@oiioii/cli 0.1.8 → 0.1.9

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.
Files changed (3) hide show
  1. package/README.md +52 -2
  2. package/dist/cli.js +30 -30
  3. package/package.json +5 -5
package/dist/cli.js CHANGED
@@ -1,39 +1,39 @@
1
1
  #!/usr/bin/env node
2
- import{realpathSync as xl}from"fs";import{fileURLToPath as Nl}from"url";import{resolve as Ul}from"path";import{Command as Ol,CommanderError as Lo}from"commander";import{Command as Bd}from"commander";import{readFileSync as tn,writeFileSync as ia,mkdirSync as sa,existsSync as Nr,chmodSync as rn,rmSync as aa}from"fs";import{join as da}from"path";var Bo={production:"OIIOII_PRODUCTION_BASE_URL",test:"OIIOII_TEST_BASE_URL",local:void 0},qo={production:"https://api.oiioii.ai",test:void 0,local:"http://localhost:4000"},As={production:void 0,test:"OIIOII_TEST_AUTHORIZATION_PAGE_URL",local:void 0},Cs={production:"https://oiioii.tv/auth/cli",test:void 0,local:"http://localhost:3000/auth/cli"},Ss={production:{managed:!0,distTag:"latest",prerelease:"forbidden"},test:{managed:!0,distTag:"test",prerelease:"required"},local:{managed:!1,prerelease:"required"}};function Os(e){return Object.prototype.hasOwnProperty.call(qo,e)}function xs(){return"production"}function Ns(){return"https://api.oiioii.ai"?.trim()||void 0}function Us(){return"https://oiioii.tv/auth/cli"?.trim()||void 0}function Ds(e){let t=Bo[e];return t&&process.env[t]?.trim()||void 0}function ne(){let e=xs()??"local";return Os(e)?e:"local"}function Ms(){let e=ne(),t=Ns()??Ds(e)??qo[e];if(!t){let r=Bo[e]??"OIIOII_BUILD_BASE_URL";throw new Error(`${r} is required for ${e} builds.`)}return{environment:e,baseUrl:t}}function vt(){return Ms().baseUrl}function jo(){let e=ne(),t=As[e],r=Us()??(t&&process.env[t]?.trim()||void 0)??Cs[e];if(!r)throw new Error(`${t??"OIIOII_BUILD_AUTHORIZATION_PAGE_URL"} is required for ${e} builds.`);return r}function Et(){return Ss[ne()]}import{randomBytes as oa}from"crypto";import{randomBytes as ta}from"crypto";import{appendFileSync as qs,chmodSync as br,existsSync as Fe,mkdirSync as zo,readFileSync as js,renameSync as Jo,statSync as vr,unlinkSync as Ho,writeFileSync as Ws}from"fs";import{dirname as Ks,join as Yo,resolve as zs}from"path";import{homedir as Ps}from"os";import{join as Ls}from"path";function Ee(){return process.env.OIIOII_CONFIG_DIR??Ls(Ps(),".oiioii")}import{closeSync as $s,fstatSync as Vs,openSync as Gs,statSync as Wo,unlinkSync as Ko}from"fs";var Fs=new Int32Array(new SharedArrayBuffer(4));function Bs(e){Atomics.wait(Fs,0,0,e)}function Te(e,t,r={}){let o=r.timeoutMs??2e3,n=r.staleMs??3e4,i=r.retryMs??10,s=Date.now()+o,a;for(;a===void 0;)try{a=Gs(e,"wx",384)}catch(d){if(d.code!=="EEXIST")throw d;try{if(Date.now()-Wo(e).mtimeMs>n){Ko(e);continue}}catch(p){if(p.code==="ENOENT")continue;throw p}if(Date.now()>=s)throw new Error(`Timed out waiting for file lock: ${e}`);Bs(Math.min(i,Math.max(1,s-Date.now())))}try{return t()}finally{let d=Vs(a);$s(a);try{let l=Wo(e);l.dev===d.dev&&l.ino===d.ino&&Ko(e)}catch(l){if(l.code!=="ENOENT")throw l}}}function Js(e,t){if(t.level&&e.level!==t.level||t.source&&e.source!==t.source||t.category&&e.category!==t.category||t.traceId&&e.trace_id!==t.traceId||t.logid&&e.logid!==t.logid||t.requestId&&e.requestId!==t.requestId||t.uid&&e.uid!==t.uid||t.workspaceId&&e.workspaceId!==t.workspaceId||t.feature&&e.feature!==t.feature||t.operation&&e.operation!==t.operation)return!1;if(t.since){let r=Date.parse(t.since);if(Number.isNaN(r)||Date.parse(e.timestamp)<r)return!1}return!0}var Be=class{logsDir;logsPath;maxBytes;maxFiles;constructor(t={}){let r=t.configDir??Ee();this.logsDir=Yo(r,"logs"),this.logsPath=Yo(this.logsDir,"events.jsonl"),this.maxBytes=t.maxBytes??5*1024*1024,this.maxFiles=Math.max(1,t.maxFiles??5)}get path(){return this.logsPath}append(t){this.ensureDir();let r=JSON.stringify(t)+`
3
- `;Te(`${this.logsPath}.lock`,()=>{Fe(this.logsPath)&&vr(this.logsPath).size>0&&vr(this.logsPath).size+Buffer.byteLength(r)>this.maxBytes&&this.rotate(),qs(this.logsPath,r,{encoding:"utf-8",mode:384}),br(this.logsPath,384)})}list(t={}){let r=[];for(let o of this.logPathsOldestFirst()){if(!Fe(o))continue;let n=js(o,"utf-8").split(`
4
- `);for(let i of n)if(i.trim())try{let s=JSON.parse(i);s.schema_version===1&&Js(s,t)&&r.push(s)}catch{}}return r.reverse(),t.limit&&t.limit>0?r.slice(0,t.limit):r}export(t){let r=zs(t.output);if(Fe(r)&&!t.force)throw new Error(`Export file already exists: ${r}. Use --force to overwrite it.`);let o=t.format??"jsonl",n=this.list(t.filter).reverse(),i=o==="json"?JSON.stringify(n,null,2)+`
2
+ import{realpathSync as Bl}from"fs";import{fileURLToPath as Kl}from"url";import{resolve as zl}from"path";import{Command as jl,CommanderError as Bo}from"commander";import{Command as ao}from"commander";import{execFile as Vs}from"child_process";var Sr={terminal:"terminal",codex:"Codex",workbuddy:"WorkBuddy",kimi:"Kimi","claude-code":"Claude Code",deepseek:"DeepSeek"},Gs={codex:"com.openai.codex",workbuddy:"com.workbuddy.workbuddy-ai"},Fs={codex:"codex",workbuddy:"workbuddy-ai"},Ws=1e4,Yo=async(e,t)=>await new Promise(r=>{Vs(e,t,{timeout:Ws,windowsHide:!0},o=>r(!o))});async function Bt(e,t=process.platform,r=Yo){return t==="darwin"?await r("/usr/bin/open",[e]):t==="win32"?await r("rundll32.exe",["url.dll,FileProtocolHandler",e]):await r("xdg-open",[e])}async function Qo(e,t=process.platform,r=Yo){if(t==="darwin"){let o=Gs[e];return o?{requested:await r("/usr/bin/open",["-b",o]),supported:!0}:{requested:!1,supported:!1}}if(t==="win32"){let o=Fs[e];return o?await r("reg.exe",["query",`HKCR\\${o}\\shell\\open\\command`,"/ve"])?{requested:await r("rundll32.exe",["url.dll,FileProtocolHandler",`${o}://`]),supported:!0}:{requested:!1,supported:!1}:{requested:!1,supported:!1}}return{requested:!1,supported:!1}}var Zo={production:"OIIOII_PRODUCTION_BASE_URL",test:"OIIOII_TEST_BASE_URL",local:void 0},Xo={production:"https://api.oiioii.ai",test:void 0,local:"http://localhost:4000"},qs={production:void 0,test:"OIIOII_TEST_AUTHORIZATION_PAGE_URL",local:void 0},js={production:"https://oiioii.ai/auth/cli",test:void 0,local:"http://localhost:3000/auth/cli"},Bs={production:{managed:!0,distTag:"latest",prerelease:"forbidden"},test:{managed:!0,distTag:"test",prerelease:"required"},local:{managed:!1,prerelease:"required"}};function Ks(e){return Object.prototype.hasOwnProperty.call(Xo,e)}function zs(){return"production"}function Js(){return"https://api.oiioii.ai"?.trim()||void 0}function Hs(){return"https://oiioii.ai/auth/cli"?.trim()||void 0}function Ys(e){let t=Zo[e];return t&&process.env[t]?.trim()||void 0}function ae(){let e=zs()??"local";return Ks(e)?e:"local"}function Qs(){let e=ae(),t=Js()??Ys(e)??Xo[e];if(!t){let r=Zo[e]??"OIIOII_BUILD_BASE_URL";throw new Error(`${r} is required for ${e} builds.`)}return{environment:e,baseUrl:t}}function Tt(){return Qs().baseUrl}function Kt(){let e=ae(),t=qs[e],r=Hs()??(t&&process.env[t]?.trim()||void 0)??js[e];if(!r)throw new Error(`${t??"OIIOII_BUILD_AUTHORIZATION_PAGE_URL"} is required for ${e} builds.`);return r}function At(){return Bs[ae()]}import{readFileSync as ln,writeFileSync as ka,mkdirSync as Ia,existsSync as Vr,chmodSync as mn,rmSync as ba}from"fs";import{join as va}from"path";import{randomBytes as wa}from"crypto";import{randomBytes as ha}from"crypto";import{appendFileSync as ia,chmodSync as Or,existsSync as qe,mkdirSync as rn,readFileSync as sa,renameSync as on,statSync as xr,unlinkSync as nn,writeFileSync as aa}from"fs";import{dirname as ca,join as sn,resolve as da}from"path";import{homedir as Zs}from"os";import{join as Xs}from"path";function Ae(){return process.env.OIIOII_CONFIG_DIR??Xs(Zs(),".oiioii")}import{closeSync as ea,fstatSync as ta,openSync as ra,statSync as en,unlinkSync as tn}from"fs";var oa=new Int32Array(new SharedArrayBuffer(4));function na(e){Atomics.wait(oa,0,0,e)}function Ce(e,t,r={}){let o=r.timeoutMs??2e3,n=r.staleMs??3e4,i=r.retryMs??10,s=Date.now()+o,a;for(;a===void 0;)try{a=ra(e,"wx",384)}catch(c){if(c.code!=="EEXIST")throw c;try{if(Date.now()-en(e).mtimeMs>n){tn(e);continue}}catch(p){if(p.code==="ENOENT")continue;throw p}if(Date.now()>=s)throw new Error(`Timed out waiting for file lock: ${e}`);na(Math.min(i,Math.max(1,s-Date.now())))}try{return t()}finally{let c=ta(a);ea(a);try{let l=en(e);l.dev===c.dev&&l.ino===c.ino&&tn(e)}catch(l){if(l.code!=="ENOENT")throw l}}}function ua(e,t){if(t.level&&e.level!==t.level||t.source&&e.source!==t.source||t.category&&e.category!==t.category||t.traceId&&e.trace_id!==t.traceId||t.logid&&e.logid!==t.logid||t.requestId&&e.requestId!==t.requestId||t.uid&&e.uid!==t.uid||t.workspaceId&&e.workspaceId!==t.workspaceId||t.feature&&e.feature!==t.feature||t.operation&&e.operation!==t.operation)return!1;if(t.since){let r=Date.parse(t.since);if(Number.isNaN(r)||Date.parse(e.timestamp)<r)return!1}return!0}var je=class{logsDir;logsPath;maxBytes;maxFiles;constructor(t={}){let r=t.configDir??Ae();this.logsDir=sn(r,"logs"),this.logsPath=sn(this.logsDir,"events.jsonl"),this.maxBytes=t.maxBytes??5*1024*1024,this.maxFiles=Math.max(1,t.maxFiles??5)}get path(){return this.logsPath}append(t){this.ensureDir();let r=JSON.stringify(t)+`
3
+ `;Ce(`${this.logsPath}.lock`,()=>{qe(this.logsPath)&&xr(this.logsPath).size>0&&xr(this.logsPath).size+Buffer.byteLength(r)>this.maxBytes&&this.rotate(),ia(this.logsPath,r,{encoding:"utf-8",mode:384}),Or(this.logsPath,384)})}list(t={}){let r=[];for(let o of this.logPathsOldestFirst()){if(!qe(o))continue;let n=sa(o,"utf-8").split(`
4
+ `);for(let i of n)if(i.trim())try{let s=JSON.parse(i);s.schema_version===1&&ua(s,t)&&r.push(s)}catch{}}return r.reverse(),t.limit&&t.limit>0?r.slice(0,t.limit):r}export(t){let r=da(t.output);if(qe(r)&&!t.force)throw new Error(`Export file already exists: ${r}. Use --force to overwrite it.`);let o=t.format??"jsonl",n=this.list(t.filter).reverse(),i=o==="json"?JSON.stringify(n,null,2)+`
5
5
  `:n.map(s=>JSON.stringify(s)).join(`
6
6
  `)+(n.length>0?`
7
- `:"");return zo(Ks(r),{recursive:!0}),Ws(r,i,{encoding:"utf-8",mode:384,flag:t.force?"w":"wx"}),br(r,384),{path:r,format:o,count:n.length,bytes:vr(r).size}}ensureDir(){Fe(this.logsDir)||zo(this.logsDir,{recursive:!0,mode:448}),br(this.logsDir,448)}rotatedPath(t){return`${this.logsPath}.${t}`}logPathsOldestFirst(){let t=[];for(let r=this.maxFiles-1;r>=1;r--)t.push(this.rotatedPath(r));return t.push(this.logsPath),t}rotate(){let t=this.rotatedPath(this.maxFiles-1);this.maxFiles>1&&Fe(t)&&Ho(t);for(let r=this.maxFiles-2;r>=1;r--){let o=this.rotatedPath(r);Fe(o)&&Jo(o,this.rotatedPath(r+1))}this.maxFiles>1&&Fe(this.logsPath)?Jo(this.logsPath,this.rotatedPath(1)):Fe(this.logsPath)&&Ho(this.logsPath)}};var Hs=/(?:authorization|api[_-]?key|token|password|secret|credential|cookie)/i,Ys=/([?&](?:api[_-]?key|token|password|secret)=)[^&\s]*/gi,Qs=/\boii_sk_[A-Za-z0-9._-]+\b/g,Xs=/\bBearer\s+[^\s,;]+/gi;function et(e){return e.replace(Ys,"$1[REDACTED]").replace(Qs,"[REDACTED]").replace(Xs,"Bearer [REDACTED]")}function Er(e,t,r){if(r>10)return"[MAX_DEPTH]";if(typeof e=="string")return et(e);if(e===null||typeof e!="object")return e;if(t.has(e))return"[CIRCULAR]";if(t.add(e),Array.isArray(e))return e.map(n=>Er(n,t,r+1));let o={};for(let[n,i]of Object.entries(e))o[n]=Hs.test(n)?"[REDACTED]":Er(i,t,r+1);return o}function Bt(e){return Er(e,new WeakSet,0)}import{AsyncLocalStorage as Zs}from"async_hooks";var Tr=new Zs;function Qo(e){Tr.enterWith(e)}function F(){return Tr.getStore()}function Xo(){Tr.enterWith(void 0)}import{createHash as ea}from"crypto";function q(e){if(typeof e!="string")return;let t=e.trim();return t&&t.length<=256&&!/[\x00-\x1f\x7f]/.test(t)&&et(t)===t?t:void 0}function qt(e,t){try{return ea("sha256").update(`${new URL(e).origin}
8
- ${t}`).digest("hex")}catch{return}}function qe(e){if(!e||typeof e!="object")return;let t=e;return q(t.workspaceId)??q(t.workspace_id)}function Zo(e,t){try{let r=new URL(e instanceof Request?e.url:String(e)),o;try{typeof t?.body=="string"&&t.body.length<=1048576&&(o=JSON.parse(t.body))}catch{}let n=o?.params;return qe(o)??qe(o?.data)??qe(n?.arguments)??q(r.searchParams.get("workspaceId"))??q(r.searchParams.get("workspace_id"))??q(decodeURIComponent(/^\/v1\/debug\/workspaces\/([^/]+)$/.exec(r.pathname)?.[1]??""))}catch{return}}function Ar(e,t){try{return t&&e.url&&new URL(t).origin!==new URL(e.url).origin?{}:{logid:q(e.headers.get("x-logid")),requestId:q(e.headers.get("x-request-id")),uid:q(e.headers.get("x-hogi-log-uid")),workspaceId:q(e.headers.get("x-hogi-log-workspace-id"))}}catch{return{}}}function en(e,t){let r=F();r&&t&&t!=="anonymous_user"&&e&&r.identityKey===e&&(r.uid=t)}function ra(){return"log_"+ta(8).toString("hex")}var Cr=class{constructor(t=new Be){this.store=t}store;record(t){try{let r={schema_version:1,id:ra(),timestamp:new Date().toISOString(),level:t.level,category:t.category??"application",source:t.source,event:t.event,...t.trace_id??F()?.traceId?{trace_id:t.trace_id??F().traceId}:{},...t.feature??F()?.feature?{feature:t.feature??F().feature}:{},...t.message?{message:et(t.message)}:{},...t.request_id?{request_id:t.request_id}:{},...t.clientRequestId?{clientRequestId:t.clientRequestId}:{},...Object.fromEntries(Object.entries({logid:q(t.logid),requestId:q(t.requestId),uid:q("uid"in t?t.uid:F()?.uid),workspaceId:q(t.workspaceId)??qe(t.metadata)??F()?.workspaceId}).filter(([,o])=>o!==void 0)),...t.operation?{operation:t.operation}:{},...t.http?{http:Bt(t.http)}:{},...t.error?{error:Bt(t.error)}:{},...t.metadata?{metadata:Bt(t.metadata)}:{}};return this.store.append(r),r}catch{return}}},Sr=class{record(){}};function Ae(){return process.env.OIIOII_LOG_DISABLED==="1"?new Sr:new Cr}function na(){return"trace_"+oa(8).toString("hex")}function Or(e){let t=na();return Qo({traceId:t,feature:e,startedAt:Date.now()}),Ae().record({level:"info",category:"application",source:"cli",event:"feature.started",trace_id:t,operation:e,metadata:{feature:e}}),t}function y(e,t,r,o="info"){let n=F();n&&Ae().record({level:o,category:"application",source:e,event:"feature.step",trace_id:n.traceId,operation:n.feature,message:t,metadata:{step:t,...r}})}function je(e,t){let r=F();r&&(r.failure={...e?{code:e}:{},message:t},Ae().record({level:"error",category:"application",source:"cli",event:"feature.diagnostic",trace_id:r.traceId,operation:r.feature,error:{...e?{code:e}:{},message:t}}))}function xr(e=0){let t=F();if(!t)return;let r=t.failure!==void 0||e!==0;Ae().record({level:r?"error":"info",category:"application",source:"cli",event:r?"feature.failed":"feature.completed",trace_id:t.traceId,operation:t.feature,...t.failure?{error:t.failure}:{},metadata:{feature:t.feature,exit_code:e,duration_ms:Date.now()-t.startedAt}}),Xo()}var u={AUTH_REQUIRED:"AUTH_REQUIRED",AUTH_INVALID:"AUTH_INVALID",AUTH_CAPTCHA_REQUIRED:"AUTH_CAPTCHA_REQUIRED",AUTH_EMAIL_NOT_CONFIRMED:"AUTH_EMAIL_NOT_CONFIRMED",AUTH_TIMEOUT:"AUTH_TIMEOUT",API_KEY_INVALID:"API_KEY_INVALID",MEMBERSHIP_REQUIRED:"MEMBERSHIP_REQUIRED",WORKSPACE_REQUIRED:"WORKSPACE_REQUIRED",WORKSPACE_NOT_FOUND:"WORKSPACE_NOT_FOUND",WORKSPACE_FORBIDDEN:"WORKSPACE_FORBIDDEN",CONVERSATION_NOT_FOUND:"CONVERSATION_NOT_FOUND",SNAPSHOT_NOT_FOUND:"SNAPSHOT_NOT_FOUND",INVALID_ARGUMENT:"INVALID_ARGUMENT",MODEL_NOT_SUPPORTED:"MODEL_NOT_SUPPORTED",MODEL_CONSTRAINT_VIOLATION:"MODEL_CONSTRAINT_VIOLATION",GENERATION_FAILED:"GENERATION_FAILED",GENERATION_TIMEOUT:"GENERATION_TIMEOUT",AGENT_EXECUTION_FAILED:"AGENT_EXECUTION_FAILED",PROVIDER_UNAVAILABLE:"PROVIDER_UNAVAILABLE",RECORD_NOT_FOUND:"RECORD_NOT_FOUND",TASK_NOT_FOUND:"TASK_NOT_FOUND",TASK_RETRY_REQUIRED:"TASK_RETRY_REQUIRED",TASK_TIMEOUT:"TASK_TIMEOUT",QUOTA_EXCEEDED:"QUOTA_EXCEEDED",PAYLOAD_TOO_LARGE:"PAYLOAD_TOO_LARGE",CONTENT_SAFETY_BLOCKED:"CONTENT_SAFETY_BLOCKED",IP_CHARACTER_RESTRICTED:"IP_CHARACTER_RESTRICTED",SERVER_ERROR:"SERVER_ERROR",NETWORK_ERROR:"NETWORK_ERROR",CLI_UPGRADE_REQUIRED:"CLI_UPGRADE_REQUIRED",CLI_INSTALLATION_UNMANAGED:"CLI_INSTALLATION_UNMANAGED",CLI_UPDATE_FAILED:"CLI_UPDATE_FAILED",NOT_IMPLEMENTED:"NOT_IMPLEMENTED",CONFIG_ERROR:"CONFIG_ERROR"},c=class extends Error{constructor(r,o,n){super(o);this.code=r;this.details=n;this.name="CliError"}code;details};function We(e,t){let r=`${e??""} ${t??""}`.toUpperCase();return/SAFETY[_\s-]*BLOCKED|SENSITIVE[_\s-]*CONTENT|PROMPT[_\s-]*SENSITIVE|CONTENT[_\s-]*FILTER|IP[_\s-]*INFRINGEMENT|IP[_\s-]*CHARACTER|COPYRIGHT|RESTRICTED[_\s-]*IP/.test(r)}function Ke(e,t,r={}){let o=`${e??""} ${t??""}`.toUpperCase(),n=/IP[_\s-]*INFRINGEMENT|IP[_\s-]*CHARACTER|COPYRIGHT|RESTRICTED[_\s-]*IP/.test(o),i=n?"Request blocked because it may contain a restricted IP or character. Revise the character, references, or prompt and retry.":"Request blocked by the content safety policy. Revise the prompt or references and retry.";return new c(n?u.IP_CHARACTER_RESTRICTED:u.CONTENT_SAFETY_BLOCKED,i,{...r,...e?{backend_code:e}:{},...t&&t!==i?{backend_message:t}:{},category:"safety",reason_category:n?"ip_or_character":"content_policy",retryable:!1,hint:n?"Remove or replace the restricted character/IP reference, then retry.":"Revise the prompt or media references, then retry."})}var ca="openapi";function Ur(e){return e==="openapi"||e==="mcp"?e:void 0}function ua(e){if(e===void 0||e.trim()==="")return;let t=Ur(e.trim());if(t)return t;throw new c(u.CONFIG_ERROR,"OIIOII_GENERATION_TRANSPORT must be openapi or mcp.",{category:"configuration",retryable:!1})}function on(){return{baseUrl:vt()}}var b=class{configPath;dirPath;constructor(t){this.dirPath=t??Ee(),this.configPath=da(this.dirPath,"config.json")}getConfigPath(){return this.configPath}load(){if(!Nr(this.configPath))return y("config_store","config.defaulted",{reason:"missing"}),on();try{let t=tn(this.configPath,"utf-8"),r=JSON.parse(t),o={baseUrl:typeof r.baseUrl=="string"?r.baseUrl:vt(),...typeof r.apiKey=="string"&&r.apiKey.trim()?{apiKey:r.apiKey.trim()}:{},...typeof r.defaultWorkspaceId=="string"?{defaultWorkspaceId:r.defaultWorkspaceId}:{},...Ur(r.generationTransport)?{generationTransport:Ur(r.generationTransport)}:{}};return y("config_store","config.loaded"),o}catch{return y("config_store","config.defaulted",{reason:"invalid"},"warn"),on()}}loadResolved(){let t=this.load();return y("config_store","config.resolved",{base_url_source:process.env.OIIOII_BASE_URL?"env":"file_or_build",api_key_source:process.env.OIIOII_API_KEY?"env":t.apiKey?"file":"missing",workspace_source:process.env.OIIOII_WORKSPACE_ID?"env":"file",generation_transport_source:process.env.OIIOII_GENERATION_TRANSPORT?"env":t.generationTransport?"file":"default"}),{...t,baseUrl:process.env.OIIOII_BASE_URL??t.baseUrl,apiKey:process.env.OIIOII_API_KEY?.trim()||t.apiKey,defaultWorkspaceId:process.env.OIIOII_WORKSPACE_ID??t.defaultWorkspaceId,generationTransport:ua(process.env.OIIOII_GENERATION_TRANSPORT)??t.generationTransport??ca}}save(t){this._ensureDir(),Te(`${this.configPath}.lock`,()=>this._write(t)),y("config_store","config.saved")}_write(t){ia(this.configPath,JSON.stringify(t,null,2)+`
9
- `,{encoding:"utf-8",mode:384}),rn(this.configPath,384)}update(t,r={}){this._ensureDir(),Te(`${this.configPath}.lock`,()=>{let n={...this.load(),...t};r.resetBaseUrl&&delete n.baseUrl,this._write(n)}),y("config_store","config.updated",{fields:Object.keys(t),reset_base_url:r.resetBaseUrl===!0})}removeApiKey(){if(!Nr(this.configPath))return!1;this._ensureDir();let t=Te(`${this.configPath}.lock`,()=>{let r;try{r=JSON.parse(tn(this.configPath,"utf-8"))}catch{return aa(this.configPath,{force:!0}),!0}if(typeof r!="object"||r===null||Array.isArray(r))return!1;let o=r;return Object.prototype.hasOwnProperty.call(o,"apiKey")?(delete o.apiKey,this._write(o),!0):!1});return y("config_store","config.api_key_removed",{removed:t}),t}_ensureDir(){Nr(this.dirPath)||sa(this.dirPath,{recursive:!0,mode:448}),rn(this.dirPath,448)}};import{randomBytes as la}from"crypto";function ma(e){if(e instanceof Error){let t="code"in e&&typeof e.code=="string"?e.code:void 0;return{name:e.name,...t?{code:t}:{},message:e.message}}return{message:String(e)}}var Dr=class{constructor(t,r){this.logger=t;this.context=r;this.correlation={uid:void 0,workspaceId:qe(r.metadata)??this.trace?.workspaceId}}logger;context;requestId="req_"+la(8).toString("hex");startedAt=Date.now();completed=!1;started=!1;correlation;trace=F();record(t){try{this.logger.record({trace_id:this.trace?.traceId,feature:this.trace?.feature,...this.correlation,...t,clientRequestId:this.requestId,request_id:this.requestId})}catch{}}start(){this.started||(this.started=!0,this.record({level:"info",category:"api",source:this.context.source,event:"api.request",request_id:this.requestId,operation:this.context.operation,http:{method:this.context.method,path:this.context.path},metadata:this.context.metadata}))}async fetch(t,r,o){this.correlation.logid=void 0,this.correlation.requestId=void 0;let n=o,i;try{let d=new Headers(o?.headers??(r instanceof Request?r.headers:void 0)),l=r instanceof Request?r.url:String(r),p=d.get("x-hogi-api-key")??d.get("authorization")?.replace(/^Bearer\s+/i,"");i=p?qt(l,p):void 0,this.correlation.uid=i&&i===this.trace?.identityKey?this.trace.uid:void 0;let m=Zo(r,o)??qe(this.context.metadata)??q(d.get("x-workspace-id"))??this.trace?.workspaceId;this.correlation.workspaceId=m,m&&d.set("x-workspace-id",m),n={...o,headers:Object.fromEntries(d.entries())}}catch{}this.start();let s=await t(r,n),a=Ar(s,r instanceof Request?r.url:String(r));return this.correlation={...a,uid:a.uid??this.correlation.uid,workspaceId:a.workspaceId??this.correlation.workspaceId},en(i,a.uid),s}async fetchResource(t,r,o){let n=await this.fetch(t,r,{...o,redirect:"manual"}),i=new URL(r),s=new Headers(o.headers);for(let a=0;[301,302,303,307,308].includes(n.status);a++){let d=n.headers.get("location");if(!d)break;if(a>=20)throw new TypeError("Too many resource redirects");this.record({level:"info",category:"api",source:this.context.source,event:"api.redirect",operation:this.context.operation,http:{method:"GET",path:this.context.path,status:n.status}});let l=new URL(d,i);l.origin!==i.origin&&(s=new Headers(Object.fromEntries([...s.entries()].filter(([m])=>["accept","range"].includes(m)))));try{await n.body?.cancel()}catch{}n=await t(l.href,{...o,headers:Object.fromEntries(s.entries()),redirect:"manual"});let p=Ar(n,r);p.logid&&(this.correlation={...this.correlation,...p}),i=l}return n}success(t,r){this.completed||(this.start(),this.completed=!0,this.record({level:"info",category:"api",source:this.context.source,event:"api.response",request_id:this.requestId,operation:this.context.operation,http:{method:this.context.method,path:this.context.path,status:t,duration_ms:Date.now()-this.startedAt},metadata:{...this.context.metadata,...r}}))}failure(t,r){this.completed||(this.start(),this.completed=!0,this.record({level:"error",category:"api",source:this.context.source,event:"api.error",request_id:this.requestId,operation:this.context.operation,http:{method:this.context.method,path:this.context.path,...r!==void 0?{status:r}:{},duration_ms:Date.now()-this.startedAt},error:ma(t)}))}};function $(e,t=Ae()){return new Dr(t,e)}var z="0.1.8",Tt="@oiioii/cli";var pa={clientType:"x-hogi-client-type",clientVersion:"x-hogi-client-version",clientOS:"x-hogi-client-os"};function fa(e){return e==="win32"?"windows":e==="darwin"?"mac":e}function ga(){return{clientType:"cli",clientVersion:z,clientOS:fa(process.platform)}}function V(e){let t=ga();return{...e,...Object.fromEntries(Object.entries(pa).map(([r,o])=>[o,t[r]]))}}var B=class extends Error{constructor(r,o){super(`${r} timed out after ${o}ms`);this.operation=r;this.timeoutMs=o;this.name="HttpRequestTimeoutError"}operation;timeoutMs};async function j(e){let t=e.timeoutMs??3e4,r=new AbortController,o,n=new Promise((i,s)=>{o=setTimeout(()=>{r.abort(),s(new B(e.operation,t))},t)});o?.unref();try{return await Promise.race([e.run(r.signal),n])}catch(i){throw i instanceof B?i:r.signal.aborted?new B(e.operation,t):i}finally{o&&clearTimeout(o)}}function ie(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function _a(e){let t=ie(e);if(t)return t;if(typeof e!="string")return;let r=e.trim();try{return ie(JSON.parse(r))}catch{}let o=r.lastIndexOf("{");for(;o>=0;){try{let n=ie(JSON.parse(r.slice(o)));if(n)return n}catch{}o=r.lastIndexOf("{",o-1)}}async function At(e){let t=await e.text().catch(()=>"");if(!t.trim())return{};try{let r=JSON.parse(t);return ie(r)??{}}catch{throw new c(u.SERVER_ERROR,"Invalid JSON response from workspace API",{status:e.status})}}function ge(e,t){let r=t.error?.code,o=t.error?.message??`Workspace request failed: HTTP ${e}`,n={status:e,...r?{code:r,backend_code:r}:{},...t.error?.details!==void 0?{backend_details:t.error.details}:{},...r==="request_in_progress"||e>=500?{retryable:!0}:{}};return e===401?new c(u.API_KEY_INVALID,o,n):e===403?new c(r==="feature_not_enabled"?u.NOT_IMPLEMENTED:u.WORKSPACE_FORBIDDEN,o,n):e===404?new c(r==="asset_not_found"||r==="canvas_node_not_found"?u.RECORD_NOT_FOUND:u.WORKSPACE_NOT_FOUND,o,n):e===400||e===422?new c(u.INVALID_ARGUMENT,o,n):e===409?new c(u.INVALID_ARGUMENT,o,n):e===429?new c(u.QUOTA_EXCEEDED,o,n):new c(u.SERVER_ERROR,o,n)}function Ct(e,t,r){if(typeof e!="string"||!e.trim())throw fe(`missing ${t}`,r);return e}function fe(e,t){return new c(u.SERVER_ERROR,`Invalid canvas composition response: ${e}`,{category:"response_protocol",request_outcome:"unknown",retryable:t})}function Mr(e){return new c(u.SERVER_ERROR,`Invalid canvas node update response: ${e}`,{category:"response_protocol",request_outcome:"unknown",retryable:!1})}function nn(e,t){if(typeof e!="string"||!e.trim())throw Mr(`missing ${t}`);return e}function ha(e,t){if(e.ok===!1)throw ge(400,e);let r=ie(e.data);if(!r||!Array.isArray(r.nodes)||!Array.isArray(r.groups)||typeof r.reused!="boolean")throw fe("missing result fields",t);let o=r.nodes.map((i,s)=>{let a=ie(i);if(!a)throw fe(`invalid nodes.${s}`,t);return{asset_id:Ct(a.asset_id,`nodes.${s}.asset_id`,t),client_id:Ct(a.client_id,`nodes.${s}.client_id`,t)}}),n=r.groups.map((i,s)=>{let a=ie(i);if(!Array.isArray(a?.member_asset_ids)||a.member_asset_ids.some(d=>typeof d!="string"||!d.trim()))throw fe(`invalid groups.${s}.member_asset_ids`,t);return{client_id:Ct(a.client_id,`groups.${s}.client_id`,t),group_id:Ct(a.group_id,`groups.${s}.group_id`,t),member_asset_ids:a.member_asset_ids}});return{workspace_id:Ct(r.workspace_id,"workspace_id",t),nodes:o,groups:n,reused:r.reused}}function ya(e,t,r,o){if(e.workspace_id!==t)throw fe("workspace_id does not match the request",o);if(e.nodes.length!==r.nodes.length||e.nodes.some((i,s)=>i.client_id!==r.nodes[s]?.client_id))throw fe("node client_id values do not preserve request order",o);if(new Set(e.nodes.map(i=>i.asset_id)).size!==e.nodes.length)throw fe("node asset_id values must be unique",o);if(e.groups.length!==r.groups.length||e.groups.some((i,s)=>i.client_id!==r.groups[s]?.client_id))throw fe("group client_id values do not preserve request order",o);if(new Set(e.groups.map(i=>i.group_id)).size!==e.groups.length)throw fe("group_id values must be unique",o);let n=new Map(e.nodes.map(i=>[i.client_id,i.asset_id]));e.groups.forEach((i,s)=>{let a=r.groups[s].members.map(d=>"client_node_id"in d?n.get(d.client_node_id):d.asset_id);if(a.some(d=>!d)||a.length!==i.member_asset_ids.length||a.some((d,l)=>d!==i.member_asset_ids[l]))throw fe(`groups.${s}.member_asset_ids do not preserve request order`,o)})}function wa(e){if(e.ok===!1)throw ge(400,e);let t=ie(e.data);if(!t||t.status!=="empty"||!["audio","image","video"].includes(String(t.type))||typeof t.updated!="boolean")throw Mr("missing result fields");return{asset_id:nn(t.asset_id,"asset_id"),status:"empty",type:t.type,updated:t.updated,workspace_id:nn(t.workspace_id,"workspace_id")}}function Ra(e){if(e.ok===!1)throw ge(400,e);let t=_a(e.data),r=t?.workspaceId,o=t?.name;if(typeof r!="string"||!r.trim())throw new c(u.SERVER_ERROR,"Invalid workspace API response: missing workspaceId");if(typeof o!="string"||!o.trim())throw new c(u.SERVER_ERROR,"Invalid workspace API response: missing name");return{workspaceId:r,name:o}}function Ia(e){if(e.ok===!1)throw ge(400,e);let t=ie(e.data),r=t?.workspace_id,o=t?.name;if(typeof r!="string"||!r.trim())throw new c(u.SERVER_ERROR,"Invalid workspace rename response: missing workspace_id");if(typeof o!="string"||!o.trim())throw new c(u.SERVER_ERROR,"Invalid workspace rename response: missing name");return{workspaceId:r,name:o}}function ka(e){if(e.ok===!1)throw ge(400,e);let t=ie(e.data);if(!Array.isArray(t?.asset))throw new c(u.SERVER_ERROR,"Invalid workspace detail response: missing asset list");return t.asset.map((r,o)=>{let n=ie(r);if(!n||typeof n.assetId!="string"||typeof n.type!="string"||typeof n.uri!="string")throw new c(u.SERVER_ERROR,`Invalid workspace asset at index ${o}`);return n})}var _e=class{baseUrl;apiKey;_fetch;logger;timeoutMs;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this._fetch=t.fetch??globalThis.fetch,this.logger=t.logger,this.timeoutMs=t.timeoutMs}async createWorkspace(t){let r=$({source:"hogi_workspace_client",operation:"workspace.create",method:"POST",path:"/v1/workspace/create",metadata:{language:t.language??null,has_name:t.name!==void 0}},this.logger),o;try{return await j({operation:"Workspace creation request",timeoutMs:this.timeoutMs,run:async n=>{o=await r.fetch(this._fetch,`${this.baseUrl}/v1/workspace/create`,{method:"POST",headers:V({authorization:`Bearer ${this.apiKey}`,"content-type":"application/json",accept:"application/json"}),body:JSON.stringify({...t.name!==void 0?{name:t.name}:{},...t.language!==void 0?{language:t.language}:{}}),signal:n});let i=await At(o);if(!o.ok)throw ge(o.status,i);let s=Ra(i);return r.success(o.status,{workspace_id:s.workspaceId}),s}})}catch(n){if(n instanceof B){let s=new c(u.NETWORK_ERROR,n.message,{retryable:!0,timeout_ms:n.timeoutMs});throw r.failure(s,o?.status),s}if(n instanceof c)throw r.failure(n,o?.status),n;let i=new c(u.NETWORK_ERROR,`Network error: ${n instanceof Error?n.message:String(n)}`);throw r.failure(i),i}}async renameWorkspace(t,r){let o="/v1/workspace/rename",n=$({source:"hogi_workspace_client",operation:"workspace.rename",method:"POST",path:o,metadata:{workspace_id:t}},this.logger),i;try{return await j({operation:"Workspace rename request",timeoutMs:this.timeoutMs,run:async s=>{i=await n.fetch(this._fetch,`${this.baseUrl}${o}`,{method:"POST",headers:{authorization:`Bearer ${this.apiKey}`,"content-type":"application/json",accept:"application/json"},body:JSON.stringify({workspace_id:t,name:r}),signal:s});let a=await At(i);if(!i.ok)throw ge(i.status,a);let d=Ia(a);return n.success(i.status,{workspace_id:d.workspaceId}),d}})}catch(s){throw this.mapRequestError(s,"Workspace rename request",n,i)}}async createCanvasComposition(t,r,o){let n=o?.trim()||void 0,i="/v1/workspace/canvas/compositions",s=$({source:"hogi_workspace_client",operation:"workspace.canvas.composition.create",method:"POST",path:i,metadata:{workspace_id:t,node_count:r.nodes.length,group_count:r.groups.length,has_idempotency_key:n!==void 0}},this.logger),a;try{return await j({operation:"Canvas composition creation request",timeoutMs:this.timeoutMs,run:async d=>{a=await s.fetch(this._fetch,`${this.baseUrl}${i}`,{method:"POST",headers:V({authorization:`Bearer ${this.apiKey}`,"content-type":"application/json",accept:"application/json",...n?{"idempotency-key":n}:{}}),body:JSON.stringify({workspace_id:t,nodes:r.nodes,groups:r.groups}),signal:d});let l=await At(a);if(!a.ok)throw ge(a.status,l);let p=n!==void 0,m=ha(l,p);return ya(m,t,r,p),s.success(a.status,{workspace_id:m.workspace_id,node_count:m.nodes.length,group_count:m.groups.length,reused:m.reused}),m}})}catch(d){let l=this.mapRequestError(d,"Canvas composition creation request",s,a);if(l.code!==u.NETWORK_ERROR&&l.code!==u.SERVER_ERROR)throw l;let p=ie(l.details)??{},m=typeof p.backend_code=="string"?p.backend_code:void 0;throw new c(l.code,l.message,{...p,request_outcome:m==="idempotency_unavailable"?"not_started":"unknown",retryable:n!==void 0})}}async updateEmptyCanvasNode(t,r,o){let n=`/v1/workspace/canvas/nodes/${encodeURIComponent(r)}`,i=$({source:"hogi_workspace_client",operation:"workspace.canvas.node.update",method:"POST",path:"/v1/workspace/canvas/nodes/:asset_id",metadata:{workspace_id:t,asset_id:r}},this.logger),s;try{return await j({operation:"Canvas node update request",timeoutMs:this.timeoutMs,run:async a=>{s=await i.fetch(this._fetch,`${this.baseUrl}${n}`,{method:"POST",headers:V({authorization:`Bearer ${this.apiKey}`,"content-type":"application/json",accept:"application/json"}),body:JSON.stringify({workspace_id:t,...o}),signal:a});let d=await At(s);if(!s.ok)throw ge(s.status,d);let l=wa(d);if(l.workspace_id!==t||l.asset_id!==r)throw Mr("identifiers do not match the request");return i.success(s.status,{workspace_id:l.workspace_id,asset_id:l.asset_id,updated:l.updated}),l}})}catch(a){throw this.mapRequestError(a,"Canvas node update request",i,s)}}async listAssets(t){let r="/v1/workspace/detail",o=$({source:"hogi_workspace_client",operation:"workspace.assets.list",method:"GET",path:r,metadata:{workspace_id:t}},this.logger),n=new URLSearchParams({workspace_id:t,relateTypes:"asset"}),i;try{return await j({operation:"Workspace asset list request",timeoutMs:this.timeoutMs,run:async s=>{i=await o.fetch(this._fetch,`${this.baseUrl}${r}?${n.toString()}`,{method:"GET",headers:{authorization:`Bearer ${this.apiKey}`,accept:"application/json"},signal:s});let a=await At(i);if(!i.ok)throw ge(i.status,a);let d=ka(a);return o.success(i.status,{workspace_id:t,asset_count:d.length}),d}})}catch(s){throw this.mapRequestError(s,"Workspace asset list request",o,i)}}mapRequestError(t,r,o,n){if(t instanceof B){let s=new c(u.NETWORK_ERROR,t.message,{retryable:!0,timeout_ms:t.timeoutMs});return o.failure(s,n?.status),s}if(t instanceof c)return o.failure(t,n?.status),t;let i=new c(u.NETWORK_ERROR,`${r} failed: ${t instanceof Error?t.message:String(t)}`);return o.failure(i),i}};function O(e){let t=e;for(;t.parent;)t=t.parent;return t.opts()}function A(e){return O(e).json===!0}function P(e,t){let r=t.loadResolved(),o=r.apiKey?.trim();if(!o)throw new c(u.AUTH_REQUIRED,"No API key configured. Run 'oiioii auth login' for browser authorization, or paste an existing key with 'oiioii auth login --api-key <key>'.");let n=e.baseUrl,i=typeof n=="string"&&n?n:r.baseUrl;return{apiKey:o,baseUrl:i}}function ze(e,t,r){let o=r?.trim();if(r!==void 0&&!o)throw new c(u.INVALID_ARGUMENT,"Workspace ID must not be empty");let n=typeof e.workspace=="string"?e.workspace.trim():"",i=o||n||t.loadResolved().defaultWorkspaceId?.trim();if(!i)throw new c(u.WORKSPACE_REQUIRED,"No workspace set. Pass a workspace ID, use --workspace <id>, set OIIOII_WORKSPACE_ID, or set an active workspace.");return i}var sn={auth:{called:"cli_biz_auth_called",result:"cli_biz_auth_result"},workspace:{called:"cli_biz_workspace_called",result:"cli_biz_workspace_result"},generation:{called:"cli_biz_generation_called",result:"cli_biz_generation_result"},upload:{called:"cli_biz_upload_called",result:"cli_biz_upload_result"},task:{called:"cli_biz_task_called",result:"cli_biz_task_result"},record:{called:"cli_biz_record_called",result:"cli_biz_record_result"},inspect:{called:"cli_biz_inspect_called",result:"cli_biz_inspect_result"},preview:{called:"cli_biz_preview_called",result:"cli_biz_preview_result"},logs:{called:"cli_biz_logs_called",result:"cli_biz_logs_result"},points:{called:"cli_biz_points_called",result:"cli_biz_points_result"},cli:{called:"cli_biz_cli_called",result:"cli_biz_cli_result"}};function v(e,t){return{domain:e,action:t,calledEvent:sn[e].called,resultEvent:sn[e].result}}var an={"auth.login":v("auth","login"),"auth.status":v("auth","status"),"auth.logout":v("auth","logout"),"workspace.create":v("workspace","create"),"workspace.set":v("workspace","set"),"workspace.current":v("workspace","current"),"workspace.rename":v("workspace","rename"),"workspace.assets.list":v("workspace","assets_list"),"workspace.assets.download":v("workspace","asset_download"),"workspace.canvas.create":v("workspace","canvas_composition_create"),"workspace.canvas.group.create":v("workspace","canvas_group_create"),"workspace.canvas.node.update":v("workspace","canvas_node_update"),"library.list":v("workspace","asset_library_list"),"library.search":v("workspace","asset_library_search"),"library.create":v("workspace","asset_library_create"),"library.update":v("workspace","asset_library_update"),"library.delete":v("workspace","asset_library_delete"),"library.add-members":v("workspace","asset_library_add_members"),"library.remove-members":v("workspace","asset_library_remove_members"),"library.members":v("workspace","asset_library_collection_members"),"library.expression":v("generation","asset_library_expression"),"image.text":v("generation","image_text"),"image.edit":v("generation","image_edit"),"video.text":v("generation","video_text"),"video.image":v("generation","video_image"),"video.generate":v("generation","video_generate"),"audio.generate":v("generation","audio_generate"),"audio.seed-audio":v("generation","audio_seed_audio"),"audio.suno":v("generation","audio_suno"),"upload.file":v("upload","file"),"upload.resource":v("upload","resource"),"task.list":v("task","list"),"task.retry":v("task","retry"),"task.status":v("task","status"),"task.wait":v("task","wait"),"record.get":v("record","get"),"record.open":v("record","open"),"inspect.capabilities":v("inspect","capabilities"),"inspect.models":v("inspect","models"),"preview.latest":v("preview","latest"),"preview.bundle":v("preview","bundle"),"logs.list":v("logs","list"),"logs.export":v("logs","export"),"logs.path":v("logs","path"),"points.balance":v("points","balance"),"points.cost":v("points","cost"),"points.logs":v("points","logs"),"points.quote":v("points","quote"),update:v("cli","update"),install:v("cli","install"),versions:v("cli","versions")};function Pr(e){return an[e]}import{randomBytes as Oa}from"crypto";import{AsyncLocalStorage as ba}from"async_hooks";var Lr=new ba;function dn(e){Lr.enterWith(e)}function Ce(){return Lr.getStore()}function cn(){Lr.enterWith(void 0)}var va=/(?:authorization|api[_-]?key|token|password|secret|credential|cookie|prompt|file[_-]?path|request[_-]?body|response[_-]?body)/i,Ea=256;function $r(e){let t={};for(let[r,o]of Object.entries(e))o===void 0||va.test(r)||(t[r]=typeof o=="string"?et(o).slice(0,Ea):o);return t}import{DataRangersSDK as Ta}from"@datarangers/sdk-node";import{httpPlugin as Aa}from"@datarangers/node-plugin-http";var Ca=20011588,Sa="https://gator.volces.com",un=1e3,jt=class{disabled;sdk;httpController;logger;pendingEventNames=[];pendingEvents=0;constructor(t={}){if(this.disabled=t.disabled??process.env.OIIOII_TELEMETRY_DISABLED==="1",this.logger=t.logger??Ae(),!this.disabled)try{let r=t.sdk??new Ta({app_id:t.appId??Ca,logLevel:"silent"}),o=t.httpController??Aa({channel_domain:t.channelDomain??Sa,retry:0,timeout:{request:un}});r.use(o),o.on("end",n=>{this.pendingEvents=Math.max(0,this.pendingEvents-1);let i=this.pendingEventNames.shift()??"unknown",s=n.hasSucceed===!0;this.logger.record({level:s?"debug":"warn",category:"application",source:"telemetry",event:s?"telemetry.delivery.completed":"telemetry.delivery.failed",metadata:{event_name:i}})}),this.sdk=r,this.httpController=o}catch(r){this.recordFailure("telemetry.initialization.failed",r)}}send(t){if(!(this.disabled||!this.sdk||!t.userId.trim()))try{this.pendingEvents+=1,this.pendingEventNames.push(t.event),this.sdk.collect(t.event,{...t.params},{user:{user_unique_id:t.userId}})}catch(r){this.pendingEvents=Math.max(0,this.pendingEvents-1),this.pendingEventNames.pop(),this.recordFailure("telemetry.delivery.failed",r,t.event)}}async flush(t=un){if(!this.httpController||this.pendingEvents===0)return;let r=this.httpController;await new Promise(o=>{let n=!1,i=d=>{n||(n=!0,clearTimeout(a),r.removeListener("drain",s),d&&this.pendingEvents>0&&this.logger.record({level:"warn",category:"application",source:"telemetry",event:"telemetry.flush.timeout",metadata:{pending_count:this.pendingEvents}}),o())},s=()=>i(!1),a=setTimeout(()=>i(!0),Math.max(0,t));r.once("drain",s)})}recordFailure(t,r,o){let n=r&&typeof r=="object"&&"code"in r&&typeof r.code=="string"?r.code:void 0;this.logger.record({level:"warn",category:"application",source:"telemetry",event:t,...n?{error:{code:n,message:"Telemetry SDK failure"}}:{},...o?{metadata:{event_name:o}}:{}})}};function xa(){let e=ne(),t=Number.parseInt(process.versions.node.split(".")[0]??"0",10);return{schema_version:1,app_env:e==="local"?"dev":e==="production"?"prod":"test",app_name:"oiioii_cli",cli_version:z,os:process.platform,arch:process.arch,node_major:Number.isFinite(t)?t:0}}function Na(){return`op_${Oa(8).toString("hex")}`}function Ua(e,t){return e.resultOverride==="partial_success"&&t===0&&!e.failureCode?"partial_success":e.failureCode?.endsWith("TIMEOUT")?"timeout":t!==0||e.failureCode?"failure":"success"}var Vr=class{transport;now;operationId;commonParams;constructor(t={}){this.transport=t.transport??new jt,this.now=t.now??Date.now,this.operationId=t.operationId??Na,this.commonParams=t.commonParams??xa}startCommand(t){let r=t.command.trim();if(!r)return;let o=Pr(r),n={command:r,startedAt:this.now(),operationId:this.operationId(),calledSent:!1,businessParams:{},...o?{calledEvent:o.calledEvent,resultEvent:o.resultEvent,action:o.action}:{},...t.userId?.trim()?{userId:t.userId.trim()}:{},...t.workspaceId?.trim()?{workspaceId:t.workspaceId.trim()}:{},...t.traceId?.trim()?{traceId:t.traceId.trim()}:{}};dn(n),this.emitCalled()}identify(t){let r=Ce(),o=t.trim();!r||!o||(r.userId=o,this.emitCalled())}addBusinessInfo(t){let r=Ce();r&&Object.assign(r.businessParams,$r(t))}markPartialSuccess(){let t=Ce();t&&(t.resultOverride="partial_success")}setWorkspaceId(t){let r=Ce(),o=t.trim();r&&o&&(r.workspaceId=o)}reportCommandFailure(t){let r=Ce();r&&t&&(r.failureCode=t)}completeCommand(t=0){let r=Ce();if(!r)return;this.emitCalled();let o=Ua(r,t);r.userId&&r.resultEvent&&r.action&&this.emit(r.resultEvent,{...r.businessParams,operation_id:r.operationId,action:r.action,result:o,duration_ms:Math.max(0,this.now()-r.startedAt),...r.failureCode?{error_code:r.failureCode}:{}}),cn()}async flush(t){await this.transport.flush(t)}emitCalled(){let t=Ce();!t?.userId||!t.calledEvent||!t.action||t.calledSent||(t.calledSent=!0,this.emit(t.calledEvent,{operation_id:t.operationId,action:t.action}))}emit(t,r){let o=Ce();if(!o?.userId)return;let n={...this.commonParams(),command:o.command,...o.traceId?{trace_id:o.traceId}:{},...o.workspaceId?{workspace_id:o.workspaceId}:{}};this.transport.send({userId:o.userId,event:t,params:$r({...r,...n})})}},ln;function Se(){return ln??=new Vr,ln}function E(e){Se().addBusinessInfo(e)}function he(){Se().markPartialSuccess()}function te(e){let t=F(),r=q(e);t&&r&&(t.workspaceId=r),Se().setWorkspaceId(e)}function Je(e){return e<10*1024*1024?"0_10mb":e<100*1024*1024?"10_100mb":e<500*1024*1024?"100_500mb":"500mb_plus"}function Wt(e){return e.startsWith("hogi://audio/")?"audio":e.startsWith("hogi://image/")?"image":e.startsWith("hogi://video/")?"video":"other"}import{fetch as Ma}from"undici";import{Agent as Da}from"undici";async function Oe(e){let t=await e.text().catch(()=>""),r;try{let d=t?JSON.parse(t):void 0;d&&typeof d=="object"&&!Array.isArray(d)&&(r=d)}catch{}let o=r?.error&&typeof r.error=="object"?r.error:void 0,n=o?.data&&typeof o.data=="object"?o.data:void 0,i=[r?.code,r?.errorCode,o?.code,n?.code].find(d=>typeof d=="string"),s=[r?.message,o?.message,typeof r?.error=="string"?r.error:void 0].find(d=>typeof d=="string"&&d.trim().length>0)??(t.trim()?t.trim():void 0),a={status:e.status,...i?{backend_code:i}:{}};return We(i,s)?Ke(i,s,a):e.status===401?new c(u.API_KEY_INVALID,s??"Invalid API key",a):e.status===426||i==="CLI_UPGRADE_REQUIRED"?new c(u.CLI_UPGRADE_REQUIRED,s??"Upgrade oiioii CLI and retry.",{...a,category:"client_version",retryable:!1}):e.status===403&&i==="MEMBERSHIP_REQUIRED"?new c(u.MEMBERSHIP_REQUIRED,s??"An active membership is required.",{...a,category:"auth",retryable:!1}):e.status===429?new c(u.QUOTA_EXCEEDED,s??"Rate limit exceeded",a):i&&/INVALID_PARAMS|RESOLUTION_NOT_SUPPORTED|DURATION_NOT_SUPPORTED/.test(i)?new c(u.MODEL_CONSTRAINT_VIOLATION,s??"The generation request violates model constraints.",{...a,category:"validation",retryable:!1}):e.status>=500?new c(u.SERVER_ERROR,s??`Server error: ${e.statusText||e.status}`,{...a,category:"server",retryable:!0,request_outcome:"unknown"}):new c(u.GENERATION_FAILED,s??`Request failed: ${e.statusText||e.status}`,a)}function ce(e,t){return new c(u.SERVER_ERROR,e,{...t!==void 0?{status:t}:{},category:"response_protocol",retryable:!0,response_protocol:!0})}function se(e){if(!(!e||typeof e!="object")){if("code"in e&&typeof e.code=="string")return e.code;if("cause"in e)return se(e.cause)}}function xe(e){return e instanceof Error&&e.name==="AbortError"?!0:["UND_ERR_HEADERS_TIMEOUT","UND_ERR_BODY_TIMEOUT","UND_ERR_CONNECT_TIMEOUT"].includes(se(e)??"")}function Kt(e){return new Da({headersTimeout:e,bodyTimeout:e})}function zt(e,t){let r=typeof e.errorCode=="string"?e.errorCode:void 0,n=(e.content??[]).filter(d=>d?.type==="text"&&typeof d.text=="string").map(d=>d.text.trim()).filter(Boolean).join(`
10
- `)||t,i=e.structuredContent&&typeof e.structuredContent=="object"?e.structuredContent:void 0,s=i?`${n} ${JSON.stringify(i)}`:n,a={...r?{backend_code:r}:{},...i?{structured_content:i}:{}};return r&&(r.includes("POINTS_INSUFFICIENT")||r.includes("POINTS_LIMIT_EXCEEDED"))?new c(u.QUOTA_EXCEEDED,n,{...a,category:"quota",retryable:!1}):We(r,s)?Ke(r,s,a):r?.includes("MEMBER_ONLY")?new c(u.MEMBERSHIP_REQUIRED,n,{...a,category:"auth",retryable:!1}):r?.includes("TASK_NOT_FOUND")?new c(u.TASK_NOT_FOUND,n,{...a,category:"task",retryable:!1}):r?.includes("TIMEOUT")?new c(u.GENERATION_TIMEOUT,n,{...a,category:"timeout",retryable:!0}):r&&(r.includes("INVALID_PARAMS")||r.includes("RESOLUTION_NOT_SUPPORTED"))?new c(u.MODEL_CONSTRAINT_VIOLATION,n,{...a,category:"validation",retryable:!1}):r&&(r.includes("MODEL_SERVICE_ERROR")||r.includes("CAPACITY_UNAVAILABLE"))?new c(u.PROVIDER_UNAVAILABLE,n,{...a,category:"provider",retryable:!0}):new c(u.GENERATION_FAILED,n,Object.keys(a).length?{...a,category:"provider",retryable:!1}:void 0)}function Pa(e){let t=e.message??"MCP tool call failed";if(/\btool\b.*\bnot found\b/i.test(t))return new c(u.SERVER_ERROR,t,{...e,category:"server_capability",retryable:!1,hint:"Deploy a backend version that exposes the required MCP tool before retrying."});let r={...e,category:"validation",retryable:!1};return Number(e.code)===-32602?new c(u.MODEL_CONSTRAINT_VIOLATION,t,r):Number(e.code)===-32601?new c(u.MODEL_NOT_SUPPORTED,t,r):Number(e.code)===-32700||Number(e.code)===-32600?new c(u.SERVER_ERROR,t,{...e,category:"protocol",retryable:!1}):new c(u.SERVER_ERROR,t,{...e,category:"server",retryable:!0,request_outcome:"unknown"})}var La=1;function $a(e,t){let r=[];for(let o of e.split(/\r?\n/))o.startsWith("data:")&&r.push(o.slice(5).trimStart());if(r.length===0)throw ce("Invalid SSE response from server",t);try{return JSON.parse(r.join(`
11
- `))}catch{throw ce("Invalid JSON in SSE response from server",t)}}async function Va(e){let r=(await e.text()).trim();if(!r)throw ce("Empty response from server",e.status);if(r.startsWith("event:")||r.startsWith("data:"))return $a(r,e.status);try{return JSON.parse(r)}catch{throw ce("Invalid JSON response from server",e.status)}}function Ga(e,t){if(!e||typeof e!="object")throw ce("Invalid MCP response from server",t);return e}var pt=class{baseUrl;apiKey;timeoutMs;_fetch;usesDefaultUndiciTransport;logger;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this.timeoutMs=t.timeoutMs??3e5,this.usesDefaultUndiciTransport=t.fetch===void 0,this._fetch=t.fetch??Ma,this.logger=t.logger}async callTool(t,r,o={}){let n=o.serverName??"genai",i=await this.requestJsonRpc(n,"tools/call",{name:t,arguments:r},`mcp.${n}.${t}`,{tool_name:t});if(!i||typeof i!="object")throw ce("Invalid MCP tool result from server");return i}async requestJsonRpc(t,r,o,n,i){let s=$({source:"hogi_mcp_client",operation:n,method:"POST",path:`/mcp/${t}/sse`,...i?{metadata:i}:{}},this.logger),a=new AbortController,d=setTimeout(()=>a.abort(),this.timeoutMs);typeof d=="object"&&"unref"in d&&d.unref();let l;try{if(l=await s.fetch(this._fetch,`${this.baseUrl}/mcp/${t}/sse`,{method:"POST",headers:V({"content-type":"application/json",accept:"application/json, text/event-stream","x-hogi-api-key":this.apiKey,"x-oiioii-cli-version":z}),body:JSON.stringify({jsonrpc:"2.0",id:La++,method:r,params:o}),...this.usesDefaultUndiciTransport?{dispatcher:Kt(this.timeoutMs)}:{},signal:a.signal}),!l.ok)throw await Oe(l);let p=Ga(await Va(l),l.status);if(p.error)throw Pa(p.error);if(p.result===void 0)throw ce("Missing MCP result from server",l.status);return s.success(l.status),p.result}catch(p){let m=p;if(a.signal.aborted||xe(p))m=new c(u.GENERATION_TIMEOUT,`Request timed out after ${this.timeoutMs}ms`,{retryable:!0,...se(p)?{cause_code:se(p)}:{}});else if(!(p instanceof c)){let f=p instanceof Error?p.message:String(p);m=new c(u.NETWORK_ERROR,`Network error: ${f}`,{retryable:!0,...se(p)?{cause_code:se(p)}:{}})}throw s.failure(m,l?.status),m}finally{clearTimeout(d)}}};function mn(e,t){if(e.isError)throw zt(e,`${t} failed`);let r=(e.content??[]).filter(o=>o?.type==="text").map(o=>o.text).find(o=>typeof o=="string"&&o.trim().length>0);if(!r)throw new c(u.SERVER_ERROR,`Invalid ${t} response: missing JSON text`);try{let o=JSON.parse(r);if(!o||typeof o!="object"||Array.isArray(o))throw new Error("not an object");return o}catch{throw new c(u.SERVER_ERROR,`Invalid ${t} response: malformed JSON`)}}var ye=class{mcp;baseUrl;apiKey;_fetch;logger;timeoutMs;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this._fetch=t.fetch??globalThis.fetch,this.logger=t.logger,this.timeoutMs=t.timeoutMs,this.mcp=new pt(t)}async getBalance(){let t=mn(await this.mcp.callTool("get_user_info",{},{serverName:"res"}),"points balance");if(typeof t.points!="number"||typeof t.tier!="string")throw new c(u.SERVER_ERROR,"Invalid points balance response");return t}async getGenerationCosts(t){if(t.length===0||t.length>20||t.some(n=>!n.startsWith("hogi://")))throw new c(u.INVALID_ARGUMENT,"Provide 1-20 hogi:// generation URIs");let r=mn(await this.mcp.callTool("query_generation_cost",{uris:t},{serverName:"res"}),"generation cost query");if(!Array.isArray(r.entries))throw new c(u.SERVER_ERROR,"Invalid generation cost response");return{entries:r.entries.map(n=>({...n,...n.status==="charged"&&typeof n.chargedAmount=="number"?{consumed_points:Math.abs(n.chargedAmount)}:{}})),...typeof r.note=="string"?{note:r.note}:{}}}async getLogs(t={}){let r=new URLSearchParams;t.cursorId!==void 0&&r.set("cursor_id",String(t.cursorId)),t.days!==void 0&&r.set("days",String(t.days)),t.limit!==void 0&&r.set("limit",String(t.limit)),t.type!==void 0&&r.set("type",t.type);let o="/v1/points/logs",n=$({source:"hogi_points_client",operation:"points.logs",method:"GET",path:o},this.logger),i;try{return await j({operation:"Points logs request",timeoutMs:this.timeoutMs,run:async s=>{if(i=await n.fetch(this._fetch,`${this.baseUrl}${o}?${r.toString()}`,{method:"GET",headers:V({accept:"application/json","x-hogi-api-key":this.apiKey}),signal:s}),i.status===401)throw new c(u.API_KEY_INVALID,"Invalid API key",{status:401});let a;try{a=await i.json()}catch{throw new c(u.SERVER_ERROR,"Invalid JSON response from points logs API")}if(!i.ok||a.ok!==!0)throw new c(u.SERVER_ERROR,a.error?.message??`Points logs request failed: HTTP ${i.status}`,{status:i.status});if(!a.data||typeof a.data!="object"||Array.isArray(a.data))throw new c(u.SERVER_ERROR,"Invalid points logs response");let d=a.data;if(!Array.isArray(d.entries)||typeof d.hasMore!="boolean")throw new c(u.SERVER_ERROR,"Invalid points logs response");let l={entries:d.entries,hasMore:d.hasMore,...typeof d.nextCursor=="number"?{nextCursor:d.nextCursor}:{}};if(l.hasMore&&l.nextCursor===void 0)throw new c(u.SERVER_ERROR,"Invalid points logs response: missing next cursor");return n.success(i.status,{entry_count:l.entries.length,has_more:l.hasMore}),l}})}catch(s){if(s instanceof B){let d=new c(u.NETWORK_ERROR,s.message,{retryable:!0,timeout_ms:s.timeoutMs});throw n.failure(d,i?.status),d}if(s instanceof c)throw n.failure(s,i?.status),s;let a=new c(u.NETWORK_ERROR,`Network error: ${s instanceof Error?s.message:String(s)}`);throw n.failure(a,i?.status),a}}};var Fa=1e3,Ba={record:()=>{}};function ft(e){return typeof e=="string"&&e.trim()?e.trim():void 0}async function Gr(e,t,r,o=Se(),n={}){try{let i=O(e),s=(n.configStore??new b).loadResolved(),a=e.registeredArguments.findIndex(U=>U.name()==="workspace_id"),d=q(e.processedArgs[a])??q(e.opts().workspaceId)??ft(i.workspace)??ft(process.env.OIIOII_WORKSPACE_ID)??ft(s.defaultWorkspaceId);o.startCommand({command:t,...d?{workspaceId:d}:{},...r?{traceId:r}:{}});let l=F(),p=ft(i.baseUrl)??s.baseUrl;if(l&&(l.workspaceId=d,l.identityKey=s.apiKey?qt(p,s.apiKey.trim()):void 0),process.env.OIIOII_TELEMETRY_DISABLED==="1")return;let m=ft(s.apiKey);if(!m)return;let f=await new ye({baseUrl:p,apiKey:m,timeoutMs:n.identityTimeoutMs??Fa,logger:Ba,...n.fetch?{fetch:n.fetch}:{}}).getBalance(),h=ft(f.userId);h&&(o.identify(h),l&&(l.uid=h))}catch{}}function Jt(e,t=Se()){t.reportCommandFailure(e)}function Ht(e=0,t=Se()){t.completeCommand(e)}async function Fr(e,t=Se()){await t.flush(e)}function I(e,t,r){return{ok:!0,type:e,data:t,...r?{next:r}:{}}}function C(e,t,r,o){je(t,r);let n=o&&typeof o=="object"&&!Array.isArray(o)?o:void 0;return{ok:!1,type:e,error:{code:t,...typeof n?.category=="string"?{category:n.category}:{},...typeof n?.hint=="string"?{hint:n.hint}:{},message:r,...typeof n?.retryable=="boolean"?{retryable:n.retryable}:{},...typeof n?.trace_id=="string"?{trace_id:n.trace_id}:{},...o!==void 0?{details:o}:{}}}}function _(e){process.stdout.write(JSON.stringify(e,null,2)+`
12
- `)}function g(e){console.log(e)}function N(e){console.log(`\u2713 ${e}`)}function K(e){console.error(`\u26A0 ${e}`)}function S(e){je(void 0,e),console.error(`\u2717 ${e}`)}function W(e){console.log(`
13
- ${e}`),console.log("\u2500".repeat(e.length))}function pn(e,t){let r=e.map((i,s)=>Math.max(i.length,...t.map(a=>(a[s]??"").length),1)),o=`+${r.map(i=>"-".repeat(i+2)).join("+")}+`,n=i=>`| ${r.map((s,a)=>(i[a]??"").padEnd(s)).join(" | ")} |`;console.log(o),console.log(n(e)),console.log(o);for(let i of t)console.log(n(i));console.log(o)}import{Command as Za}from"commander";import{mkdir as qa,writeFile as ja}from"fs/promises";import{existsSync as Wa,statSync as Ka}from"fs";import{basename as za,dirname as Ja,join as Ha,resolve as fn}from"path";function gn(e){if(!e||!e.startsWith("hogi://"))throw new c(u.INVALID_ARGUMENT,`Invalid hogi URI: "${e}". Expected format: hogi://image/<id> or hogi://video/<id>`)}function Ya(e){try{let t=new URL(e),r=za(t.pathname);if(r&&r!=="."&&r!=="/")return r}catch{}return"resource.bin"}function Qa(e,t){let r=Ya(e);if(!t)return fn(process.cwd(),r);let o=fn(t);return Wa(o)&&Ka(o).isDirectory()?Ha(o,r):o}function Xa(e,t){if(e?.toLowerCase().includes("application/json"))return!0;let r=t.subarray(0,128).toString("utf8").trimStart();return r.startsWith("{")&&(r.includes('"error"')||r.includes('"code"'))}var gt=class{baseUrl;apiKey;_fetch;logger;timeoutMs;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this._fetch=t.fetch??globalThis.fetch,this.logger=t.logger,this.timeoutMs=t.timeoutMs??3e5}getReadUrl(t,r={}){gn(t);let o=new URLSearchParams;return o.set("uri",t),r.filename&&o.set("filename",r.filename),typeof r.watermark=="boolean"&&o.set("wm",r.watermark?"1":"0"),t.startsWith("hogi://image/")&&r.watermark!==!0&&o.set("format","original"),`${this.baseUrl}/v1/res/read_file?${o.toString()}`}async download(t,r={}){gn(t);let o=this.getReadUrl(t,r),n=Qa(t,r.output),i=$({source:"hogi_res_client",operation:"resource.read",method:"GET",path:"/v1/res/read_file"},this.logger),s,a;try{a=await j({operation:"Resource download request",timeoutMs:this.timeoutMs,run:async d=>{if(s=await i.fetchResource(this._fetch,o,{method:"GET",headers:V({"x-hogi-api-key":this.apiKey,accept:"image/*,video/*,application/octet-stream,application/json;q=0.5,*/*;q=0.1"}),signal:d}),s.status===401)throw new c(u.API_KEY_INVALID,"Invalid API key",{status:401});if(s.status===404)throw new c(u.RECORD_NOT_FOUND,`Resource not found for URI: ${t}`,{status:404});if(!s.ok){let m=await s.text().catch(()=>"");throw new c(u.SERVER_ERROR,`HTTP ${s.status}: ${m||s.statusText}`,{status:s.status})}let l=s.headers.get("content-type"),p=Buffer.from(await s.arrayBuffer());if(Xa(l,p)){let m="Resource read failed";try{let f=JSON.parse(p.toString("utf8"));m=f.message??f.error??f.code??m}catch{}throw new c(u.SERVER_ERROR,m)}return{contentType:l,buffer:p}}})}catch(d){if(d instanceof B){let m=new c(u.NETWORK_ERROR,d.message,{retryable:!0,timeout_ms:d.timeoutMs});throw i.failure(m,s?.status),m}if(d instanceof c)throw i.failure(d,s?.status),d;let l=d instanceof Error?d.message:String(d),p=new c(u.NETWORK_ERROR,`Network error: ${l}`);throw i.failure(p),p}return i.success(s.status,{bytes:a.buffer.byteLength,mime_type:a.contentType}),await qa(Ja(n),{recursive:!0}),await ja(n,a.buffer),y("record","resource.saved",{bytes:a.buffer.byteLength,mime_type:a.contentType}),{path:n,bytes:a.buffer.byteLength,mimeType:a.contentType,uri:t}}};function hn(e,t){let r=t.configStore??new b,o=P(e,r);return{auth:o,configStore:r,workspaceClient:new _e({baseUrl:o.baseUrl,apiKey:o.apiKey,...t.fetch?{fetch:t.fetch}:{}})}}async function ed(e,t,r={}){let{configStore:o,workspaceClient:n}=hn(t,r),i=ze(t,o,e.workspaceId),s=await n.listAssets(i);return y("workspace_assets","assets.listed",{workspace_id:i,count:s.length}),{workspace_id:i,count:s.length,assets:s}}function td(e){return e.startsWith("hogi://asset/")?e.slice(13):e}function rd(e,t){let r=td(t.trim()),o=e.find(n=>n.assetId===r);if(!o)throw new c(u.RECORD_NOT_FOUND,`Workspace asset not found: ${t}`,{asset_reference:t});if(o.status)throw new c(u.INVALID_ARGUMENT,`Workspace asset ${o.assetId} is not ready for download (status: ${o.status}).`,{asset_id:o.assetId,status:o.status});if(!o.uri.startsWith("hogi://")||o.uri.startsWith("hogi://asset/"))throw new c(u.INVALID_ARGUMENT,`Workspace asset ${o.assetId} has no downloadable resource URI.`,{asset_id:o.assetId,uri:o.uri});return o}async function od(e,t,r={}){let o=e.asset.trim();if(!o)throw new c(u.INVALID_ARGUMENT,"Asset ID is required");let{auth:n,configStore:i,workspaceClient:s}=hn(t,r),a=ze(t,i,e.workspaceId),d=rd(await s.listAssets(a),o),l=await new gt({baseUrl:n.baseUrl,apiKey:n.apiKey,...r.fetch?{fetch:r.fetch}:{}}).download(d.uri,{...e.output?{output:e.output}:{},...e.filename?{filename:e.filename}:{},...e.watermark!==void 0?{watermark:e.watermark}:{}});return y("workspace_assets","asset.downloaded",{workspace_id:a,asset_id:d.assetId,bytes:l.bytes}),{workspace_id:a,asset_id:d.assetId,uri:d.uri,path:l.path,bytes:l.bytes,mime_type:l.mimeType}}function _n(e,t,r){let o=e instanceof c?e:new c(u.SERVER_ERROR,e instanceof Error?e.message:String(e));t?_(C(r,o.code,o.message,o.details)):S(o.message),process.exitCode=1}function yn(e={}){let t=new Za("assets").description("List and download workspace assets");return t.command("list").description("List assets in a workspace").argument("[workspace_id]","Workspace ID; defaults to the active workspace").action(async(r,o,n)=>{let i=A(n);try{let s=await ed({workspaceId:r},O(n),e);if(te(s.workspace_id),E({asset_count:s.count}),i)_(I("workspace_assets_list",s));else{W(`Workspace assets (${s.count})`);for(let a of s.assets)g(` ${a.assetId} ${a.type} ${a.status??"ready"} ${a.uri||"-"}`)}}catch(s){_n(s,i,"workspace_assets_list")}}),t.command("download").description("Download a workspace asset by asset ID or hogi://asset URI").argument("<asset>","Workspace asset ID or hogi://asset/<id>").option("-o, --output <path>","Output file or directory path").option("--filename <name>","Download filename hint passed to backend").option("--wm","Request watermarked asset").action(async(r,o,n)=>{let i=A(n);try{let s=await od({asset:r,...o.output?{output:o.output}:{},...o.filename?{filename:o.filename}:{},...o.wm!==void 0?{watermark:o.wm}:{}},O(n),e);te(s.workspace_id),E({resource_type:new URL(s.uri).hostname,size_bytes:s.bytes}),i?_(I("workspace_asset_download",s)):N(`Downloaded workspace asset ${s.asset_id}: ${s.path}`)}catch(s){_n(s,i,"workspace_asset_download")}}),t}import{readFile as Cd}from"fs/promises";import{resolve as Sd}from"path";import{Command as Od}from"commander";var ue=class{baseUrl;apiKey;_fetch;logger;timeoutMs;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this._fetch=t.fetch??globalThis.fetch,this.logger=t.logger,this.timeoutMs=t.timeoutMs}async listModels(t={}){let r=$({source:"hogi_model_catalog_client",operation:"models.list",method:"POST",path:"/points/mcp_model_pricings"},this.logger),o;try{return await j({operation:"Model catalog request",timeoutMs:this.timeoutMs,run:async n=>{if(o=await r.fetch(this._fetch,`${this.baseUrl}/points/mcp_model_pricings`,{method:"POST",headers:V({"content-type":"application/json",accept:"application/json",connection:"close","x-hogi-api-key":this.apiKey}),body:JSON.stringify(t.includeDisplayNames?{includeDisplayNames:!0}:{}),signal:n}),o.status===401)throw new c(u.API_KEY_INVALID,"Invalid API key",{status:401});if(!o.ok)throw new c(u.SERVER_ERROR,`Model catalog request failed: HTTP ${o.status}`,{status:o.status});let i;try{i=await o.json()}catch{throw new c(u.SERVER_ERROR,"Invalid JSON response from model catalog")}if(i.code==="UNAUTHORIZED")throw new c(u.API_KEY_INVALID,"Invalid API key",{status:401});let s=i.data?.pricings;if(i.code!=="SUCCESS"||!Array.isArray(s)||s.some(a=>!nd(a)))throw new c(u.SERVER_ERROR,i.error??"Invalid model catalog response from server");return r.success(o.status,{model_count:s.length}),s}})}catch(n){if(n instanceof B){let a=new c(u.NETWORK_ERROR,n.message,{retryable:!0,timeout_ms:n.timeoutMs});throw r.failure(a,o?.status),a}if(n instanceof c)throw r.failure(n,o?.status),n;let i=n instanceof Error?n.message:String(n),s=new c(u.NETWORK_ERROR,`Network error: ${i}`);throw r.failure(s),s}}};function nd(e){if(!e||typeof e!="object")return!1;let t=e,r=i=>Array.isArray(i)&&i.every(s=>typeof s=="string"),o=t.input_capabilities===void 0||r(t.input_capabilities)&&t.input_capabilities.every(i=>["text","image","video","audio","file"].includes(i)),n=i=>i==null||typeof i=="number"&&Number.isInteger(i)&&i>=0;return typeof t.id=="number"&&typeof t.mcp_method_name=="string"&&(t.name===null||typeof t.name=="string")&&(t.display_name===void 0||t.display_name===null||typeof t.display_name=="string")&&(t.model===null||typeof t.model=="string")&&typeof t.points_cost=="number"&&r(t.sizes)&&r(t.aspect_ratios)&&(t.durations===void 0||r(t.durations))&&o&&n(t.reference_image_count_min)&&n(t.reference_image_count_max)&&r(t.tags)&&!!t.description_i18n&&typeof t.description_i18n=="object"&&!Array.isArray(t.description_i18n)&&(t.members_only===void 0||t.members_only===null||typeof t.members_only=="boolean")&&typeof t.sort_order=="number"}import{z as D}from"zod";var rt=D.string().trim().min(1).max(200),Br=D.string().trim().min(1).max(100),tt=D.string().trim().min(1).max(100);function id(e){if(e.startsWith("generate_music_"))return"audio";if(e.startsWith("generate_video_"))return"video";if(e.startsWith("generate_image_"))return"image";if(e.startsWith("generate_text_"))return"text"}var sd=D.object({duration:D.union([D.number().positive().finite(),D.literal("auto")]).optional(),mcp_method_name:rt.optional(),model_version:rt.optional(),quality:tt.optional(),ratio:tt.optional(),resolution:tt.optional()}).strict().refine(e=>Object.values(e).some(t=>t!==void 0),{message:"generation_config must include at least one parameter"}),qr=D.object({kind:D.literal("media"),media_type:D.enum(["audio","image","text","video"]),uri:D.string().trim().min(1).max(2048)}).strict().superRefine((e,t)=>{let r=`hogi://${e.media_type}/`;(!e.uri.startsWith(r)||e.uri===r)&&t.addIssue({code:D.ZodIssueCode.custom,path:["uri"],message:`URI must start with ${r} and include a resource key`})}),jr=D.object({kind:D.literal("workspace_asset"),asset_id:rt,asset_type:D.enum(["item","role","scene"])}).strict(),ad=D.union([D.object({client_node_id:Br}).strict(),D.object({asset_id:rt}).strict()]),dd=D.object({nodes:D.array(D.object({client_id:Br,type:D.enum(["audio","image","video"]),title:D.string().trim().max(100).optional(),prompt:D.string().max(2e4).optional(),generation_config:sd.optional(),references:D.array(D.union([qr,jr])).max(50).optional()}).strict().superRefine((e,t)=>{let r=e.generation_config;if(!r||(r.model_version&&!r.mcp_method_name&&t.addIssue({code:D.ZodIssueCode.custom,path:["generation_config","model_version"],message:"model_version requires mcp_method_name"}),!r.mcp_method_name))return;let o=id(r.mcp_method_name);o?o!==e.type&&t.addIssue({code:D.ZodIssueCode.custom,path:["generation_config","mcp_method_name"],message:`Generation model type ${o} does not match node type ${e.type}`}):t.addIssue({code:D.ZodIssueCode.custom,path:["generation_config","mcp_method_name"],message:"Unknown generation model method"})})).max(100).optional().default([]),groups:D.array(D.object({client_id:Br,title:D.string().trim().max(100).optional(),existing_member_policy:D.enum(["move","reject"]).optional(),members:D.array(ad).min(1).max(100)}).strict()).max(50).optional().default([])}).strict().superRefine((e,t)=>{e.nodes.length===0&&e.groups.length===0&&t.addIssue({code:D.ZodIssueCode.custom,path:[],message:"Composition must include at least one node or group"});let r=new Set;e.nodes.forEach((i,s)=>{r.has(i.client_id)&&t.addIssue({code:D.ZodIssueCode.custom,path:["nodes",s,"client_id"],message:"Node client_id values must be unique"}),r.add(i.client_id)});let o=new Set,n=new Map;e.groups.forEach((i,s)=>{o.has(i.client_id)&&t.addIssue({code:D.ZodIssueCode.custom,path:["groups",s,"client_id"],message:"Group client_id values must be unique"}),o.add(i.client_id);let a=new Set;i.members.forEach((d,l)=>{let p="client_node_id"in d?`client:${d.client_node_id}`:`asset:${d.asset_id}`;"client_node_id"in d&&!r.has(d.client_node_id)&&t.addIssue({code:D.ZodIssueCode.custom,path:["groups",s,"members",l],message:`Unknown client node: ${d.client_node_id}`}),a.has(p)&&t.addIssue({code:D.ZodIssueCode.custom,path:["groups",s,"members",l],message:"A group cannot contain the same member more than once"});let m=n.get(p);m&&t.addIssue({code:D.ZodIssueCode.custom,path:["groups",s,"members",l],message:`A node cannot belong to multiple groups (${m}, ${i.client_id})`}),a.add(p),n.set(p,i.client_id)})})});function cd(e){return e.length>0?e.join("."):"input"}function Wr(e){let t=dd.safeParse(e);if(t.success)return t.data;let r=t.error.issues.map(n=>({path:cd(n.path),message:n.message})),o=r[0];throw new c(u.INVALID_ARGUMENT,`Invalid canvas composition input${o?` at ${o.path}: ${o.message}`:""}`,{category:"validation",retryable:!1,issues:r})}var ud=/^hogi:\/\/(role|scene|item)_asset\/([A-Za-z0-9_-]+)$/,ld=/\[(Role|Scene|Item):([^\]]+)]/g,md=/^[A-Za-z0-9_-]+$/;function pd(e){return e==="Role"?"role":e==="Scene"?"scene":"item"}function fd(e){return e==="role"?"Role":e==="scene"?"Scene":"Item"}function we(e){let t=e.trim(),r=ud.exec(t);if(!r)throw new c(u.INVALID_ARGUMENT,`Invalid asset library URI: ${e}. Expected hogi://role_asset/<id>, hogi://scene_asset/<id>, or hogi://item_asset/<id>.`);let o=r[2];if(o.length>200)throw new c(u.INVALID_ARGUMENT,`Asset library ID is too long: ${o.slice(0,40)}...`);return{kind:"workspace_asset",assetType:r[1],assetId:o}}function wn(e){return`hogi://${e.assetType}_asset/${e.assetId}`}function gd(e){let t=e.indexOf("=");if(t<=0||t===e.length-1)throw new c(u.INVALID_ARGUMENT,`Invalid asset binding: ${e}. Expected <name>=<asset-uri>, for example \u7403\u7403=hogi://role_asset/<id>.`);let r=e.slice(0,t).trim().replace(/^@/,"");if(!r||r.length>100||/[@\[\]=\n\r]/.test(r))throw new c(u.INVALID_ARGUMENT,`Invalid asset binding name: ${e.slice(0,t).trim()}`);return{alias:r,reference:we(e.slice(t+1))}}function Kr(e){return`${e.assetType}:${e.assetId}`}function _d(e){let t=new Set;return e.filter(r=>{let o=Kr(r);return t.has(o)?!1:(t.add(o),!0)})}function ot(e){let t=e.prompt,r=(e.assets??[]).map(we),o=(e.bindings??[]).map(gd),n=new Map;for(let d of o){let l=n.get(d.alias);if(l&&Kr(l)!==Kr(d.reference))throw new c(u.INVALID_ARGUMENT,`Asset binding @${d.alias} maps to more than one asset.`);n.set(d.alias,d.reference)}for(let[d,l]of[...n.entries()].sort(([p],[m])=>m.length-p.length)){let p=`@${d}`;if(!t.includes(p))throw new c(u.INVALID_ARGUMENT,`Asset binding ${p} was not found in the prompt.`);t=t.split(p).join(`[${fd(l.assetType)}:${l.assetId}]`),r.push(l)}let i=new RegExp(ld.source,"g"),s=null;for(;(s=i.exec(t))!==null;){let d=s[2]?.trim();if(!d||d.length>200||!md.test(d))throw new c(u.INVALID_ARGUMENT,`Invalid asset placeholder in prompt: ${s[0]}`);r.push({kind:"workspace_asset",assetType:pd(s[1]),assetId:d})}let a=_d(r);if(a.length>50)throw new c(u.INVALID_ARGUMENT,`Too many asset references: ${a.length}. Maximum is 50.`);return{prompt:t,references:a}}function le(e,t){let r=e.loadResolved().generationTransport??"openapi";return t.some(n=>n.kind==="workspace_asset")?(r!=="openapi"&&y("async_generation","transport.selected",{configured_transport:r,selected_transport:"openapi",reason:"workspace_asset_reference"}),"openapi"):r}function Re(...e){let t=new Set,r=[];for(let o of e.flat()){let n=o.kind==="media"?`media:${o.mediaType}:${o.uri}`:`asset:${o.assetType}:${o.assetId}`;t.has(n)||(t.add(n),r.push(o))}return r}import{z as Ne}from"zod";var hd=Ne.object({duration:Ne.union([Ne.number().positive().finite(),Ne.literal("auto"),Ne.null()]).optional(),mcp_method_name:rt.nullable().optional(),model_version:rt.nullable().optional(),quality:tt.nullable().optional(),ratio:tt.nullable().optional(),resolution:tt.nullable().optional()}).strict().refine(e=>Object.keys(e).length>0,{message:"generation_config must include at least one parameter"}),yd=Ne.object({generation_config:hd.optional(),prompt:Ne.string().max(2e4).nullable().optional(),references:Ne.array(Ne.union([qr,jr])).max(50).optional()}).strict().refine(e=>Object.keys(e).length>0,{message:"update input must include generation_config, prompt, or references"});function wd(e){return e.length>0?e.join("."):"input"}function zr(e){let t=yd.safeParse(e);if(t.success)return t.data;let r=t.error.issues.map(n=>({path:wd(n.path),message:n.message})),o=r[0];throw new c(u.INVALID_ARGUMENT,`Invalid canvas node update input${o?` at ${o.path}: ${o.message}`:""}`,{category:"validation",retryable:!1,issues:r})}function Jr(e){return e.startsWith("hogi://")?e.slice(7):e}function Rd(e){if(e.kind==="workspace_asset")return"image";if(e.media_type==="image"||e.media_type==="audio"||e.media_type==="video")return e.media_type}function Id(e){if(e.kind==="workspace_asset")return`[${e.asset_type==="role"?"Role":e.asset_type==="scene"?"Scene":"Item"}:${e.asset_id}]`;if(e.media_type==="image")return`[Image:${Jr(e.uri)}]`;if(e.media_type==="audio")return`[Audio:${Jr(e.uri)}]`;if(e.media_type==="video")return`[Video:${Jr(e.uri)}]`}function Hr(e,t,r,o){let n=t.filter(i=>Rd(i)===r).map(Id);return e.replace(o,(i,s)=>{let a=Number(s)-1;return n[a]??i})}function Yr(e,t){let r=Hr(e,t,"image",/@(?:图片|图)\s*([1-9]\d*)/g),o=Hr(r,t,"audio",/@音频\s*([1-9]\d*)/g);return Hr(o,t,"video",/@视频\s*([1-9]\d*)/g)}var kd={seedream45:"generate_image_seedream45",seedream40:"generate_image_seedream40",seedream50:"generate_image_seedream50","seedream50-lite":"generate_image_seedream50lite","seedream50-pro":"generate_image_seedream50pro",gpt4o:"generate_image_gpt4o","gpt-image2":"generate_image_gpt_image2","gpt-image-2":"generate_image_gpt_image2",midjourney:"generate_image_midjourney",midjourney8:"generate_image_midjourney8",flux:"generate_image_flux",nano:"generate_image_nano",qwen:"generate_image_qwen","qwen-image3":"generate_image_qwen_image3",comfyui:"generate_image_comfyui",novelai:"generate_image_novelai"},bd={seedance20:"generate_video_seedance20","seedance 2.0":"generate_video_seedance20",kling:"generate_video_kling","kling-o1":"generate_video_kling_o1",hailuo02:"generate_video_hailuo02","minimax-h3":"generate_video_minimax_h3",wan:"generate_video_wan",wan26:"generate_video_wan26",wan27:"generate_video_wan27",vidu:"generate_video_vidu",veo3:"generate_video_veo3",sora2:"generate_video_sora2","sora2-pro":"generate_video_sora2_pro",grok:"generate_video_grok","grok-imagine":"generate_video_grok_imagine","grok-imagine-1.5":"generate_video_grok_imagine_15","grok-imagine-1.5-fast":"generate_video_grok_imagine_15_fast",seedance25:"generate_video_seedance25","midjourney-video":"generate_video_midjourney"},vd={"seed-audio":"generate_music_seed_audio","seed-audio-1.0":"generate_music_seed_audio",suno:"generate_music_suno"};function Rn(e){return e==="image"?kd:e==="video"?bd:vd}function Ed(e){return e==="audio"?"generate_music_":`generate_${e}_`}function In(e,t){let r=Rn(t),o=r[e];if(!o){y("model_map","model.resolve_failed",{domain:t,model:e},"warn");let n=Object.keys(r).join(", ");throw new c(u.MODEL_NOT_SUPPORTED,`Unknown ${t} model: "${e}". Available: ${n}`,{category:"validation",retryable:!1,hint:`Run oiioii inspect models --domain ${t} --json to list active models.`,domain:t,model:e})}return y("model_map","model.resolved",{domain:t,model:e,tool:o}),o}function Td(e){let t=Rn(e);return Object.entries(t).map(([r,o])=>({name:r,tool:o}))}function Ot(e,t){let r=Ed(t);return!e.startsWith(r)||e.length===r.length?void 0:Td(t).find(n=>n.tool===e)?.name??e.slice(r.length)}function kn(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"")}function vn(e,t){let r=Qr(e);if(!r)return!1;let o=kn(t),n=Ot(e.mcp_method_name,r);return[e.name,n,n&&e.model?`${n}${e.model}`:void 0].filter(s=>typeof s=="string").some(s=>kn(s)===o)}function Qr(e){if(e.mcp_method_name.startsWith("generate_image_"))return"image";if(e.mcp_method_name.startsWith("generate_video_"))return"video";if(e.mcp_method_name.startsWith("generate_music_"))return"audio"}function En(e){return[...e].sort((t,r)=>t.sort_order-r.sort_order||t.id-r.id)[0]}function _t(e,t){let r=Qr(e);if(!r||t&&r!==t)throw new c(u.MODEL_NOT_SUPPORTED,`Model ID ${e.id} belongs to ${r??"an unsupported"} domain${t?`, not ${t}`:""}.`,{category:"validation",retryable:!1,model_id:e.id,...t?{expected_domain:t}:{}});let o=Ot(e.mcp_method_name,r);if(!o)throw new c(u.MODEL_NOT_SUPPORTED,`Model ID ${e.id} is not supported by ${r} generation.`,{category:"validation",retryable:!1,model_id:e.id});return{key:o,toolName:e.mcp_method_name,modelId:e.id,name:e.name??e.model??o,...e.model?{variant:e.model}:{},catalog:e,catalogStatus:"exact"}}function xt(e,t){if(t.modelId&&(t.model||t.variant))throw new c(u.INVALID_ARGUMENT,"Use --model-id or --model [--variant], not both.");if(t.variant&&!t.model)throw new c(u.INVALID_ARGUMENT,"--variant requires --model.");if(!t.modelId&&!t.model)throw new c(u.INVALID_ARGUMENT,"Provide --model-id or --model [--variant].");if(t.modelId){let i=Ad(t.modelId),s=e.find(a=>a.id===i);if(s)return s;throw new c(u.MODEL_NOT_SUPPORTED,`Model ID ${i} is not present in the active backend model catalog.`,{category:"validation",retryable:!1,hint:"Run oiioii inspect models --json and select an active model_id.",model_id:i})}let r=e.filter(i=>vn(i,t.model)),o=t.variant?r.filter(i=>i.model===t.variant):r,n=En(o);if(n)return n;throw new c(u.MODEL_NOT_SUPPORTED,t.variant?`Model ${t.model} does not have variant "${t.variant}" in the active backend model catalog.`:`Model ${t.model} is not present in the active backend model catalog.`,{category:"validation",retryable:!1,hint:"Run oiioii inspect models --json and select an active model.",model:t.model,...t.variant?{variant:t.variant}:{}})}function Ad(e){if(!/^\d+$/.test(e))throw new c(u.INVALID_ARGUMENT,`Invalid model ID: "${e}". Expected a positive integer from inspect models.`);let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new c(u.INVALID_ARGUMENT,`Invalid model ID: "${e}". Expected a positive integer from inspect models.`);return t}async function nt(e){if(e.modelId&&e.variant)throw new c(u.INVALID_ARGUMENT,"Use either --model-id or --variant, not both.");if(!e.modelId&&!e.variant){let n={key:e.model,toolName:In(e.model,e.domain)};if(!e.requireActiveCatalog)return n;let s=(await new ue({baseUrl:e.baseUrl,apiKey:e.apiKey,...e.fetch?{fetch:e.fetch}:{}}).listModels()).filter(d=>Qr(d)===e.domain&&(d.mcp_method_name===n.toolName||vn(d,e.model)));if(s.length===0)throw new c(u.MODEL_NOT_SUPPORTED,`Model ${e.model} is not present in the active backend model catalog.`,{category:"validation",retryable:!1,hint:"Run oiioii inspect models --json and select an active model.",model:e.model});let a=s.find(d=>d.mcp_method_name===n.toolName&&d.model===null)??En(s);return a?{..._t(a,e.domain),key:e.model}:{...n,catalogStatus:"ambiguous"}}let t=await new ue({baseUrl:e.baseUrl,apiKey:e.apiKey,...e.fetch?{fetch:e.fetch}:{}}).listModels(),r=xt(t,e.modelId?{modelId:e.modelId}:{model:e.model,variant:e.variant}),o=_t(r,e.domain);return e.modelId?o:{...o,key:e.model}}function Tn(e){return[...new Set(e.catalog?.input_capabilities??[])]}function Nt(e,t){let r=e.catalog?.durations?.[0]?.trim(),o=t.duration;if(r&&/^\d+(?:\.\d+)?$/.test(r))o=Number(r);else if(r){let n=/^(\d+(?:\.\d+)?)\s*-\s*(\d+(?:\.\d+)?)$/.exec(r);n&&(o=Number(n[1]))}return{aspectRatio:e.catalog?.aspect_ratios[0]??t.aspectRatio,resolution:e.catalog?.sizes[0]??t.resolution,...o!==void 0?{duration:o}:{}}}function bn(e){let t=e.trim().toLowerCase();return t==="adaptive"?"auto":t}function it(e,t){let r=e.catalog;if(r){if(t.aspectRatio&&r.aspect_ratios.length>0){let o=bn(t.aspectRatio);if(!r.aspect_ratios.map(bn).includes(o))throw new c(u.MODEL_CONSTRAINT_VIOLATION,`${e.name??e.key} does not support aspect ratio ${t.aspectRatio}. Supported: ${r.aspect_ratios.join(", ")}.`,{category:"validation",retryable:!1,field:"aspect_ratio",received:t.aspectRatio,supported:r.aspect_ratios})}if(t.resolution&&r.sizes.length>0){let o=t.resolution.trim().toLowerCase();if(!r.sizes.some(n=>n.trim().toLowerCase()===o))throw new c(u.MODEL_CONSTRAINT_VIOLATION,`${e.name??e.key} does not support resolution ${t.resolution}. Supported: ${r.sizes.join(", ")}.`,{category:"validation",retryable:!1,field:"resolution",received:t.resolution,supported:r.sizes})}if(t.duration!==void 0&&r.durations&&r.durations.length>0&&!r.durations.some(n=>{let i=n.trim();if(/^\d+(?:\.\d+)?$/.test(i))return Number(i)===t.duration;let s=/^(\d+(?:\.\d+)?)\s*-\s*(\d+(?:\.\d+)?)$/.exec(i);return s!==null&&t.duration>=Number(s[1])&&t.duration<=Number(s[2])}))throw new c(u.MODEL_CONSTRAINT_VIOLATION,`${e.name??e.key} does not support duration ${t.duration}s. Supported: ${[...new Set(r.durations)].join(", ")}.`,{category:"validation",retryable:!1,field:"duration",received:t.duration,supported:[...new Set(r.durations)]})}}function Ie(e){return{key:e.key,...e.modelId!==void 0?{model_id:e.modelId}:{},...e.name?{name:e.name}:{},...e.variant?{variant:e.variant}:{}}}function He(e){return e.modelId!==void 0?`--model-id ${e.modelId}`:e.variant?`--model ${e.key} --variant ${e.variant}`:`--model ${e.key}`}var xd=16*1024*1024;async function Nd(e,t,r=async o=>Cd(o,"utf8")){let o=e.trim();if(!o)throw new c(u.INVALID_ARGUMENT,"--input must not be empty");let n;try{n=await r(Sd(o))}catch(i){throw new c(u.INVALID_ARGUMENT,`Unable to read ${t} input: ${i instanceof Error?i.message:String(i)}`,{category:"validation",retryable:!1,path:o})}if(Buffer.byteLength(n,"utf8")>xd)throw new c(u.INVALID_ARGUMENT,"Canvas composition input must not exceed 16 MiB");try{return JSON.parse(n)}catch(i){throw new c(u.INVALID_ARGUMENT,`Canvas composition input is not valid JSON: ${i instanceof Error?i.message:String(i)}`,{category:"validation",retryable:!1,path:o})}}async function Ud(e,t){return await Nd(e,"canvas composition",t)}async function An(e,t,r={}){let o=e.idempotencyKey?.trim();if(e.idempotencyKey!==void 0&&!o)throw new c(u.INVALID_ARGUMENT,"--idempotency-key must not be empty");if(o&&o.length>200)throw new c(u.INVALID_ARGUMENT,"--idempotency-key must not exceed 200 characters");let n=Wr(e.input),i=Wr({...n,nodes:n.nodes.map(p=>p.prompt===void 0?p:{...p,prompt:Yr(p.prompt,p.references??[])})}),s=r.configStore??new b,a=P(t,s),d=ze(t,s,e.workspaceId);y("workspace_canvas","composition.create_requested",{workspace_id:d,node_count:i.nodes.length,group_count:i.groups.length,has_idempotency_key:o!==void 0});let l=await new _e({baseUrl:a.baseUrl,apiKey:a.apiKey,...r.fetch?{fetch:r.fetch}:{}}).createCanvasComposition(d,i,o);return y("workspace_canvas",l.reused?"composition.reused":"composition.created",{workspace_id:l.workspace_id,node_count:l.nodes.length,group_count:l.groups.length}),l}async function Dd(e,t,r={}){let o=e.assetIds.map(s=>s.trim());if(o.length<2)throw new c(u.INVALID_ARGUMENT,"A canvas group requires at least two asset IDs");if(new Set(o).size!==o.length)throw new c(u.INVALID_ARGUMENT,"A canvas group cannot contain duplicate asset IDs");let n=await An({input:{nodes:[],groups:[{client_id:"group",...e.title!==void 0?{title:e.title}:{},existing_member_policy:"reject",members:o.map(s=>({asset_id:s}))}]},workspaceId:e.workspaceId,idempotencyKey:e.idempotencyKey},t,r),i=n.groups[0];if(!i)throw new c(u.SERVER_ERROR,"Invalid canvas group response: missing group");return{workspace_id:n.workspace_id,group_id:i.group_id,member_asset_ids:i.member_asset_ids,reused:n.reused}}function ht(e,t,r,o){if(e!==void 0&&t)throw new c(u.INVALID_ARGUMENT,`${r} cannot be combined with ${o}`)}function Md(e){let t=e.trim().toLowerCase();if(t==="auto")return"auto";let r=Number(t);if(!t||!Number.isFinite(r)||r<=0)throw new c(u.INVALID_ARGUMENT,"--duration must be a positive number or auto");return r}function Pd(e){let t=e.trim(),r=/^hogi:\/\/(audio|image|text|video)\/(.+)$/.exec(t);if(r)return{kind:"media",media_type:r[1],uri:t};let o=we(t);return{kind:"workspace_asset",asset_id:o.assetId,asset_type:o.assetType}}async function Ld(e,t,r){if(ht(e.prompt,e.clearPrompt,"--prompt","--clear-prompt"),ht(e.ratio,e.clearRatio,"--ratio","--clear-ratio"),ht(e.duration,e.clearDuration,"--duration","--clear-duration"),ht(e.resolution,e.clearResolution,"--resolution","--clear-resolution"),ht(e.quality,e.clearQuality,"--quality","--clear-quality"),ht(e.reference,e.clearReferences,"--reference","--clear-references"),e.clearModel&&(e.model!==void 0||e.modelId!==void 0||e.variant!==void 0))throw new c(u.INVALID_ARGUMENT,"--clear-model cannot be combined with --model, --model-id, or --variant");if(e.variant!==void 0&&e.model===void 0)throw new c(u.INVALID_ARGUMENT,"--variant requires --model.");if(e.modelId!==void 0&&(e.model!==void 0||e.variant!==void 0))throw new c(u.INVALID_ARGUMENT,"Use --model-id or --model [--variant], not both.");let o={};e.prompt!==void 0?o.prompt=e.prompt:e.clearPrompt&&(o.prompt=null);let n={};if(e.clearModel)n.mcp_method_name=null,n.model_version=null;else if(e.model!==void 0||e.modelId!==void 0||e.variant!==void 0){let s=await new ue({baseUrl:t.baseUrl,apiKey:t.apiKey,...r.fetch?{fetch:r.fetch}:{}}).listModels(),a=xt(s,{...e.model!==void 0?{model:e.model}:{},...e.modelId!==void 0?{modelId:e.modelId}:{},...e.variant!==void 0?{variant:e.variant}:{}}),d=_t(a);n.mcp_method_name=d.toolName,n.model_version=d.variant??null}e.ratio!==void 0?n.ratio=e.ratio:e.clearRatio&&(n.ratio=null),e.duration!==void 0?n.duration=Md(e.duration):e.clearDuration&&(n.duration=null),e.resolution!==void 0?n.resolution=e.resolution:e.clearResolution&&(n.resolution=null),e.quality!==void 0?n.quality=e.quality:e.clearQuality&&(n.quality=null),Object.keys(n).length>0&&(o.generation_config=n),e.reference!==void 0?o.references=e.reference.map(Pd):e.clearReferences&&(o.references=[]);let i=zr(o);return typeof i.prompt!="string"?i:zr({...i,prompt:Yr(i.prompt,i.references??[])})}async function $d(e,t,r={}){let o=e.assetId.trim();if(!o||o.length>200)throw new c(u.INVALID_ARGUMENT,"asset_id must contain between 1 and 200 characters");let n=r.configStore??new b,i=P(t,n),s=ze(t,n,e.workspaceId),a=await Ld(e,i,r);y("workspace_canvas","node.update_requested",{workspace_id:s,asset_id:o,has_prompt:a.prompt!==void 0,has_generation_config:a.generation_config!==void 0,has_references:a.references!==void 0});let d=await new _e({baseUrl:i.baseUrl,apiKey:i.apiKey,...r.fetch?{fetch:r.fetch}:{}}).updateEmptyCanvasNode(s,o,a);return y("workspace_canvas",d.updated?"node.updated":"node.unchanged",{workspace_id:d.workspace_id,asset_id:d.asset_id}),d}function Vd(e,t){if(te(e.workspace_id),E({node_count:e.nodes.length,group_count:e.groups.length,reused:e.reused}),t){_(I("workspace_canvas_composition_created",e));return}N(`Canvas composition ${e.reused?"reused":"created"}: ${e.nodes.length} node(s), ${e.groups.length} group(s)`),g(` Workspace: ${e.workspace_id}`);for(let r of e.nodes)g(` Node: ${r.client_id} -> hogi://asset/${r.asset_id}`);for(let r of e.groups)g(` Group: ${r.client_id} -> ${r.group_id}`)}function Xr(e,t,r="workspace_canvas_composition_created"){let o=e instanceof c?e:new c(u.SERVER_ERROR,e instanceof Error?e.message:String(e));t?_(C(r,o.code,o.message,o.details)):S(o.message),process.exitCode=1}function Gd(e,t){if(te(e.workspace_id),E({asset_id:e.asset_id,updated:e.updated,type:e.type}),t){_(I("workspace_canvas_node_updated",e));return}N(`Canvas node ${e.updated?"updated":"unchanged"}: hogi://asset/${e.asset_id}`),g(` Workspace: ${e.workspace_id}`),g(` Type: ${e.type}`)}function Fd(e,t){if(te(e.workspace_id),E({group_id:e.group_id,member_count:e.member_asset_ids.length,reused:e.reused}),t){_(I("workspace_canvas_group_created",e));return}N(`Canvas group ${e.reused?"reused":"created"}: ${e.group_id}`),g(` Workspace: ${e.workspace_id}`);for(let r of e.member_asset_ids)g(` Member: hogi://asset/${r}`)}function Cn(e={}){let t=new Od("canvas").description("Create and manage canvas content");return t.command("create").description("Create blank canvas nodes and groups from a JSON input file").argument("[workspace_id]","Workspace ID; defaults to the active workspace").requiredOption("--input <path>","JSON file containing nodes and groups").option("--idempotency-key <key>","Safely replay the same composition request").action(async(n,i,s)=>{let a=A(s);try{let d=await Ud(i.input,e.readInputFile),l=await An({input:d,workspaceId:n,idempotencyKey:i.idempotencyKey},O(s),e);Vd(l,a)}catch(d){Xr(d,a)}}),t.command("node").description("Manage canvas nodes").command("update").description("Update prompt, generation parameters, or references on an empty canvas node").argument("<asset_id>","Empty canvas node asset ID").option("--workspace-id <workspace_id>","Workspace ID; defaults to the active workspace").option("--prompt <text>","Replace the cached prompt").option("--clear-prompt","Clear the cached prompt").option("--model <model>","Select an active model by name").option("--model-id <id>","Select an active model by catalog ID").option("--variant <variant>","Select a variant for --model").option("--clear-model","Clear the cached model method and version").option("--ratio <ratio>","Replace the cached aspect ratio").option("--clear-ratio","Clear the cached aspect ratio").option("--duration <seconds|auto>","Replace the cached duration").option("--clear-duration","Clear the cached duration").option("--resolution <resolution>","Replace the cached resolution").option("--clear-resolution","Clear the cached resolution").option("--quality <quality>","Replace the cached quality").option("--clear-quality","Clear the cached quality").option("--reference <uri...>","Replace references with hogi:// media or library asset URIs").option("--clear-references","Clear all cached references").action(async(n,i,s)=>{let a=A(s);try{let d=await $d({assetId:n,...i},O(s),e);Gd(d,a)}catch(d){Xr(d,a,"workspace_canvas_node_updated")}}),t.command("group").description("Manage canvas groups").command("create").description("Group two or more existing canvas nodes").argument("<asset_ids...>","Existing canvas node asset IDs").option("--title <title>","Group title").option("--workspace-id <workspace_id>","Workspace ID; defaults to the active workspace").option("--idempotency-key <key>","Safely replay the same group request").action(async(n,i,s)=>{let a=A(s);try{let d=await Dd({assetIds:n,title:i.title,workspaceId:i.workspaceId,idempotencyKey:i.idempotencyKey},O(s),e);Fd(d,a)}catch(d){Xr(d,a,"workspace_canvas_group_created")}}),t}function qd(e){let t=e;for(;t.parent;)t=t.parent;return t.opts().workspace}var Sn=["en","zh","zh-Hant","ja"];async function jd(e,t,r={}){let o=e.name?.trim();if(e.name!==void 0&&!o)throw new c(u.INVALID_ARGUMENT,"--name must not be empty");if(e.language!==void 0&&!Sn.includes(e.language))throw new c(u.INVALID_ARGUMENT,`--language must be one of: ${Sn.join(", ")}`);let n=r.configStore??new b,i=P(t,n),s=e.language;y("workspace","workspace.create_requested",{has_name:o!==void 0,language:s??null,set_current:e.setCurrent===!0});let a=await new _e({baseUrl:i.baseUrl,apiKey:i.apiKey,...r.fetch?{fetch:r.fetch}:{}}).createWorkspace({...o!==void 0?{name:o}:{},...s!==void 0?{language:s}:{}});return e.setCurrent===!0&&(n.update({defaultWorkspaceId:a.workspaceId}),y("workspace","workspace.current_updated",{workspace_id:a.workspaceId})),y("workspace","workspace.created",{workspace_id:a.workspaceId}),{workspace_id:a.workspaceId,name:a.name,...s!==void 0?{language:s}:{},set_current:e.setCurrent===!0}}async function Wd(e,t,r={}){let o=e.name.trim();if(!o)throw new c(u.INVALID_ARGUMENT,"--name must not be empty");if(o.length>100)throw new c(u.INVALID_ARGUMENT,"--name must not exceed 100 characters");let n=r.configStore??new b,i=P(t,n),s=ze(t,n,e.workspaceId),a=await new _e({baseUrl:i.baseUrl,apiKey:i.apiKey,...r.fetch?{fetch:r.fetch}:{}}).renameWorkspace(s,o);return y("workspace","workspace.renamed",{workspace_id:a.workspaceId}),{workspace_id:a.workspaceId,name:a.name}}function On(e,t,r){let o=e instanceof c?e:new c(u.SERVER_ERROR,e instanceof Error?e.message:String(e));t?_(C(r,o.code,o.message,o.details)):S(o.message),process.exitCode=1}function xn(e={}){let t=new Bd("workspace").description("Workspace management");return t.command("create").description("Create a new workspace").option("--name <name>","Workspace name").option("--language <language>","Workspace language: en, zh, zh-Hant, or ja").option("--set-current","Set the created workspace as the active workspace").action(async(r,o)=>{let n=A(o);try{let i=await jd(r,O(o),e);te(i.workspace_id),E({set_current:i.set_current,...i.language?{language:i.language}:{}}),n?_(I("workspace_created",i,[...i.set_current?[]:[{command:`oiioii workspace set ${i.workspace_id}`,description:"Set the new workspace as active"}],{command:`oiioii --workspace ${i.workspace_id} upload file <path> --json`,description:"Upload a resource"}])):(N(`Workspace created: ${i.workspace_id}`),g(` Name: ${i.name}`),i.language&&g(` Language: ${i.language}`),g(` Current: ${i.set_current?"yes":"no"}`))}catch(i){On(i,n,"workspace_created")}}),t.command("set").description("Set active workspace").argument("<workspace_id>","Workspace ID").action((r,o,n)=>{let i=A(n);if(!r||r.trim()===""){i?_(C("workspace_set",u.INVALID_ARGUMENT,"Workspace ID is required.")):S("Workspace ID is required."),process.exitCode=1;return}(e.configStore??new b).update({defaultWorkspaceId:r.trim()}),te(r.trim()),i?_(I("workspace_set",{workspace_id:r.trim()},[{command:"oiioii workspace current --json"},{command:"oiioii image text --prompt '...' --json"}])):N(`Workspace set to: ${r.trim()}`)}),t.command("current").description("Show current workspace").action((r,o)=>{let n=A(o),s=(e.configStore??new b).loadResolved(),a=qd(o),d=process.env.OIIOII_WORKSPACE_ID,l=a??d??s.defaultWorkspaceId,p=a?"flag":d?"env":s.defaultWorkspaceId?"config":"none";if(!l){n?_(C("workspace_current",u.WORKSPACE_REQUIRED,"No workspace set. Use 'oiioii workspace set <id>' or set OIIOII_WORKSPACE_ID.",{hint:"oiioii workspace set <workspace_id>"})):(S("No workspace set."),g(" Use: oiioii workspace set <workspace_id>"),g(" Or set: OIIOII_WORKSPACE_ID=<id>")),process.exitCode=1;return}te(l),E({has_workspace:!0}),n?_(I("workspace_current",{workspace_id:l,source:p})):(g(`Workspace: ${l}`),g(` Source: ${p}`))}),t.command("rename").description("Rename a workspace").argument("[workspace_id]","Workspace ID; defaults to the active workspace").requiredOption("--name <name>","New workspace name").action(async(r,o,n)=>{let i=A(n);try{let s=await Wd({workspaceId:r,name:o.name},O(n),e);te(s.workspace_id),i?_(I("workspace_renamed",s)):N(`Workspace renamed to: ${s.name}`)}catch(s){On(s,i,"workspace_renamed")}}),t.addCommand(yn(e)),t.addCommand(Cn(e)),t}import{Command as Ic,Option as Jn}from"commander";import{fetch as Kd}from"undici";var Ue=3e4;function Y(e){return new c(u.SERVER_ERROR,e,{category:"response_protocol",retryable:!0,response_protocol:!0})}function Nn(e,t){if(e.isError)throw zt(e,t);let r=(e.content??[]).filter(o=>o?.type==="text"&&typeof o.text=="string").map(o=>o.text).join(`
14
- `).trim();if(!r)throw Y(`${t}: empty response`);try{return JSON.parse(r)}catch{throw Y(`${t}: invalid JSON response`)}}function ae(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Yt(e){if(e==="pending"||e==="processing"||e==="succeeded"||e==="failed"||e==="cancelled")return e;throw Y(`Invalid backend async task status: ${String(e)}`)}function Qt(e){if(e==="image"||e==="video"||e==="audio")return e;throw Y(`Invalid backend async media type: ${String(e)}`)}var Zr=class{constructor(t){this.mcp=t}mcp;async submit(t){let r=t.references?.filter(d=>d.kind==="media")??[];if((t.references?.filter(d=>d.kind==="workspace_asset")??[]).length>0)throw new c(u.MODEL_CONSTRAINT_VIOLATION,"Workspace asset references require the OpenAPI generation transport.",{category:"validation",retryable:!1,transport:"mcp"});let n={...t.input,...r.some(d=>d.mediaType==="image")?{referenceImages:r.filter(d=>d.mediaType==="image").map(d=>d.uri)}:{},...r.some(d=>d.mediaType==="audio")?{audioUrl:r.filter(d=>d.mediaType==="audio").map(d=>d.uri)}:{},...r.some(d=>d.mediaType==="video")?{videoUrl:r.filter(d=>d.mediaType==="video").map(d=>d.uri)}:{},...r.some(d=>d.mediaType==="text")?{referenceTexts:r.filter(d=>d.mediaType==="text").map(d=>d.uri)}:{}};y("async_generation","submission.started",{workspace_id:t.workspaceId,media_type:t.mediaType,tool:t.mcpMethodName,idempotency_key:t.idempotencyKey});let i=await this.mcp.callTool("submit_async_media_generation",{workspace_id:t.workspaceId,mediaType:t.mediaType,prompt:t.prompt,mcpMethodName:t.mcpMethodName,...t.model?{model:t.model}:{},input:n,idempotencyKey:t.idempotencyKey}),s=Nn(i,"Async generation submission failed");if(!ae(s)||typeof s.taskId!="string"||s.taskId.length===0||typeof s.assetId!="string"||s.assetId.length===0||typeof s.workspaceId!="string"||s.workspaceId.length===0||typeof s.reused!="boolean")throw Y("Invalid async generation submission response");let a={assetId:s.assetId,...typeof s.createdAt=="string"?{createdAt:s.createdAt}:{},mediaType:Qt(s.mediaType),reused:s.reused===!0,status:Yt(s.status),taskId:s.taskId,workspaceId:s.workspaceId};if(a.workspaceId!==t.workspaceId||a.mediaType!==t.mediaType)throw Y("Async generation submission response does not match the request");return y("async_generation","submission.accepted",{task_id:a.taskId,asset_id:a.assetId,status:a.status,reused:a.reused}),a}async query(t,r){y("async_generation","query.started",{task_id:r,workspace_id:t});let o=await this.mcp.callTool("query_async_media_generation",{workspace_id:t,taskId:r}),n=Nn(o,"Async generation query failed"),i=ae(n)&&ae(n.task)?n.task:void 0;if(!i||typeof i.taskId!="string"||typeof i.workspaceId!="string"||!Array.isArray(i.outputUris))throw Y("Invalid async generation query response");if(!i.outputUris.every(d=>typeof d=="string"))throw Y("Invalid async generation output URI list");if(typeof i.progress!="number"||!Number.isFinite(i.progress))throw Y("Invalid async generation progress");if(i.error!==null&&i.error!==void 0&&(!ae(i.error)||typeof i.error.code!="string"||typeof i.error.message!="string"))throw Y("Invalid async generation error payload");let s=i.outputUris,a={...typeof i.assetId=="string"?{assetId:i.assetId}:{},...typeof i.createdAt=="string"?{createdAt:i.createdAt}:{},error:ae(i.error)&&typeof i.error.code=="string"&&typeof i.error.message=="string"?{code:i.error.code,message:i.error.message}:null,mediaType:Qt(i.mediaType),outputUris:s,progress:Math.max(0,Math.min(100,i.progress)),status:Yt(i.status),taskId:i.taskId,...typeof i.updatedAt=="string"?{updatedAt:i.updatedAt}:{},workspaceId:i.workspaceId};if(a.taskId!==r||a.workspaceId!==t)throw Y("Async generation query response does not match the requested task");return y("async_generation","query.completed",{task_id:r,status:a.status,progress:a.progress,output_count:a.outputUris.length,has_error:a.error!==null}),a}};function zd(e){return e.kind==="media"?{kind:e.kind,media_type:e.mediaType,uri:e.uri}:{kind:e.kind,asset_type:e.assetType,asset_id:e.assetId}}function Un(e,t){if(!ae(e)||e.ok!==!0||!ae(e.data))throw Y(`${t}: invalid response envelope`);return e.data}async function Jd(e){let t=await Oe(e);return e.status===400?new c(u.MODEL_CONSTRAINT_VIOLATION,t.message,{...ae(t.details)?t.details:{},category:"validation",retryable:!1}):e.status===403&&t.code!==u.MEMBERSHIP_REQUIRED?new c(u.WORKSPACE_FORBIDDEN,t.message,{...ae(t.details)?t.details:{},category:"auth",retryable:!1}):e.status===404?new c(u.TASK_NOT_FOUND,t.message,{...ae(t.details)?t.details:{},category:"task",retryable:!1}):t}function Hd(e){if(typeof e.task_id!="string"||!e.task_id||typeof e.asset_id!="string"||!e.asset_id||typeof e.workspace_id!="string"||!e.workspace_id||typeof e.reused!="boolean")throw Y("Invalid async generation submission response");return{assetId:e.asset_id,...typeof e.created_at=="string"?{createdAt:e.created_at}:{},mediaType:Qt(e.media_type),reused:e.reused,status:Yt(e.status),taskId:e.task_id,workspaceId:e.workspace_id}}function Yd(e){if(typeof e.task_id!="string"||typeof e.workspace_id!="string"||!Array.isArray(e.output_uris)||!e.output_uris.every(t=>typeof t=="string")||typeof e.progress!="number"||!Number.isFinite(e.progress))throw Y("Invalid async generation query response");if(e.error!==null&&e.error!==void 0&&(!ae(e.error)||typeof e.error.code!="string"||typeof e.error.message!="string"))throw Y("Invalid async generation error payload");return{...typeof e.asset_id=="string"?{assetId:e.asset_id}:{},...typeof e.created_at=="string"?{createdAt:e.created_at}:{},error:ae(e.error)?{code:String(e.error.code),message:String(e.error.message)}:null,mediaType:Qt(e.media_type),outputUris:e.output_uris,progress:Math.max(0,Math.min(100,e.progress)),status:Yt(e.status),taskId:e.task_id,...typeof e.updated_at=="string"?{updatedAt:e.updated_at}:{},workspaceId:e.workspace_id}}var eo=class{baseUrl;apiKey;timeoutMs;_fetch;usesDefaultUndiciTransport;logger;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this.timeoutMs=t.timeoutMs??Ue,this.usesDefaultUndiciTransport=t.fetch===void 0,this._fetch=t.fetch??Kd,this.logger=t.logger}async submit(t){let r=Un(await this.request("POST","/v1/media/generations",{headers:{"idempotency-key":t.idempotencyKey},body:{workspace_id:t.workspaceId,media_type:t.mediaType,mcp_method_name:t.mcpMethodName,prompt:t.prompt,...t.model?{model:t.model}:{},input:t.input,...t.references?{references:t.references.map(zd)}:{}}}),"Async generation submission failed"),o=Hd(r);if(o.workspaceId!==t.workspaceId||o.mediaType!==t.mediaType)throw Y("Async generation submission response does not match the request");return o}async query(t,r){let o=new URLSearchParams({workspace_id:t}),n=Un(await this.request("GET",`/v1/media/generations/${encodeURIComponent(r)}?${o}`,{cache:"no-store"}),"Async generation query failed"),i=Yd(n);if(i.taskId!==r||i.workspaceId!==t)throw Y("Async generation query response does not match the requested task");return i}async request(t,r,o){let n=$({source:"hogi_async_generation_open_api_client",operation:r,method:t,path:r},this.logger),i=new AbortController,s=setTimeout(()=>i.abort(),this.timeoutMs);typeof s=="object"&&"unref"in s&&s.unref();let a;try{if(a=await n.fetch(this._fetch,`${this.baseUrl}${r}`,{method:t,headers:V({accept:"application/json",authorization:`Bearer ${this.apiKey}`,...o.body?{"content-type":"application/json"}:{},...o.headers}),...o.body?{body:JSON.stringify(o.body)}:{},...o.cache?{cache:o.cache}:{},...this.usesDefaultUndiciTransport?{dispatcher:Kt(this.timeoutMs)}:{},signal:i.signal}),!a.ok)throw await Jd(a);let d=await a.text();if(!d.trim())throw ce("Empty response from server",a.status);let l;try{l=JSON.parse(d)}catch{throw ce("Invalid JSON response from server",a.status)}return n.success(a.status),l}catch(d){let l=d;throw i.signal.aborted||xe(d)?l=new c(u.GENERATION_TIMEOUT,`Request timed out after ${this.timeoutMs}ms`,{retryable:!0,...se(d)?{cause_code:se(d)}:{}}):d instanceof c||(l=new c(u.NETWORK_ERROR,`Network error: ${d instanceof Error?d.message:String(d)}`,{retryable:!0,...se(d)?{cause_code:se(d)}:{}})),n.failure(l,a?.status),l}finally{clearTimeout(s)}}};function me(e){return e.transport==="openapi"?new eo(e):new Zr(new pt(e))}import{readFileSync as Qd,writeFileSync as Xd,appendFileSync as Zd,mkdirSync as ec,existsSync as Dn,chmodSync as to}from"fs";import{join as tc,dirname as rc}from"path";import{randomBytes as oc}from"crypto";function nc(){return"task_"+oc(8).toString("hex")}var H=class{configDir;tasksPath;constructor(t){this.configDir=t?.configDir??Ee(),this.tasksPath=tc(this.configDir,"tasks.jsonl")}getConfigDir(){return this.configDir}create(t){let r=new Date().toISOString(),o={id:nc(),workspaceId:t.workspaceId,command:t.command,toolName:t.toolName,inputArgs:t.inputArgs,...t.pendingSubmission?{pendingSubmission:t.pendingSubmission}:{},...t.credentialFingerprint?{credentialFingerprint:t.credentialFingerprint}:{},...t.backendBaseUrl?{backendBaseUrl:t.backendBaseUrl.replace(/\/+$/,"")}:{},...t.backendTransport?{backendTransport:t.backendTransport}:{},...t.mediaType?{mediaType:t.mediaType}:{},status:"created",resourceUris:[],createdAt:r,updatedAt:r};return this._ensureDir(),Te(`${this.tasksPath}.lock`,()=>{Zd(this.tasksPath,JSON.stringify(o)+`
15
- `,{encoding:"utf-8",mode:384}),to(this.tasksPath,384)}),y("task_store","task.created",{task_id:o.id,tool:o.toolName}),o}update(t,r){this._ensureDir();let o=Te(`${this.tasksPath}.lock`,()=>{let n=this._readAll(),i=n.findIndex(a=>a.id===t);if(i===-1)return;let s=n[i];return r.status!==void 0&&(s.status=r.status),r.resourceUris!==void 0&&(s.resourceUris=r.resourceUris),r.recordIds!==void 0&&(s.recordIds=r.recordIds),r.backendTaskId!==void 0&&(s.backendTaskId=r.backendTaskId),r.backendAssetId!==void 0&&(s.backendAssetId=r.backendAssetId),r.backendBaseUrl!==void 0&&(s.backendBaseUrl=r.backendBaseUrl),r.backendTransport!==void 0&&(s.backendTransport=r.backendTransport),r.mediaType!==void 0&&(s.mediaType=r.mediaType),r.progress!==void 0&&(s.progress=r.progress),r.lastSyncedAt!==void 0&&(s.lastSyncedAt=r.lastSyncedAt),r.error===null?delete s.error:r.error!==void 0&&(s.error=r.error),s.updatedAt=new Date().toISOString(),this._writeAll(n),s});if(!o){y("task_store","task.update_skipped",{task_id:t,reason:"not_found"},"warn");return}return y("task_store","task.updated",{task_id:t,status:o.status}),o}get(t){let o=this._readAll().find(n=>n.id===t);return y("task_store","task.read",{task_id:t,found:o!==void 0}),o}getByAnyId(t){let o=this._readAll().find(n=>n.id===t||n.backendTaskId===t);return y("task_store","task.read_by_any_id",{task_id:t,found:o!==void 0,matched_by:o?.id===t?"local":o?"backend":"none"}),o}list(t){let r=this._readAll();if(r.reverse(),t!==void 0&&t>0){let o=r.slice(0,t);return y("task_store","task.listed",{count:o.length,limit:t}),o}return y("task_store","task.listed",{count:r.length}),r}_readAll(){if(!Dn(this.tasksPath))return[];try{return Qd(this.tasksPath,"utf-8").trim().split(`
7
+ `:"");return rn(ca(r),{recursive:!0}),aa(r,i,{encoding:"utf-8",mode:384,flag:t.force?"w":"wx"}),Or(r,384),{path:r,format:o,count:n.length,bytes:xr(r).size}}ensureDir(){qe(this.logsDir)||rn(this.logsDir,{recursive:!0,mode:448}),Or(this.logsDir,448)}rotatedPath(t){return`${this.logsPath}.${t}`}logPathsOldestFirst(){let t=[];for(let r=this.maxFiles-1;r>=1;r--)t.push(this.rotatedPath(r));return t.push(this.logsPath),t}rotate(){let t=this.rotatedPath(this.maxFiles-1);this.maxFiles>1&&qe(t)&&nn(t);for(let r=this.maxFiles-2;r>=1;r--){let o=this.rotatedPath(r);qe(o)&&on(o,this.rotatedPath(r+1))}this.maxFiles>1&&qe(this.logsPath)?on(this.logsPath,this.rotatedPath(1)):qe(this.logsPath)&&nn(this.logsPath)}};var la=/(?:authorization|api[_-]?key|token|password|secret|credential|cookie)/i,ma=/([?&](?:api[_-]?key|token|password|secret)=)[^&\s]*/gi,pa=/\boii_sk_[A-Za-z0-9._-]+\b/g,fa=/\bBearer\s+[^\s,;]+/gi;function tt(e){return e.replace(ma,"$1[REDACTED]").replace(pa,"[REDACTED]").replace(fa,"Bearer [REDACTED]")}function Nr(e,t,r){if(r>10)return"[MAX_DEPTH]";if(typeof e=="string")return tt(e);if(e===null||typeof e!="object")return e;if(t.has(e))return"[CIRCULAR]";if(t.add(e),Array.isArray(e))return e.map(n=>Nr(n,t,r+1));let o={};for(let[n,i]of Object.entries(e))o[n]=la.test(n)?"[REDACTED]":Nr(i,t,r+1);return o}function zt(e){return Nr(e,new WeakSet,0)}import{AsyncLocalStorage as ga}from"async_hooks";var Ur=new ga;function an(e){Ur.enterWith(e)}function W(){return Ur.getStore()}function cn(){Ur.enterWith(void 0)}import{createHash as _a}from"crypto";function j(e){if(typeof e!="string")return;let t=e.trim();return t&&t.length<=256&&!/[\x00-\x1f\x7f]/.test(t)&&tt(t)===t?t:void 0}function Jt(e,t){try{return _a("sha256").update(`${new URL(e).origin}
8
+ ${t}`).digest("hex")}catch{return}}function Be(e){if(!e||typeof e!="object")return;let t=e;return j(t.workspaceId)??j(t.workspace_id)}function dn(e,t){try{let r=new URL(e instanceof Request?e.url:String(e)),o;try{typeof t?.body=="string"&&t.body.length<=1048576&&(o=JSON.parse(t.body))}catch{}let n=o?.params;return Be(o)??Be(o?.data)??Be(n?.arguments)??j(r.searchParams.get("workspaceId"))??j(r.searchParams.get("workspace_id"))??j(decodeURIComponent(/^\/v1\/debug\/workspaces\/([^/]+)$/.exec(r.pathname)?.[1]??""))}catch{return}}function Dr(e,t){try{return t&&e.url&&new URL(t).origin!==new URL(e.url).origin?{}:{logid:j(e.headers.get("x-logid")),requestId:j(e.headers.get("x-request-id")),uid:j(e.headers.get("x-hogi-log-uid")),workspaceId:j(e.headers.get("x-hogi-log-workspace-id"))}}catch{return{}}}function un(e,t){let r=W();r&&t&&t!=="anonymous_user"&&e&&r.identityKey===e&&(r.uid=t)}function ya(){return"log_"+ha(8).toString("hex")}var Mr=class{constructor(t=new je){this.store=t}store;record(t){try{let r={schema_version:1,id:ya(),timestamp:new Date().toISOString(),level:t.level,category:t.category??"application",source:t.source,event:t.event,...t.trace_id??W()?.traceId?{trace_id:t.trace_id??W().traceId}:{},...t.feature??W()?.feature?{feature:t.feature??W().feature}:{},...t.message?{message:tt(t.message)}:{},...t.request_id?{request_id:t.request_id}:{},...t.clientRequestId?{clientRequestId:t.clientRequestId}:{},...Object.fromEntries(Object.entries({logid:j(t.logid),requestId:j(t.requestId),uid:j("uid"in t?t.uid:W()?.uid),workspaceId:j(t.workspaceId)??Be(t.metadata)??W()?.workspaceId}).filter(([,o])=>o!==void 0)),...t.operation?{operation:t.operation}:{},...t.http?{http:zt(t.http)}:{},...t.error?{error:zt(t.error)}:{},...t.metadata?{metadata:zt(t.metadata)}:{}};return this.store.append(r),r}catch{return}}},Pr=class{record(){}};function Se(){return process.env.OIIOII_LOG_DISABLED==="1"?new Pr:new Mr}function Ra(){return"trace_"+wa(8).toString("hex")}function Lr(e){let t=Ra();return an({traceId:t,feature:e,startedAt:Date.now()}),Se().record({level:"info",category:"application",source:"cli",event:"feature.started",trace_id:t,operation:e,metadata:{feature:e}}),t}function y(e,t,r,o="info"){let n=W();n&&Se().record({level:o,category:"application",source:e,event:"feature.step",trace_id:n.traceId,operation:n.feature,message:t,metadata:{step:t,...r}})}function Ke(e,t){let r=W();r&&(r.failure={...e?{code:e}:{},message:t},Se().record({level:"error",category:"application",source:"cli",event:"feature.diagnostic",trace_id:r.traceId,operation:r.feature,error:{...e?{code:e}:{},message:t}}))}function $r(e=0){let t=W();if(!t)return;let r=t.failure!==void 0||e!==0;Se().record({level:r?"error":"info",category:"application",source:"cli",event:r?"feature.failed":"feature.completed",trace_id:t.traceId,operation:t.feature,...t.failure?{error:t.failure}:{},metadata:{feature:t.feature,exit_code:e,duration_ms:Date.now()-t.startedAt}}),cn()}var u={AUTH_REQUIRED:"AUTH_REQUIRED",AUTH_INVALID:"AUTH_INVALID",AUTH_CAPTCHA_REQUIRED:"AUTH_CAPTCHA_REQUIRED",AUTH_EMAIL_NOT_CONFIRMED:"AUTH_EMAIL_NOT_CONFIRMED",AUTH_TIMEOUT:"AUTH_TIMEOUT",API_KEY_INVALID:"API_KEY_INVALID",MEMBERSHIP_REQUIRED:"MEMBERSHIP_REQUIRED",WORKSPACE_REQUIRED:"WORKSPACE_REQUIRED",WORKSPACE_NOT_FOUND:"WORKSPACE_NOT_FOUND",WORKSPACE_FORBIDDEN:"WORKSPACE_FORBIDDEN",CONVERSATION_NOT_FOUND:"CONVERSATION_NOT_FOUND",SNAPSHOT_NOT_FOUND:"SNAPSHOT_NOT_FOUND",INVALID_ARGUMENT:"INVALID_ARGUMENT",MODEL_NOT_SUPPORTED:"MODEL_NOT_SUPPORTED",MODEL_CONSTRAINT_VIOLATION:"MODEL_CONSTRAINT_VIOLATION",GENERATION_FAILED:"GENERATION_FAILED",GENERATION_TIMEOUT:"GENERATION_TIMEOUT",AGENT_EXECUTION_FAILED:"AGENT_EXECUTION_FAILED",PROVIDER_UNAVAILABLE:"PROVIDER_UNAVAILABLE",RECORD_NOT_FOUND:"RECORD_NOT_FOUND",TASK_NOT_FOUND:"TASK_NOT_FOUND",TASK_RETRY_REQUIRED:"TASK_RETRY_REQUIRED",TASK_TIMEOUT:"TASK_TIMEOUT",QUOTA_EXCEEDED:"QUOTA_EXCEEDED",PAYLOAD_TOO_LARGE:"PAYLOAD_TOO_LARGE",CONTENT_SAFETY_BLOCKED:"CONTENT_SAFETY_BLOCKED",IP_CHARACTER_RESTRICTED:"IP_CHARACTER_RESTRICTED",SERVER_ERROR:"SERVER_ERROR",NETWORK_ERROR:"NETWORK_ERROR",CLI_UPGRADE_REQUIRED:"CLI_UPGRADE_REQUIRED",CLI_INSTALLATION_UNMANAGED:"CLI_INSTALLATION_UNMANAGED",CLI_UPDATE_FAILED:"CLI_UPDATE_FAILED",NOT_IMPLEMENTED:"NOT_IMPLEMENTED",CONFIG_ERROR:"CONFIG_ERROR"},d=class extends Error{constructor(r,o,n){super(o);this.code=r;this.details=n;this.name="CliError"}code;details};function ze(e,t){let r=`${e??""} ${t??""}`.toUpperCase();return/SAFETY[_\s-]*BLOCKED|SENSITIVE[_\s-]*CONTENT|PROMPT[_\s-]*SENSITIVE|CONTENT[_\s-]*FILTER|IP[_\s-]*INFRINGEMENT|IP[_\s-]*CHARACTER|COPYRIGHT|RESTRICTED[_\s-]*IP/.test(r)}function Je(e,t,r={}){let o=`${e??""} ${t??""}`.toUpperCase(),n=/IP[_\s-]*INFRINGEMENT|IP[_\s-]*CHARACTER|COPYRIGHT|RESTRICTED[_\s-]*IP/.test(o),i=n?"Request blocked because it may contain a restricted IP or character. Revise the character, references, or prompt and retry.":"Request blocked by the content safety policy. Revise the prompt or references and retry.";return new d(n?u.IP_CHARACTER_RESTRICTED:u.CONTENT_SAFETY_BLOCKED,i,{...r,...e?{backend_code:e}:{},...t&&t!==i?{backend_message:t}:{},category:"safety",reason_category:n?"ip_or_character":"content_policy",retryable:!1,hint:n?"Remove or replace the restricted character/IP reference, then retry.":"Revise the prompt or media references, then retry."})}var Ea="openapi";function Gr(e){return e==="openapi"||e==="mcp"?e:void 0}function Ta(e){if(e===void 0||e.trim()==="")return;let t=Gr(e.trim());if(t)return t;throw new d(u.CONFIG_ERROR,"OIIOII_GENERATION_TRANSPORT must be openapi or mcp.",{category:"configuration",retryable:!1})}function pn(){return{baseUrl:Tt()}}var b=class{configPath;dirPath;constructor(t){this.dirPath=t??Ae(),this.configPath=va(this.dirPath,"config.json")}getConfigPath(){return this.configPath}load(){if(!Vr(this.configPath))return y("config_store","config.defaulted",{reason:"missing"}),pn();try{let t=ln(this.configPath,"utf-8"),r=JSON.parse(t),o={baseUrl:typeof r.baseUrl=="string"?r.baseUrl:Tt(),...typeof r.apiKey=="string"&&r.apiKey.trim()?{apiKey:r.apiKey.trim()}:{},...typeof r.defaultWorkspaceId=="string"?{defaultWorkspaceId:r.defaultWorkspaceId}:{},...Gr(r.generationTransport)?{generationTransport:Gr(r.generationTransport)}:{}};return y("config_store","config.loaded"),o}catch{return y("config_store","config.defaulted",{reason:"invalid"},"warn"),pn()}}loadResolved(){let t=this.load();return y("config_store","config.resolved",{base_url_source:process.env.OIIOII_BASE_URL?"env":"file_or_build",api_key_source:process.env.OIIOII_API_KEY?"env":t.apiKey?"file":"missing",workspace_source:process.env.OIIOII_WORKSPACE_ID?"env":"file",generation_transport_source:process.env.OIIOII_GENERATION_TRANSPORT?"env":t.generationTransport?"file":"default"}),{...t,baseUrl:process.env.OIIOII_BASE_URL??t.baseUrl,apiKey:process.env.OIIOII_API_KEY?.trim()||t.apiKey,defaultWorkspaceId:process.env.OIIOII_WORKSPACE_ID??t.defaultWorkspaceId,generationTransport:Ta(process.env.OIIOII_GENERATION_TRANSPORT)??t.generationTransport??Ea}}save(t){this._ensureDir(),Ce(`${this.configPath}.lock`,()=>this._write(t)),y("config_store","config.saved")}_write(t){ka(this.configPath,JSON.stringify(t,null,2)+`
9
+ `,{encoding:"utf-8",mode:384}),mn(this.configPath,384)}update(t,r={}){this._ensureDir(),Ce(`${this.configPath}.lock`,()=>{let n={...this.load(),...t};r.resetBaseUrl&&delete n.baseUrl,this._write(n)}),y("config_store","config.updated",{fields:Object.keys(t),reset_base_url:r.resetBaseUrl===!0})}removeApiKey(){if(!Vr(this.configPath))return!1;this._ensureDir();let t=Ce(`${this.configPath}.lock`,()=>{let r;try{r=JSON.parse(ln(this.configPath,"utf-8"))}catch{return ba(this.configPath,{force:!0}),!0}if(typeof r!="object"||r===null||Array.isArray(r))return!1;let o=r;return Object.prototype.hasOwnProperty.call(o,"apiKey")?(delete o.apiKey,this._write(o),!0):!1});return y("config_store","config.api_key_removed",{removed:t}),t}_ensureDir(){Vr(this.dirPath)||Ia(this.dirPath,{recursive:!0,mode:448}),mn(this.dirPath,448)}};import{z as x}from"zod";import{randomBytes as Aa}from"crypto";function Ca(e){if(e instanceof Error){let t="code"in e&&typeof e.code=="string"?e.code:void 0;return{name:e.name,...t?{code:t}:{},message:e.message}}return{message:String(e)}}var Fr=class{constructor(t,r){this.logger=t;this.context=r;this.correlation={uid:void 0,workspaceId:Be(r.metadata)??this.trace?.workspaceId}}logger;context;requestId="req_"+Aa(8).toString("hex");startedAt=Date.now();completed=!1;started=!1;correlation;trace=W();record(t){try{this.logger.record({trace_id:this.trace?.traceId,feature:this.trace?.feature,...this.correlation,...t,clientRequestId:this.requestId,request_id:this.requestId})}catch{}}start(){this.started||(this.started=!0,this.record({level:"info",category:"api",source:this.context.source,event:"api.request",request_id:this.requestId,operation:this.context.operation,http:{method:this.context.method,path:this.context.path},metadata:this.context.metadata}))}async fetch(t,r,o){this.correlation.logid=void 0,this.correlation.requestId=void 0;let n=o,i;try{let c=new Headers(o?.headers??(r instanceof Request?r.headers:void 0)),l=r instanceof Request?r.url:String(r),p=c.get("x-hogi-api-key")??c.get("authorization")?.replace(/^Bearer\s+/i,"");i=p?Jt(l,p):void 0,this.correlation.uid=i&&i===this.trace?.identityKey?this.trace.uid:void 0;let m=dn(r,o)??Be(this.context.metadata)??j(c.get("x-workspace-id"))??this.trace?.workspaceId;this.correlation.workspaceId=m,m&&c.set("x-workspace-id",m),n={...o,headers:Object.fromEntries(c.entries())}}catch{}this.start();let s=await t(r,n),a=Dr(s,r instanceof Request?r.url:String(r));return this.correlation={...a,uid:a.uid??this.correlation.uid,workspaceId:a.workspaceId??this.correlation.workspaceId},un(i,a.uid),s}async fetchResource(t,r,o){let n=await this.fetch(t,r,{...o,redirect:"manual"}),i=new URL(r),s=new Headers(o.headers);for(let a=0;[301,302,303,307,308].includes(n.status);a++){let c=n.headers.get("location");if(!c)break;if(a>=20)throw new TypeError("Too many resource redirects");this.record({level:"info",category:"api",source:this.context.source,event:"api.redirect",operation:this.context.operation,http:{method:"GET",path:this.context.path,status:n.status}});let l=new URL(c,i);l.origin!==i.origin&&(s=new Headers(Object.fromEntries([...s.entries()].filter(([m])=>["accept","range"].includes(m)))));try{await n.body?.cancel()}catch{}n=await t(l.href,{...o,headers:Object.fromEntries(s.entries()),redirect:"manual"});let p=Dr(n,r);p.logid&&(this.correlation={...this.correlation,...p}),i=l}return n}success(t,r){this.completed||(this.start(),this.completed=!0,this.record({level:"info",category:"api",source:this.context.source,event:"api.response",request_id:this.requestId,operation:this.context.operation,http:{method:this.context.method,path:this.context.path,status:t,duration_ms:Date.now()-this.startedAt},metadata:{...this.context.metadata,...r}}))}failure(t,r){this.completed||(this.start(),this.completed=!0,this.record({level:"error",category:"api",source:this.context.source,event:"api.error",request_id:this.requestId,operation:this.context.operation,http:{method:this.context.method,path:this.context.path,...r!==void 0?{status:r}:{},duration_ms:Date.now()-this.startedAt},error:Ca(t)}))}};function $(e,t=Se()){return new Fr(t,e)}var H="0.1.9",Ct="@oiioii/cli";var Sa={clientType:"x-hogi-client-type",clientVersion:"x-hogi-client-version",clientOS:"x-hogi-client-os"};function Oa(e){return e==="win32"?"windows":e==="darwin"?"mac":e}function xa(){return{clientType:"cli",clientVersion:H,clientOS:Oa(process.platform)}}function G(e){let t=xa();return{...e,...Object.fromEntries(Object.entries(Sa).map(([r,o])=>[o,t[r]]))}}var q=class extends Error{constructor(r,o){super(`${r} timed out after ${o}ms`);this.operation=r;this.timeoutMs=o;this.name="HttpRequestTimeoutError"}operation;timeoutMs};async function B(e){let t=e.timeoutMs??3e4,r=new AbortController,o,n=new Promise((i,s)=>{o=setTimeout(()=>{r.abort(),s(new q(e.operation,t))},t)});o?.unref();try{return await Promise.race([e.run(r.signal),n])}catch(i){throw i instanceof q?i:r.signal.aborted?new q(e.operation,t):i}finally{o&&clearTimeout(o)}}function oe(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function Na(e){let t=oe(e);if(t)return t;if(typeof e!="string")return;let r=e.trim();try{return oe(JSON.parse(r))}catch{}let o=r.lastIndexOf("{");for(;o>=0;){try{let n=oe(JSON.parse(r.slice(o)));if(n)return n}catch{}o=r.lastIndexOf("{",o-1)}}async function ft(e){let t=await e.text().catch(()=>"");if(!t.trim())return{};try{let r=JSON.parse(t);return oe(r)??{}}catch{throw new d(u.SERVER_ERROR,"Invalid JSON response from workspace API",{status:e.status})}}function me(e,t){let r=t.error?.code,o=t.error?.message??`Workspace request failed: HTTP ${e}`,n={status:e,...r?{code:r,backend_code:r}:{},...t.error?.details!==void 0?{backend_details:t.error.details}:{},...r==="request_in_progress"||e>=500?{retryable:!0}:{}};return e===401?new d(u.API_KEY_INVALID,o,n):e===403?new d(r==="feature_not_enabled"?u.NOT_IMPLEMENTED:u.WORKSPACE_FORBIDDEN,o,n):e===404?new d(r==="asset_not_found"||r==="canvas_node_not_found"||r==="folder_not_found"||r==="subgroup_not_found"?u.RECORD_NOT_FOUND:u.WORKSPACE_NOT_FOUND,o,n):e===400||e===422?new d(u.INVALID_ARGUMENT,o,n):e===409?new d(u.INVALID_ARGUMENT,o,n):e===429?new d(u.QUOTA_EXCEEDED,o,n):new d(u.SERVER_ERROR,o,n)}function St(e,t,r){if(typeof e!="string"||!e.trim())throw ye(`missing ${t}`,r);return e}function ye(e,t){return new d(u.SERVER_ERROR,`Invalid canvas composition response: ${e}`,{category:"response_protocol",request_outcome:"unknown",retryable:t})}function Wr(e){return new d(u.SERVER_ERROR,`Invalid canvas node update response: ${e}`,{category:"response_protocol",request_outcome:"unknown",retryable:!1})}function fn(e,t){if(typeof e!="string"||!e.trim())throw Wr(`missing ${t}`);return e}function Ua(e,t){if(e.ok===!1)throw me(400,e);let r=oe(e.data);if(!r||!Array.isArray(r.nodes)||!Array.isArray(r.groups)||typeof r.reused!="boolean")throw ye("missing result fields",t);let o=r.nodes.map((i,s)=>{let a=oe(i);if(!a)throw ye(`invalid nodes.${s}`,t);return{asset_id:St(a.asset_id,`nodes.${s}.asset_id`,t),client_id:St(a.client_id,`nodes.${s}.client_id`,t)}}),n=r.groups.map((i,s)=>{let a=oe(i);if(!Array.isArray(a?.member_asset_ids)||a.member_asset_ids.some(c=>typeof c!="string"||!c.trim()))throw ye(`invalid groups.${s}.member_asset_ids`,t);return{client_id:St(a.client_id,`groups.${s}.client_id`,t),group_id:St(a.group_id,`groups.${s}.group_id`,t),member_asset_ids:a.member_asset_ids}});return{workspace_id:St(r.workspace_id,"workspace_id",t),nodes:o,groups:n,reused:r.reused}}function Da(e,t,r,o){if(e.workspace_id!==t)throw ye("workspace_id does not match the request",o);if(e.nodes.length!==r.nodes.length||e.nodes.some((i,s)=>i.client_id!==r.nodes[s]?.client_id))throw ye("node client_id values do not preserve request order",o);if(new Set(e.nodes.map(i=>i.asset_id)).size!==e.nodes.length)throw ye("node asset_id values must be unique",o);if(e.groups.length!==r.groups.length||e.groups.some((i,s)=>i.client_id!==r.groups[s]?.client_id))throw ye("group client_id values do not preserve request order",o);if(new Set(e.groups.map(i=>i.group_id)).size!==e.groups.length)throw ye("group_id values must be unique",o);let n=new Map(e.nodes.map(i=>[i.client_id,i.asset_id]));e.groups.forEach((i,s)=>{let a=r.groups[s].members.map(c=>"client_node_id"in c?n.get(c.client_node_id):c.asset_id);if(a.some(c=>!c)||a.length!==i.member_asset_ids.length||a.some((c,l)=>c!==i.member_asset_ids[l]))throw ye(`groups.${s}.member_asset_ids do not preserve request order`,o)})}function Ma(e){if(e.ok===!1)throw me(400,e);let t=oe(e.data);if(!t||t.status!=="empty"||!["audio","image","video"].includes(String(t.type))||typeof t.updated!="boolean")throw Wr("missing result fields");return{asset_id:fn(t.asset_id,"asset_id"),status:"empty",type:t.type,updated:t.updated,workspace_id:fn(t.workspace_id,"workspace_id")}}function Pa(e){if(e.ok===!1)throw me(400,e);let t=Na(e.data),r=t?.workspaceId,o=t?.name;if(typeof r!="string"||!r.trim())throw new d(u.SERVER_ERROR,"Invalid workspace API response: missing workspaceId");if(typeof o!="string"||!o.trim())throw new d(u.SERVER_ERROR,"Invalid workspace API response: missing name");for(let n of["folder_id","subgroup_id"])if(t&&n in t&&t[n]!==null&&(typeof t[n]!="string"||!String(t[n]).trim()))throw new d(u.SERVER_ERROR,`Invalid workspace API response: invalid ${n}`);return{workspaceId:r,name:o,...t&&"folder_id"in t?{folderId:t.folder_id}:{},...t&&"subgroup_id"in t?{subgroupId:t.subgroup_id}:{}}}function La(e){if(e.ok===!1)throw me(400,e);let t=oe(e.data),r=t?.workspace_id,o=t?.name;if(typeof r!="string"||!r.trim())throw new d(u.SERVER_ERROR,"Invalid workspace rename response: missing workspace_id");if(typeof o!="string"||!o.trim())throw new d(u.SERVER_ERROR,"Invalid workspace rename response: missing name");return{workspaceId:r,name:o}}function $a(e){if(e.ok===!1)throw me(400,e);let t=oe(e.data);if(!Array.isArray(t?.asset))throw new d(u.SERVER_ERROR,"Invalid workspace detail response: missing asset list");return t.asset.map((r,o)=>{let n=oe(r);if(!n||typeof n.assetId!="string"||typeof n.type!="string"||typeof n.uri!="string")throw new d(u.SERVER_ERROR,`Invalid workspace asset at index ${o}`);return n})}var Ot=x.object({id:x.string().min(1),name:x.string().min(1),project_count:x.number().int().nonnegative(),subgroup_id:x.string().nullable().optional()}).passthrough(),te=class{baseUrl;apiKey;_fetch;logger;timeoutMs;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this._fetch=t.fetch??globalThis.fetch,this.logger=t.logger,this.timeoutMs=t.timeoutMs}async createWorkspace(t){let r=$({source:"hogi_workspace_client",operation:"workspace.create",method:"POST",path:"/v1/workspace/create",metadata:{language:t.language??null,has_name:t.name!==void 0}},this.logger),o;try{return await B({operation:"Workspace creation request",timeoutMs:this.timeoutMs,run:async n=>{o=await r.fetch(this._fetch,`${this.baseUrl}/v1/workspace/create`,{method:"POST",headers:G({authorization:`Bearer ${this.apiKey}`,"content-type":"application/json",accept:"application/json"}),body:JSON.stringify({...t.name!==void 0?{name:t.name}:{},...t.language!==void 0?{language:t.language}:{},...t.folderId!==void 0?{folder_id:t.folderId}:{},...t.subgroupId!==void 0?{subgroup_id:t.subgroupId}:{}}),signal:n});let i=await ft(o);if(!o.ok)throw me(o.status,i);let s=Pa(i);if(t.folderId!==void 0&&s.folderId===void 0||t.subgroupId!==void 0&&s.subgroupId===void 0)throw new d(u.NOT_IMPLEMENTED,"Server does not return workspace placement; update the backend before using placement options",{workspace_id:s.workspaceId,request_outcome:"created",retryable:!1});return r.success(o.status,{workspace_id:s.workspaceId}),s}})}catch(n){if(n instanceof q){let s=new d(u.NETWORK_ERROR,n.message,{retryable:!1,request_outcome:"unknown",timeout_ms:n.timeoutMs});throw r.failure(s,o?.status),s}if(n instanceof d){let s=n.code===u.SERVER_ERROR||n.code===u.NETWORK_ERROR?new d(n.code,n.message,{...oe(n.details)??{},retryable:!1,request_outcome:"unknown"}):n;throw r.failure(s,o?.status),s}let i=new d(u.NETWORK_ERROR,`Network error: ${n instanceof Error?n.message:String(n)}`,{retryable:!1,request_outcome:"unknown"});throw r.failure(i),i}}async renameWorkspace(t,r){let o="/v1/workspace/rename",n=$({source:"hogi_workspace_client",operation:"workspace.rename",method:"POST",path:o,metadata:{workspace_id:t}},this.logger),i;try{return await B({operation:"Workspace rename request",timeoutMs:this.timeoutMs,run:async s=>{i=await n.fetch(this._fetch,`${this.baseUrl}${o}`,{method:"POST",headers:{authorization:`Bearer ${this.apiKey}`,"content-type":"application/json",accept:"application/json"},body:JSON.stringify({workspace_id:t,name:r}),signal:s});let a=await ft(i);if(!i.ok)throw me(i.status,a);let c=La(a);return n.success(i.status,{workspace_id:c.workspaceId}),c}})}catch(s){throw this.mapRequestError(s,"Workspace rename request",n,i)}}async createCanvasComposition(t,r,o){let n=o?.trim()||void 0,i="/v1/workspace/canvas/compositions",s=$({source:"hogi_workspace_client",operation:"workspace.canvas.composition.create",method:"POST",path:i,metadata:{workspace_id:t,node_count:r.nodes.length,group_count:r.groups.length,has_idempotency_key:n!==void 0}},this.logger),a;try{return await B({operation:"Canvas composition creation request",timeoutMs:this.timeoutMs,run:async c=>{a=await s.fetch(this._fetch,`${this.baseUrl}${i}`,{method:"POST",headers:G({authorization:`Bearer ${this.apiKey}`,"content-type":"application/json",accept:"application/json",...n?{"idempotency-key":n}:{}}),body:JSON.stringify({workspace_id:t,nodes:r.nodes,groups:r.groups}),signal:c});let l=await ft(a);if(!a.ok)throw me(a.status,l);let p=n!==void 0,m=Ua(l,p);return Da(m,t,r,p),s.success(a.status,{workspace_id:m.workspace_id,node_count:m.nodes.length,group_count:m.groups.length,reused:m.reused}),m}})}catch(c){let l=this.mapRequestError(c,"Canvas composition creation request",s,a);if(l.code!==u.NETWORK_ERROR&&l.code!==u.SERVER_ERROR)throw l;let p=oe(l.details)??{},m=typeof p.backend_code=="string"?p.backend_code:void 0;throw new d(l.code,l.message,{...p,request_outcome:m==="idempotency_unavailable"?"not_started":"unknown",retryable:n!==void 0})}}async updateEmptyCanvasNode(t,r,o){let n=`/v1/workspace/canvas/nodes/${encodeURIComponent(r)}`,i=$({source:"hogi_workspace_client",operation:"workspace.canvas.node.update",method:"POST",path:"/v1/workspace/canvas/nodes/:asset_id",metadata:{workspace_id:t,asset_id:r}},this.logger),s;try{return await B({operation:"Canvas node update request",timeoutMs:this.timeoutMs,run:async a=>{s=await i.fetch(this._fetch,`${this.baseUrl}${n}`,{method:"POST",headers:G({authorization:`Bearer ${this.apiKey}`,"content-type":"application/json",accept:"application/json"}),body:JSON.stringify({workspace_id:t,...o}),signal:a});let c=await ft(s);if(!s.ok)throw me(s.status,c);let l=Ma(c);if(l.workspace_id!==t||l.asset_id!==r)throw Wr("identifiers do not match the request");return i.success(s.status,{workspace_id:l.workspace_id,asset_id:l.asset_id,updated:l.updated}),l}})}catch(a){throw this.mapRequestError(a,"Canvas node update request",i,s)}}async listAssets(t){let r="/v1/workspace/detail",o=$({source:"hogi_workspace_client",operation:"workspace.assets.list",method:"GET",path:r,metadata:{workspace_id:t}},this.logger),n=new URLSearchParams({workspace_id:t,relateTypes:"asset"}),i;try{return await B({operation:"Workspace asset list request",timeoutMs:this.timeoutMs,run:async s=>{i=await o.fetch(this._fetch,`${this.baseUrl}${r}?${n.toString()}`,{method:"GET",headers:{authorization:`Bearer ${this.apiKey}`,accept:"application/json"},signal:s});let a=await ft(i);if(!i.ok)throw me(i.status,a);let c=$a(a);return o.success(i.status,{workspace_id:t,asset_count:c.length}),c}})}catch(s){throw this.mapRequestError(s,"Workspace asset list request",o,i)}}async organizationRequest(t,r,o,n){let i=$({source:"hogi_workspace_client",operation:"workspace.organization",method:t,path:r},this.logger),s;try{return await B({operation:"Workspace organization request",timeoutMs:this.timeoutMs,run:async a=>{s=await i.fetch(this._fetch,`${this.baseUrl}${r}`,{method:t,signal:a,headers:G({authorization:`Bearer ${this.apiKey}`,accept:"application/json","content-type":"application/json"}),...n!==void 0?{body:JSON.stringify(n)}:{}});let c=await ft(s);if(!s.ok||c.ok===!1)throw me(s.status,c);let l=o.safeParse(c.data);if(!l.success)throw new d(u.SERVER_ERROR,"Invalid workspace organization response",{category:"response_protocol",retryable:!1});return i.success(s.status),l.data}})}catch(a){let c=this.mapRequestError(a,"Workspace organization request",i,s);throw t!=="GET"&&(c.code===u.NETWORK_ERROR||c.code===u.SERVER_ERROR)?new d(c.code,c.message,{...oe(c.details)??{},retryable:!1,request_outcome:"unknown"}):c}}listWorkspaces(t){let r=new URLSearchParams({limit:String(t.limit),...t.cursor?{cursor:t.cursor}:{},...t.search?{search:t.search}:{}});return this.organizationRequest("GET",`/v1/workspaces?${r}`,x.object({workspaces:x.array(x.object({workspace_id:x.string().min(1),conversation_count:x.number().int().nonnegative(),name:x.string().nullable(),created_at:x.string(),updated_at:x.string()})),has_more:x.boolean(),next_cursor:x.string().nullable()}))}async deleteWorkspace(t){let r=await this.organizationRequest("POST","/v1/workspace/delete",x.object({workspace_id:x.string().min(1),state:x.literal("trash"),trash_time:x.string().min(1)}),{workspace_id:t});if(r.workspace_id!==t)throw new d(u.SERVER_ERROR,"Deleted workspace ID does not match the request",{retryable:!1,request_outcome:"unknown"});return r}listFolders(t,r){let o=new URLSearchParams({limit:String(t),...r?{cursor:r}:{}});return this.organizationRequest("GET",`/v1/workspace/folders?${o}`,x.object({folders:x.array(Ot),has_more:x.boolean(),next_cursor:x.string().optional()}))}getFolder(t){return this.organizationRequest("GET",`/v1/workspace/folders/${encodeURIComponent(t)}`,x.object({folder:Ot}))}createFolder(t){return this.organizationRequest("POST","/v1/workspace/folders",x.object({folder:Ot,workspace_id:x.string().optional()}),t)}updateFolder(t,r){return this.organizationRequest("PATCH",`/v1/workspace/folders/${encodeURIComponent(t)}`,x.object({folder:Ot}),r)}listFolderWorkspaces(t,r,o){let n=new URLSearchParams({limit:String(r),...o?{cursor:o}:{}});return this.organizationRequest("GET",`/v1/workspace/folders/${encodeURIComponent(t)}/workspaces?${n}`,x.object({workspaces:x.array(x.record(x.unknown())),has_more:x.boolean(),next_cursor:x.string().optional()}))}setWorkspaceFolder(t,r){return this.organizationRequest("PUT",`/v1/workspace/${encodeURIComponent(t)}/folder`,x.object({workspace_id:x.string(),folder_id:x.string().nullable(),previous_folder_id:x.string().optional(),folder:Ot.optional()}),{folder_id:r})}folderLifecycle(t,r){return this.organizationRequest(r==="purge"?"DELETE":"POST",`/v1/workspace/folders/${encodeURIComponent(t)}${r==="purge"?"":`/${r}`}`,x.object({folder_id:x.string(),workspace_ids:x.array(x.string())}))}listCreationSubgroups(){return this.organizationRequest("GET","/v1/workspace/subgroups",x.object({subgroups:x.array(x.object({id:x.string(),name:x.string(),can_create:x.boolean()}))}))}mapRequestError(t,r,o,n){if(t instanceof q){let s=new d(u.NETWORK_ERROR,t.message,{retryable:!0,timeout_ms:t.timeoutMs});return o.failure(s,n?.status),s}if(t instanceof d)return o.failure(t,n?.status),t;let i=new d(u.NETWORK_ERROR,`${r} failed: ${t instanceof Error?t.message:String(t)}`);return o.failure(i),i}};function T(e){let t=e;for(;t.parent;)t=t.parent;return t.opts()}function E(e){return T(e).json===!0}function P(e,t){let r=t.loadResolved(),o=r.apiKey?.trim();if(!o)throw new d(u.AUTH_REQUIRED,"No API key configured. Run 'oiioii auth login' for browser authorization, or paste an existing key with 'oiioii auth login --api-key <key>'.");let n=e.baseUrl,i=typeof n=="string"&&n?n:r.baseUrl;return{apiKey:o,baseUrl:i}}function ce(e,t,r){let o=r?.trim();if(r!==void 0&&!o)throw new d(u.INVALID_ARGUMENT,"Workspace ID must not be empty");let n=typeof e.workspace=="string"?e.workspace.trim():"",i=o||n||t.loadResolved().defaultWorkspaceId?.trim();if(!i)throw new d(u.WORKSPACE_REQUIRED,"No workspace set. Pass a workspace ID, use --workspace <id>, set OIIOII_WORKSPACE_ID, or set an active workspace.");return i}var gn={auth:{called:"cli_biz_auth_called",result:"cli_biz_auth_result"},workspace:{called:"cli_biz_workspace_called",result:"cli_biz_workspace_result"},generation:{called:"cli_biz_generation_called",result:"cli_biz_generation_result"},upload:{called:"cli_biz_upload_called",result:"cli_biz_upload_result"},task:{called:"cli_biz_task_called",result:"cli_biz_task_result"},record:{called:"cli_biz_record_called",result:"cli_biz_record_result"},inspect:{called:"cli_biz_inspect_called",result:"cli_biz_inspect_result"},preview:{called:"cli_biz_preview_called",result:"cli_biz_preview_result"},logs:{called:"cli_biz_logs_called",result:"cli_biz_logs_result"},points:{called:"cli_biz_points_called",result:"cli_biz_points_result"},cli:{called:"cli_biz_cli_called",result:"cli_biz_cli_result"}};function R(e,t){return{domain:e,action:t,calledEvent:gn[e].called,resultEvent:gn[e].result}}var _n={"auth.login":R("auth","login"),"auth.status":R("auth","status"),"auth.logout":R("auth","logout"),"workspace.list":R("workspace","list"),"workspaces.list":R("workspace","list"),"workspace.delete":R("workspace","delete"),"workspace.create":R("workspace","create"),"workspace.folder.list":R("workspace","folder_list"),"workspace.folder.get":R("workspace","folder_get"),"workspace.folder.create":R("workspace","folder_create"),"workspace.folder.rename":R("workspace","folder_rename"),"workspace.folder.favorite":R("workspace","folder_favorite"),"workspace.folder.unfavorite":R("workspace","folder_unfavorite"),"workspace.folder.workspaces":R("workspace","folder_workspaces"),"workspace.folder.move":R("workspace","folder_move"),"workspace.folder.remove":R("workspace","folder_remove"),"workspace.folder.trash":R("workspace","folder_trash"),"workspace.folder.restore":R("workspace","folder_restore"),"workspace.folder.purge":R("workspace","folder_purge"),"workspace.subgroup.list":R("workspace","subgroup_list"),"workspace.open":R("workspace","open"),"workspace.set":R("workspace","set"),"workspace.current":R("workspace","current"),"workspace.rename":R("workspace","rename"),"workspace.assets.list":R("workspace","assets_list"),"workspace.assets.download":R("workspace","asset_download"),"workspace.canvas.create":R("workspace","canvas_composition_create"),"workspace.canvas.group.create":R("workspace","canvas_group_create"),"workspace.canvas.node.update":R("workspace","canvas_node_update"),"library.list":R("workspace","asset_library_list"),"library.search":R("workspace","asset_library_search"),"library.create":R("workspace","asset_library_create"),"library.update":R("workspace","asset_library_update"),"library.delete":R("workspace","asset_library_delete"),"library.add-members":R("workspace","asset_library_add_members"),"library.remove-members":R("workspace","asset_library_remove_members"),"library.members":R("workspace","asset_library_collection_members"),"library.expression":R("generation","asset_library_expression"),"image.text":R("generation","image_text"),"image.edit":R("generation","image_edit"),"video.text":R("generation","video_text"),"video.image":R("generation","video_image"),"video.generate":R("generation","video_generate"),"audio.generate":R("generation","audio_generate"),"audio.seed-audio":R("generation","audio_seed_audio"),"audio.suno":R("generation","audio_suno"),"upload.file":R("upload","file"),"upload.resource":R("upload","resource"),"task.list":R("task","list"),"task.retry":R("task","retry"),"task.status":R("task","status"),"task.wait":R("task","wait"),"record.get":R("record","get"),"record.open":R("record","open"),"inspect.capabilities":R("inspect","capabilities"),"inspect.models":R("inspect","models"),"preview.latest":R("preview","latest"),"preview.bundle":R("preview","bundle"),"logs.list":R("logs","list"),"logs.export":R("logs","export"),"logs.path":R("logs","path"),"points.balance":R("points","balance"),"points.cost":R("points","cost"),"points.logs":R("points","logs"),"points.quote":R("points","quote"),update:R("cli","update"),install:R("cli","install"),versions:R("cli","versions")};function qr(e){return _n[e]}import{randomBytes as Ka}from"crypto";import{AsyncLocalStorage as Va}from"async_hooks";var jr=new Va;function hn(e){jr.enterWith(e)}function Oe(){return jr.getStore()}function yn(){jr.enterWith(void 0)}var Ga=/(?:authorization|api[_-]?key|token|password|secret|credential|cookie|prompt|file[_-]?path|request[_-]?body|response[_-]?body)/i,Fa=256;function Br(e){let t={};for(let[r,o]of Object.entries(e))o===void 0||Ga.test(r)||(t[r]=typeof o=="string"?tt(o).slice(0,Fa):o);return t}import{DataRangersSDK as Wa}from"@datarangers/sdk-node";import{httpPlugin as qa}from"@datarangers/node-plugin-http";var ja=20011588,Ba="https://gator.volces.com",wn=1e3,Ht=class{disabled;sdk;httpController;logger;pendingEventNames=[];pendingEvents=0;constructor(t={}){if(this.disabled=t.disabled??process.env.OIIOII_TELEMETRY_DISABLED==="1",this.logger=t.logger??Se(),!this.disabled)try{let r=t.sdk??new Wa({app_id:t.appId??ja,logLevel:"silent"}),o=t.httpController??qa({channel_domain:t.channelDomain??Ba,retry:0,timeout:{request:wn}});r.use(o),o.on("end",n=>{this.pendingEvents=Math.max(0,this.pendingEvents-1);let i=this.pendingEventNames.shift()??"unknown",s=n.hasSucceed===!0;this.logger.record({level:s?"debug":"warn",category:"application",source:"telemetry",event:s?"telemetry.delivery.completed":"telemetry.delivery.failed",metadata:{event_name:i}})}),this.sdk=r,this.httpController=o}catch(r){this.recordFailure("telemetry.initialization.failed",r)}}send(t){if(!(this.disabled||!this.sdk||!t.userId.trim()))try{this.pendingEvents+=1,this.pendingEventNames.push(t.event),this.sdk.collect(t.event,{...t.params},{user:{user_unique_id:t.userId}})}catch(r){this.pendingEvents=Math.max(0,this.pendingEvents-1),this.pendingEventNames.pop(),this.recordFailure("telemetry.delivery.failed",r,t.event)}}async flush(t=wn){if(!this.httpController||this.pendingEvents===0)return;let r=this.httpController;await new Promise(o=>{let n=!1,i=c=>{n||(n=!0,clearTimeout(a),r.removeListener("drain",s),c&&this.pendingEvents>0&&this.logger.record({level:"warn",category:"application",source:"telemetry",event:"telemetry.flush.timeout",metadata:{pending_count:this.pendingEvents}}),o())},s=()=>i(!1),a=setTimeout(()=>i(!0),Math.max(0,t));r.once("drain",s)})}recordFailure(t,r,o){let n=r&&typeof r=="object"&&"code"in r&&typeof r.code=="string"?r.code:void 0;this.logger.record({level:"warn",category:"application",source:"telemetry",event:t,...n?{error:{code:n,message:"Telemetry SDK failure"}}:{},...o?{metadata:{event_name:o}}:{}})}};function za(){let e=ae(),t=Number.parseInt(process.versions.node.split(".")[0]??"0",10);return{schema_version:1,app_env:e==="local"?"dev":e==="production"?"prod":"test",app_name:"oiioii_cli",cli_version:H,os:process.platform,arch:process.arch,node_major:Number.isFinite(t)?t:0}}function Ja(){return`op_${Ka(8).toString("hex")}`}function Ha(e,t){return e.resultOverride==="partial_success"&&t===0&&!e.failureCode?"partial_success":e.failureCode?.endsWith("TIMEOUT")?"timeout":t!==0||e.failureCode?"failure":"success"}var Kr=class{transport;now;operationId;commonParams;constructor(t={}){this.transport=t.transport??new Ht,this.now=t.now??Date.now,this.operationId=t.operationId??Ja,this.commonParams=t.commonParams??za}startCommand(t){let r=t.command.trim();if(!r)return;let o=qr(r),n={command:r,startedAt:this.now(),operationId:this.operationId(),calledSent:!1,businessParams:{},...o?{calledEvent:o.calledEvent,resultEvent:o.resultEvent,action:o.action}:{},...t.userId?.trim()?{userId:t.userId.trim()}:{},...t.workspaceId?.trim()?{workspaceId:t.workspaceId.trim()}:{},...t.traceId?.trim()?{traceId:t.traceId.trim()}:{}};hn(n),this.emitCalled()}identify(t){let r=Oe(),o=t.trim();!r||!o||(r.userId=o,this.emitCalled())}addBusinessInfo(t){let r=Oe();r&&Object.assign(r.businessParams,Br(t))}markPartialSuccess(){let t=Oe();t&&(t.resultOverride="partial_success")}setWorkspaceId(t){let r=Oe(),o=t.trim();r&&o&&(r.workspaceId=o)}reportCommandFailure(t){let r=Oe();r&&t&&(r.failureCode=t)}completeCommand(t=0){let r=Oe();if(!r)return;this.emitCalled();let o=Ha(r,t);r.userId&&r.resultEvent&&r.action&&this.emit(r.resultEvent,{...r.businessParams,operation_id:r.operationId,action:r.action,result:o,duration_ms:Math.max(0,this.now()-r.startedAt),...r.failureCode?{error_code:r.failureCode}:{}}),yn()}async flush(t){await this.transport.flush(t)}emitCalled(){let t=Oe();!t?.userId||!t.calledEvent||!t.action||t.calledSent||(t.calledSent=!0,this.emit(t.calledEvent,{operation_id:t.operationId,action:t.action}))}emit(t,r){let o=Oe();if(!o?.userId)return;let n={...this.commonParams(),command:o.command,...o.traceId?{trace_id:o.traceId}:{},...o.workspaceId?{workspace_id:o.workspaceId}:{}};this.transport.send({userId:o.userId,event:t,params:Br({...r,...n})})}},Rn;function xe(){return Rn??=new Kr,Rn}function A(e){xe().addBusinessInfo(e)}function we(){xe().markPartialSuccess()}function re(e){let t=W(),r=j(e);t&&r&&(t.workspaceId=r),xe().setWorkspaceId(e)}function He(e){return e<10*1024*1024?"0_10mb":e<100*1024*1024?"10_100mb":e<500*1024*1024?"100_500mb":"500mb_plus"}function Yt(e){return e.startsWith("hogi://audio/")?"audio":e.startsWith("hogi://image/")?"image":e.startsWith("hogi://video/")?"video":"other"}import{fetch as Qa}from"undici";import{Agent as Ya}from"undici";async function Ne(e){let t=await e.text().catch(()=>""),r;try{let c=t?JSON.parse(t):void 0;c&&typeof c=="object"&&!Array.isArray(c)&&(r=c)}catch{}let o=r?.error&&typeof r.error=="object"?r.error:void 0,n=o?.data&&typeof o.data=="object"?o.data:void 0,i=[r?.code,r?.errorCode,o?.code,n?.code].find(c=>typeof c=="string"),s=[r?.message,o?.message,typeof r?.error=="string"?r.error:void 0].find(c=>typeof c=="string"&&c.trim().length>0)??(t.trim()?t.trim():void 0),a={status:e.status,...i?{backend_code:i}:{}};return ze(i,s)?Je(i,s,a):e.status===401?new d(u.API_KEY_INVALID,s??"Invalid API key",a):e.status===426||i==="CLI_UPGRADE_REQUIRED"?new d(u.CLI_UPGRADE_REQUIRED,s??"Upgrade oiioii CLI and retry.",{...a,category:"client_version",retryable:!1}):e.status===403&&i==="MEMBERSHIP_REQUIRED"?new d(u.MEMBERSHIP_REQUIRED,s??"An active membership is required.",{...a,category:"auth",retryable:!1}):e.status===429?new d(u.QUOTA_EXCEEDED,s??"Rate limit exceeded",a):i&&/INVALID_PARAMS|RESOLUTION_NOT_SUPPORTED|DURATION_NOT_SUPPORTED/.test(i)?new d(u.MODEL_CONSTRAINT_VIOLATION,s??"The generation request violates model constraints.",{...a,category:"validation",retryable:!1}):e.status>=500?new d(u.SERVER_ERROR,s??`Server error: ${e.statusText||e.status}`,{...a,category:"server",retryable:!0,request_outcome:"unknown"}):new d(u.GENERATION_FAILED,s??`Request failed: ${e.statusText||e.status}`,a)}function pe(e,t){return new d(u.SERVER_ERROR,e,{...t!==void 0?{status:t}:{},category:"response_protocol",retryable:!0,response_protocol:!0})}function de(e){if(!(!e||typeof e!="object")){if("code"in e&&typeof e.code=="string")return e.code;if("cause"in e)return de(e.cause)}}function Ue(e){return e instanceof Error&&e.name==="AbortError"?!0:["UND_ERR_HEADERS_TIMEOUT","UND_ERR_BODY_TIMEOUT","UND_ERR_CONNECT_TIMEOUT"].includes(de(e)??"")}function Qt(e){return new Ya({headersTimeout:e,bodyTimeout:e})}function Zt(e,t){let r=typeof e.errorCode=="string"?e.errorCode:void 0,n=(e.content??[]).filter(c=>c?.type==="text"&&typeof c.text=="string").map(c=>c.text.trim()).filter(Boolean).join(`
10
+ `)||t,i=e.structuredContent&&typeof e.structuredContent=="object"?e.structuredContent:void 0,s=i?`${n} ${JSON.stringify(i)}`:n,a={...r?{backend_code:r}:{},...i?{structured_content:i}:{}};return r&&(r.includes("POINTS_INSUFFICIENT")||r.includes("POINTS_LIMIT_EXCEEDED"))?new d(u.QUOTA_EXCEEDED,n,{...a,category:"quota",retryable:!1}):ze(r,s)?Je(r,s,a):r?.includes("MEMBER_ONLY")?new d(u.MEMBERSHIP_REQUIRED,n,{...a,category:"auth",retryable:!1}):r?.includes("TASK_NOT_FOUND")?new d(u.TASK_NOT_FOUND,n,{...a,category:"task",retryable:!1}):r?.includes("TIMEOUT")?new d(u.GENERATION_TIMEOUT,n,{...a,category:"timeout",retryable:!0}):r&&(r.includes("INVALID_PARAMS")||r.includes("RESOLUTION_NOT_SUPPORTED"))?new d(u.MODEL_CONSTRAINT_VIOLATION,n,{...a,category:"validation",retryable:!1}):r&&(r.includes("MODEL_SERVICE_ERROR")||r.includes("CAPACITY_UNAVAILABLE"))?new d(u.PROVIDER_UNAVAILABLE,n,{...a,category:"provider",retryable:!0}):new d(u.GENERATION_FAILED,n,Object.keys(a).length?{...a,category:"provider",retryable:!1}:void 0)}function Za(e){let t=e.message??"MCP tool call failed";if(/\btool\b.*\bnot found\b/i.test(t))return new d(u.SERVER_ERROR,t,{...e,category:"server_capability",retryable:!1,hint:"Deploy a backend version that exposes the required MCP tool before retrying."});let r={...e,category:"validation",retryable:!1};return Number(e.code)===-32602?new d(u.MODEL_CONSTRAINT_VIOLATION,t,r):Number(e.code)===-32601?new d(u.MODEL_NOT_SUPPORTED,t,r):Number(e.code)===-32700||Number(e.code)===-32600?new d(u.SERVER_ERROR,t,{...e,category:"protocol",retryable:!1}):new d(u.SERVER_ERROR,t,{...e,category:"server",retryable:!0,request_outcome:"unknown"})}var Xa=1;function ec(e,t){let r=[];for(let o of e.split(/\r?\n/))o.startsWith("data:")&&r.push(o.slice(5).trimStart());if(r.length===0)throw pe("Invalid SSE response from server",t);try{return JSON.parse(r.join(`
11
+ `))}catch{throw pe("Invalid JSON in SSE response from server",t)}}async function tc(e){let r=(await e.text()).trim();if(!r)throw pe("Empty response from server",e.status);if(r.startsWith("event:")||r.startsWith("data:"))return ec(r,e.status);try{return JSON.parse(r)}catch{throw pe("Invalid JSON response from server",e.status)}}function rc(e,t){if(!e||typeof e!="object")throw pe("Invalid MCP response from server",t);return e}var gt=class{baseUrl;apiKey;timeoutMs;_fetch;usesDefaultUndiciTransport;logger;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this.timeoutMs=t.timeoutMs??3e5,this.usesDefaultUndiciTransport=t.fetch===void 0,this._fetch=t.fetch??Qa,this.logger=t.logger}async callTool(t,r,o={}){let n=o.serverName??"genai",i=await this.requestJsonRpc(n,"tools/call",{name:t,arguments:r},`mcp.${n}.${t}`,{tool_name:t});if(!i||typeof i!="object")throw pe("Invalid MCP tool result from server");return i}async requestJsonRpc(t,r,o,n,i){let s=$({source:"hogi_mcp_client",operation:n,method:"POST",path:`/mcp/${t}/sse`,...i?{metadata:i}:{}},this.logger),a=new AbortController,c=setTimeout(()=>a.abort(),this.timeoutMs);typeof c=="object"&&"unref"in c&&c.unref();let l;try{if(l=await s.fetch(this._fetch,`${this.baseUrl}/mcp/${t}/sse`,{method:"POST",headers:G({"content-type":"application/json",accept:"application/json, text/event-stream","x-hogi-api-key":this.apiKey,"x-oiioii-cli-version":H}),body:JSON.stringify({jsonrpc:"2.0",id:Xa++,method:r,params:o}),...this.usesDefaultUndiciTransport?{dispatcher:Qt(this.timeoutMs)}:{},signal:a.signal}),!l.ok)throw await Ne(l);let p=rc(await tc(l),l.status);if(p.error)throw Za(p.error);if(p.result===void 0)throw pe("Missing MCP result from server",l.status);return s.success(l.status),p.result}catch(p){let m=p;if(a.signal.aborted||Ue(p))m=new d(u.GENERATION_TIMEOUT,`Request timed out after ${this.timeoutMs}ms`,{retryable:!0,...de(p)?{cause_code:de(p)}:{}});else if(!(p instanceof d)){let f=p instanceof Error?p.message:String(p);m=new d(u.NETWORK_ERROR,`Network error: ${f}`,{retryable:!0,...de(p)?{cause_code:de(p)}:{}})}throw s.failure(m,l?.status),m}finally{clearTimeout(c)}}};function kn(e,t){if(e.isError)throw Zt(e,`${t} failed`);let r=(e.content??[]).filter(o=>o?.type==="text").map(o=>o.text).find(o=>typeof o=="string"&&o.trim().length>0);if(!r)throw new d(u.SERVER_ERROR,`Invalid ${t} response: missing JSON text`);try{let o=JSON.parse(r);if(!o||typeof o!="object"||Array.isArray(o))throw new Error("not an object");return o}catch{throw new d(u.SERVER_ERROR,`Invalid ${t} response: malformed JSON`)}}var Re=class{mcp;baseUrl;apiKey;_fetch;logger;timeoutMs;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this._fetch=t.fetch??globalThis.fetch,this.logger=t.logger,this.timeoutMs=t.timeoutMs,this.mcp=new gt(t)}async getBalance(){let t=kn(await this.mcp.callTool("get_user_info",{},{serverName:"res"}),"points balance");if(typeof t.points!="number"||typeof t.tier!="string")throw new d(u.SERVER_ERROR,"Invalid points balance response");return t}async getGenerationCosts(t){if(t.length===0||t.length>20||t.some(n=>!n.startsWith("hogi://")))throw new d(u.INVALID_ARGUMENT,"Provide 1-20 hogi:// generation URIs");let r=kn(await this.mcp.callTool("query_generation_cost",{uris:t},{serverName:"res"}),"generation cost query");if(!Array.isArray(r.entries))throw new d(u.SERVER_ERROR,"Invalid generation cost response");return{entries:r.entries.map(n=>({...n,...n.status==="charged"&&typeof n.chargedAmount=="number"?{consumed_points:Math.abs(n.chargedAmount)}:{}})),...typeof r.note=="string"?{note:r.note}:{}}}async getLogs(t={}){let r=new URLSearchParams;t.cursorId!==void 0&&r.set("cursor_id",String(t.cursorId)),t.days!==void 0&&r.set("days",String(t.days)),t.limit!==void 0&&r.set("limit",String(t.limit)),t.type!==void 0&&r.set("type",t.type);let o="/v1/points/logs",n=$({source:"hogi_points_client",operation:"points.logs",method:"GET",path:o},this.logger),i;try{return await B({operation:"Points logs request",timeoutMs:this.timeoutMs,run:async s=>{if(i=await n.fetch(this._fetch,`${this.baseUrl}${o}?${r.toString()}`,{method:"GET",headers:G({accept:"application/json","x-hogi-api-key":this.apiKey}),signal:s}),i.status===401)throw new d(u.API_KEY_INVALID,"Invalid API key",{status:401});let a;try{a=await i.json()}catch{throw new d(u.SERVER_ERROR,"Invalid JSON response from points logs API")}if(!i.ok||a.ok!==!0)throw new d(u.SERVER_ERROR,a.error?.message??`Points logs request failed: HTTP ${i.status}`,{status:i.status});if(!a.data||typeof a.data!="object"||Array.isArray(a.data))throw new d(u.SERVER_ERROR,"Invalid points logs response");let c=a.data;if(!Array.isArray(c.entries)||typeof c.hasMore!="boolean")throw new d(u.SERVER_ERROR,"Invalid points logs response");let l={entries:c.entries,hasMore:c.hasMore,...typeof c.nextCursor=="number"?{nextCursor:c.nextCursor}:{}};if(l.hasMore&&l.nextCursor===void 0)throw new d(u.SERVER_ERROR,"Invalid points logs response: missing next cursor");return n.success(i.status,{entry_count:l.entries.length,has_more:l.hasMore}),l}})}catch(s){if(s instanceof q){let c=new d(u.NETWORK_ERROR,s.message,{retryable:!0,timeout_ms:s.timeoutMs});throw n.failure(c,i?.status),c}if(s instanceof d)throw n.failure(s,i?.status),s;let a=new d(u.NETWORK_ERROR,`Network error: ${s instanceof Error?s.message:String(s)}`);throw n.failure(a,i?.status),a}}};var oc=1e3,nc={record:()=>{}};function _t(e){return typeof e=="string"&&e.trim()?e.trim():void 0}async function zr(e,t,r,o=xe(),n={}){try{let i=T(e),s=(n.configStore??new b).loadResolved(),a=e.registeredArguments.findIndex(D=>D.name()==="workspace_id"),c=j(e.processedArgs[a])??j(e.opts().workspaceId)??_t(i.workspace)??_t(process.env.OIIOII_WORKSPACE_ID)??_t(s.defaultWorkspaceId);o.startCommand({command:t,...c?{workspaceId:c}:{},...r?{traceId:r}:{}});let l=W(),p=_t(i.baseUrl)??s.baseUrl;if(l&&(l.workspaceId=c,l.identityKey=s.apiKey?Jt(p,s.apiKey.trim()):void 0),process.env.OIIOII_TELEMETRY_DISABLED==="1")return;let m=_t(s.apiKey);if(!m)return;let f=await new Re({baseUrl:p,apiKey:m,timeoutMs:n.identityTimeoutMs??oc,logger:nc,...n.fetch?{fetch:n.fetch}:{}}).getBalance(),h=_t(f.userId);h&&(o.identify(h),l&&(l.uid=h))}catch{}}function Xt(e,t=xe()){t.reportCommandFailure(e)}function er(e=0,t=xe()){t.completeCommand(e)}async function Jr(e,t=xe()){await t.flush(e)}function k(e,t,r){return{ok:!0,type:e,data:t,...r?{next:r}:{}}}function S(e,t,r,o){Ke(t,r);let n=o&&typeof o=="object"&&!Array.isArray(o)?o:void 0;return{ok:!1,type:e,error:{code:t,...typeof n?.category=="string"?{category:n.category}:{},...typeof n?.hint=="string"?{hint:n.hint}:{},message:r,...typeof n?.retryable=="boolean"?{retryable:n.retryable}:{},...typeof n?.trace_id=="string"?{trace_id:n.trace_id}:{},...o!==void 0?{details:o}:{}}}}function _(e){process.stdout.write(JSON.stringify(e,null,2)+`
12
+ `)}function g(e){console.log(e)}function U(e){console.log(`\u2713 ${e}`)}function K(e){console.error(`\u26A0 ${e}`)}function O(e){Ke(void 0,e),console.error(`\u2717 ${e}`)}function z(e){console.log(`
13
+ ${e}`),console.log("\u2500".repeat(e.length))}function In(e,t){let r=e.map((i,s)=>Math.max(i.length,...t.map(a=>(a[s]??"").length),1)),o=`+${r.map(i=>"-".repeat(i+2)).join("+")}+`,n=i=>`| ${r.map((s,a)=>(i[a]??"").padEnd(s)).join(" | ")} |`;console.log(o),console.log(n(e)),console.log(o);for(let i of t)console.log(n(i));console.log(o)}import{Command as bn}from"commander";import{z as ic}from"zod";function tr(e,t){let r=ic.string().trim().uuid().safeParse(e);if(!r.success)throw new d(u.INVALID_ARGUMENT,`${t} must be a UUID`);return r.data}function Hr(e){if(e.subgroup!==void 0&&e.public)throw new d(u.INVALID_ARGUMENT,"--subgroup and --public are mutually exclusive");return{...e.folder!==void 0?{folderId:tr(e.folder,"--folder")}:{},...e.subgroup!==void 0?{subgroupId:tr(e.subgroup,"--subgroup")}:e.public?{subgroupId:null}:{}}}async function sc(e,t,r,o={}){let n=Hr({subgroup:t.subgroup,public:t.public}),i=t.folderId!==void 0?tr(t.folderId,"folder_id"):void 0,s=t.limit===void 0?12:Number(t.limit);if(!Number.isInteger(s)||s<1||s>100)throw new d(u.INVALID_ARGUMENT,"--limit must be an integer from 1 to 100");if(t.cursor!==void 0&&!t.cursor.trim())throw new d(u.INVALID_ARGUMENT,"--cursor must not be empty");let a=t.name?.trim();if((e==="create"||e==="rename")&&(!a||a.length>100))throw new d(u.INVALID_ARGUMENT,"--name must contain 1 to 100 characters");if(!["list","create","remove"].includes(e)&&!i)throw new d(u.INVALID_ARGUMENT,"folder_id is required");let c=o.configStore??new b,l=P(r,c),p=new te({baseUrl:l.baseUrl,apiKey:l.apiKey,...o.fetch?{fetch:o.fetch}:{}}),m=()=>tr(ce(r,c,t.workspaceId),"workspace_id"),f;switch(e){case"list":f=await p.listFolders(s,t.cursor);break;case"get":f=await p.getFolder(i);break;case"create":f=await p.createFolder({name:a,...n.subgroupId!==void 0?{subgroup_id:n.subgroupId}:{},...t.workspaceId!==void 0?{workspace_id:m()}:{}});break;case"rename":f=await p.updateFolder(i,{name:a});break;case"favorite":case"unfavorite":f=await p.updateFolder(i,{is_favorite:e==="favorite"});break;case"workspaces":f=await p.listFolderWorkspaces(i,s,t.cursor);break;case"move":f=await p.setWorkspaceFolder(m(),i);break;case"remove":f=await p.setWorkspaceFolder(m(),null);break;case"trash":case"restore":case"purge":f=await p.folderLifecycle(i,e);break}return y("workspace_folder",`folder.${e}`,{...i?{folder_id:i}:{}}),f}function vn(e,t,r){let o=e instanceof d?e:new d(u.SERVER_ERROR,e instanceof Error?e.message:String(e));E(t)?_(S(r,o.code,o.message,o.details)):O(o.message),process.exitCode=1}function En(e,t,r){E(t)?_(k(r,e)):g(JSON.stringify(e,null,2))}function Tn(e={}){let t=new bn("folder").description("Manage workspace folders"),r={list:"List folders",get:"Get folder details",create:"Create a folder",rename:"Rename a folder",favorite:"Favorite a folder",unfavorite:"Remove folder favorite",workspaces:"List folder workspaces",move:"Move a workspace into a folder",remove:"Remove a workspace from its folder",trash:"Move a folder and its projects to trash",restore:"Restore a folder and its projects",purge:"Permanently delete a trashed folder and its projects"};for(let o of Object.keys(r)){let n=t.command(o).description(r[o]);["list","create","remove"].includes(o)||n.argument("<folder_id>","Folder UUID"),(o==="create"||o==="rename")&&n.requiredOption("--name <name>","Folder name"),o==="create"&&n.option("--subgroup <subgroup_id>","Team subgroup UUID").option("--public","Explicit public placement"),["create","move","remove"].includes(o)&&n.option("--workspace-id <workspace_id>","Workspace UUID (move/remove otherwise use the active workspace)"),(o==="list"||o==="workspaces")&&n.option("--limit <count>","Page size (1 to 100)","12").option("--cursor <cursor>","Next-page cursor"),n.action(async(...i)=>{let s=i.at(-1);try{let a={...s.opts(),...i.length>2?{folderId:i[0]}:{}};En(await sc(o,a,T(s),e),s,`workspace_folder_${o}`)}catch(a){vn(a,s,`workspace_folder_${o}`)}})}return t}function An(e={}){let t=new bn("subgroup").description("Workspace subgroup choices");return t.command("list").description("List visible subgroups and creation permission").action(async(r,o)=>{try{let n=P(T(o),e.configStore??new b),i=new te({baseUrl:n.baseUrl,apiKey:n.apiKey,...e.fetch?{fetch:e.fetch}:{}});En(await i.listCreationSubgroups(),o,"workspace_subgroup_list")}catch(n){vn(n,o,"workspace_subgroup_list")}}),t}import{Command as hc}from"commander";import{mkdir as ac,writeFile as cc}from"fs/promises";import{existsSync as dc,statSync as uc}from"fs";import{basename as lc,dirname as mc,join as pc,resolve as Cn}from"path";function Sn(e){if(!e||!e.startsWith("hogi://"))throw new d(u.INVALID_ARGUMENT,`Invalid hogi URI: "${e}". Expected format: hogi://image/<id> or hogi://video/<id>`)}function fc(e){try{let t=new URL(e),r=lc(t.pathname);if(r&&r!=="."&&r!=="/")return r}catch{}return"resource.bin"}function gc(e,t){let r=fc(e);if(!t)return Cn(process.cwd(),r);let o=Cn(t);return dc(o)&&uc(o).isDirectory()?pc(o,r):o}function _c(e,t){if(e?.toLowerCase().includes("application/json"))return!0;let r=t.subarray(0,128).toString("utf8").trimStart();return r.startsWith("{")&&(r.includes('"error"')||r.includes('"code"'))}var ht=class{baseUrl;apiKey;_fetch;logger;timeoutMs;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this._fetch=t.fetch??globalThis.fetch,this.logger=t.logger,this.timeoutMs=t.timeoutMs??3e5}getReadUrl(t,r={}){Sn(t);let o=new URLSearchParams;return o.set("uri",t),r.filename&&o.set("filename",r.filename),typeof r.watermark=="boolean"&&o.set("wm",r.watermark?"1":"0"),t.startsWith("hogi://image/")&&r.watermark!==!0&&o.set("format","original"),`${this.baseUrl}/v1/res/read_file?${o.toString()}`}async download(t,r={}){Sn(t);let o=this.getReadUrl(t,r),n=gc(t,r.output),i=$({source:"hogi_res_client",operation:"resource.read",method:"GET",path:"/v1/res/read_file"},this.logger),s,a;try{a=await B({operation:"Resource download request",timeoutMs:this.timeoutMs,run:async c=>{if(s=await i.fetchResource(this._fetch,o,{method:"GET",headers:G({"x-hogi-api-key":this.apiKey,accept:"image/*,video/*,application/octet-stream,application/json;q=0.5,*/*;q=0.1"}),signal:c}),s.status===401)throw new d(u.API_KEY_INVALID,"Invalid API key",{status:401});if(s.status===404)throw new d(u.RECORD_NOT_FOUND,`Resource not found for URI: ${t}`,{status:404});if(!s.ok){let m=await s.text().catch(()=>"");throw new d(u.SERVER_ERROR,`HTTP ${s.status}: ${m||s.statusText}`,{status:s.status})}let l=s.headers.get("content-type"),p=Buffer.from(await s.arrayBuffer());if(_c(l,p)){let m="Resource read failed";try{let f=JSON.parse(p.toString("utf8"));m=f.message??f.error??f.code??m}catch{}throw new d(u.SERVER_ERROR,m)}return{contentType:l,buffer:p}}})}catch(c){if(c instanceof q){let m=new d(u.NETWORK_ERROR,c.message,{retryable:!0,timeout_ms:c.timeoutMs});throw i.failure(m,s?.status),m}if(c instanceof d)throw i.failure(c,s?.status),c;let l=c instanceof Error?c.message:String(c),p=new d(u.NETWORK_ERROR,`Network error: ${l}`);throw i.failure(p),p}return i.success(s.status,{bytes:a.buffer.byteLength,mime_type:a.contentType}),await ac(mc(n),{recursive:!0}),await cc(n,a.buffer),y("record","resource.saved",{bytes:a.buffer.byteLength,mime_type:a.contentType}),{path:n,bytes:a.buffer.byteLength,mimeType:a.contentType,uri:t}}};function xn(e,t){let r=t.configStore??new b,o=P(e,r);return{auth:o,configStore:r,workspaceClient:new te({baseUrl:o.baseUrl,apiKey:o.apiKey,...t.fetch?{fetch:t.fetch}:{}})}}async function yc(e,t,r={}){let{configStore:o,workspaceClient:n}=xn(t,r),i=ce(t,o,e.workspaceId),s=await n.listAssets(i);return y("workspace_assets","assets.listed",{workspace_id:i,count:s.length}),{workspace_id:i,count:s.length,assets:s}}function wc(e){return e.startsWith("hogi://asset/")?e.slice(13):e}function Rc(e,t){let r=wc(t.trim()),o=e.find(n=>n.assetId===r);if(!o)throw new d(u.RECORD_NOT_FOUND,`Workspace asset not found: ${t}`,{asset_reference:t});if(o.status)throw new d(u.INVALID_ARGUMENT,`Workspace asset ${o.assetId} is not ready for download (status: ${o.status}).`,{asset_id:o.assetId,status:o.status});if(!o.uri.startsWith("hogi://")||o.uri.startsWith("hogi://asset/"))throw new d(u.INVALID_ARGUMENT,`Workspace asset ${o.assetId} has no downloadable resource URI.`,{asset_id:o.assetId,uri:o.uri});return o}async function kc(e,t,r={}){let o=e.asset.trim();if(!o)throw new d(u.INVALID_ARGUMENT,"Asset ID is required");let{auth:n,configStore:i,workspaceClient:s}=xn(t,r),a=ce(t,i,e.workspaceId),c=Rc(await s.listAssets(a),o),l=await new ht({baseUrl:n.baseUrl,apiKey:n.apiKey,...r.fetch?{fetch:r.fetch}:{}}).download(c.uri,{...e.output?{output:e.output}:{},...e.filename?{filename:e.filename}:{},...e.watermark!==void 0?{watermark:e.watermark}:{}});return y("workspace_assets","asset.downloaded",{workspace_id:a,asset_id:c.assetId,bytes:l.bytes}),{workspace_id:a,asset_id:c.assetId,uri:c.uri,path:l.path,bytes:l.bytes,mime_type:l.mimeType}}function On(e,t,r){let o=e instanceof d?e:new d(u.SERVER_ERROR,e instanceof Error?e.message:String(e));t?_(S(r,o.code,o.message,o.details)):O(o.message),process.exitCode=1}function Nn(e={}){let t=new hc("assets").description("List and download workspace assets");return t.command("list").description("List assets in a workspace").argument("[workspace_id]","Workspace ID; defaults to the active workspace").action(async(r,o,n)=>{let i=E(n);try{let s=await yc({workspaceId:r},T(n),e);if(re(s.workspace_id),A({asset_count:s.count}),i)_(k("workspace_assets_list",s));else{z(`Workspace assets (${s.count})`);for(let a of s.assets)g(` ${a.assetId} ${a.type} ${a.status??"ready"} ${a.uri||"-"}`)}}catch(s){On(s,i,"workspace_assets_list")}}),t.command("download").description("Download a workspace asset by asset ID or hogi://asset URI").argument("<asset>","Workspace asset ID or hogi://asset/<id>").option("-o, --output <path>","Output file or directory path").option("--filename <name>","Download filename hint passed to backend").option("--wm","Request watermarked asset").action(async(r,o,n)=>{let i=E(n);try{let s=await kc({asset:r,...o.output?{output:o.output}:{},...o.filename?{filename:o.filename}:{},...o.wm!==void 0?{watermark:o.wm}:{}},T(n),e);re(s.workspace_id),A({resource_type:new URL(s.uri).hostname,size_bytes:s.bytes}),i?_(k("workspace_asset_download",s)):U(`Downloaded workspace asset ${s.asset_id}: ${s.path}`)}catch(s){On(s,i,"workspace_asset_download")}}),t}import{readFile as Kc}from"fs/promises";import{resolve as zc}from"path";import{Command as Jc}from"commander";var fe=class{baseUrl;apiKey;_fetch;logger;timeoutMs;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this._fetch=t.fetch??globalThis.fetch,this.logger=t.logger,this.timeoutMs=t.timeoutMs}async listModels(t={}){let r=$({source:"hogi_model_catalog_client",operation:"models.list",method:"POST",path:"/points/mcp_model_pricings"},this.logger),o;try{return await B({operation:"Model catalog request",timeoutMs:this.timeoutMs,run:async n=>{if(o=await r.fetch(this._fetch,`${this.baseUrl}/points/mcp_model_pricings`,{method:"POST",headers:G({"content-type":"application/json",accept:"application/json",connection:"close","x-hogi-api-key":this.apiKey}),body:JSON.stringify(t.includeDisplayNames?{includeDisplayNames:!0}:{}),signal:n}),o.status===401)throw new d(u.API_KEY_INVALID,"Invalid API key",{status:401});if(!o.ok)throw new d(u.SERVER_ERROR,`Model catalog request failed: HTTP ${o.status}`,{status:o.status});let i;try{i=await o.json()}catch{throw new d(u.SERVER_ERROR,"Invalid JSON response from model catalog")}if(i.code==="UNAUTHORIZED")throw new d(u.API_KEY_INVALID,"Invalid API key",{status:401});let s=i.data?.pricings;if(i.code!=="SUCCESS"||!Array.isArray(s)||s.some(a=>!Ic(a)))throw new d(u.SERVER_ERROR,i.error??"Invalid model catalog response from server");return r.success(o.status,{model_count:s.length}),s}})}catch(n){if(n instanceof q){let a=new d(u.NETWORK_ERROR,n.message,{retryable:!0,timeout_ms:n.timeoutMs});throw r.failure(a,o?.status),a}if(n instanceof d)throw r.failure(n,o?.status),n;let i=n instanceof Error?n.message:String(n),s=new d(u.NETWORK_ERROR,`Network error: ${i}`);throw r.failure(s),s}}};function Ic(e){if(!e||typeof e!="object")return!1;let t=e,r=i=>Array.isArray(i)&&i.every(s=>typeof s=="string"),o=t.input_capabilities===void 0||r(t.input_capabilities)&&t.input_capabilities.every(i=>["text","image","video","audio","file"].includes(i)),n=i=>i==null||typeof i=="number"&&Number.isInteger(i)&&i>=0;return typeof t.id=="number"&&typeof t.mcp_method_name=="string"&&(t.name===null||typeof t.name=="string")&&(t.display_name===void 0||t.display_name===null||typeof t.display_name=="string")&&(t.model===null||typeof t.model=="string")&&typeof t.points_cost=="number"&&r(t.sizes)&&r(t.aspect_ratios)&&(t.durations===void 0||r(t.durations))&&o&&n(t.reference_image_count_min)&&n(t.reference_image_count_max)&&r(t.tags)&&!!t.description_i18n&&typeof t.description_i18n=="object"&&!Array.isArray(t.description_i18n)&&(t.members_only===void 0||t.members_only===null||typeof t.members_only=="boolean")&&typeof t.sort_order=="number"}import{z as M}from"zod";var ot=M.string().trim().min(1).max(200),Yr=M.string().trim().min(1).max(100),rt=M.string().trim().min(1).max(100);function bc(e){if(e.startsWith("generate_music_"))return"audio";if(e.startsWith("generate_video_"))return"video";if(e.startsWith("generate_image_"))return"image";if(e.startsWith("generate_text_"))return"text"}var vc=M.object({duration:M.union([M.number().positive().finite(),M.literal("auto")]).optional(),mcp_method_name:ot.optional(),model_version:ot.optional(),quality:rt.optional(),ratio:rt.optional(),resolution:rt.optional()}).strict().refine(e=>Object.values(e).some(t=>t!==void 0),{message:"generation_config must include at least one parameter"}),Qr=M.object({kind:M.literal("media"),media_type:M.enum(["audio","image","text","video"]),uri:M.string().trim().min(1).max(2048)}).strict().superRefine((e,t)=>{let r=`hogi://${e.media_type}/`;(!e.uri.startsWith(r)||e.uri===r)&&t.addIssue({code:M.ZodIssueCode.custom,path:["uri"],message:`URI must start with ${r} and include a resource key`})}),Zr=M.object({kind:M.literal("workspace_asset"),asset_id:ot,asset_type:M.enum(["item","role","scene"])}).strict(),Ec=M.union([M.object({client_node_id:Yr}).strict(),M.object({asset_id:ot}).strict()]),Tc=M.object({nodes:M.array(M.object({client_id:Yr,type:M.enum(["audio","image","video"]),title:M.string().trim().max(100).optional(),prompt:M.string().max(2e4).optional(),generation_config:vc.optional(),references:M.array(M.union([Qr,Zr])).max(50).optional()}).strict().superRefine((e,t)=>{let r=e.generation_config;if(!r||(r.model_version&&!r.mcp_method_name&&t.addIssue({code:M.ZodIssueCode.custom,path:["generation_config","model_version"],message:"model_version requires mcp_method_name"}),!r.mcp_method_name))return;let o=bc(r.mcp_method_name);o?o!==e.type&&t.addIssue({code:M.ZodIssueCode.custom,path:["generation_config","mcp_method_name"],message:`Generation model type ${o} does not match node type ${e.type}`}):t.addIssue({code:M.ZodIssueCode.custom,path:["generation_config","mcp_method_name"],message:"Unknown generation model method"})})).max(100).optional().default([]),groups:M.array(M.object({client_id:Yr,title:M.string().trim().max(100).optional(),existing_member_policy:M.enum(["move","reject"]).optional(),members:M.array(Ec).min(1).max(100)}).strict()).max(50).optional().default([])}).strict().superRefine((e,t)=>{e.nodes.length===0&&e.groups.length===0&&t.addIssue({code:M.ZodIssueCode.custom,path:[],message:"Composition must include at least one node or group"});let r=new Set;e.nodes.forEach((i,s)=>{r.has(i.client_id)&&t.addIssue({code:M.ZodIssueCode.custom,path:["nodes",s,"client_id"],message:"Node client_id values must be unique"}),r.add(i.client_id)});let o=new Set,n=new Map;e.groups.forEach((i,s)=>{o.has(i.client_id)&&t.addIssue({code:M.ZodIssueCode.custom,path:["groups",s,"client_id"],message:"Group client_id values must be unique"}),o.add(i.client_id);let a=new Set;i.members.forEach((c,l)=>{let p="client_node_id"in c?`client:${c.client_node_id}`:`asset:${c.asset_id}`;"client_node_id"in c&&!r.has(c.client_node_id)&&t.addIssue({code:M.ZodIssueCode.custom,path:["groups",s,"members",l],message:`Unknown client node: ${c.client_node_id}`}),a.has(p)&&t.addIssue({code:M.ZodIssueCode.custom,path:["groups",s,"members",l],message:"A group cannot contain the same member more than once"});let m=n.get(p);m&&t.addIssue({code:M.ZodIssueCode.custom,path:["groups",s,"members",l],message:`A node cannot belong to multiple groups (${m}, ${i.client_id})`}),a.add(p),n.set(p,i.client_id)})})});function Ac(e){return e.length>0?e.join("."):"input"}function Xr(e){let t=Tc.safeParse(e);if(t.success)return t.data;let r=t.error.issues.map(n=>({path:Ac(n.path),message:n.message})),o=r[0];throw new d(u.INVALID_ARGUMENT,`Invalid canvas composition input${o?` at ${o.path}: ${o.message}`:""}`,{category:"validation",retryable:!1,issues:r})}var Cc=/^hogi:\/\/(role|scene|item)_asset\/([A-Za-z0-9_-]+)$/,Sc=/\[(Role|Scene|Item):([^\]]+)]/g,Oc=/^[A-Za-z0-9_-]+$/;function xc(e){return e==="Role"?"role":e==="Scene"?"scene":"item"}function Nc(e){return e==="role"?"Role":e==="scene"?"Scene":"Item"}function ke(e){let t=e.trim(),r=Cc.exec(t);if(!r)throw new d(u.INVALID_ARGUMENT,`Invalid asset library URI: ${e}. Expected hogi://role_asset/<id>, hogi://scene_asset/<id>, or hogi://item_asset/<id>.`);let o=r[2];if(o.length>200)throw new d(u.INVALID_ARGUMENT,`Asset library ID is too long: ${o.slice(0,40)}...`);return{kind:"workspace_asset",assetType:r[1],assetId:o}}function Un(e){return`hogi://${e.assetType}_asset/${e.assetId}`}function Uc(e){let t=e.indexOf("=");if(t<=0||t===e.length-1)throw new d(u.INVALID_ARGUMENT,`Invalid asset binding: ${e}. Expected <name>=<asset-uri>, for example \u7403\u7403=hogi://role_asset/<id>.`);let r=e.slice(0,t).trim().replace(/^@/,"");if(!r||r.length>100||/[@\[\]=\n\r]/.test(r))throw new d(u.INVALID_ARGUMENT,`Invalid asset binding name: ${e.slice(0,t).trim()}`);return{alias:r,reference:ke(e.slice(t+1))}}function eo(e){return`${e.assetType}:${e.assetId}`}function Dc(e){let t=new Set;return e.filter(r=>{let o=eo(r);return t.has(o)?!1:(t.add(o),!0)})}function nt(e){let t=e.prompt,r=(e.assets??[]).map(ke),o=(e.bindings??[]).map(Uc),n=new Map;for(let c of o){let l=n.get(c.alias);if(l&&eo(l)!==eo(c.reference))throw new d(u.INVALID_ARGUMENT,`Asset binding @${c.alias} maps to more than one asset.`);n.set(c.alias,c.reference)}for(let[c,l]of[...n.entries()].sort(([p],[m])=>m.length-p.length)){let p=`@${c}`;if(!t.includes(p))throw new d(u.INVALID_ARGUMENT,`Asset binding ${p} was not found in the prompt.`);t=t.split(p).join(`[${Nc(l.assetType)}:${l.assetId}]`),r.push(l)}let i=new RegExp(Sc.source,"g"),s=null;for(;(s=i.exec(t))!==null;){let c=s[2]?.trim();if(!c||c.length>200||!Oc.test(c))throw new d(u.INVALID_ARGUMENT,`Invalid asset placeholder in prompt: ${s[0]}`);r.push({kind:"workspace_asset",assetType:xc(s[1]),assetId:c})}let a=Dc(r);if(a.length>50)throw new d(u.INVALID_ARGUMENT,`Too many asset references: ${a.length}. Maximum is 50.`);return{prompt:t,references:a}}function ge(e,t){let r=e.loadResolved().generationTransport??"openapi";return t.some(n=>n.kind==="workspace_asset")?(r!=="openapi"&&y("async_generation","transport.selected",{configured_transport:r,selected_transport:"openapi",reason:"workspace_asset_reference"}),"openapi"):r}function Ie(...e){let t=new Set,r=[];for(let o of e.flat()){let n=o.kind==="media"?`media:${o.mediaType}:${o.uri}`:`asset:${o.assetType}:${o.assetId}`;t.has(n)||(t.add(n),r.push(o))}return r}import{z as De}from"zod";var Mc=De.object({duration:De.union([De.number().positive().finite(),De.literal("auto"),De.null()]).optional(),mcp_method_name:ot.nullable().optional(),model_version:ot.nullable().optional(),quality:rt.nullable().optional(),ratio:rt.nullable().optional(),resolution:rt.nullable().optional()}).strict().refine(e=>Object.keys(e).length>0,{message:"generation_config must include at least one parameter"}),Pc=De.object({generation_config:Mc.optional(),prompt:De.string().max(2e4).nullable().optional(),references:De.array(De.union([Qr,Zr])).max(50).optional()}).strict().refine(e=>Object.keys(e).length>0,{message:"update input must include generation_config, prompt, or references"});function Lc(e){return e.length>0?e.join("."):"input"}function to(e){let t=Pc.safeParse(e);if(t.success)return t.data;let r=t.error.issues.map(n=>({path:Lc(n.path),message:n.message})),o=r[0];throw new d(u.INVALID_ARGUMENT,`Invalid canvas node update input${o?` at ${o.path}: ${o.message}`:""}`,{category:"validation",retryable:!1,issues:r})}function ro(e){return e.startsWith("hogi://")?e.slice(7):e}function $c(e){if(e.kind==="workspace_asset")return"image";if(e.media_type==="image"||e.media_type==="audio"||e.media_type==="video")return e.media_type}function Vc(e){if(e.kind==="workspace_asset")return`[${e.asset_type==="role"?"Role":e.asset_type==="scene"?"Scene":"Item"}:${e.asset_id}]`;if(e.media_type==="image")return`[Image:${ro(e.uri)}]`;if(e.media_type==="audio")return`[Audio:${ro(e.uri)}]`;if(e.media_type==="video")return`[Video:${ro(e.uri)}]`}function oo(e,t,r,o){let n=t.filter(i=>$c(i)===r).map(Vc);return e.replace(o,(i,s)=>{let a=Number(s)-1;return n[a]??i})}function no(e,t){let r=oo(e,t,"image",/@(?:图片|图)\s*([1-9]\d*)/g),o=oo(r,t,"audio",/@音频\s*([1-9]\d*)/g);return oo(o,t,"video",/@视频\s*([1-9]\d*)/g)}var Gc={seedream45:"generate_image_seedream45",seedream40:"generate_image_seedream40",seedream50:"generate_image_seedream50","seedream50-lite":"generate_image_seedream50lite","seedream50-pro":"generate_image_seedream50pro",gpt4o:"generate_image_gpt4o","gpt-image2":"generate_image_gpt_image2","gpt-image-2":"generate_image_gpt_image2",midjourney:"generate_image_midjourney",midjourney8:"generate_image_midjourney8",flux:"generate_image_flux",nano:"generate_image_nano",qwen:"generate_image_qwen","qwen-image3":"generate_image_qwen_image3",comfyui:"generate_image_comfyui",novelai:"generate_image_novelai"},Fc={seedance20:"generate_video_seedance20","seedance 2.0":"generate_video_seedance20",kling:"generate_video_kling","kling-o1":"generate_video_kling_o1",hailuo02:"generate_video_hailuo02","minimax-h3":"generate_video_minimax_h3",wan:"generate_video_wan",wan26:"generate_video_wan26",wan27:"generate_video_wan27",vidu:"generate_video_vidu",veo3:"generate_video_veo3",sora2:"generate_video_sora2","sora2-pro":"generate_video_sora2_pro",grok:"generate_video_grok","grok-imagine":"generate_video_grok_imagine","grok-imagine-1.5":"generate_video_grok_imagine_15","grok-imagine-1.5-fast":"generate_video_grok_imagine_15_fast",seedance25:"generate_video_seedance25","midjourney-video":"generate_video_midjourney"},Wc={"seed-audio":"generate_music_seed_audio","seed-audio-1.0":"generate_music_seed_audio",suno:"generate_music_suno"};function Dn(e){return e==="image"?Gc:e==="video"?Fc:Wc}function qc(e){return e==="audio"?"generate_music_":`generate_${e}_`}function Mn(e,t){let r=Dn(t),o=r[e];if(!o){y("model_map","model.resolve_failed",{domain:t,model:e},"warn");let n=Object.keys(r).join(", ");throw new d(u.MODEL_NOT_SUPPORTED,`Unknown ${t} model: "${e}". Available: ${n}`,{category:"validation",retryable:!1,hint:`Run oiioii inspect models --domain ${t} --json to list active models.`,domain:t,model:e})}return y("model_map","model.resolved",{domain:t,model:e,tool:o}),o}function jc(e){let t=Dn(e);return Object.entries(t).map(([r,o])=>({name:r,tool:o}))}function Nt(e,t){let r=qc(t);return!e.startsWith(r)||e.length===r.length?void 0:jc(t).find(n=>n.tool===e)?.name??e.slice(r.length)}function Pn(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"")}function $n(e,t){let r=io(e);if(!r)return!1;let o=Pn(t),n=Nt(e.mcp_method_name,r);return[e.name,n,n&&e.model?`${n}${e.model}`:void 0].filter(s=>typeof s=="string").some(s=>Pn(s)===o)}function io(e){if(e.mcp_method_name.startsWith("generate_image_"))return"image";if(e.mcp_method_name.startsWith("generate_video_"))return"video";if(e.mcp_method_name.startsWith("generate_music_"))return"audio"}function Vn(e){return[...e].sort((t,r)=>t.sort_order-r.sort_order||t.id-r.id)[0]}function yt(e,t){let r=io(e);if(!r||t&&r!==t)throw new d(u.MODEL_NOT_SUPPORTED,`Model ID ${e.id} belongs to ${r??"an unsupported"} domain${t?`, not ${t}`:""}.`,{category:"validation",retryable:!1,model_id:e.id,...t?{expected_domain:t}:{}});let o=Nt(e.mcp_method_name,r);if(!o)throw new d(u.MODEL_NOT_SUPPORTED,`Model ID ${e.id} is not supported by ${r} generation.`,{category:"validation",retryable:!1,model_id:e.id});return{key:o,toolName:e.mcp_method_name,modelId:e.id,name:e.name??e.model??o,...e.model?{variant:e.model}:{},catalog:e,catalogStatus:"exact"}}function Ut(e,t){if(t.modelId&&(t.model||t.variant))throw new d(u.INVALID_ARGUMENT,"Use --model-id or --model [--variant], not both.");if(t.variant&&!t.model)throw new d(u.INVALID_ARGUMENT,"--variant requires --model.");if(!t.modelId&&!t.model)throw new d(u.INVALID_ARGUMENT,"Provide --model-id or --model [--variant].");if(t.modelId){let i=Bc(t.modelId),s=e.find(a=>a.id===i);if(s)return s;throw new d(u.MODEL_NOT_SUPPORTED,`Model ID ${i} is not present in the active backend model catalog.`,{category:"validation",retryable:!1,hint:"Run oiioii inspect models --json and select an active model_id.",model_id:i})}let r=e.filter(i=>$n(i,t.model)),o=t.variant?r.filter(i=>i.model===t.variant):r,n=Vn(o);if(n)return n;throw new d(u.MODEL_NOT_SUPPORTED,t.variant?`Model ${t.model} does not have variant "${t.variant}" in the active backend model catalog.`:`Model ${t.model} is not present in the active backend model catalog.`,{category:"validation",retryable:!1,hint:"Run oiioii inspect models --json and select an active model.",model:t.model,...t.variant?{variant:t.variant}:{}})}function Bc(e){if(!/^\d+$/.test(e))throw new d(u.INVALID_ARGUMENT,`Invalid model ID: "${e}". Expected a positive integer from inspect models.`);let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new d(u.INVALID_ARGUMENT,`Invalid model ID: "${e}". Expected a positive integer from inspect models.`);return t}async function it(e){if(e.modelId&&e.variant)throw new d(u.INVALID_ARGUMENT,"Use either --model-id or --variant, not both.");if(!e.modelId&&!e.variant){let n={key:e.model,toolName:Mn(e.model,e.domain)};if(!e.requireActiveCatalog)return n;let s=(await new fe({baseUrl:e.baseUrl,apiKey:e.apiKey,...e.fetch?{fetch:e.fetch}:{}}).listModels()).filter(c=>io(c)===e.domain&&(c.mcp_method_name===n.toolName||$n(c,e.model)));if(s.length===0)throw new d(u.MODEL_NOT_SUPPORTED,`Model ${e.model} is not present in the active backend model catalog.`,{category:"validation",retryable:!1,hint:"Run oiioii inspect models --json and select an active model.",model:e.model});let a=s.find(c=>c.mcp_method_name===n.toolName&&c.model===null)??Vn(s);return a?{...yt(a,e.domain),key:e.model}:{...n,catalogStatus:"ambiguous"}}let t=await new fe({baseUrl:e.baseUrl,apiKey:e.apiKey,...e.fetch?{fetch:e.fetch}:{}}).listModels(),r=Ut(t,e.modelId?{modelId:e.modelId}:{model:e.model,variant:e.variant}),o=yt(r,e.domain);return e.modelId?o:{...o,key:e.model}}function Gn(e){return[...new Set(e.catalog?.input_capabilities??[])]}function Dt(e,t){let r=e.catalog?.durations?.[0]?.trim(),o=t.duration;if(r&&/^\d+(?:\.\d+)?$/.test(r))o=Number(r);else if(r){let n=/^(\d+(?:\.\d+)?)\s*-\s*(\d+(?:\.\d+)?)$/.exec(r);n&&(o=Number(n[1]))}return{aspectRatio:e.catalog?.aspect_ratios[0]??t.aspectRatio,resolution:e.catalog?.sizes[0]??t.resolution,...o!==void 0?{duration:o}:{}}}function Ln(e){let t=e.trim().toLowerCase();return t==="adaptive"?"auto":t}function st(e,t){let r=e.catalog;if(r){if(t.aspectRatio&&r.aspect_ratios.length>0){let o=Ln(t.aspectRatio);if(!r.aspect_ratios.map(Ln).includes(o))throw new d(u.MODEL_CONSTRAINT_VIOLATION,`${e.name??e.key} does not support aspect ratio ${t.aspectRatio}. Supported: ${r.aspect_ratios.join(", ")}.`,{category:"validation",retryable:!1,field:"aspect_ratio",received:t.aspectRatio,supported:r.aspect_ratios})}if(t.resolution&&r.sizes.length>0){let o=t.resolution.trim().toLowerCase();if(!r.sizes.some(n=>n.trim().toLowerCase()===o))throw new d(u.MODEL_CONSTRAINT_VIOLATION,`${e.name??e.key} does not support resolution ${t.resolution}. Supported: ${r.sizes.join(", ")}.`,{category:"validation",retryable:!1,field:"resolution",received:t.resolution,supported:r.sizes})}if(t.duration!==void 0&&r.durations&&r.durations.length>0&&!r.durations.some(n=>{let i=n.trim();if(/^\d+(?:\.\d+)?$/.test(i))return Number(i)===t.duration;let s=/^(\d+(?:\.\d+)?)\s*-\s*(\d+(?:\.\d+)?)$/.exec(i);return s!==null&&t.duration>=Number(s[1])&&t.duration<=Number(s[2])}))throw new d(u.MODEL_CONSTRAINT_VIOLATION,`${e.name??e.key} does not support duration ${t.duration}s. Supported: ${[...new Set(r.durations)].join(", ")}.`,{category:"validation",retryable:!1,field:"duration",received:t.duration,supported:[...new Set(r.durations)]})}}function be(e){return{key:e.key,...e.modelId!==void 0?{model_id:e.modelId}:{},...e.name?{name:e.name}:{},...e.variant?{variant:e.variant}:{}}}function Ye(e){return e.modelId!==void 0?`--model-id ${e.modelId}`:e.variant?`--model ${e.key} --variant ${e.variant}`:`--model ${e.key}`}var Hc=16*1024*1024;async function Yc(e,t,r=async o=>Kc(o,"utf8")){let o=e.trim();if(!o)throw new d(u.INVALID_ARGUMENT,"--input must not be empty");let n;try{n=await r(zc(o))}catch(i){throw new d(u.INVALID_ARGUMENT,`Unable to read ${t} input: ${i instanceof Error?i.message:String(i)}`,{category:"validation",retryable:!1,path:o})}if(Buffer.byteLength(n,"utf8")>Hc)throw new d(u.INVALID_ARGUMENT,"Canvas composition input must not exceed 16 MiB");try{return JSON.parse(n)}catch(i){throw new d(u.INVALID_ARGUMENT,`Canvas composition input is not valid JSON: ${i instanceof Error?i.message:String(i)}`,{category:"validation",retryable:!1,path:o})}}async function Qc(e,t){return await Yc(e,"canvas composition",t)}async function Fn(e,t,r={}){let o=e.idempotencyKey?.trim();if(e.idempotencyKey!==void 0&&!o)throw new d(u.INVALID_ARGUMENT,"--idempotency-key must not be empty");if(o&&o.length>200)throw new d(u.INVALID_ARGUMENT,"--idempotency-key must not exceed 200 characters");let n=Xr(e.input),i=Xr({...n,nodes:n.nodes.map(p=>p.prompt===void 0?p:{...p,prompt:no(p.prompt,p.references??[])})}),s=r.configStore??new b,a=P(t,s),c=ce(t,s,e.workspaceId);y("workspace_canvas","composition.create_requested",{workspace_id:c,node_count:i.nodes.length,group_count:i.groups.length,has_idempotency_key:o!==void 0});let l=await new te({baseUrl:a.baseUrl,apiKey:a.apiKey,...r.fetch?{fetch:r.fetch}:{}}).createCanvasComposition(c,i,o);return y("workspace_canvas",l.reused?"composition.reused":"composition.created",{workspace_id:l.workspace_id,node_count:l.nodes.length,group_count:l.groups.length}),l}async function Zc(e,t,r={}){let o=e.assetIds.map(s=>s.trim());if(o.length<2)throw new d(u.INVALID_ARGUMENT,"A canvas group requires at least two asset IDs");if(new Set(o).size!==o.length)throw new d(u.INVALID_ARGUMENT,"A canvas group cannot contain duplicate asset IDs");let n=await Fn({input:{nodes:[],groups:[{client_id:"group",...e.title!==void 0?{title:e.title}:{},existing_member_policy:"reject",members:o.map(s=>({asset_id:s}))}]},workspaceId:e.workspaceId,idempotencyKey:e.idempotencyKey},t,r),i=n.groups[0];if(!i)throw new d(u.SERVER_ERROR,"Invalid canvas group response: missing group");return{workspace_id:n.workspace_id,group_id:i.group_id,member_asset_ids:i.member_asset_ids,reused:n.reused}}function wt(e,t,r,o){if(e!==void 0&&t)throw new d(u.INVALID_ARGUMENT,`${r} cannot be combined with ${o}`)}function Xc(e){let t=e.trim().toLowerCase();if(t==="auto")return"auto";let r=Number(t);if(!t||!Number.isFinite(r)||r<=0)throw new d(u.INVALID_ARGUMENT,"--duration must be a positive number or auto");return r}function ed(e){let t=e.trim(),r=/^hogi:\/\/(audio|image|text|video)\/(.+)$/.exec(t);if(r)return{kind:"media",media_type:r[1],uri:t};let o=ke(t);return{kind:"workspace_asset",asset_id:o.assetId,asset_type:o.assetType}}async function td(e,t,r){if(wt(e.prompt,e.clearPrompt,"--prompt","--clear-prompt"),wt(e.ratio,e.clearRatio,"--ratio","--clear-ratio"),wt(e.duration,e.clearDuration,"--duration","--clear-duration"),wt(e.resolution,e.clearResolution,"--resolution","--clear-resolution"),wt(e.quality,e.clearQuality,"--quality","--clear-quality"),wt(e.reference,e.clearReferences,"--reference","--clear-references"),e.clearModel&&(e.model!==void 0||e.modelId!==void 0||e.variant!==void 0))throw new d(u.INVALID_ARGUMENT,"--clear-model cannot be combined with --model, --model-id, or --variant");if(e.variant!==void 0&&e.model===void 0)throw new d(u.INVALID_ARGUMENT,"--variant requires --model.");if(e.modelId!==void 0&&(e.model!==void 0||e.variant!==void 0))throw new d(u.INVALID_ARGUMENT,"Use --model-id or --model [--variant], not both.");let o={};e.prompt!==void 0?o.prompt=e.prompt:e.clearPrompt&&(o.prompt=null);let n={};if(e.clearModel)n.mcp_method_name=null,n.model_version=null;else if(e.model!==void 0||e.modelId!==void 0||e.variant!==void 0){let s=await new fe({baseUrl:t.baseUrl,apiKey:t.apiKey,...r.fetch?{fetch:r.fetch}:{}}).listModels(),a=Ut(s,{...e.model!==void 0?{model:e.model}:{},...e.modelId!==void 0?{modelId:e.modelId}:{},...e.variant!==void 0?{variant:e.variant}:{}}),c=yt(a);n.mcp_method_name=c.toolName,n.model_version=c.variant??null}e.ratio!==void 0?n.ratio=e.ratio:e.clearRatio&&(n.ratio=null),e.duration!==void 0?n.duration=Xc(e.duration):e.clearDuration&&(n.duration=null),e.resolution!==void 0?n.resolution=e.resolution:e.clearResolution&&(n.resolution=null),e.quality!==void 0?n.quality=e.quality:e.clearQuality&&(n.quality=null),Object.keys(n).length>0&&(o.generation_config=n),e.reference!==void 0?o.references=e.reference.map(ed):e.clearReferences&&(o.references=[]);let i=to(o);return typeof i.prompt!="string"?i:to({...i,prompt:no(i.prompt,i.references??[])})}async function rd(e,t,r={}){let o=e.assetId.trim();if(!o||o.length>200)throw new d(u.INVALID_ARGUMENT,"asset_id must contain between 1 and 200 characters");let n=r.configStore??new b,i=P(t,n),s=ce(t,n,e.workspaceId),a=await td(e,i,r);y("workspace_canvas","node.update_requested",{workspace_id:s,asset_id:o,has_prompt:a.prompt!==void 0,has_generation_config:a.generation_config!==void 0,has_references:a.references!==void 0});let c=await new te({baseUrl:i.baseUrl,apiKey:i.apiKey,...r.fetch?{fetch:r.fetch}:{}}).updateEmptyCanvasNode(s,o,a);return y("workspace_canvas",c.updated?"node.updated":"node.unchanged",{workspace_id:c.workspace_id,asset_id:c.asset_id}),c}function od(e,t){if(re(e.workspace_id),A({node_count:e.nodes.length,group_count:e.groups.length,reused:e.reused}),t){_(k("workspace_canvas_composition_created",e));return}U(`Canvas composition ${e.reused?"reused":"created"}: ${e.nodes.length} node(s), ${e.groups.length} group(s)`),g(` Workspace: ${e.workspace_id}`);for(let r of e.nodes)g(` Node: ${r.client_id} -> hogi://asset/${r.asset_id}`);for(let r of e.groups)g(` Group: ${r.client_id} -> ${r.group_id}`)}function so(e,t,r="workspace_canvas_composition_created"){let o=e instanceof d?e:new d(u.SERVER_ERROR,e instanceof Error?e.message:String(e));t?_(S(r,o.code,o.message,o.details)):O(o.message),process.exitCode=1}function nd(e,t){if(re(e.workspace_id),A({asset_id:e.asset_id,updated:e.updated,type:e.type}),t){_(k("workspace_canvas_node_updated",e));return}U(`Canvas node ${e.updated?"updated":"unchanged"}: hogi://asset/${e.asset_id}`),g(` Workspace: ${e.workspace_id}`),g(` Type: ${e.type}`)}function id(e,t){if(re(e.workspace_id),A({group_id:e.group_id,member_count:e.member_asset_ids.length,reused:e.reused}),t){_(k("workspace_canvas_group_created",e));return}U(`Canvas group ${e.reused?"reused":"created"}: ${e.group_id}`),g(` Workspace: ${e.workspace_id}`);for(let r of e.member_asset_ids)g(` Member: hogi://asset/${r}`)}function Wn(e={}){let t=new Jc("canvas").description("Create and manage canvas content");return t.command("create").description("Create blank canvas nodes and groups from a JSON input file").argument("[workspace_id]","Workspace ID; defaults to the active workspace").requiredOption("--input <path>","JSON file containing nodes and groups").option("--idempotency-key <key>","Safely replay the same composition request").action(async(n,i,s)=>{let a=E(s);try{let c=await Qc(i.input,e.readInputFile),l=await Fn({input:c,workspaceId:n,idempotencyKey:i.idempotencyKey},T(s),e);od(l,a)}catch(c){so(c,a)}}),t.command("node").description("Manage canvas nodes").command("update").description("Update prompt, generation parameters, or references on an empty canvas node").argument("<asset_id>","Empty canvas node asset ID").option("--workspace-id <workspace_id>","Workspace ID; defaults to the active workspace").option("--prompt <text>","Replace the cached prompt").option("--clear-prompt","Clear the cached prompt").option("--model <model>","Select an active model by name").option("--model-id <id>","Select an active model by catalog ID").option("--variant <variant>","Select a variant for --model").option("--clear-model","Clear the cached model method and version").option("--ratio <ratio>","Replace the cached aspect ratio").option("--clear-ratio","Clear the cached aspect ratio").option("--duration <seconds|auto>","Replace the cached duration").option("--clear-duration","Clear the cached duration").option("--resolution <resolution>","Replace the cached resolution").option("--clear-resolution","Clear the cached resolution").option("--quality <quality>","Replace the cached quality").option("--clear-quality","Clear the cached quality").option("--reference <uri...>","Replace references with hogi:// media or library asset URIs").option("--clear-references","Clear all cached references").action(async(n,i,s)=>{let a=E(s);try{let c=await rd({assetId:n,...i},T(s),e);nd(c,a)}catch(c){so(c,a,"workspace_canvas_node_updated")}}),t.command("group").description("Manage canvas groups").command("create").description("Group two or more existing canvas nodes").argument("<asset_ids...>","Existing canvas node asset IDs").option("--title <title>","Group title").option("--workspace-id <workspace_id>","Workspace ID; defaults to the active workspace").option("--idempotency-key <key>","Safely replay the same group request").action(async(n,i,s)=>{let a=E(s);try{let c=await Zc({assetIds:n,title:i.title,workspaceId:i.workspaceId,idempotencyKey:i.idempotencyKey},T(s),e);id(c,a)}catch(c){so(c,a,"workspace_canvas_group_created")}}),t}function sd(e){let t=e;for(;t.parent;)t=t.parent;return t.opts().workspace}var qn=["en","zh","zh-Hant","ja"];async function ad(e,t,r={}){let o=Hr(e),n=e.name?.trim();if(e.name!==void 0&&!n)throw new d(u.INVALID_ARGUMENT,"--name must not be empty");if(n&&n.length>100)throw new d(u.INVALID_ARGUMENT,"--name must not exceed 100 characters");if(e.language!==void 0&&!qn.includes(e.language))throw new d(u.INVALID_ARGUMENT,`--language must be one of: ${qn.join(", ")}`);let i=r.configStore??new b,s=P(t,i),a=e.language;y("workspace","workspace.create_requested",{has_name:n!==void 0,language:a??null,set_current:e.setCurrent===!0});let c=await new te({baseUrl:s.baseUrl,apiKey:s.apiKey,...r.fetch?{fetch:r.fetch}:{}}).createWorkspace({...o,...n!==void 0?{name:n}:{},...a!==void 0?{language:a}:{}});return e.setCurrent===!0&&(i.update({defaultWorkspaceId:c.workspaceId}),y("workspace","workspace.current_updated",{workspace_id:c.workspaceId})),y("workspace","workspace.created",{workspace_id:c.workspaceId}),{workspace_id:c.workspaceId,...c.folderId!==void 0?{folder_id:c.folderId}:{},...c.subgroupId!==void 0?{subgroup_id:c.subgroupId}:{},name:c.name,...a!==void 0?{language:a}:{},set_current:e.setCurrent===!0}}async function cd(e,t,r={}){let o=e.name.trim();if(!o)throw new d(u.INVALID_ARGUMENT,"--name must not be empty");if(o.length>100)throw new d(u.INVALID_ARGUMENT,"--name must not exceed 100 characters");let n=r.configStore??new b,i=P(t,n),s=ce(t,n,e.workspaceId),a=await new te({baseUrl:i.baseUrl,apiKey:i.apiKey,...r.fetch?{fetch:r.fetch}:{}}).renameWorkspace(s,o);return y("workspace","workspace.renamed",{workspace_id:a.workspaceId}),{workspace_id:a.workspaceId,name:a.name}}function Mt(e,t,r){let o=e instanceof d?e:new d(u.SERVER_ERROR,e instanceof Error?e.message:String(e));t?_(S(r,o.code,o.message,o.details)):O(o.message),process.exitCode=1}function jn(e={}){let t=new ao("workspace").description("Workspace management");return t.command("create").description("Create a new workspace").option("--name <name>","Workspace name").option("--language <language>","Workspace language: en, zh, zh-Hant, or ja").option("--folder <folder_id>","Create in an existing folder").option("--subgroup <subgroup_id>","Create in a team subgroup").option("--public","Create with explicit public placement").option("--set-current","Set the created workspace as the active workspace").action(async(r,o)=>{let n=E(o);try{let i=await ad(r,T(o),e);re(i.workspace_id),A({set_current:i.set_current,...i.language?{language:i.language}:{}}),n?_(k("workspace_created",i,[...i.set_current?[]:[{command:`oiioii workspace set ${i.workspace_id}`,description:"Set the new workspace as active"}],{command:`oiioii --workspace ${i.workspace_id} upload file <path> --json`,description:"Upload a resource"}])):(U(`Workspace created: ${i.workspace_id}`),g(` Name: ${i.name}`),i.language&&g(` Language: ${i.language}`),i.folder_id!==void 0&&g(` Folder: ${i.folder_id??"root"}`),i.subgroup_id!==void 0&&g(` Subgroup: ${i.subgroup_id??"public"}`),g(` Current: ${i.set_current?"yes":"no"}`))}catch(i){Mt(i,n,"workspace_created")}}),t.addCommand(Bn(e)),t.command("delete").description("Move one workspace to trash (recoverable in the web recycle bin)").argument("[workspace_id]","Workspace ID; defaults to the active workspace").action(async(r,o,n)=>{let i=E(n);try{let s=await dd(r,T(n),e);re(s.workspace_id),i?_(k("workspace_deleted",s)):U(`Workspace moved to trash: ${s.workspace_id}`)}catch(s){Mt(s,i,"workspace_deleted")}}),t.command("open").description("Open a workspace in the browser").argument("[workspace_id]","Workspace ID; defaults to the active workspace").option("--no-browser","Print the workspace URL without opening a browser").action(async(r,o,n)=>{let i=E(n);try{let s=ce(T(n),e.configStore??new b,r);if(!/^[A-Za-z0-9_-]+$/.test(s))throw new d(u.INVALID_ARGUMENT,"Workspace ID must contain only letters, numbers, underscores, or hyphens");let a=new URL(`/space/${encodeURIComponent(s)}`,Kt()).href,c=o.browser===!1?!1:await(e.openBrowser??Bt)(a);re(s),i?_(k("workspace_opened",{workspace_id:s,url:a,opened:c})):(g(a),o.browser!==!1&&!c&&K("Unable to open a browser. Open the workspace URL manually."))}catch(s){Mt(s,i,"workspace_opened")}}),t.command("set").description("Set active workspace").argument("<workspace_id>","Workspace ID").action((r,o,n)=>{let i=E(n);if(!r||r.trim()===""){i?_(S("workspace_set",u.INVALID_ARGUMENT,"Workspace ID is required.")):O("Workspace ID is required."),process.exitCode=1;return}(e.configStore??new b).update({defaultWorkspaceId:r.trim()}),re(r.trim()),i?_(k("workspace_set",{workspace_id:r.trim()},[{command:"oiioii workspace current --json"},{command:"oiioii image text --prompt '...' --json"}])):U(`Workspace set to: ${r.trim()}`)}),t.command("current").description("Show current workspace").action((r,o)=>{let n=E(o),s=(e.configStore??new b).loadResolved(),a=sd(o),c=process.env.OIIOII_WORKSPACE_ID,l=a??c??s.defaultWorkspaceId,p=a?"flag":c?"env":s.defaultWorkspaceId?"config":"none";if(!l){n?_(S("workspace_current",u.WORKSPACE_REQUIRED,"No workspace set. Use 'oiioii workspace set <id>' or set OIIOII_WORKSPACE_ID.",{hint:"oiioii workspace set <workspace_id>"})):(O("No workspace set."),g(" Use: oiioii workspace set <workspace_id>"),g(" Or set: OIIOII_WORKSPACE_ID=<id>")),process.exitCode=1;return}re(l),A({has_workspace:!0}),n?_(k("workspace_current",{workspace_id:l,source:p})):(g(`Workspace: ${l}`),g(` Source: ${p}`))}),t.command("rename").description("Rename a workspace").argument("[workspace_id]","Workspace ID; defaults to the active workspace").requiredOption("--name <name>","New workspace name").action(async(r,o,n)=>{let i=E(n);try{let s=await cd({workspaceId:r,name:o.name},T(n),e);re(s.workspace_id),i?_(k("workspace_renamed",s)):U(`Workspace renamed to: ${s.name}`)}catch(s){Mt(s,i,"workspace_renamed")}}),t.addCommand(Tn(e)),t.addCommand(An(e)),t.addCommand(Nn(e)),t.addCommand(Wn(e)),t}async function dd(e,t,r={}){let o=r.configStore??new b,n=P(t,o),i=ce(t,o,e);return await new te({baseUrl:n.baseUrl,apiKey:n.apiKey,...r.fetch?{fetch:r.fetch}:{}}).deleteWorkspace(i)}function Bn(e={}){return new ao("list").description("List API-key-visible workspaces with names").option("--limit <count>","Page size (1 to 50)","10").option("--cursor <cursor>","Next-page cursor").option("--search <keyword>","Search by name or ID").action(async(t,r)=>{let o=E(r);try{let n=Number(t.limit);if(!Number.isInteger(n)||n<1||n>50)throw new d(u.INVALID_ARGUMENT,"--limit must be an integer from 1 to 50");if(t.cursor!==void 0&&!t.cursor.trim())throw new d(u.INVALID_ARGUMENT,"--cursor must not be empty");let i=P(T(r),e.configStore??new b),s=await new te({baseUrl:i.baseUrl,apiKey:i.apiKey,...e.fetch?{fetch:e.fetch}:{}}).listWorkspaces({limit:n,cursor:t.cursor,search:t.search?.trim()});o?_(k("workspaces",s)):g(JSON.stringify(s,null,2))}catch(n){Mt(n,o,"workspaces")}})}function Kn(e={}){return new ao("workspaces").description("List workspaces").addCommand(Bn(e))}import{Command as Vd,Option as di}from"commander";import{fetch as ud}from"undici";var Me=3e4;function Q(e){return new d(u.SERVER_ERROR,e,{category:"response_protocol",retryable:!0,response_protocol:!0})}function zn(e,t){if(e.isError)throw Zt(e,t);let r=(e.content??[]).filter(o=>o?.type==="text"&&typeof o.text=="string").map(o=>o.text).join(`
14
+ `).trim();if(!r)throw Q(`${t}: empty response`);try{return JSON.parse(r)}catch{throw Q(`${t}: invalid JSON response`)}}function ue(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function rr(e){if(e==="pending"||e==="processing"||e==="succeeded"||e==="failed"||e==="cancelled")return e;throw Q(`Invalid backend async task status: ${String(e)}`)}function or(e){if(e==="image"||e==="video"||e==="audio")return e;throw Q(`Invalid backend async media type: ${String(e)}`)}var co=class{constructor(t){this.mcp=t}mcp;async submit(t){let r=t.references?.filter(c=>c.kind==="media")??[];if((t.references?.filter(c=>c.kind==="workspace_asset")??[]).length>0)throw new d(u.MODEL_CONSTRAINT_VIOLATION,"Workspace asset references require the OpenAPI generation transport.",{category:"validation",retryable:!1,transport:"mcp"});let n={...t.input,...r.some(c=>c.mediaType==="image")?{referenceImages:r.filter(c=>c.mediaType==="image").map(c=>c.uri)}:{},...r.some(c=>c.mediaType==="audio")?{audioUrl:r.filter(c=>c.mediaType==="audio").map(c=>c.uri)}:{},...r.some(c=>c.mediaType==="video")?{videoUrl:r.filter(c=>c.mediaType==="video").map(c=>c.uri)}:{},...r.some(c=>c.mediaType==="text")?{referenceTexts:r.filter(c=>c.mediaType==="text").map(c=>c.uri)}:{}};y("async_generation","submission.started",{workspace_id:t.workspaceId,media_type:t.mediaType,tool:t.mcpMethodName,idempotency_key:t.idempotencyKey});let i=await this.mcp.callTool("submit_async_media_generation",{workspace_id:t.workspaceId,mediaType:t.mediaType,prompt:t.prompt,mcpMethodName:t.mcpMethodName,...t.model?{model:t.model}:{},input:n,idempotencyKey:t.idempotencyKey}),s=zn(i,"Async generation submission failed");if(!ue(s)||typeof s.taskId!="string"||s.taskId.length===0||typeof s.assetId!="string"||s.assetId.length===0||typeof s.workspaceId!="string"||s.workspaceId.length===0||typeof s.reused!="boolean")throw Q("Invalid async generation submission response");let a={assetId:s.assetId,...typeof s.createdAt=="string"?{createdAt:s.createdAt}:{},mediaType:or(s.mediaType),reused:s.reused===!0,status:rr(s.status),taskId:s.taskId,workspaceId:s.workspaceId};if(a.workspaceId!==t.workspaceId||a.mediaType!==t.mediaType)throw Q("Async generation submission response does not match the request");return y("async_generation","submission.accepted",{task_id:a.taskId,asset_id:a.assetId,status:a.status,reused:a.reused}),a}async query(t,r){y("async_generation","query.started",{task_id:r,workspace_id:t});let o=await this.mcp.callTool("query_async_media_generation",{workspace_id:t,taskId:r}),n=zn(o,"Async generation query failed"),i=ue(n)&&ue(n.task)?n.task:void 0;if(!i||typeof i.taskId!="string"||typeof i.workspaceId!="string"||!Array.isArray(i.outputUris))throw Q("Invalid async generation query response");if(!i.outputUris.every(c=>typeof c=="string"))throw Q("Invalid async generation output URI list");if(typeof i.progress!="number"||!Number.isFinite(i.progress))throw Q("Invalid async generation progress");if(i.error!==null&&i.error!==void 0&&(!ue(i.error)||typeof i.error.code!="string"||typeof i.error.message!="string"))throw Q("Invalid async generation error payload");let s=i.outputUris,a={...typeof i.assetId=="string"?{assetId:i.assetId}:{},...typeof i.createdAt=="string"?{createdAt:i.createdAt}:{},error:ue(i.error)&&typeof i.error.code=="string"&&typeof i.error.message=="string"?{code:i.error.code,message:i.error.message}:null,mediaType:or(i.mediaType),outputUris:s,progress:Math.max(0,Math.min(100,i.progress)),status:rr(i.status),taskId:i.taskId,...typeof i.updatedAt=="string"?{updatedAt:i.updatedAt}:{},workspaceId:i.workspaceId};if(a.taskId!==r||a.workspaceId!==t)throw Q("Async generation query response does not match the requested task");return y("async_generation","query.completed",{task_id:r,status:a.status,progress:a.progress,output_count:a.outputUris.length,has_error:a.error!==null}),a}};function ld(e){return e.kind==="media"?{kind:e.kind,media_type:e.mediaType,uri:e.uri}:{kind:e.kind,asset_type:e.assetType,asset_id:e.assetId}}function Jn(e,t){if(!ue(e)||e.ok!==!0||!ue(e.data))throw Q(`${t}: invalid response envelope`);return e.data}async function md(e){let t=await Ne(e);return e.status===400?new d(u.MODEL_CONSTRAINT_VIOLATION,t.message,{...ue(t.details)?t.details:{},category:"validation",retryable:!1}):e.status===403&&t.code!==u.MEMBERSHIP_REQUIRED?new d(u.WORKSPACE_FORBIDDEN,t.message,{...ue(t.details)?t.details:{},category:"auth",retryable:!1}):e.status===404?new d(u.TASK_NOT_FOUND,t.message,{...ue(t.details)?t.details:{},category:"task",retryable:!1}):t}function pd(e){if(typeof e.task_id!="string"||!e.task_id||typeof e.asset_id!="string"||!e.asset_id||typeof e.workspace_id!="string"||!e.workspace_id||typeof e.reused!="boolean")throw Q("Invalid async generation submission response");return{assetId:e.asset_id,...typeof e.created_at=="string"?{createdAt:e.created_at}:{},mediaType:or(e.media_type),reused:e.reused,status:rr(e.status),taskId:e.task_id,workspaceId:e.workspace_id}}function fd(e){if(typeof e.task_id!="string"||typeof e.workspace_id!="string"||!Array.isArray(e.output_uris)||!e.output_uris.every(t=>typeof t=="string")||typeof e.progress!="number"||!Number.isFinite(e.progress))throw Q("Invalid async generation query response");if(e.error!==null&&e.error!==void 0&&(!ue(e.error)||typeof e.error.code!="string"||typeof e.error.message!="string"))throw Q("Invalid async generation error payload");return{...typeof e.asset_id=="string"?{assetId:e.asset_id}:{},...typeof e.created_at=="string"?{createdAt:e.created_at}:{},error:ue(e.error)?{code:String(e.error.code),message:String(e.error.message)}:null,mediaType:or(e.media_type),outputUris:e.output_uris,progress:Math.max(0,Math.min(100,e.progress)),status:rr(e.status),taskId:e.task_id,...typeof e.updated_at=="string"?{updatedAt:e.updated_at}:{},workspaceId:e.workspace_id}}var uo=class{baseUrl;apiKey;timeoutMs;_fetch;usesDefaultUndiciTransport;logger;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this.timeoutMs=t.timeoutMs??Me,this.usesDefaultUndiciTransport=t.fetch===void 0,this._fetch=t.fetch??ud,this.logger=t.logger}async submit(t){let r=Jn(await this.request("POST","/v1/media/generations",{headers:{"idempotency-key":t.idempotencyKey},body:{workspace_id:t.workspaceId,media_type:t.mediaType,mcp_method_name:t.mcpMethodName,prompt:t.prompt,...t.model?{model:t.model}:{},input:t.input,...t.references?{references:t.references.map(ld)}:{}}}),"Async generation submission failed"),o=pd(r);if(o.workspaceId!==t.workspaceId||o.mediaType!==t.mediaType)throw Q("Async generation submission response does not match the request");return o}async query(t,r){let o=new URLSearchParams({workspace_id:t}),n=Jn(await this.request("GET",`/v1/media/generations/${encodeURIComponent(r)}?${o}`,{cache:"no-store"}),"Async generation query failed"),i=fd(n);if(i.taskId!==r||i.workspaceId!==t)throw Q("Async generation query response does not match the requested task");return i}async request(t,r,o){let n=$({source:"hogi_async_generation_open_api_client",operation:r,method:t,path:r},this.logger),i=new AbortController,s=setTimeout(()=>i.abort(),this.timeoutMs);typeof s=="object"&&"unref"in s&&s.unref();let a;try{if(a=await n.fetch(this._fetch,`${this.baseUrl}${r}`,{method:t,headers:G({accept:"application/json",authorization:`Bearer ${this.apiKey}`,...o.body?{"content-type":"application/json"}:{},...o.headers}),...o.body?{body:JSON.stringify(o.body)}:{},...o.cache?{cache:o.cache}:{},...this.usesDefaultUndiciTransport?{dispatcher:Qt(this.timeoutMs)}:{},signal:i.signal}),!a.ok)throw await md(a);let c=await a.text();if(!c.trim())throw pe("Empty response from server",a.status);let l;try{l=JSON.parse(c)}catch{throw pe("Invalid JSON response from server",a.status)}return n.success(a.status),l}catch(c){let l=c;throw i.signal.aborted||Ue(c)?l=new d(u.GENERATION_TIMEOUT,`Request timed out after ${this.timeoutMs}ms`,{retryable:!0,...de(c)?{cause_code:de(c)}:{}}):c instanceof d||(l=new d(u.NETWORK_ERROR,`Network error: ${c instanceof Error?c.message:String(c)}`,{retryable:!0,...de(c)?{cause_code:de(c)}:{}})),n.failure(l,a?.status),l}finally{clearTimeout(s)}}};function _e(e){return e.transport==="openapi"?new uo(e):new co(new gt(e))}import{readFileSync as gd,writeFileSync as _d,appendFileSync as hd,mkdirSync as yd,existsSync as Hn,chmodSync as lo}from"fs";import{join as wd,dirname as Rd}from"path";import{randomBytes as kd}from"crypto";function Id(){return"task_"+kd(8).toString("hex")}var Y=class{configDir;tasksPath;constructor(t){this.configDir=t?.configDir??Ae(),this.tasksPath=wd(this.configDir,"tasks.jsonl")}getConfigDir(){return this.configDir}create(t){let r=new Date().toISOString(),o={id:Id(),workspaceId:t.workspaceId,command:t.command,toolName:t.toolName,inputArgs:t.inputArgs,...t.pendingSubmission?{pendingSubmission:t.pendingSubmission}:{},...t.credentialFingerprint?{credentialFingerprint:t.credentialFingerprint}:{},...t.backendBaseUrl?{backendBaseUrl:t.backendBaseUrl.replace(/\/+$/,"")}:{},...t.backendTransport?{backendTransport:t.backendTransport}:{},...t.mediaType?{mediaType:t.mediaType}:{},status:"created",resourceUris:[],createdAt:r,updatedAt:r};return this._ensureDir(),Ce(`${this.tasksPath}.lock`,()=>{hd(this.tasksPath,JSON.stringify(o)+`
15
+ `,{encoding:"utf-8",mode:384}),lo(this.tasksPath,384)}),y("task_store","task.created",{task_id:o.id,tool:o.toolName}),o}update(t,r){this._ensureDir();let o=Ce(`${this.tasksPath}.lock`,()=>{let n=this._readAll(),i=n.findIndex(a=>a.id===t);if(i===-1)return;let s=n[i];return r.status!==void 0&&(s.status=r.status),r.resourceUris!==void 0&&(s.resourceUris=r.resourceUris),r.recordIds!==void 0&&(s.recordIds=r.recordIds),r.backendTaskId!==void 0&&(s.backendTaskId=r.backendTaskId),r.backendAssetId!==void 0&&(s.backendAssetId=r.backendAssetId),r.backendBaseUrl!==void 0&&(s.backendBaseUrl=r.backendBaseUrl),r.backendTransport!==void 0&&(s.backendTransport=r.backendTransport),r.mediaType!==void 0&&(s.mediaType=r.mediaType),r.progress!==void 0&&(s.progress=r.progress),r.lastSyncedAt!==void 0&&(s.lastSyncedAt=r.lastSyncedAt),r.error===null?delete s.error:r.error!==void 0&&(s.error=r.error),s.updatedAt=new Date().toISOString(),this._writeAll(n),s});if(!o){y("task_store","task.update_skipped",{task_id:t,reason:"not_found"},"warn");return}return y("task_store","task.updated",{task_id:t,status:o.status}),o}get(t){let o=this._readAll().find(n=>n.id===t);return y("task_store","task.read",{task_id:t,found:o!==void 0}),o}getByAnyId(t){let o=this._readAll().find(n=>n.id===t||n.backendTaskId===t);return y("task_store","task.read_by_any_id",{task_id:t,found:o!==void 0,matched_by:o?.id===t?"local":o?"backend":"none"}),o}list(t){let r=this._readAll();if(r.reverse(),t!==void 0&&t>0){let o=r.slice(0,t);return y("task_store","task.listed",{count:o.length,limit:t}),o}return y("task_store","task.listed",{count:r.length}),r}_readAll(){if(!Hn(this.tasksPath))return[];try{return gd(this.tasksPath,"utf-8").trim().split(`
16
16
  `).filter(o=>o.trim()!=="").map(o=>JSON.parse(o))}catch{return[]}}_writeAll(t){this._ensureDir();let r=t.map(o=>JSON.stringify(o)).join(`
17
17
  `)+`
18
- `;Xd(this.tasksPath,r,{encoding:"utf-8",mode:384}),to(this.tasksPath,384)}_ensureDir(){let t=rc(this.tasksPath);Dn(t)||ec(t,{recursive:!0,mode:448}),to(t,448)}};import{readFileSync as ro,writeFileSync as Mn,mkdirSync as Pn,existsSync as Xt,readdirSync as ic,chmodSync as yt}from"fs";import{join as ke}from"path";import{randomBytes as sc}from"crypto";function ac(){return"preview_"+sc(8).toString("hex")}function dc(e){let t=e.replace(/^generate_/,"").split("_"),r=t[0]??"generation",o=t.slice(1).join("_");return`${o.charAt(0).toUpperCase()+o.slice(1)} ${r} generation`}function cc(e){let t=[];for(let r of e)t.push({command:`oiioii record get ${r.uri} --json`,description:"Get generation record details"}),r.uri.startsWith("hogi://image/")&&t.push({command:`oiioii video image --image ${r.uri} --prompt '<motion>' --json`,description:"Create video from this image"});return t}var uc=0;function Ln(e,t){let r=t.created_at.localeCompare(e.created_at);if(r!==0)return r;let o=typeof e.created_sequence=="number"?e.created_sequence:0,i=(typeof t.created_sequence=="number"?t.created_sequence:0)-o;return i!==0?i:t.bundle_id.localeCompare(e.bundle_id)}var De=class{configDir;previewsDir;constructor(t){this.configDir=t?.configDir??Ee(),this.previewsDir=ke(this.configDir,"previews")}getConfigDir(){return this.configDir}createBundle(t){let r=ac(),o=ke(this.previewsDir,r);Pn(o,{recursive:!0,mode:448}),Pn(ke(o,"artifacts"),{recursive:!0,mode:448}),yt(this.configDir,448),yt(this.previewsDir,448),yt(o,448),yt(ke(o,"artifacts"),448);let n=new Date().toISOString(),i={schema_version:1,bundle_id:r,created_at:n,created_sequence:++uc,...t.projectId?{project_id:t.projectId}:{},workspace_id:t.workspaceId,task_id:t.taskId,command:t.command,tool:t.tool,input_args:t.inputArgs,resources:t.resources},s=t.resources.length,a=t.tool.includes("video")?"video":t.tool.includes("music")||t.tool.includes("audio")?"audio":"image",d,l,p=[];if(t.status==="succeeded"){let U=t.inputArgs.size?` ${t.inputArgs.size}`:"";d=`Generated ${s}${U} ${a}${s!==1?"s":""}.`,l=t.resources.length>0?`Use \`oiioii record get ${t.resources[0].uri} --json\` for details.`:"No resources returned.",p.push(...cc(t.resources))}else d=`Generation failed: ${t.error?.message??"unknown error"}`,l=`Task ${t.taskId} failed with ${t.error?.code??"UNKNOWN"}. Check task status or retry.`,p.push({command:`oiioii task status ${t.taskId} --json`,description:"Check task details"});let m={title:dc(t.tool),status:t.status,human_summary:d,agent_summary:l,next:p},f=ke(o,"manifest.json"),h=ke(o,"summary.json");return Mn(f,JSON.stringify(i,null,2)+`
19
- `,{encoding:"utf-8",mode:384}),Mn(h,JSON.stringify(m,null,2)+`
20
- `,{encoding:"utf-8",mode:384}),yt(f,384),yt(h,384),y("preview_store","preview.created",{bundle_id:r,task_id:t.taskId,status:t.status,resource_count:t.resources.length}),{bundleId:r,bundleDir:o,manifest:i,summary:m}}getBundle(t){let r=ke(this.previewsDir,t),o=ke(r,"manifest.json"),n=ke(r,"summary.json");if(!Xt(o)||!Xt(n)){y("preview_store","preview.read",{bundle_id:t,found:!1});return}try{let i=JSON.parse(ro(o,"utf-8")),s=JSON.parse(ro(n,"utf-8"));return y("preview_store","preview.read",{bundle_id:t,found:!0}),{manifest:i,summary:s,bundleDir:r}}catch{y("preview_store","preview.read",{bundle_id:t,found:!1,reason:"invalid"},"warn");return}}getBundleByTaskId(t){let r=this._scanBundles();for(let o of r)if(o.task_id===t)return this.getBundle(o.bundle_id)}getLatest(){let t=this._scanBundles();if(t.length!==0)return t.sort(Ln),this.getBundle(t[0].bundle_id)}listBundles(t){let r=this._scanBundles();return r.sort(Ln),t!==void 0&&t>0?r.slice(0,t):r}_scanBundles(){if(!Xt(this.previewsDir))return[];let t=ic(this.previewsDir,{withFileTypes:!0}),r=[];for(let o of t){if(!o.isDirectory())continue;let n=ke(this.previewsDir,o.name,"manifest.json");if(Xt(n))try{let i=JSON.parse(ro(n,"utf-8"));r.push(i)}catch{}}return r}};function oo(e){let t=e.previewStore??new De({configDir:e.taskStore.getConfigDir()});try{t.createBundle({taskId:e.task.id,workspaceId:e.task.workspaceId,command:e.task.command,tool:e.task.toolName,inputArgs:e.task.inputArgs,resources:e.resources,status:e.status,...e.error?{error:e.error}:{}});return}catch(r){let o=r instanceof Error?r.message:String(r);return y("preview_store","preview.create_failed",{task_id:e.task.id,status:e.status},"warn"),{code:"PREVIEW_BUNDLE_WRITE_FAILED",message:`Generation completed, but the local preview bundle could not be written: ${o}`}}}var lc={image:"image/jpeg",video:"video/mp4",audio:"audio/mpeg"};function st(e,t=e.mediaType){if(t)return t==="image"&&e.pendingSubmission?.input.transparent===!0?"image/png":lc[t]}var mc={image:"hogi://image/",video:"hogi://video/",audio:"hogi://audio/"};function $n(e){return e==="pending"?"queued":e==="processing"?"running":e}function at(e){return e.status==="succeeded"||e.status==="failed"||e.status==="cancelled"}function pc(e){if(!(e instanceof c))return!1;if(e.code===u.NETWORK_ERROR||e.code===u.GENERATION_TIMEOUT)return!0;let t=Vn(e);return t.response_protocol===!0||t.request_outcome==="unknown"}function Vn(e){return e.details&&typeof e.details=="object"&&!Array.isArray(e.details)?e.details:{}}function Me(e){if(e.taskStore.get(e.task.id)?.backendTaskId)return e.error;let t=e.error instanceof c?e.error.code:u.GENERATION_FAILED,r=e.error instanceof Error?e.error.message:String(e.error);if(pc(e.error))return e.taskStore.update(e.task.id,{status:"submitting",error:{code:t,message:r}}),new c(t,r,{...Vn(e.error),submission_outcome:"unknown",local_task_id:e.task.id,task_status:"submitting",retry_command:`oiioii task retry ${e.task.id}`});let o=e.taskStore.update(e.task.id,{status:"failed",error:{code:t,message:r}})??e.task;return oo({taskStore:e.taskStore,previewStore:e.previewStore,task:o,resources:[],status:"failed",error:{code:t,message:r}}),e.error}function fc(e){let t=mc[e.mediaType],r=e.outputUris.find(o=>!o.startsWith(t));if(r)throw new c(u.SERVER_ERROR,`Backend ${e.mediaType} task returned an incompatible resource URI`,{task_id:e.taskId,uri:r});if(e.status==="succeeded"&&e.outputUris.length===0)throw new c(u.SERVER_ERROR,`Backend task ${e.taskId} succeeded without an output URI`);return e.outputUris}function gc(e){let t=e.previewStore??new De({configDir:e.taskStore.getConfigDir()});if(t.getBundleByTaskId(e.task.id))return;let r=e.task.status==="failed"||e.task.status==="cancelled";return oo({taskStore:e.taskStore,previewStore:t,task:e.task,resources:e.task.resourceUris.map(o=>({uri:o,mime_type:st(e.task)})),status:r?"failed":"succeeded",...r?{error:e.task.error??{code:e.task.status==="cancelled"?"GENERATION_CANCELLED":u.GENERATION_FAILED,message:e.task.status==="cancelled"?"Generation was cancelled":"Generation failed"}}:{}})}async function Pe(e){let t=await e.client.submit({workspaceId:e.task.workspaceId,mediaType:e.mediaType,prompt:e.prompt,mcpMethodName:e.task.toolName,...e.model?{model:e.model}:{},input:e.input,...e.references?{references:e.references}:{},idempotencyKey:e.task.id}),r=e.taskStore.update(e.task.id,{backendTaskId:t.taskId,backendAssetId:t.assetId,backendBaseUrl:e.backendBaseUrl.replace(/\/+$/,""),backendTransport:e.backendTransport,mediaType:t.mediaType,status:t.status==="succeeded"||t.status==="failed"||t.status==="cancelled"?"running":$n(t.status),progress:0,lastSyncedAt:new Date().toISOString(),error:null});if(!r)throw new c(u.SERVER_ERROR,`Local task disappeared after submission: ${e.task.id}`);if(y("async_generation","submission.cached",{local_task_id:r.id,backend_task_id:t.taskId,status:r.status}),!(t.status==="succeeded"||t.status==="failed"||t.status==="cancelled"))return{submission:t,task:r};let n=await no({client:e.client,taskStore:e.taskStore,previewStore:e.previewStore,task:r});if(n.task.status==="failed"||n.task.status==="cancelled")throw new c(u.GENERATION_FAILED,n.task.error?.message??`Backend generation task ${n.task.backendTaskId} ${n.task.status}`,{backend_task_id:n.task.backendTaskId,backend_status:n.task.status,...n.task.error?{backend_error:n.task.error}:{}});return{submission:t,...n}}async function Gn(e){if(e.task.backendTaskId)throw new c(u.INVALID_ARGUMENT,`Task ${e.task.id} has already been accepted by the backend.`);if(e.task.status!=="submitting"||!e.task.pendingSubmission||!e.task.error)throw new c(u.INVALID_ARGUMENT,`Task ${e.task.id} is not an ambiguous submission that can be retried.`);let t=e.task.pendingSubmission;try{return await Pe({client:e.client,taskStore:e.taskStore,previewStore:e.previewStore,task:e.task,mediaType:t.mediaType,prompt:t.prompt,...t.model?{model:t.model}:{},backendBaseUrl:e.backendBaseUrl,backendTransport:e.backendTransport,input:t.input,...t.references?{references:t.references}:{}})}catch(r){throw Me({taskStore:e.taskStore,previewStore:e.previewStore,task:e.task,error:r})}}async function no(e){if(!e.task.backendTaskId){if(at(e.task))return{task:e.task};throw new c(u.TASK_NOT_FOUND,`Task ${e.task.id} has no cached backend async-task ID.`)}let t=await e.client.query(e.task.workspaceId,e.task.backendTaskId);if(e.task.mediaType&&e.task.mediaType!==t.mediaType)throw new c(u.SERVER_ERROR,"Backend task media type does not match the cached local task",{task_id:t.taskId,cached_media_type:e.task.mediaType,backend_media_type:t.mediaType});let r=fc(t),o=e.taskStore.update(e.task.id,{backendAssetId:t.assetId,mediaType:t.mediaType,status:$n(t.status),progress:t.progress,resourceUris:r,lastSyncedAt:new Date().toISOString(),error:t.error});if(!o)throw new c(u.SERVER_ERROR,`Local task disappeared during synchronization: ${e.task.id}`);if(y("async_generation","task.cache_synchronized",{local_task_id:o.id,backend_task_id:o.backendTaskId,status:o.status,progress:o.progress,output_count:o.resourceUris.length}),!at(o))return{task:o};let n=gc({taskStore:e.taskStore,previewStore:e.previewStore,task:o});return y("async_generation","task.terminal_projected",{local_task_id:o.id,backend_task_id:o.backendTaskId,status:o.status,preview_warning:n!==void 0}),{task:o,...n?{previewWarning:n}:{}}}import{createHash as _c}from"crypto";function be(e){return`sha256:${_c("sha256").update("oiioii-cli-task-credential-v1\0").update(e).digest("hex")}`}var er=["text2Video","firstframe2Video","endframe2Video","frame2Video","image2Video","omni2Video"],Q=(e,t=!1)=>({name:"imageUrl",max:e,single:t}),dt=e=>({name:"images",max:e}),Le=(e,t=!1)=>({name:"videoUrl",max:e,single:t}),Zt=e=>({name:"audioUrl",max:e}),Bn=["text2Video","firstframe2Video"],Fn=["text2Video","image2Video","omni2Video"],Ye=["text2Video","firstframe2Video","frame2Video","image2Video","omni2Video"];function hc(e){return e==="2.7"?{fields:{image:Q(5),video:Le(1,!0)},modes:Ye,totalMax:5}:{fields:{image:Q(10),video:Le(5),audio:Zt(5)},modes:Ye}}function yc(e){return e?.toLowerCase()==="kling-v3-omni"?{fields:{image:dt(),video:Le()},modes:Ye}:{fields:{image:dt()},modes:e==="2.6"?Bn:["text2Video","firstframe2Video","frame2Video"]}}function wc(e){return e==="viduQ3Ref"||e==="viduQ3MixRef"||e==="viduQ3Ad"?{fields:{image:Q(7)},modes:["image2Video","omni2Video"]}:e==="viduQ3"?{fields:{image:Q(7)},modes:["text2Video","firstframe2Video","image2Video","omni2Video"]}:{fields:{image:Q(7)},modes:Ye}}function co(e,t){return e==="generate_video_wan"?hc(t):e==="generate_video_kling"?yc(t):e==="generate_video_vidu"?wc(t):{generate_video_seedance20:{fields:{image:Q(9),video:Le(3),audio:Zt(3)},modes:Ye},generate_video_seedance25:{fields:{image:Q(30),video:Le(10),audio:Zt(10)},modes:Ye,totalMax:50},generate_video_minimax_h3:{fields:{image:Q(9),video:Le(3),audio:Zt(3)},modes:[...Ye,"endframe2Video"],audioRequiresVisual:!0},generate_video_wan27:{fields:{image:Q(5),video:Le(1,!0)},modes:Ye,totalMax:5},generate_video_wan26:{fields:{image:Q(5),video:Le(1,!0)},modes:["text2Video","firstframe2Video","image2Video","omni2Video"]},generate_video_gemini_omni:{fields:{image:dt(5),video:Le(1,!0)},modes:Fn,totalMax:5},generate_video_grok_imagine:{fields:{image:Q(1,!0)},modes:Bn},generate_video_grok_imagine_15:{fields:{image:Q(1,!0)},modes:["firstframe2Video"]},generate_video_grok_imagine_15_fast:{fields:{image:Q(7)},modes:Fn},generate_video_happyhorse:{fields:{image:Q(9)},modes:["text2Video","firstframe2Video","image2Video","omni2Video"]},generate_video_happyhorse11:{fields:{image:Q(9)},modes:["text2Video","firstframe2Video","image2Video","omni2Video"]},generate_video_sora2:{fields:{image:dt()}},generate_video_sora2_pro:{fields:{image:dt()}},generate_video_kling_o1:{fields:{image:dt()}},generate_video_midjourney:{fields:{image:dt()}},generate_video_veo3:{fields:{image:Q(1,!0)}},generate_video_hailuo02:{fields:{image:Q(2)}}}[e]}function qn(e,t){let r=co(e,t);if(r)return{image:r.fields.image!==void 0,video:r.fields.video!==void 0,audio:r.fields.audio!==void 0}}function jn(e,t){let r=co(e,t);return!r||!r.modes?!0:r.modes.includes("text2Video")}function io(e){return[...new Set((e??[]).map(t=>t.trim()).filter(Boolean))]}function so(e,t,r){let o=e.find(n=>!n.startsWith(r));if(o)throw new c(u.INVALID_ARGUMENT,`Video ${t} references must use ${r} URIs: ${o}`)}function re(e,t={}){return new c(u.MODEL_CONSTRAINT_VIOLATION,e,{category:"validation",retryable:!1,...t})}function ao(e,t,r,o,n){if(o.length!==0){if(!n)throw re(`${t} does not support ${r} references.`,{field:r});if(n.max!==void 0&&o.length>n.max)throw re(`${t} supports at most ${n.max} ${r} references; received ${o.length}.`,{field:r,received:o.length,supported_max:n.max});if(n.single&&o.length>1)throw re(`${t} supports only one ${r} reference.`,{field:r,received:o.length,supported_max:1});e[n.name]=n.single?o[0]:o}}function Rc(e,t,r=0){let o=t.images.length+r;return o+t.videos.length+t.audios.length===0?"text2Video":e.modes?.includes("omni2Video")||t.videos.length||t.audios.length?"omni2Video":e.modes?.includes("image2Video")?"image2Video":o===1&&e.modes?.includes("firstframe2Video")?"firstframe2Video":o===2&&e.modes?.includes("frame2Video")?"frame2Video":"image2Video"}function Wn(e){let t={images:io(e.images),videos:io(e.videos),audios:io(e.audios)};so(t.images,"images","hogi://image/"),so(t.videos,"videos","hogi://video/"),so(t.audios,"audios","hogi://audio/");let r=e.additionalImageReferenceCount??0;if(!Number.isInteger(r)||r<0)throw new c(u.INVALID_ARGUMENT,"Additional image reference count must be a non-negative integer.");let o=t.images.length+r,n=o+t.videos.length+t.audios.length,i=co(e.toolName,e.version);if(!i){if(n===0)return{args:{},mode:"text2Video",references:t};throw new c(u.MODEL_NOT_SUPPORTED,`${e.toolName} has no verified reference-input contract in this CLI. Select a confirmed model or use video text.`,{category:"validation",retryable:!1,tool:e.toolName})}if(i.totalMax!==void 0&&n>i.totalMax)throw re(`${e.toolName} supports at most ${i.totalMax} total references; received ${n}.`,{field:"references",received:n,supported_max:i.totalMax});if(r>0){let d=i.fields.image;if(!d)throw re(`${e.toolName} does not support image references.`,{field:"image"});if(d.max!==void 0&&o>d.max)throw re(`${e.toolName} supports at most ${d.max} image references; received ${o}.`,{field:"image",received:o,supported_max:d.max});if(d.single&&o>1)throw re(`${e.toolName} supports only one image reference.`,{field:"image",received:o,supported_max:1})}if(i.audioRequiresVisual&&t.audios.length>0&&o===0&&t.videos.length===0)throw re(`${e.toolName} audio references require at least one image or video reference.`,{field:"audio"});let s=e.mode&&e.mode!=="auto"?e.mode:Rc(i,t,r);if(e.mode&&e.mode!=="auto"&&!i.modes)throw new c(u.MODEL_CONSTRAINT_VIOLATION,`${e.toolName} does not expose a selectable generateMode; omit --mode or use --mode auto.`,{category:"validation",retryable:!1,field:"mode",received:e.mode});if(i.modes&&!i.modes.includes(s))throw new c(u.MODEL_CONSTRAINT_VIOLATION,`${e.toolName} does not support ${s}. Supported modes: ${i.modes.join(", ")}.`,{category:"validation",retryable:!1,field:"mode",received:s,supported:i.modes});if(s==="text2Video"&&n>0)throw re("text2Video does not accept image, video, or audio references.",{field:"references"});if((s==="firstframe2Video"||s==="endframe2Video")&&(o!==1||t.videos.length>0||t.audios.length>0))throw re(`${s} requires exactly one image and no video or audio references.`,{field:"references",mode:s});if(s==="frame2Video"&&(o!==2||t.videos.length>0||t.audios.length>0))throw re("frame2Video requires exactly two images and no video or audio references.",{field:"references",mode:s});if(s==="image2Video"&&(o===0||t.videos.length>0||t.audios.length>0))throw re("image2Video requires image references and does not accept video or audio references.",{field:"references",mode:s});if(s==="omni2Video"&&n===0)throw re("omni2Video requires at least one reference; use text2Video for prompt-only generation.",{field:"references",mode:s});let a={};return ao(a,e.toolName,"image",t.images,i.fields.image),ao(a,e.toolName,"video",t.videos,i.fields.video),ao(a,e.toolName,"audio",t.audios,i.fields.audio),i.modes&&(a.generateMode=s),{args:a,mode:s,references:t}}var Kn={image:!1,video:!1,audio:!1};function tr(e){let t=Kn;if(e.toolName.startsWith("generate_image_"))t={image:!0,video:!1,audio:!1};else if(e.toolName.startsWith("generate_video_"))t=qn(e.toolName,e.variant)??Kn;else if(e.toolName==="generate_music_seed_audio"){let r=new Set(e.catalog?.input_capabilities??["text"]);t={image:r.has("image"),video:!1,audio:r.has("audio")}}return{text:!0,image:t.image&&e.catalog?.reference_image_count_max!==0,video:t.video,audio:t.audio,file:!1}}function Ut(e){let t=typeof e.catalog?.reference_image_count_min=="number"&&e.catalog.reference_image_count_min>0;return{media:tr(e),prompt_only_supported:!t&&(!e.toolName.startsWith("generate_video_")||jn(e.toolName,e.variant))}}function ct(e){if(Ut(e).prompt_only_supported)return;let t=e.catalog?.reference_image_count_min,r=typeof t=="number"&&t>0;throw new c(u.MODEL_CONSTRAINT_VIOLATION,r?`${e.name??e.key??e.toolName} requires at least ${t} reference image.`:`${e.name??e.key??e.toolName} requires a media reference and does not support prompt-only generation.`,{category:"validation",retryable:!1,...r?{field:"reference_image_count_min",received:0,supported_min:t}:{field:"generateMode",received:"text2Video"}})}function wt(e,t){let r=e.catalog?.reference_image_count_min,o=e.catalog?.reference_image_count_max;if(typeof r=="number"&&t<r)throw new c(u.MODEL_CONSTRAINT_VIOLATION,`${e.name??e.key??e.toolName} requires at least ${r} reference images; received ${t}.`,{category:"validation",retryable:!1,field:"reference_image_count_min",received:t,supported_min:r});if(t!==0){if(!tr(e).image)throw new c(u.MODEL_CONSTRAINT_VIOLATION,`${e.name??e.key??e.toolName} does not support reference images.`,{category:"validation",retryable:!1,field:"reference_image_count_max",received:t,...o===0?{supported_max:0}:{}});if(typeof o=="number"&&t>o)throw new c(u.MODEL_CONSTRAINT_VIOLATION,`${e.name??e.key??e.toolName} supports at most ${o} reference images; received ${t}.`,{category:"validation",retryable:!1,field:"reference_image_count_max",received:t,supported_max:o})}}function rr(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=Object.entries(e).filter(r=>typeof r[1]=="number");return Object.fromEntries(t)}function Dt(e,t){if(!e||!t)return;let r=e[t];if(r!==void 0)return r;let o=Object.keys(e).find(n=>n.toLowerCase()===t.toLowerCase());return o?e[o]:void 0}function zn(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function uo(e){let t=Number.EPSILON*Math.max(1,Math.abs(e))*8;return e<=0?0:Math.max(1,Math.ceil(e-t))}function or(e){let{pricing:t}=e,r=e.tier==="free"?"free":"member",o=t.mcp_method_name.startsWith("generate_video_"),n=t.audio_pricing_mode==="per_second",i=e.referenceVideoDuration??0;if(e.duration!==void 0&&(!Number.isFinite(e.duration)||e.duration<=0))throw new c(u.INVALID_ARGUMENT,"Duration must be a positive number");if(!Number.isFinite(i)||i<0)throw new c(u.INVALID_ARGUMENT,"Reference video duration must be zero or positive");let s=t.points_cost,a=zn(t.free_user_points_cost)??s,d=r==="free"?a:s,l=rr(t.resolution_pricing),p=rr(t.free_user_resolution_pricing)??l,m=rr(t.resolution_pricing_with_video),f=rr(t.free_user_resolution_pricing_with_video)??m,h=r==="free"?p:l,U=r==="free"?f:m,x=i>0?U:h,T=e.resolution;if(t.mcp_method_name==="generate_image_gpt_image2"&&e.resolution&&Dt(x,e.resolution)===void 0&&/^[124]k$/i.test(e.resolution)){let oe=e.quality?.trim().toLowerCase()??(e.resolution.toLowerCase()==="1k"?"low":"medium"),pe=`${e.resolution}-${oe}`;(Dt(x,pe)!==void 0||Dt(h,pe)!==void 0)&&(T=pe)}let k=(i>0?Dt(U,T):void 0)??Dt(h,T)??d,R=t.promo_active===!0&&zn(t.promo_discount_percent)!==void 0,L=R?t.promo_discount_percent/100:1,w=k*L,G=e.duration??(o?10:void 0),M=G!==void 0?G+(o?i:0):void 0;return{estimate:!0,estimated_points:o&&M!==void 0?uo(w*M):n&&G!==void 0?uo(w*G):R?uo(w):k,unit_points:k,tier:r,billing_unit:o||n?"second":"request",...M!==void 0&&(o||n)?{billed_duration:M}:{},promo_applied:R,model_id:t.id,model_name:t.name??t.model??t.mcp_method_name,caveat:"Client-side estimate from the current model catalog; actual charge may differ because backend feature flags, resolved media duration, promotions, and fallback pricing are authoritative."}}function Rt(e,t,r,o){let n=e.catalog,i=n?or({pricing:n,tier:"member",...typeof r.duration=="number"?{duration:r.duration}:{},...typeof r.resolution=="string"?{resolution:r.resolution}:{},...typeof r.quality=="string"?{quality:r.quality}:{},...typeof r.referenceVideoDuration=="number"?{referenceVideoDuration:r.referenceVideoDuration}:{}}):void 0;return{valid:!0,resolved:{arguments:r,contract:{source:"cli_model_catalog_and_command_schema",input_capabilities:Tn(e),input_capabilities_scope:"model_input_modalities",generation_input_contract:Ut(e),...t==="image"?{reference_images:{capability_field:"reference_image_count_max",count_min:n?.reference_image_count_min??null,count_max:n?.reference_image_count_max??null,source:typeof n?.reference_image_count_max=="number"?"catalog":"frontend_fallback",supported:n?.reference_image_count_max!==0}}:{},constraints:{aspect_ratios:n?.aspect_ratios??[],durations:n?.durations??[],sizes:n?.sizes??[]}},media_type:t,mcp_method_name:e.toolName,model_id:e.modelId??null,variant:e.variant??null,...o?.references?.length?{references:o.references}:{},...o?.transport?{transport:o.transport}:{}},estimate:{caveat:n?`${i?.caveat??"Client-side estimate from the current model catalog."} Assumes the API-key member tier; no generation was submitted.`:"No exact model catalog row was selected; use --model-id for a points estimate.",points:i?.estimated_points??null},warnings:n?[]:e.catalogStatus==="ambiguous"?[{code:"MODEL_CATALOG_SELECTION_AMBIGUOUS",message:"Multiple active variants exist; use --model-id or --variant for exact constraints and points."}]:[{code:"MODEL_CATALOG_SELECTION_NOT_EXACT",message:"Use --model-id or --variant to validate catalog-specific constraints and estimate points."}]}}function $e(e,t){if(t){_(I("generation_dry_run",e));return}N("Generation request is valid (dry-run; nothing was submitted)"),e.resolved.model_id!==null&&g(` Model ID: ${e.resolved.model_id}`),g(` Tool: ${e.resolved.mcp_method_name}`),e.resolved.variant&&g(` Variant: ${e.resolved.variant}`),g(` Points: ${e.estimate.points??"unknown"}${e.estimate.points!==null?" (estimated)":""}`),g(` Arguments: ${JSON.stringify(e.resolved.arguments)}`);for(let r of e.warnings)K(`${r.code}: ${r.message}`)}var It="seedream45",ut="seedance20",nr="seed-audio";var Hn=A,Yn=O;function Qn(e,t){let r=e.workspace;if(r)return{workspaceId:r,source:"flag"};let o=process.env.OIIOII_WORKSPACE_ID;if(o)return{workspaceId:o,source:"env"};let n=t.loadResolved();if(n.defaultWorkspaceId)return{workspaceId:n.defaultWorkspaceId,source:"config"};throw new c(u.WORKSPACE_REQUIRED,"No workspace set. Run: oiioii workspace set <workspace_id>")}function kc(e){let t=/^(\d+)x(\d+)$/.exec(e.trim());if(!t)throw new c(u.INVALID_ARGUMENT,`Invalid image size: ${e}. Expected <width>x<height>.`);let r=Number(t[1]),o=Number(t[2]);if(r<=0||o<=0)throw new c(u.INVALID_ARGUMENT,`Invalid image size: ${e}. Dimensions must be positive.`);let n=(s,a)=>a===0?s:n(a,s%a),i=n(r,o);return`${r/i}:${o/i}`}function bc(e,t){let r=Nt(e,{aspectRatio:"1:1",resolution:"2K"}),o=t.aspectRatio??(t.size?kc(t.size):r.aspectRatio),n=t.resolution??r.resolution,i;if(e.toolName==="generate_image_gpt4o"){let[s=1,a=1]=o.split(":").map(Number);i={size:s===a?"1024x1024":s>a?"1536x1024":"1024x1536"}}else i={aspectRatio:o,resolution:n};return it(e,{aspectRatio:o,resolution:n}),{args:i,aspectRatio:o,resolution:n}}function lo(e){let{images:t,...r}=e;return{input:r,references:Array.isArray(t)?t.filter(o=>typeof o=="string").map(o=>({kind:"media",mediaType:"image",uri:o})):[]}}async function mo(e,t,r,o,n,i){let s=await nt({domain:"image",model:e.model,modelId:e.modelId,variant:e.variant,requireActiveCatalog:i,baseUrl:o,apiKey:r,fetch:n.fetch});if(e.transparent&&s.toolName!=="generate_image_gpt_image2")throw new c(u.MODEL_CONSTRAINT_VIOLATION,"--transparent is supported only with GPT Image 2.");let a=ot({prompt:e.prompt,assets:e.assets,bindings:e.bindings}),d=a.references.length+(t==="edit"?1:0);d===0?ct(s):wt(s,d);let l=bc(s,e);return{selection:s,prompt:a.prompt,assetReferences:a.references,resolved:{aspectRatio:l.aspectRatio,resolution:l.resolution},args:{prompt:a.prompt,...t==="edit"?{images:[e.image]}:{},...l.args,...e.transparent?{transparent:!0}:{},...s.variant?{version:s.variant}:{}}}}async function Xn(e,t,r,o,n){let i=await mo(e,t,r,o,n,!0),s=lo(i.args);s.references=Re(s.references,i.assetReferences);let a=le(n.configStore??new b,s.references);return Rt(i.selection,"image",i.args,{references:s.references,transport:a})}async function vc(e,t,r,o,n={}){let i=n.taskStore??new H,s=await mo(e,"text",r,o,n,!0),{selection:a}=s,d=a.toolName;y("image","generation.prepared",{mode:"text",model:a.key,model_id:a.modelId,variant:a.variant,workspace_id:t});let l={...s.args,workspace_id:t},p=lo(s.args);p.references=Re(p.references,s.assetReferences);let m=n.configStore??new b,f=le(m,p.references),h={transport:f,mediaType:"image",prompt:s.prompt,model:a.variant,...p},U=`oiioii image text --prompt "${e.prompt}" ${He(a)}${e.aspectRatio?` --aspect-ratio ${e.aspectRatio}`:""}${e.size?` --size ${e.size}`:""}${e.resolution?` --resolution ${e.resolution}`:""}${e.transparent?" --transparent":""}`,x=i.create({workspaceId:t,command:U,toolName:d,inputArgs:{provider:`async_generation_${f}`,prompt:s.prompt,model:a.key,modelId:a.modelId,variant:a.variant,mcpMethodName:d,workspaceId:t,toolArgs:{aspectRatio:l.aspectRatio,size:l.size,resolution:l.resolution,transparent:l.transparent}},pendingSubmission:h,credentialFingerprint:be(r),backendBaseUrl:o,backendTransport:f,mediaType:"image"});i.update(x.id,{status:"submitting"});let T=me({transport:f,baseUrl:o,apiKey:r,fetch:n.fetch,timeoutMs:n.imageTextTimeoutMs??Ue});try{let k=await Pe({client:T,taskStore:i,previewStore:n.previewStore,task:x,mediaType:"image",prompt:s.prompt,model:a.variant,backendBaseUrl:o,backendTransport:f,input:h.input,references:h.references}),R=k.task.resourceUris.map(w=>({type:"image",uri:w,mime_type:st(k.task)})),L=k.previewWarning?[k.previewWarning]:[];return y("image","generation.submitted",{local_task_id:x.id,backend_task_id:k.submission.taskId,status:k.task.status}),{task_id:k.submission.taskId,local_task_id:x.id,tool:d,model:Ie(a),workspace_id:t,status:k.task.status,artifacts:R,request:{aspect_ratio:s.resolved.aspectRatio,resolution:s.resolved.resolution,...e.transparent?{transparent:!0}:{}},...L.length>0?{warnings:L}:{}}}catch(k){let R=k instanceof c?k.code:u.GENERATION_FAILED;throw y("image","generation.command_failed",{task_id:x.id,backend_task_cached:i.get(x.id)?.backendTaskId!==void 0,error_code:R},"error"),Me({taskStore:i,previewStore:n.previewStore,task:x,error:k})}}async function Ec(e,t,r,o,n={}){let i=n.taskStore??new H,s=await mo(e,"edit",r,o,n,!0),{selection:a}=s,d=a.toolName;y("image","generation.prepared",{mode:"edit",model:a.key,model_id:a.modelId,variant:a.variant,workspace_id:t});let l={...s.args,workspace_id:t},p=lo(s.args);p.references=Re(p.references,s.assetReferences);let m=n.configStore??new b,f=le(m,p.references),h={transport:f,mediaType:"image",prompt:s.prompt,model:a.variant,...p},U=`oiioii image edit --image ${e.image} --prompt "${e.prompt}" ${He(a)}${e.aspectRatio?` --aspect-ratio ${e.aspectRatio}`:""}${e.size?` --size ${e.size}`:""}${e.resolution?` --resolution ${e.resolution}`:""}${e.transparent?" --transparent":""}`,x=i.create({workspaceId:t,command:U,toolName:d,inputArgs:{provider:`async_generation_${f}`,prompt:s.prompt,model:a.key,modelId:a.modelId,variant:a.variant,sourceImage:e.image,mcpMethodName:d,workspaceId:t,toolArgs:{images:l.images,aspectRatio:l.aspectRatio,size:l.size,resolution:l.resolution,transparent:l.transparent}},pendingSubmission:h,credentialFingerprint:be(r),backendBaseUrl:o,backendTransport:f,mediaType:"image"});i.update(x.id,{status:"submitting"});let T=me({transport:f,baseUrl:o,apiKey:r,fetch:n.fetch,timeoutMs:n.imageTextTimeoutMs??Ue});try{let k=await Pe({client:T,taskStore:i,previewStore:n.previewStore,task:x,mediaType:"image",prompt:s.prompt,model:a.variant,backendBaseUrl:o,backendTransport:f,input:h.input,references:h.references}),R=k.task.resourceUris.map(w=>({type:"image",uri:w,mime_type:st(k.task)})),L=k.previewWarning?[k.previewWarning]:[];return y("image","generation.submitted",{local_task_id:x.id,backend_task_id:k.submission.taskId,status:k.task.status}),{task_id:k.submission.taskId,local_task_id:x.id,tool:d,model:Ie(a),workspace_id:t,status:k.task.status,artifacts:R,request:{aspect_ratio:s.resolved.aspectRatio,resolution:s.resolved.resolution,...e.transparent?{transparent:!0}:{}},...L.length>0?{warnings:L}:{}}}catch(k){let R=k instanceof c?k.code:u.GENERATION_FAILED;throw y("image","generation.command_failed",{task_id:x.id,backend_task_cached:i.get(x.id)?.backendTaskId!==void 0,error_code:R},"error"),Me({taskStore:i,previewStore:n.previewStore,task:x,error:k})}}function Zn(e={}){let t=new Ic("image").description("Image generation commands");return t.command("text").description("Generate image from text prompt").requiredOption("--prompt <text>","Image description").option("--asset <uri...>","Role, scene, or item asset URI used as a visual reference").option("--bind <name=uri...>","Bind @name in the prompt to a role, scene, or item asset URI").option("--model <model>","Model name",It).option("--model-id <id>","Exact model ID from inspect models").option("--variant <variant>","Exact model variant from inspect models").option("--aspect-ratio <ratio>","Image aspect ratio (defaults to the selected model catalog)").addOption(new Jn("--size <size>","Deprecated <width>x<height> compatibility option").hideHelp()).option("--resolution <resolution>","Image resolution (defaults to the selected model catalog)").option("--transparent","Generate a transparent PNG background (GPT Image 2 only)").option("--dry-run","Validate and preview the resolved request without submitting").action(async(r,o)=>{let n=Hn(o),i=Yn(o),s=e.configStore??new b;try{let a=P(i,s),d=a.baseUrl,{workspaceId:l}=Qn(i,s),p={prompt:r.prompt,assets:r.asset,bindings:r.bind,model:r.model,modelId:r.modelId,variant:r.variant,size:r.size,aspectRatio:r.aspectRatio,resolution:r.resolution,transparent:r.transparent};if(r.dryRun===!0){$e(await Xn(p,"text",a.apiKey,d,e),n);return}let m=await vc(p,l,a.apiKey,d,e);if(E({media_type:"image",generation_mode:"text",model_key:m.model.key,...m.model.model_id!==void 0?{model_id:m.model.model_id}:{},...m.model.variant?{variant:m.model.variant}:{},resolution:m.request.resolution,aspect_ratio:m.request.aspect_ratio,artifact_count:m.artifacts.length,warning_count:m.warnings?.length??0}),m.warnings?.length&&he(),n)_(I(m.status==="succeeded"?"generation_completed":"generation_submitted",{task_id:m.task_id,local_task_id:m.local_task_id,tool:m.tool,model:m.model,workspace_id:m.workspace_id,status:m.status,artifacts:m.artifacts,request:m.request,...m.warnings?{warnings:m.warnings}:{}},[...m.artifacts.length>0?[{command:`oiioii record get ${m.artifacts[0].uri} --json`,description:"Get generation record details"}]:[],{command:`oiioii task status ${m.task_id} --json`,description:"Check task status"}]));else{N(m.status==="succeeded"?"Image generated successfully":"Image generation submitted"),g(` Task ID: ${m.task_id}`),g(` Model: ${m.model.name??m.model.key}${m.model.variant?` (${m.model.variant})`:""}`);for(let f of m.artifacts)g(` URI: ${f.uri}`);for(let f of m.warnings??[])K(`Warning: ${f.message}`);m.artifacts.length>0?g(`
18
+ `;_d(this.tasksPath,r,{encoding:"utf-8",mode:384}),lo(this.tasksPath,384)}_ensureDir(){let t=Rd(this.tasksPath);Hn(t)||yd(t,{recursive:!0,mode:448}),lo(t,448)}};import{readFileSync as mo,writeFileSync as Yn,mkdirSync as Qn,existsSync as nr,readdirSync as bd,chmodSync as Rt}from"fs";import{join as ve}from"path";import{randomBytes as vd}from"crypto";function Ed(){return"preview_"+vd(8).toString("hex")}function Td(e){let t=e.replace(/^generate_/,"").split("_"),r=t[0]??"generation",o=t.slice(1).join("_");return`${o.charAt(0).toUpperCase()+o.slice(1)} ${r} generation`}function Ad(e){let t=[];for(let r of e)t.push({command:`oiioii record get ${r.uri} --json`,description:"Get generation record details"}),r.uri.startsWith("hogi://image/")&&t.push({command:`oiioii video image --image ${r.uri} --prompt '<motion>' --json`,description:"Create video from this image"});return t}var Cd=0;function Zn(e,t){let r=t.created_at.localeCompare(e.created_at);if(r!==0)return r;let o=typeof e.created_sequence=="number"?e.created_sequence:0,i=(typeof t.created_sequence=="number"?t.created_sequence:0)-o;return i!==0?i:t.bundle_id.localeCompare(e.bundle_id)}var Pe=class{configDir;previewsDir;constructor(t){this.configDir=t?.configDir??Ae(),this.previewsDir=ve(this.configDir,"previews")}getConfigDir(){return this.configDir}createBundle(t){let r=Ed(),o=ve(this.previewsDir,r);Qn(o,{recursive:!0,mode:448}),Qn(ve(o,"artifacts"),{recursive:!0,mode:448}),Rt(this.configDir,448),Rt(this.previewsDir,448),Rt(o,448),Rt(ve(o,"artifacts"),448);let n=new Date().toISOString(),i={schema_version:1,bundle_id:r,created_at:n,created_sequence:++Cd,...t.projectId?{project_id:t.projectId}:{},workspace_id:t.workspaceId,task_id:t.taskId,command:t.command,tool:t.tool,input_args:t.inputArgs,resources:t.resources},s=t.resources.length,a=t.tool.includes("video")?"video":t.tool.includes("music")||t.tool.includes("audio")?"audio":"image",c,l,p=[];if(t.status==="succeeded"){let D=t.inputArgs.size?` ${t.inputArgs.size}`:"";c=`Generated ${s}${D} ${a}${s!==1?"s":""}.`,l=t.resources.length>0?`Use \`oiioii record get ${t.resources[0].uri} --json\` for details.`:"No resources returned.",p.push(...Ad(t.resources))}else c=`Generation failed: ${t.error?.message??"unknown error"}`,l=`Task ${t.taskId} failed with ${t.error?.code??"UNKNOWN"}. Check task status or retry.`,p.push({command:`oiioii task status ${t.taskId} --json`,description:"Check task details"});let m={title:Td(t.tool),status:t.status,human_summary:c,agent_summary:l,next:p},f=ve(o,"manifest.json"),h=ve(o,"summary.json");return Yn(f,JSON.stringify(i,null,2)+`
19
+ `,{encoding:"utf-8",mode:384}),Yn(h,JSON.stringify(m,null,2)+`
20
+ `,{encoding:"utf-8",mode:384}),Rt(f,384),Rt(h,384),y("preview_store","preview.created",{bundle_id:r,task_id:t.taskId,status:t.status,resource_count:t.resources.length}),{bundleId:r,bundleDir:o,manifest:i,summary:m}}getBundle(t){let r=ve(this.previewsDir,t),o=ve(r,"manifest.json"),n=ve(r,"summary.json");if(!nr(o)||!nr(n)){y("preview_store","preview.read",{bundle_id:t,found:!1});return}try{let i=JSON.parse(mo(o,"utf-8")),s=JSON.parse(mo(n,"utf-8"));return y("preview_store","preview.read",{bundle_id:t,found:!0}),{manifest:i,summary:s,bundleDir:r}}catch{y("preview_store","preview.read",{bundle_id:t,found:!1,reason:"invalid"},"warn");return}}getBundleByTaskId(t){let r=this._scanBundles();for(let o of r)if(o.task_id===t)return this.getBundle(o.bundle_id)}getLatest(){let t=this._scanBundles();if(t.length!==0)return t.sort(Zn),this.getBundle(t[0].bundle_id)}listBundles(t){let r=this._scanBundles();return r.sort(Zn),t!==void 0&&t>0?r.slice(0,t):r}_scanBundles(){if(!nr(this.previewsDir))return[];let t=bd(this.previewsDir,{withFileTypes:!0}),r=[];for(let o of t){if(!o.isDirectory())continue;let n=ve(this.previewsDir,o.name,"manifest.json");if(nr(n))try{let i=JSON.parse(mo(n,"utf-8"));r.push(i)}catch{}}return r}};function po(e){let t=e.previewStore??new Pe({configDir:e.taskStore.getConfigDir()});try{t.createBundle({taskId:e.task.id,workspaceId:e.task.workspaceId,command:e.task.command,tool:e.task.toolName,inputArgs:e.task.inputArgs,resources:e.resources,status:e.status,...e.error?{error:e.error}:{}});return}catch(r){let o=r instanceof Error?r.message:String(r);return y("preview_store","preview.create_failed",{task_id:e.task.id,status:e.status},"warn"),{code:"PREVIEW_BUNDLE_WRITE_FAILED",message:`Generation completed, but the local preview bundle could not be written: ${o}`}}}var Sd={image:"image/jpeg",video:"video/mp4",audio:"audio/mpeg"};function at(e,t=e.mediaType){if(t)return t==="image"&&e.pendingSubmission?.input.transparent===!0?"image/png":Sd[t]}var Od={image:"hogi://image/",video:"hogi://video/",audio:"hogi://audio/"};function Xn(e){return e==="pending"?"queued":e==="processing"?"running":e}function ct(e){return e.status==="succeeded"||e.status==="failed"||e.status==="cancelled"}function xd(e){if(!(e instanceof d))return!1;if(e.code===u.NETWORK_ERROR||e.code===u.GENERATION_TIMEOUT)return!0;let t=ei(e);return t.response_protocol===!0||t.request_outcome==="unknown"}function ei(e){return e.details&&typeof e.details=="object"&&!Array.isArray(e.details)?e.details:{}}function Le(e){if(e.taskStore.get(e.task.id)?.backendTaskId)return e.error;let t=e.error instanceof d?e.error.code:u.GENERATION_FAILED,r=e.error instanceof Error?e.error.message:String(e.error);if(xd(e.error))return e.taskStore.update(e.task.id,{status:"submitting",error:{code:t,message:r}}),new d(t,r,{...ei(e.error),submission_outcome:"unknown",local_task_id:e.task.id,task_status:"submitting",retry_command:`oiioii task retry ${e.task.id}`});let o=e.taskStore.update(e.task.id,{status:"failed",error:{code:t,message:r}})??e.task;return po({taskStore:e.taskStore,previewStore:e.previewStore,task:o,resources:[],status:"failed",error:{code:t,message:r}}),e.error}function Nd(e){let t=Od[e.mediaType],r=e.outputUris.find(o=>!o.startsWith(t));if(r)throw new d(u.SERVER_ERROR,`Backend ${e.mediaType} task returned an incompatible resource URI`,{task_id:e.taskId,uri:r});if(e.status==="succeeded"&&e.outputUris.length===0)throw new d(u.SERVER_ERROR,`Backend task ${e.taskId} succeeded without an output URI`);return e.outputUris}function Ud(e){let t=e.previewStore??new Pe({configDir:e.taskStore.getConfigDir()});if(t.getBundleByTaskId(e.task.id))return;let r=e.task.status==="failed"||e.task.status==="cancelled";return po({taskStore:e.taskStore,previewStore:t,task:e.task,resources:e.task.resourceUris.map(o=>({uri:o,mime_type:at(e.task)})),status:r?"failed":"succeeded",...r?{error:e.task.error??{code:e.task.status==="cancelled"?"GENERATION_CANCELLED":u.GENERATION_FAILED,message:e.task.status==="cancelled"?"Generation was cancelled":"Generation failed"}}:{}})}async function $e(e){let t=await e.client.submit({workspaceId:e.task.workspaceId,mediaType:e.mediaType,prompt:e.prompt,mcpMethodName:e.task.toolName,...e.model?{model:e.model}:{},input:e.input,...e.references?{references:e.references}:{},idempotencyKey:e.task.id}),r=e.taskStore.update(e.task.id,{backendTaskId:t.taskId,backendAssetId:t.assetId,backendBaseUrl:e.backendBaseUrl.replace(/\/+$/,""),backendTransport:e.backendTransport,mediaType:t.mediaType,status:t.status==="succeeded"||t.status==="failed"||t.status==="cancelled"?"running":Xn(t.status),progress:0,lastSyncedAt:new Date().toISOString(),error:null});if(!r)throw new d(u.SERVER_ERROR,`Local task disappeared after submission: ${e.task.id}`);if(y("async_generation","submission.cached",{local_task_id:r.id,backend_task_id:t.taskId,status:r.status}),!(t.status==="succeeded"||t.status==="failed"||t.status==="cancelled"))return{submission:t,task:r};let n=await fo({client:e.client,taskStore:e.taskStore,previewStore:e.previewStore,task:r});if(n.task.status==="failed"||n.task.status==="cancelled")throw new d(u.GENERATION_FAILED,n.task.error?.message??`Backend generation task ${n.task.backendTaskId} ${n.task.status}`,{backend_task_id:n.task.backendTaskId,backend_status:n.task.status,...n.task.error?{backend_error:n.task.error}:{}});return{submission:t,...n}}async function ti(e){if(e.task.backendTaskId)throw new d(u.INVALID_ARGUMENT,`Task ${e.task.id} has already been accepted by the backend.`);if(e.task.status!=="submitting"||!e.task.pendingSubmission||!e.task.error)throw new d(u.INVALID_ARGUMENT,`Task ${e.task.id} is not an ambiguous submission that can be retried.`);let t=e.task.pendingSubmission;try{return await $e({client:e.client,taskStore:e.taskStore,previewStore:e.previewStore,task:e.task,mediaType:t.mediaType,prompt:t.prompt,...t.model?{model:t.model}:{},backendBaseUrl:e.backendBaseUrl,backendTransport:e.backendTransport,input:t.input,...t.references?{references:t.references}:{}})}catch(r){throw Le({taskStore:e.taskStore,previewStore:e.previewStore,task:e.task,error:r})}}async function fo(e){if(!e.task.backendTaskId){if(ct(e.task))return{task:e.task};throw new d(u.TASK_NOT_FOUND,`Task ${e.task.id} has no cached backend async-task ID.`)}let t=await e.client.query(e.task.workspaceId,e.task.backendTaskId);if(e.task.mediaType&&e.task.mediaType!==t.mediaType)throw new d(u.SERVER_ERROR,"Backend task media type does not match the cached local task",{task_id:t.taskId,cached_media_type:e.task.mediaType,backend_media_type:t.mediaType});let r=Nd(t),o=e.taskStore.update(e.task.id,{backendAssetId:t.assetId,mediaType:t.mediaType,status:Xn(t.status),progress:t.progress,resourceUris:r,lastSyncedAt:new Date().toISOString(),error:t.error});if(!o)throw new d(u.SERVER_ERROR,`Local task disappeared during synchronization: ${e.task.id}`);if(y("async_generation","task.cache_synchronized",{local_task_id:o.id,backend_task_id:o.backendTaskId,status:o.status,progress:o.progress,output_count:o.resourceUris.length}),!ct(o))return{task:o};let n=Ud({taskStore:e.taskStore,previewStore:e.previewStore,task:o});return y("async_generation","task.terminal_projected",{local_task_id:o.id,backend_task_id:o.backendTaskId,status:o.status,preview_warning:n!==void 0}),{task:o,...n?{previewWarning:n}:{}}}import{createHash as Dd}from"crypto";function Ee(e){return`sha256:${Dd("sha256").update("oiioii-cli-task-credential-v1\0").update(e).digest("hex")}`}var sr=["text2Video","firstframe2Video","endframe2Video","frame2Video","image2Video","omni2Video"],Z=(e,t=!1)=>({name:"imageUrl",max:e,single:t}),dt=e=>({name:"images",max:e}),Ve=(e,t=!1)=>({name:"videoUrl",max:e,single:t}),ir=e=>({name:"audioUrl",max:e}),oi=["text2Video","firstframe2Video"],ri=["text2Video","image2Video","omni2Video"],Qe=["text2Video","firstframe2Video","frame2Video","image2Video","omni2Video"];function Md(e){return e==="2.7"?{fields:{image:Z(5),video:Ve(1,!0)},modes:Qe,totalMax:5}:{fields:{image:Z(10),video:Ve(5),audio:ir(5)},modes:Qe}}function Pd(e){return e?.toLowerCase()==="kling-v3-omni"?{fields:{image:dt(),video:Ve()},modes:Qe}:{fields:{image:dt()},modes:e==="2.6"?oi:["text2Video","firstframe2Video","frame2Video"]}}function Ld(e){return e==="viduQ3Ref"||e==="viduQ3MixRef"||e==="viduQ3Ad"?{fields:{image:Z(7)},modes:["image2Video","omni2Video"]}:e==="viduQ3"?{fields:{image:Z(7)},modes:["text2Video","firstframe2Video","image2Video","omni2Video"]}:{fields:{image:Z(7)},modes:Qe}}function yo(e,t){return e==="generate_video_wan"?Md(t):e==="generate_video_kling"?Pd(t):e==="generate_video_vidu"?Ld(t):{generate_video_seedance20:{fields:{image:Z(9),video:Ve(3),audio:ir(3)},modes:Qe},generate_video_seedance25:{fields:{image:Z(30),video:Ve(10),audio:ir(10)},modes:Qe,totalMax:50},generate_video_minimax_h3:{fields:{image:Z(9),video:Ve(3),audio:ir(3)},modes:[...Qe,"endframe2Video"],audioRequiresVisual:!0},generate_video_wan27:{fields:{image:Z(5),video:Ve(1,!0)},modes:Qe,totalMax:5},generate_video_wan26:{fields:{image:Z(5),video:Ve(1,!0)},modes:["text2Video","firstframe2Video","image2Video","omni2Video"]},generate_video_gemini_omni:{fields:{image:dt(5),video:Ve(1,!0)},modes:ri,totalMax:5},generate_video_grok_imagine:{fields:{image:Z(1,!0)},modes:oi},generate_video_grok_imagine_15:{fields:{image:Z(1,!0)},modes:["firstframe2Video"]},generate_video_grok_imagine_15_fast:{fields:{image:Z(7)},modes:ri},generate_video_happyhorse:{fields:{image:Z(9)},modes:["text2Video","firstframe2Video","image2Video","omni2Video"]},generate_video_happyhorse11:{fields:{image:Z(9)},modes:["text2Video","firstframe2Video","image2Video","omni2Video"]},generate_video_sora2:{fields:{image:dt()}},generate_video_sora2_pro:{fields:{image:dt()}},generate_video_kling_o1:{fields:{image:dt()}},generate_video_midjourney:{fields:{image:dt()}},generate_video_veo3:{fields:{image:Z(1,!0)}},generate_video_hailuo02:{fields:{image:Z(2)}}}[e]}function ni(e,t){let r=yo(e,t);if(r)return{image:r.fields.image!==void 0,video:r.fields.video!==void 0,audio:r.fields.audio!==void 0}}function ii(e,t){let r=yo(e,t);return!r||!r.modes?!0:r.modes.includes("text2Video")}function go(e){return[...new Set((e??[]).map(t=>t.trim()).filter(Boolean))]}function _o(e,t,r){let o=e.find(n=>!n.startsWith(r));if(o)throw new d(u.INVALID_ARGUMENT,`Video ${t} references must use ${r} URIs: ${o}`)}function ie(e,t={}){return new d(u.MODEL_CONSTRAINT_VIOLATION,e,{category:"validation",retryable:!1,...t})}function ho(e,t,r,o,n){if(o.length!==0){if(!n)throw ie(`${t} does not support ${r} references.`,{field:r});if(n.max!==void 0&&o.length>n.max)throw ie(`${t} supports at most ${n.max} ${r} references; received ${o.length}.`,{field:r,received:o.length,supported_max:n.max});if(n.single&&o.length>1)throw ie(`${t} supports only one ${r} reference.`,{field:r,received:o.length,supported_max:1});e[n.name]=n.single?o[0]:o}}function $d(e,t,r=0){let o=t.images.length+r;return o+t.videos.length+t.audios.length===0?"text2Video":e.modes?.includes("omni2Video")||t.videos.length||t.audios.length?"omni2Video":e.modes?.includes("image2Video")?"image2Video":o===1&&e.modes?.includes("firstframe2Video")?"firstframe2Video":o===2&&e.modes?.includes("frame2Video")?"frame2Video":"image2Video"}function si(e){let t={images:go(e.images),videos:go(e.videos),audios:go(e.audios)};_o(t.images,"images","hogi://image/"),_o(t.videos,"videos","hogi://video/"),_o(t.audios,"audios","hogi://audio/");let r=e.additionalImageReferenceCount??0;if(!Number.isInteger(r)||r<0)throw new d(u.INVALID_ARGUMENT,"Additional image reference count must be a non-negative integer.");let o=t.images.length+r,n=o+t.videos.length+t.audios.length,i=yo(e.toolName,e.version);if(!i){if(n===0)return{args:{},mode:"text2Video",references:t};throw new d(u.MODEL_NOT_SUPPORTED,`${e.toolName} has no verified reference-input contract in this CLI. Select a confirmed model or use video text.`,{category:"validation",retryable:!1,tool:e.toolName})}if(i.totalMax!==void 0&&n>i.totalMax)throw ie(`${e.toolName} supports at most ${i.totalMax} total references; received ${n}.`,{field:"references",received:n,supported_max:i.totalMax});if(r>0){let c=i.fields.image;if(!c)throw ie(`${e.toolName} does not support image references.`,{field:"image"});if(c.max!==void 0&&o>c.max)throw ie(`${e.toolName} supports at most ${c.max} image references; received ${o}.`,{field:"image",received:o,supported_max:c.max});if(c.single&&o>1)throw ie(`${e.toolName} supports only one image reference.`,{field:"image",received:o,supported_max:1})}if(i.audioRequiresVisual&&t.audios.length>0&&o===0&&t.videos.length===0)throw ie(`${e.toolName} audio references require at least one image or video reference.`,{field:"audio"});let s=e.mode&&e.mode!=="auto"?e.mode:$d(i,t,r);if(e.mode&&e.mode!=="auto"&&!i.modes)throw new d(u.MODEL_CONSTRAINT_VIOLATION,`${e.toolName} does not expose a selectable generateMode; omit --mode or use --mode auto.`,{category:"validation",retryable:!1,field:"mode",received:e.mode});if(i.modes&&!i.modes.includes(s))throw new d(u.MODEL_CONSTRAINT_VIOLATION,`${e.toolName} does not support ${s}. Supported modes: ${i.modes.join(", ")}.`,{category:"validation",retryable:!1,field:"mode",received:s,supported:i.modes});if(s==="text2Video"&&n>0)throw ie("text2Video does not accept image, video, or audio references.",{field:"references"});if((s==="firstframe2Video"||s==="endframe2Video")&&(o!==1||t.videos.length>0||t.audios.length>0))throw ie(`${s} requires exactly one image and no video or audio references.`,{field:"references",mode:s});if(s==="frame2Video"&&(o!==2||t.videos.length>0||t.audios.length>0))throw ie("frame2Video requires exactly two images and no video or audio references.",{field:"references",mode:s});if(s==="image2Video"&&(o===0||t.videos.length>0||t.audios.length>0))throw ie("image2Video requires image references and does not accept video or audio references.",{field:"references",mode:s});if(s==="omni2Video"&&n===0)throw ie("omni2Video requires at least one reference; use text2Video for prompt-only generation.",{field:"references",mode:s});let a={};return ho(a,e.toolName,"image",t.images,i.fields.image),ho(a,e.toolName,"video",t.videos,i.fields.video),ho(a,e.toolName,"audio",t.audios,i.fields.audio),i.modes&&(a.generateMode=s),{args:a,mode:s,references:t}}var ai={image:!1,video:!1,audio:!1};function ar(e){let t=ai;if(e.toolName.startsWith("generate_image_"))t={image:!0,video:!1,audio:!1};else if(e.toolName.startsWith("generate_video_"))t=ni(e.toolName,e.variant)??ai;else if(e.toolName==="generate_music_seed_audio"){let r=new Set(e.catalog?.input_capabilities??["text"]);t={image:r.has("image"),video:!1,audio:r.has("audio")}}return{text:!0,image:t.image&&e.catalog?.reference_image_count_max!==0,video:t.video,audio:t.audio,file:!1}}function Pt(e){let t=typeof e.catalog?.reference_image_count_min=="number"&&e.catalog.reference_image_count_min>0;return{media:ar(e),prompt_only_supported:!t&&(!e.toolName.startsWith("generate_video_")||ii(e.toolName,e.variant))}}function ut(e){if(Pt(e).prompt_only_supported)return;let t=e.catalog?.reference_image_count_min,r=typeof t=="number"&&t>0;throw new d(u.MODEL_CONSTRAINT_VIOLATION,r?`${e.name??e.key??e.toolName} requires at least ${t} reference image.`:`${e.name??e.key??e.toolName} requires a media reference and does not support prompt-only generation.`,{category:"validation",retryable:!1,...r?{field:"reference_image_count_min",received:0,supported_min:t}:{field:"generateMode",received:"text2Video"}})}function kt(e,t){let r=e.catalog?.reference_image_count_min,o=e.catalog?.reference_image_count_max;if(typeof r=="number"&&t<r)throw new d(u.MODEL_CONSTRAINT_VIOLATION,`${e.name??e.key??e.toolName} requires at least ${r} reference images; received ${t}.`,{category:"validation",retryable:!1,field:"reference_image_count_min",received:t,supported_min:r});if(t!==0){if(!ar(e).image)throw new d(u.MODEL_CONSTRAINT_VIOLATION,`${e.name??e.key??e.toolName} does not support reference images.`,{category:"validation",retryable:!1,field:"reference_image_count_max",received:t,...o===0?{supported_max:0}:{}});if(typeof o=="number"&&t>o)throw new d(u.MODEL_CONSTRAINT_VIOLATION,`${e.name??e.key??e.toolName} supports at most ${o} reference images; received ${t}.`,{category:"validation",retryable:!1,field:"reference_image_count_max",received:t,supported_max:o})}}function cr(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=Object.entries(e).filter(r=>typeof r[1]=="number");return Object.fromEntries(t)}function Lt(e,t){if(!e||!t)return;let r=e[t];if(r!==void 0)return r;let o=Object.keys(e).find(n=>n.toLowerCase()===t.toLowerCase());return o?e[o]:void 0}function ci(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function wo(e){let t=Number.EPSILON*Math.max(1,Math.abs(e))*8;return e<=0?0:Math.max(1,Math.ceil(e-t))}function dr(e){let{pricing:t}=e,r=e.tier==="free"?"free":"member",o=t.mcp_method_name.startsWith("generate_video_"),n=t.audio_pricing_mode==="per_second",i=e.referenceVideoDuration??0;if(e.duration!==void 0&&(!Number.isFinite(e.duration)||e.duration<=0))throw new d(u.INVALID_ARGUMENT,"Duration must be a positive number");if(!Number.isFinite(i)||i<0)throw new d(u.INVALID_ARGUMENT,"Reference video duration must be zero or positive");let s=t.points_cost,a=ci(t.free_user_points_cost)??s,c=r==="free"?a:s,l=cr(t.resolution_pricing),p=cr(t.free_user_resolution_pricing)??l,m=cr(t.resolution_pricing_with_video),f=cr(t.free_user_resolution_pricing_with_video)??m,h=r==="free"?p:l,D=r==="free"?f:m,N=i>0?D:h,C=e.resolution;if(t.mcp_method_name==="generate_image_gpt_image2"&&e.resolution&&Lt(N,e.resolution)===void 0&&/^[124]k$/i.test(e.resolution)){let se=e.quality?.trim().toLowerCase()??(e.resolution.toLowerCase()==="1k"?"low":"medium"),he=`${e.resolution}-${se}`;(Lt(N,he)!==void 0||Lt(h,he)!==void 0)&&(C=he)}let v=(i>0?Lt(D,C):void 0)??Lt(h,C)??c,I=t.promo_active===!0&&ci(t.promo_discount_percent)!==void 0,V=I?t.promo_discount_percent/100:1,w=v*V,F=e.duration??(o?10:void 0),L=F!==void 0?F+(o?i:0):void 0;return{estimate:!0,estimated_points:o&&L!==void 0?wo(w*L):n&&F!==void 0?wo(w*F):I?wo(w):v,unit_points:v,tier:r,billing_unit:o||n?"second":"request",...L!==void 0&&(o||n)?{billed_duration:L}:{},promo_applied:I,model_id:t.id,model_name:t.name??t.model??t.mcp_method_name,caveat:"Client-side estimate from the current model catalog; actual charge may differ because backend feature flags, resolved media duration, promotions, and fallback pricing are authoritative."}}function It(e,t,r,o){let n=e.catalog,i=n?dr({pricing:n,tier:"member",...typeof r.duration=="number"?{duration:r.duration}:{},...typeof r.resolution=="string"?{resolution:r.resolution}:{},...typeof r.quality=="string"?{quality:r.quality}:{},...typeof r.referenceVideoDuration=="number"?{referenceVideoDuration:r.referenceVideoDuration}:{}}):void 0;return{valid:!0,resolved:{arguments:r,contract:{source:"cli_model_catalog_and_command_schema",input_capabilities:Gn(e),input_capabilities_scope:"model_input_modalities",generation_input_contract:Pt(e),...t==="image"?{reference_images:{capability_field:"reference_image_count_max",count_min:n?.reference_image_count_min??null,count_max:n?.reference_image_count_max??null,source:typeof n?.reference_image_count_max=="number"?"catalog":"frontend_fallback",supported:n?.reference_image_count_max!==0}}:{},constraints:{aspect_ratios:n?.aspect_ratios??[],durations:n?.durations??[],sizes:n?.sizes??[]}},media_type:t,mcp_method_name:e.toolName,model_id:e.modelId??null,variant:e.variant??null,...o?.references?.length?{references:o.references}:{},...o?.transport?{transport:o.transport}:{}},estimate:{caveat:n?`${i?.caveat??"Client-side estimate from the current model catalog."} Assumes the API-key member tier; no generation was submitted.`:"No exact model catalog row was selected; use --model-id for a points estimate.",points:i?.estimated_points??null},warnings:n?[]:e.catalogStatus==="ambiguous"?[{code:"MODEL_CATALOG_SELECTION_AMBIGUOUS",message:"Multiple active variants exist; use --model-id or --variant for exact constraints and points."}]:[{code:"MODEL_CATALOG_SELECTION_NOT_EXACT",message:"Use --model-id or --variant to validate catalog-specific constraints and estimate points."}]}}function Ge(e,t){if(t){_(k("generation_dry_run",e));return}U("Generation request is valid (dry-run; nothing was submitted)"),e.resolved.model_id!==null&&g(` Model ID: ${e.resolved.model_id}`),g(` Tool: ${e.resolved.mcp_method_name}`),e.resolved.variant&&g(` Variant: ${e.resolved.variant}`),g(` Points: ${e.estimate.points??"unknown"}${e.estimate.points!==null?" (estimated)":""}`),g(` Arguments: ${JSON.stringify(e.resolved.arguments)}`);for(let r of e.warnings)K(`${r.code}: ${r.message}`)}var bt="seedream45",lt="seedance20",ur="seed-audio";var ui=E,li=T;function mi(e,t){let r=e.workspace;if(r)return{workspaceId:r,source:"flag"};let o=process.env.OIIOII_WORKSPACE_ID;if(o)return{workspaceId:o,source:"env"};let n=t.loadResolved();if(n.defaultWorkspaceId)return{workspaceId:n.defaultWorkspaceId,source:"config"};throw new d(u.WORKSPACE_REQUIRED,"No workspace set. Run: oiioii workspace set <workspace_id>")}function Gd(e){let t=/^(\d+)x(\d+)$/.exec(e.trim());if(!t)throw new d(u.INVALID_ARGUMENT,`Invalid image size: ${e}. Expected <width>x<height>.`);let r=Number(t[1]),o=Number(t[2]);if(r<=0||o<=0)throw new d(u.INVALID_ARGUMENT,`Invalid image size: ${e}. Dimensions must be positive.`);let n=(s,a)=>a===0?s:n(a,s%a),i=n(r,o);return`${r/i}:${o/i}`}function Fd(e,t){let r=Dt(e,{aspectRatio:"1:1",resolution:"2K"}),o=t.aspectRatio??(t.size?Gd(t.size):r.aspectRatio),n=t.resolution??r.resolution,i;if(e.toolName==="generate_image_gpt4o"){let[s=1,a=1]=o.split(":").map(Number);i={size:s===a?"1024x1024":s>a?"1536x1024":"1024x1536"}}else i={aspectRatio:o,resolution:n};return st(e,{aspectRatio:o,resolution:n}),{args:i,aspectRatio:o,resolution:n}}function Ro(e){let{images:t,...r}=e;return{input:r,references:Array.isArray(t)?t.filter(o=>typeof o=="string").map(o=>({kind:"media",mediaType:"image",uri:o})):[]}}async function ko(e,t,r,o,n,i){let s=await it({domain:"image",model:e.model,modelId:e.modelId,variant:e.variant,requireActiveCatalog:i,baseUrl:o,apiKey:r,fetch:n.fetch});if(e.transparent&&s.toolName!=="generate_image_gpt_image2")throw new d(u.MODEL_CONSTRAINT_VIOLATION,"--transparent is supported only with GPT Image 2.");let a=nt({prompt:e.prompt,assets:e.assets,bindings:e.bindings}),c=a.references.length+(t==="edit"?1:0);c===0?ut(s):kt(s,c);let l=Fd(s,e);return{selection:s,prompt:a.prompt,assetReferences:a.references,resolved:{aspectRatio:l.aspectRatio,resolution:l.resolution},args:{prompt:a.prompt,...t==="edit"?{images:[e.image]}:{},...l.args,...e.transparent?{transparent:!0}:{},...s.variant?{version:s.variant}:{}}}}async function pi(e,t,r,o,n){let i=await ko(e,t,r,o,n,!0),s=Ro(i.args);s.references=Ie(s.references,i.assetReferences);let a=ge(n.configStore??new b,s.references);return It(i.selection,"image",i.args,{references:s.references,transport:a})}async function Wd(e,t,r,o,n={}){let i=n.taskStore??new Y,s=await ko(e,"text",r,o,n,!0),{selection:a}=s,c=a.toolName;y("image","generation.prepared",{mode:"text",model:a.key,model_id:a.modelId,variant:a.variant,workspace_id:t});let l={...s.args,workspace_id:t},p=Ro(s.args);p.references=Ie(p.references,s.assetReferences);let m=n.configStore??new b,f=ge(m,p.references),h={transport:f,mediaType:"image",prompt:s.prompt,model:a.variant,...p},D=`oiioii image text --prompt "${e.prompt}" ${Ye(a)}${e.aspectRatio?` --aspect-ratio ${e.aspectRatio}`:""}${e.size?` --size ${e.size}`:""}${e.resolution?` --resolution ${e.resolution}`:""}${e.transparent?" --transparent":""}`,N=i.create({workspaceId:t,command:D,toolName:c,inputArgs:{provider:`async_generation_${f}`,prompt:s.prompt,model:a.key,modelId:a.modelId,variant:a.variant,mcpMethodName:c,workspaceId:t,toolArgs:{aspectRatio:l.aspectRatio,size:l.size,resolution:l.resolution,transparent:l.transparent}},pendingSubmission:h,credentialFingerprint:Ee(r),backendBaseUrl:o,backendTransport:f,mediaType:"image"});i.update(N.id,{status:"submitting"});let C=_e({transport:f,baseUrl:o,apiKey:r,fetch:n.fetch,timeoutMs:n.imageTextTimeoutMs??Me});try{let v=await $e({client:C,taskStore:i,previewStore:n.previewStore,task:N,mediaType:"image",prompt:s.prompt,model:a.variant,backendBaseUrl:o,backendTransport:f,input:h.input,references:h.references}),I=v.task.resourceUris.map(w=>({type:"image",uri:w,mime_type:at(v.task)})),V=v.previewWarning?[v.previewWarning]:[];return y("image","generation.submitted",{local_task_id:N.id,backend_task_id:v.submission.taskId,status:v.task.status}),{task_id:v.submission.taskId,local_task_id:N.id,tool:c,model:be(a),workspace_id:t,status:v.task.status,artifacts:I,request:{aspect_ratio:s.resolved.aspectRatio,resolution:s.resolved.resolution,...e.transparent?{transparent:!0}:{}},...V.length>0?{warnings:V}:{}}}catch(v){let I=v instanceof d?v.code:u.GENERATION_FAILED;throw y("image","generation.command_failed",{task_id:N.id,backend_task_cached:i.get(N.id)?.backendTaskId!==void 0,error_code:I},"error"),Le({taskStore:i,previewStore:n.previewStore,task:N,error:v})}}async function qd(e,t,r,o,n={}){let i=n.taskStore??new Y,s=await ko(e,"edit",r,o,n,!0),{selection:a}=s,c=a.toolName;y("image","generation.prepared",{mode:"edit",model:a.key,model_id:a.modelId,variant:a.variant,workspace_id:t});let l={...s.args,workspace_id:t},p=Ro(s.args);p.references=Ie(p.references,s.assetReferences);let m=n.configStore??new b,f=ge(m,p.references),h={transport:f,mediaType:"image",prompt:s.prompt,model:a.variant,...p},D=`oiioii image edit --image ${e.image} --prompt "${e.prompt}" ${Ye(a)}${e.aspectRatio?` --aspect-ratio ${e.aspectRatio}`:""}${e.size?` --size ${e.size}`:""}${e.resolution?` --resolution ${e.resolution}`:""}${e.transparent?" --transparent":""}`,N=i.create({workspaceId:t,command:D,toolName:c,inputArgs:{provider:`async_generation_${f}`,prompt:s.prompt,model:a.key,modelId:a.modelId,variant:a.variant,sourceImage:e.image,mcpMethodName:c,workspaceId:t,toolArgs:{images:l.images,aspectRatio:l.aspectRatio,size:l.size,resolution:l.resolution,transparent:l.transparent}},pendingSubmission:h,credentialFingerprint:Ee(r),backendBaseUrl:o,backendTransport:f,mediaType:"image"});i.update(N.id,{status:"submitting"});let C=_e({transport:f,baseUrl:o,apiKey:r,fetch:n.fetch,timeoutMs:n.imageTextTimeoutMs??Me});try{let v=await $e({client:C,taskStore:i,previewStore:n.previewStore,task:N,mediaType:"image",prompt:s.prompt,model:a.variant,backendBaseUrl:o,backendTransport:f,input:h.input,references:h.references}),I=v.task.resourceUris.map(w=>({type:"image",uri:w,mime_type:at(v.task)})),V=v.previewWarning?[v.previewWarning]:[];return y("image","generation.submitted",{local_task_id:N.id,backend_task_id:v.submission.taskId,status:v.task.status}),{task_id:v.submission.taskId,local_task_id:N.id,tool:c,model:be(a),workspace_id:t,status:v.task.status,artifacts:I,request:{aspect_ratio:s.resolved.aspectRatio,resolution:s.resolved.resolution,...e.transparent?{transparent:!0}:{}},...V.length>0?{warnings:V}:{}}}catch(v){let I=v instanceof d?v.code:u.GENERATION_FAILED;throw y("image","generation.command_failed",{task_id:N.id,backend_task_cached:i.get(N.id)?.backendTaskId!==void 0,error_code:I},"error"),Le({taskStore:i,previewStore:n.previewStore,task:N,error:v})}}function fi(e={}){let t=new Vd("image").description("Image generation commands");return t.command("text").description("Generate image from text prompt").requiredOption("--prompt <text>","Image description").option("--asset <uri...>","Role, scene, or item asset URI used as a visual reference").option("--bind <name=uri...>","Bind @name in the prompt to a role, scene, or item asset URI").option("--model <model>","Model name",bt).option("--model-id <id>","Exact model ID from inspect models").option("--variant <variant>","Exact model variant from inspect models").option("--aspect-ratio <ratio>","Image aspect ratio (defaults to the selected model catalog)").addOption(new di("--size <size>","Deprecated <width>x<height> compatibility option").hideHelp()).option("--resolution <resolution>","Image resolution (defaults to the selected model catalog)").option("--transparent","Generate a transparent PNG background (GPT Image 2 only)").option("--dry-run","Validate and preview the resolved request without submitting").action(async(r,o)=>{let n=ui(o),i=li(o),s=e.configStore??new b;try{let a=P(i,s),c=a.baseUrl,{workspaceId:l}=mi(i,s),p={prompt:r.prompt,assets:r.asset,bindings:r.bind,model:r.model,modelId:r.modelId,variant:r.variant,size:r.size,aspectRatio:r.aspectRatio,resolution:r.resolution,transparent:r.transparent};if(r.dryRun===!0){Ge(await pi(p,"text",a.apiKey,c,e),n);return}let m=await Wd(p,l,a.apiKey,c,e);if(A({media_type:"image",generation_mode:"text",model_key:m.model.key,...m.model.model_id!==void 0?{model_id:m.model.model_id}:{},...m.model.variant?{variant:m.model.variant}:{},resolution:m.request.resolution,aspect_ratio:m.request.aspect_ratio,artifact_count:m.artifacts.length,warning_count:m.warnings?.length??0}),m.warnings?.length&&we(),n)_(k(m.status==="succeeded"?"generation_completed":"generation_submitted",{task_id:m.task_id,local_task_id:m.local_task_id,tool:m.tool,model:m.model,workspace_id:m.workspace_id,status:m.status,artifacts:m.artifacts,request:m.request,...m.warnings?{warnings:m.warnings}:{}},[...m.artifacts.length>0?[{command:`oiioii record get ${m.artifacts[0].uri} --json`,description:"Get generation record details"}]:[],{command:`oiioii task status ${m.task_id} --json`,description:"Check task status"}]));else{U(m.status==="succeeded"?"Image generated successfully":"Image generation submitted"),g(` Task ID: ${m.task_id}`),g(` Model: ${m.model.name??m.model.key}${m.model.variant?` (${m.model.variant})`:""}`);for(let f of m.artifacts)g(` URI: ${f.uri}`);for(let f of m.warnings??[])K(`Warning: ${f.message}`);m.artifacts.length>0?g(`
21
21
  Next: oiioii record get ${m.artifacts[0].uri}`):g(`
22
- Next: oiioii task wait ${m.task_id} --json`)}}catch(a){if(a instanceof c){n?_(C("generation_failed",a.code,a.message,a.details)):S(a.message),process.exitCode=1;return}let d=a instanceof Error?a.message:String(a);n?_(C("generation_failed",u.GENERATION_FAILED,d)):S(d),process.exitCode=1}}),t.command("edit").description("Edit an existing image (image-to-image)").requiredOption("--image <uri>","Source image (hogi:// URI)").requiredOption("--prompt <text>","Edit instruction").option("--asset <uri...>","Additional role, scene, or item asset URI used as a visual reference").option("--bind <name=uri...>","Bind @name in the prompt to a role, scene, or item asset URI").option("--model <model>","Model name",It).option("--model-id <id>","Exact model ID from inspect models").option("--variant <variant>","Exact model variant from inspect models").option("--aspect-ratio <ratio>","Image aspect ratio (defaults to the selected model catalog)").addOption(new Jn("--size <size>","Deprecated <width>x<height> compatibility option").hideHelp()).option("--resolution <resolution>","Image resolution (defaults to the selected model catalog)").option("--transparent","Generate a transparent PNG background (GPT Image 2 only)").option("--dry-run","Validate and preview the resolved request without submitting").action(async(r,o)=>{let n=Hn(o),i=Yn(o),s=e.configStore??new b;try{let a=P(i,s),d=a.baseUrl,{workspaceId:l}=Qn(i,s),p={image:r.image,prompt:r.prompt,assets:r.asset,bindings:r.bind,model:r.model,modelId:r.modelId,variant:r.variant,size:r.size,aspectRatio:r.aspectRatio,resolution:r.resolution,transparent:r.transparent};if(r.dryRun===!0){$e(await Xn(p,"edit",a.apiKey,d,e),n);return}let m=await Ec(p,l,a.apiKey,d,e);if(E({media_type:"image",generation_mode:"image",model_key:m.model.key,...m.model.model_id!==void 0?{model_id:m.model.model_id}:{},...m.model.variant?{variant:m.model.variant}:{},resolution:m.request.resolution,aspect_ratio:m.request.aspect_ratio,artifact_count:m.artifacts.length,warning_count:m.warnings?.length??0}),m.warnings?.length&&he(),n)_(I(m.status==="succeeded"?"generation_completed":"generation_submitted",{task_id:m.task_id,local_task_id:m.local_task_id,tool:m.tool,model:m.model,workspace_id:m.workspace_id,status:m.status,artifacts:m.artifacts,request:m.request,...m.warnings?{warnings:m.warnings}:{}},[...m.artifacts.length>0?[{command:`oiioii record get ${m.artifacts[0].uri} --json`,description:"Get generation record details"}]:[],{command:`oiioii task status ${m.task_id} --json`,description:"Check task status"}]));else{N(m.status==="succeeded"?"Image edited successfully":"Image edit submitted"),g(` Task ID: ${m.task_id}`),g(` Model: ${m.model.name??m.model.key}${m.model.variant?` (${m.model.variant})`:""}`),g(` Source: ${r.image}`);for(let f of m.artifacts)g(` URI: ${f.uri}`);for(let f of m.warnings??[])K(`Warning: ${f.message}`);m.artifacts.length>0?g(`
22
+ Next: oiioii task wait ${m.task_id} --json`)}}catch(a){if(a instanceof d){n?_(S("generation_failed",a.code,a.message,a.details)):O(a.message),process.exitCode=1;return}let c=a instanceof Error?a.message:String(a);n?_(S("generation_failed",u.GENERATION_FAILED,c)):O(c),process.exitCode=1}}),t.command("edit").description("Edit an existing image (image-to-image)").requiredOption("--image <uri>","Source image (hogi:// URI)").requiredOption("--prompt <text>","Edit instruction").option("--asset <uri...>","Additional role, scene, or item asset URI used as a visual reference").option("--bind <name=uri...>","Bind @name in the prompt to a role, scene, or item asset URI").option("--model <model>","Model name",bt).option("--model-id <id>","Exact model ID from inspect models").option("--variant <variant>","Exact model variant from inspect models").option("--aspect-ratio <ratio>","Image aspect ratio (defaults to the selected model catalog)").addOption(new di("--size <size>","Deprecated <width>x<height> compatibility option").hideHelp()).option("--resolution <resolution>","Image resolution (defaults to the selected model catalog)").option("--transparent","Generate a transparent PNG background (GPT Image 2 only)").option("--dry-run","Validate and preview the resolved request without submitting").action(async(r,o)=>{let n=ui(o),i=li(o),s=e.configStore??new b;try{let a=P(i,s),c=a.baseUrl,{workspaceId:l}=mi(i,s),p={image:r.image,prompt:r.prompt,assets:r.asset,bindings:r.bind,model:r.model,modelId:r.modelId,variant:r.variant,size:r.size,aspectRatio:r.aspectRatio,resolution:r.resolution,transparent:r.transparent};if(r.dryRun===!0){Ge(await pi(p,"edit",a.apiKey,c,e),n);return}let m=await qd(p,l,a.apiKey,c,e);if(A({media_type:"image",generation_mode:"image",model_key:m.model.key,...m.model.model_id!==void 0?{model_id:m.model.model_id}:{},...m.model.variant?{variant:m.model.variant}:{},resolution:m.request.resolution,aspect_ratio:m.request.aspect_ratio,artifact_count:m.artifacts.length,warning_count:m.warnings?.length??0}),m.warnings?.length&&we(),n)_(k(m.status==="succeeded"?"generation_completed":"generation_submitted",{task_id:m.task_id,local_task_id:m.local_task_id,tool:m.tool,model:m.model,workspace_id:m.workspace_id,status:m.status,artifacts:m.artifacts,request:m.request,...m.warnings?{warnings:m.warnings}:{}},[...m.artifacts.length>0?[{command:`oiioii record get ${m.artifacts[0].uri} --json`,description:"Get generation record details"}]:[],{command:`oiioii task status ${m.task_id} --json`,description:"Check task status"}]));else{U(m.status==="succeeded"?"Image edited successfully":"Image edit submitted"),g(` Task ID: ${m.task_id}`),g(` Model: ${m.model.name??m.model.key}${m.model.variant?` (${m.model.variant})`:""}`),g(` Source: ${r.image}`);for(let f of m.artifacts)g(` URI: ${f.uri}`);for(let f of m.warnings??[])K(`Warning: ${f.message}`);m.artifacts.length>0?g(`
23
23
  Next: oiioii record get ${m.artifacts[0].uri}`):g(`
24
- Next: oiioii task wait ${m.task_id} --json`)}}catch(a){if(a instanceof c){n?_(C("generation_failed",a.code,a.message,a.details)):S(a.message),process.exitCode=1;return}let d=a instanceof Error?a.message:String(a);n?_(C("generation_failed",u.GENERATION_FAILED,d)):S(d),process.exitCode=1}}),t}import{Command as Tc}from"commander";var Ac="generate_video_grok_imagine",po=A,fo=O;function ir(e){return typeof e=="string"&&e?[e]:Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.length>0):[]}function ho(e){let{imageUrl:t,images:r,videoUrl:o,audioUrl:n,...i}=e,a=[...[...new Set([...ir(t),...ir(r)])].map(d=>({kind:"media",mediaType:"image",uri:d})),...ir(o).map(d=>({kind:"media",mediaType:"video",uri:d})),...ir(n).map(d=>({kind:"media",mediaType:"audio",uri:d}))];return{input:i,references:a}}function go(e,t){let r=e.workspace;if(r)return{workspaceId:r,source:"flag"};let o=process.env.OIIOII_WORKSPACE_ID;if(o)return{workspaceId:o,source:"env"};let n=t.loadResolved();if(n.defaultWorkspaceId)return{workspaceId:n.defaultWorkspaceId,source:"config"};throw new c(u.WORKSPACE_REQUIRED,"No workspace set. Run: oiioii workspace set <workspace_id>")}function Mt(e){let t=typeof e=="number"?e:Number.parseInt(String(e),10);if(!Number.isInteger(t)||t<=0)throw new c(u.INVALID_ARGUMENT,`Invalid duration: ${String(e)}. Duration must be a positive integer number of seconds.`);return t}async function ti(e,t,r,o,n){let i=await nt({domain:"video",model:e.model,modelId:e.modelId,variant:e.variant,requireActiveCatalog:n,baseUrl:r,apiKey:t,fetch:o.fetch}),s=Nt(i,{aspectRatio:"16:9",resolution:"720p",duration:5}),a=e.duration===void 0?s.duration:Mt(e.duration),d=e.aspectRatio??s.aspectRatio,l=e.resolution??s.resolution;return ct(i),it(i,{aspectRatio:d,resolution:l,duration:a}),{duration:a,aspectRatio:d,resolution:l,selection:i,args:{prompt:e.prompt,resolution:l,duration:a,aspectRatio:d,...i.toolName===Ac?{generateMode:"text2Video"}:{},...i.variant?{version:i.variant}:{}}}}async function ri(e,t,r,o,n){let i=await nt({domain:"video",model:e.model,modelId:e.modelId,variant:e.variant,requireActiveCatalog:n,baseUrl:r,apiKey:t,fetch:o.fetch}),s=Nt(i,{aspectRatio:"16:9",resolution:"720p",duration:5}),a=e.duration===void 0?s.duration:Mt(e.duration),d=e.aspectRatio??s.aspectRatio,l=e.resolution??s.resolution,p=ot({prompt:e.prompt,assets:e.assets,bindings:e.bindings}),m=Wn({toolName:i.toolName,version:i.variant,images:[...e.image?[e.image]:[],...e.images??[]],videos:e.videos,audios:e.audios,mode:e.mode,additionalImageReferenceCount:p.references.length}),f=m.references.images.length+m.references.videos.length+m.references.audios.length+p.references.length,h=e.taskType??(i.toolName==="generate_video_seedance25"&&m.mode==="omni2Video"&&f>0?"reference":void 0);if(h!==void 0&&(i.toolName!=="generate_video_seedance25"||m.mode!=="omni2Video"))throw new c(u.MODEL_CONSTRAINT_VIOLATION,"--task-type requires Seedance 2.5 with --mode omni2Video.");if(h==="reference"&&f===0)throw new c(u.MODEL_CONSTRAINT_VIOLATION,"Seedance 2.5 reference tasks require at least one media reference.");if((h==="edit"||h==="extend")&&m.references.videos.length===0)throw new c(u.MODEL_CONSTRAINT_VIOLATION,`Seedance 2.5 ${h} tasks require a video reference.`);return f===0?ct(i):wt(i,m.references.images.length+p.references.length),it(i,{aspectRatio:d,resolution:l,duration:a}),{duration:a,aspectRatio:d,resolution:l,references:m,prompt:p.prompt,assetReferences:p.references,selection:i,args:{prompt:p.prompt,...m.args,...h?{omni_reference_task_type:h}:{},resolution:l,duration:a,aspectRatio:d,...i.variant?{version:i.variant}:{}}}}async function _o(e,t,r,o,n){let i=t==="text"?await ti(e,r,o,n,!0):await ri(e,r,o,n,!0),s=ho(i.args),a=t==="references"?i.assetReferences:[];s.references=Re(s.references,a);let d=le(n.configStore??new b,s.references);return Rt(i.selection,"video",i.args,{references:s.references,transport:d})}async function Cc(e,t,r,o,n={}){let i=n.taskStore??new H,s=await ti(e,r,o,n,!0),{duration:a,aspectRatio:d,resolution:l,selection:p}=s,m=p.toolName;y("video","generation.prepared",{mode:"text",model:p.key,model_id:p.modelId,variant:p.variant,workspace_id:t});let f={...s.args,workspace_id:t},h=ho(s.args),U=n.configStore??new b,x=le(U,h.references),T={transport:x,mediaType:"video",prompt:e.prompt,model:p.variant,...h},k=`oiioii video text --prompt "${e.prompt}" ${He(p)} --duration ${a} --aspect-ratio ${d} --resolution ${l}`,R=i.create({workspaceId:t,command:k,toolName:m,inputArgs:{provider:`async_generation_${x}`,prompt:e.prompt,model:p.key,modelId:p.modelId,variant:p.variant,mcpMethodName:m,workspaceId:t,aspectRatio:d,duration:a,toolArgs:f},pendingSubmission:T,credentialFingerprint:be(r),backendBaseUrl:o,backendTransport:x,mediaType:"video"});i.update(R.id,{status:"submitting"});let L=me({transport:x,baseUrl:o,apiKey:r,fetch:n.fetch,timeoutMs:n.videoTextTimeoutMs??Ue});try{let w=await Pe({client:L,taskStore:i,previewStore:n.previewStore,task:R,mediaType:"video",prompt:e.prompt,model:p.variant,backendBaseUrl:o,backendTransport:x,input:T.input,references:T.references}),G=w.task.resourceUris.map(Z=>({type:"video",uri:Z,mime_type:"video/mp4"})),M=w.previewWarning?[w.previewWarning]:[];return y("video","generation.submitted",{local_task_id:R.id,backend_task_id:w.submission.taskId,status:w.task.status}),{task_id:w.submission.taskId,local_task_id:R.id,tool:m,model:Ie(p),workspace_id:t,status:w.task.status,generation_mode:"text2Video",artifacts:G,request:{duration_seconds:a,aspect_ratio:d,resolution:l},...M.length>0?{warnings:M}:{}}}catch(w){let G=w instanceof c?w.code:u.GENERATION_FAILED;throw y("video","generation.command_failed",{task_id:R.id,backend_task_cached:i.get(R.id)?.backendTaskId!==void 0,error_code:G},"error"),Me({taskStore:i,previewStore:n.previewStore,task:R,error:w})}}async function ei(e,t,r,o,n={}){let i=n.taskStore??new H,s=await ri(e,r,o,n,!0),{duration:a,aspectRatio:d,resolution:l,selection:p}=s,m=p.toolName,f=s.references;y("video","generation.prepared",{mode:f.mode,model:p.key,model_id:p.modelId,variant:p.variant,workspace_id:t,reference_image_count:f.references.images.length+s.assetReferences.length,reference_video_count:f.references.videos.length,reference_audio_count:f.references.audios.length});let h={...s.args,workspace_id:t},U=ho(s.args);U.references=Re(U.references,s.assetReferences);let x=n.configStore??new b,T=le(x,U.references),k={transport:T,mediaType:"video",prompt:s.prompt,model:p.variant,...U},L=`oiioii video generate ${[...f.references.images.map(M=>`--image ${M}`),...f.references.videos.map(M=>`--video ${M}`),...f.references.audios.map(M=>`--audio ${M}`)].join(" ")} --prompt "${e.prompt}" ${He(p)} --duration ${a} --aspect-ratio ${d} --resolution ${l} --mode ${f.mode}`,w=i.create({workspaceId:t,command:L,toolName:m,inputArgs:{provider:`async_generation_${T}`,prompt:s.prompt,model:p.key,modelId:p.modelId,variant:p.variant,sourceImage:f.references.images[0],sourceImages:f.references.images,sourceVideos:f.references.videos,sourceAudios:f.references.audios,generateMode:f.mode,mcpMethodName:m,workspaceId:t,duration:a,toolArgs:h},pendingSubmission:k,credentialFingerprint:be(r),backendBaseUrl:o,backendTransport:T,mediaType:"video"});i.update(w.id,{status:"submitting"});let G=me({transport:T,baseUrl:o,apiKey:r,fetch:n.fetch,timeoutMs:n.videoTextTimeoutMs??Ue});try{let M=await Pe({client:G,taskStore:i,previewStore:n.previewStore,task:w,mediaType:"video",prompt:s.prompt,model:p.variant,backendBaseUrl:o,backendTransport:T,input:k.input,references:k.references}),Z=M.task.resourceUris.map(pe=>({type:"video",uri:pe,mime_type:"video/mp4"})),oe=M.previewWarning?[M.previewWarning]:[];return y("video","generation.submitted",{local_task_id:w.id,backend_task_id:M.submission.taskId,status:M.task.status}),{task_id:M.submission.taskId,local_task_id:w.id,tool:m,model:Ie(p),workspace_id:t,status:M.task.status,generation_mode:f.mode,artifacts:Z,request:{duration_seconds:a,aspect_ratio:d,resolution:l},...oe.length>0?{warnings:oe}:{}}}catch(M){let Z=M instanceof c?M.code:u.GENERATION_FAILED;throw y("video","generation.command_failed",{task_id:w.id,backend_task_cached:i.get(w.id)?.backendTaskId!==void 0,error_code:Z},"error"),Me({taskStore:i,previewStore:n.previewStore,task:w,error:M})}}function oi(e={}){let t=new Tc("video").description("Video generation commands");return t.command("text").description("Generate video from text prompt").requiredOption("--prompt <text>","Video description").option("--model <model>","Model name",ut).option("--model-id <id>","Exact model ID from inspect models").option("--variant <variant>","Exact model variant from inspect models").option("--duration <seconds>","Duration in seconds (defaults to the selected model catalog)").option("--aspect-ratio <ratio>","Aspect ratio (defaults to the selected model catalog)").option("--resolution <resolution>","Video resolution (defaults to the selected model catalog)").option("--dry-run","Validate and preview the resolved request without submitting").action(async(r,o)=>{let n=po(o),i=fo(o),s=e.configStore??new b;try{let a=P(i,s),d=a.baseUrl,{workspaceId:l}=go(i,s),p={prompt:r.prompt,model:r.model,modelId:r.modelId,variant:r.variant,...r.duration!==void 0?{duration:Mt(r.duration)}:{},aspectRatio:r.aspectRatio,resolution:r.resolution};if(r.dryRun===!0){$e(await _o(p,"text",a.apiKey,d,e),n);return}let m=await Cc(p,l,a.apiKey,d,e);if(E({media_type:"video",generation_mode:"text",model_key:m.model.key,...m.model.model_id!==void 0?{model_id:m.model.model_id}:{},...m.model.variant?{variant:m.model.variant}:{},duration_seconds:m.request.duration_seconds,resolution:m.request.resolution,aspect_ratio:m.request.aspect_ratio,artifact_count:m.artifacts.length,warning_count:m.warnings?.length??0}),m.warnings?.length&&he(),n)_(I(m.status==="succeeded"?"generation_completed":"generation_submitted",{task_id:m.task_id,local_task_id:m.local_task_id,tool:m.tool,model:m.model,workspace_id:m.workspace_id,status:m.status,artifacts:m.artifacts,request:m.request,...m.warnings?{warnings:m.warnings}:{}},[...m.artifacts.length>0?[{command:`oiioii record get ${m.artifacts[0].uri} --json`,description:"Get generation record details"}]:[],{command:`oiioii task status ${m.task_id} --json`,description:"Check task status"}]));else{N(m.status==="succeeded"?"Video generated successfully":"Video generation submitted"),g(` Task ID: ${m.task_id}`),g(` Model: ${m.model.name??m.model.key}${m.model.variant?` (${m.model.variant})`:""}`),g(` Duration: ${m.request.duration_seconds}s`);for(let f of m.artifacts)g(` URI: ${f.uri}`);for(let f of m.warnings??[])K(`Warning: ${f.message}`);m.artifacts.length>0?g(`
24
+ Next: oiioii task wait ${m.task_id} --json`)}}catch(a){if(a instanceof d){n?_(S("generation_failed",a.code,a.message,a.details)):O(a.message),process.exitCode=1;return}let c=a instanceof Error?a.message:String(a);n?_(S("generation_failed",u.GENERATION_FAILED,c)):O(c),process.exitCode=1}}),t}import{Command as jd}from"commander";var Bd="generate_video_grok_imagine",Io=E,bo=T;function lr(e){return typeof e=="string"&&e?[e]:Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.length>0):[]}function To(e){let{imageUrl:t,images:r,videoUrl:o,audioUrl:n,...i}=e,a=[...[...new Set([...lr(t),...lr(r)])].map(c=>({kind:"media",mediaType:"image",uri:c})),...lr(o).map(c=>({kind:"media",mediaType:"video",uri:c})),...lr(n).map(c=>({kind:"media",mediaType:"audio",uri:c}))];return{input:i,references:a}}function vo(e,t){let r=e.workspace;if(r)return{workspaceId:r,source:"flag"};let o=process.env.OIIOII_WORKSPACE_ID;if(o)return{workspaceId:o,source:"env"};let n=t.loadResolved();if(n.defaultWorkspaceId)return{workspaceId:n.defaultWorkspaceId,source:"config"};throw new d(u.WORKSPACE_REQUIRED,"No workspace set. Run: oiioii workspace set <workspace_id>")}function $t(e){let t=typeof e=="number"?e:Number.parseInt(String(e),10);if(!Number.isInteger(t)||t<=0)throw new d(u.INVALID_ARGUMENT,`Invalid duration: ${String(e)}. Duration must be a positive integer number of seconds.`);return t}async function _i(e,t,r,o,n){let i=await it({domain:"video",model:e.model,modelId:e.modelId,variant:e.variant,requireActiveCatalog:n,baseUrl:r,apiKey:t,fetch:o.fetch}),s=Dt(i,{aspectRatio:"16:9",resolution:"720p",duration:5}),a=e.duration===void 0?s.duration:$t(e.duration),c=e.aspectRatio??s.aspectRatio,l=e.resolution??s.resolution;return ut(i),st(i,{aspectRatio:c,resolution:l,duration:a}),{duration:a,aspectRatio:c,resolution:l,selection:i,args:{prompt:e.prompt,resolution:l,duration:a,aspectRatio:c,...i.toolName===Bd?{generateMode:"text2Video"}:{},...i.variant?{version:i.variant}:{}}}}async function hi(e,t,r,o,n){let i=await it({domain:"video",model:e.model,modelId:e.modelId,variant:e.variant,requireActiveCatalog:n,baseUrl:r,apiKey:t,fetch:o.fetch}),s=Dt(i,{aspectRatio:"16:9",resolution:"720p",duration:5}),a=e.duration===void 0?s.duration:$t(e.duration),c=e.aspectRatio??s.aspectRatio,l=e.resolution??s.resolution,p=nt({prompt:e.prompt,assets:e.assets,bindings:e.bindings}),m=si({toolName:i.toolName,version:i.variant,images:[...e.image?[e.image]:[],...e.images??[]],videos:e.videos,audios:e.audios,mode:e.mode,additionalImageReferenceCount:p.references.length}),f=m.references.images.length+m.references.videos.length+m.references.audios.length+p.references.length,h=e.taskType??(i.toolName==="generate_video_seedance25"&&m.mode==="omni2Video"&&f>0?"reference":void 0);if(h!==void 0&&(i.toolName!=="generate_video_seedance25"||m.mode!=="omni2Video"))throw new d(u.MODEL_CONSTRAINT_VIOLATION,"--task-type requires Seedance 2.5 with --mode omni2Video.");if(h==="reference"&&f===0)throw new d(u.MODEL_CONSTRAINT_VIOLATION,"Seedance 2.5 reference tasks require at least one media reference.");if((h==="edit"||h==="extend")&&m.references.videos.length===0)throw new d(u.MODEL_CONSTRAINT_VIOLATION,`Seedance 2.5 ${h} tasks require a video reference.`);return f===0?ut(i):kt(i,m.references.images.length+p.references.length),st(i,{aspectRatio:c,resolution:l,duration:a}),{duration:a,aspectRatio:c,resolution:l,references:m,prompt:p.prompt,assetReferences:p.references,selection:i,args:{prompt:p.prompt,...m.args,...h?{omni_reference_task_type:h}:{},resolution:l,duration:a,aspectRatio:c,...i.variant?{version:i.variant}:{}}}}async function Eo(e,t,r,o,n){let i=t==="text"?await _i(e,r,o,n,!0):await hi(e,r,o,n,!0),s=To(i.args),a=t==="references"?i.assetReferences:[];s.references=Ie(s.references,a);let c=ge(n.configStore??new b,s.references);return It(i.selection,"video",i.args,{references:s.references,transport:c})}async function Kd(e,t,r,o,n={}){let i=n.taskStore??new Y,s=await _i(e,r,o,n,!0),{duration:a,aspectRatio:c,resolution:l,selection:p}=s,m=p.toolName;y("video","generation.prepared",{mode:"text",model:p.key,model_id:p.modelId,variant:p.variant,workspace_id:t});let f={...s.args,workspace_id:t},h=To(s.args),D=n.configStore??new b,N=ge(D,h.references),C={transport:N,mediaType:"video",prompt:e.prompt,model:p.variant,...h},v=`oiioii video text --prompt "${e.prompt}" ${Ye(p)} --duration ${a} --aspect-ratio ${c} --resolution ${l}`,I=i.create({workspaceId:t,command:v,toolName:m,inputArgs:{provider:`async_generation_${N}`,prompt:e.prompt,model:p.key,modelId:p.modelId,variant:p.variant,mcpMethodName:m,workspaceId:t,aspectRatio:c,duration:a,toolArgs:f},pendingSubmission:C,credentialFingerprint:Ee(r),backendBaseUrl:o,backendTransport:N,mediaType:"video"});i.update(I.id,{status:"submitting"});let V=_e({transport:N,baseUrl:o,apiKey:r,fetch:n.fetch,timeoutMs:n.videoTextTimeoutMs??Me});try{let w=await $e({client:V,taskStore:i,previewStore:n.previewStore,task:I,mediaType:"video",prompt:e.prompt,model:p.variant,backendBaseUrl:o,backendTransport:N,input:C.input,references:C.references}),F=w.task.resourceUris.map(ee=>({type:"video",uri:ee,mime_type:"video/mp4"})),L=w.previewWarning?[w.previewWarning]:[];return y("video","generation.submitted",{local_task_id:I.id,backend_task_id:w.submission.taskId,status:w.task.status}),{task_id:w.submission.taskId,local_task_id:I.id,tool:m,model:be(p),workspace_id:t,status:w.task.status,generation_mode:"text2Video",artifacts:F,request:{duration_seconds:a,aspect_ratio:c,resolution:l},...L.length>0?{warnings:L}:{}}}catch(w){let F=w instanceof d?w.code:u.GENERATION_FAILED;throw y("video","generation.command_failed",{task_id:I.id,backend_task_cached:i.get(I.id)?.backendTaskId!==void 0,error_code:F},"error"),Le({taskStore:i,previewStore:n.previewStore,task:I,error:w})}}async function gi(e,t,r,o,n={}){let i=n.taskStore??new Y,s=await hi(e,r,o,n,!0),{duration:a,aspectRatio:c,resolution:l,selection:p}=s,m=p.toolName,f=s.references;y("video","generation.prepared",{mode:f.mode,model:p.key,model_id:p.modelId,variant:p.variant,workspace_id:t,reference_image_count:f.references.images.length+s.assetReferences.length,reference_video_count:f.references.videos.length,reference_audio_count:f.references.audios.length});let h={...s.args,workspace_id:t},D=To(s.args);D.references=Ie(D.references,s.assetReferences);let N=n.configStore??new b,C=ge(N,D.references),v={transport:C,mediaType:"video",prompt:s.prompt,model:p.variant,...D},V=`oiioii video generate ${[...f.references.images.map(L=>`--image ${L}`),...f.references.videos.map(L=>`--video ${L}`),...f.references.audios.map(L=>`--audio ${L}`)].join(" ")} --prompt "${e.prompt}" ${Ye(p)} --duration ${a} --aspect-ratio ${c} --resolution ${l} --mode ${f.mode}`,w=i.create({workspaceId:t,command:V,toolName:m,inputArgs:{provider:`async_generation_${C}`,prompt:s.prompt,model:p.key,modelId:p.modelId,variant:p.variant,sourceImage:f.references.images[0],sourceImages:f.references.images,sourceVideos:f.references.videos,sourceAudios:f.references.audios,generateMode:f.mode,mcpMethodName:m,workspaceId:t,duration:a,toolArgs:h},pendingSubmission:v,credentialFingerprint:Ee(r),backendBaseUrl:o,backendTransport:C,mediaType:"video"});i.update(w.id,{status:"submitting"});let F=_e({transport:C,baseUrl:o,apiKey:r,fetch:n.fetch,timeoutMs:n.videoTextTimeoutMs??Me});try{let L=await $e({client:F,taskStore:i,previewStore:n.previewStore,task:w,mediaType:"video",prompt:s.prompt,model:p.variant,backendBaseUrl:o,backendTransport:C,input:v.input,references:v.references}),ee=L.task.resourceUris.map(he=>({type:"video",uri:he,mime_type:"video/mp4"})),se=L.previewWarning?[L.previewWarning]:[];return y("video","generation.submitted",{local_task_id:w.id,backend_task_id:L.submission.taskId,status:L.task.status}),{task_id:L.submission.taskId,local_task_id:w.id,tool:m,model:be(p),workspace_id:t,status:L.task.status,generation_mode:f.mode,artifacts:ee,request:{duration_seconds:a,aspect_ratio:c,resolution:l},...se.length>0?{warnings:se}:{}}}catch(L){let ee=L instanceof d?L.code:u.GENERATION_FAILED;throw y("video","generation.command_failed",{task_id:w.id,backend_task_cached:i.get(w.id)?.backendTaskId!==void 0,error_code:ee},"error"),Le({taskStore:i,previewStore:n.previewStore,task:w,error:L})}}function yi(e={}){let t=new jd("video").description("Video generation commands");return t.command("text").description("Generate video from text prompt").requiredOption("--prompt <text>","Video description").option("--model <model>","Model name",lt).option("--model-id <id>","Exact model ID from inspect models").option("--variant <variant>","Exact model variant from inspect models").option("--duration <seconds>","Duration in seconds (defaults to the selected model catalog)").option("--aspect-ratio <ratio>","Aspect ratio (defaults to the selected model catalog)").option("--resolution <resolution>","Video resolution (defaults to the selected model catalog)").option("--dry-run","Validate and preview the resolved request without submitting").action(async(r,o)=>{let n=Io(o),i=bo(o),s=e.configStore??new b;try{let a=P(i,s),c=a.baseUrl,{workspaceId:l}=vo(i,s),p={prompt:r.prompt,model:r.model,modelId:r.modelId,variant:r.variant,...r.duration!==void 0?{duration:$t(r.duration)}:{},aspectRatio:r.aspectRatio,resolution:r.resolution};if(r.dryRun===!0){Ge(await Eo(p,"text",a.apiKey,c,e),n);return}let m=await Kd(p,l,a.apiKey,c,e);if(A({media_type:"video",generation_mode:"text",model_key:m.model.key,...m.model.model_id!==void 0?{model_id:m.model.model_id}:{},...m.model.variant?{variant:m.model.variant}:{},duration_seconds:m.request.duration_seconds,resolution:m.request.resolution,aspect_ratio:m.request.aspect_ratio,artifact_count:m.artifacts.length,warning_count:m.warnings?.length??0}),m.warnings?.length&&we(),n)_(k(m.status==="succeeded"?"generation_completed":"generation_submitted",{task_id:m.task_id,local_task_id:m.local_task_id,tool:m.tool,model:m.model,workspace_id:m.workspace_id,status:m.status,artifacts:m.artifacts,request:m.request,...m.warnings?{warnings:m.warnings}:{}},[...m.artifacts.length>0?[{command:`oiioii record get ${m.artifacts[0].uri} --json`,description:"Get generation record details"}]:[],{command:`oiioii task status ${m.task_id} --json`,description:"Check task status"}]));else{U(m.status==="succeeded"?"Video generated successfully":"Video generation submitted"),g(` Task ID: ${m.task_id}`),g(` Model: ${m.model.name??m.model.key}${m.model.variant?` (${m.model.variant})`:""}`),g(` Duration: ${m.request.duration_seconds}s`);for(let f of m.artifacts)g(` URI: ${f.uri}`);for(let f of m.warnings??[])K(`Warning: ${f.message}`);m.artifacts.length>0?g(`
25
25
  Next: oiioii record get ${m.artifacts[0].uri}`):g(`
26
- Next: oiioii task wait ${m.task_id} --json`)}}catch(a){if(a instanceof c){n?_(C("generation_failed",a.code,a.message,a.details)):S(a.message),process.exitCode=1;return}let d=a instanceof Error?a.message:String(a);n?_(C("generation_failed",u.GENERATION_FAILED,d)):S(d),process.exitCode=1}}),t.command("generate").description("Generate video from text and model-supported mixed image/video/audio references").requiredOption("--prompt <text>","Video description").option("--image <uri...>","Reference image URIs; may be combined with --video/--audio when supported").option("--video <uri...>","Reference video URIs; may be combined with --image/--audio when supported").option("--audio <uri...>","Reference audio URIs; may be combined with --image/--video when supported").option("--asset <uri...>","Role, scene, or item asset URI used as a visual reference").option("--bind <name=uri...>","Bind @name in the prompt to a role, scene, or item asset URI").option("--mode <mode>",`Generation mode (auto, ${er.join(", ")})`,"auto").option("--task-type <type>","Seedance 2.5 omni task type (reference, edit, extend)").option("--model <model>","Model name",ut).option("--model-id <id>","Exact model ID from inspect models").option("--variant <variant>","Exact model variant from inspect models").option("--duration <seconds>","Duration in seconds (defaults to the selected model catalog)").option("--aspect-ratio <ratio>","Aspect ratio (defaults to the selected model catalog)").option("--resolution <resolution>","Video resolution (defaults to the selected model catalog)").option("--dry-run","Validate and preview the resolved request without submitting").action(async(r,o)=>{let n=po(o),i=fo(o),s=e.configStore??new b;try{let a=String(r.mode);if(a!=="auto"&&!er.includes(a))throw new c(u.INVALID_ARGUMENT,`Invalid video mode: ${a}. Expected auto, ${er.join(", ")}.`);if(r.taskType!==void 0&&!["reference","edit","extend"].includes(String(r.taskType)))throw new c(u.INVALID_ARGUMENT,`Invalid task type: ${String(r.taskType)}. Expected reference, edit, or extend.`);let d=P(i,s),{workspaceId:l}=go(i,s),p={prompt:r.prompt,images:r.image,videos:r.video,audios:r.audio,assets:r.asset,bindings:r.bind,mode:a,taskType:r.taskType,model:r.model,modelId:r.modelId,variant:r.variant,...r.duration!==void 0?{duration:Mt(r.duration)}:{},aspectRatio:r.aspectRatio,resolution:r.resolution},m=ot({prompt:p.prompt,assets:p.assets,bindings:p.bindings}).references.map(wn);if(r.dryRun===!0){$e(await _o(p,"references",d.apiKey,d.baseUrl,e),n);return}let f=await ei(p,l,d.apiKey,d.baseUrl,e);if(E({media_type:"video",generation_mode:f.generation_mode??a,model_key:f.model.key,...f.model.model_id!==void 0?{model_id:f.model.model_id}:{},...f.model.variant?{variant:f.model.variant}:{},duration_seconds:f.request.duration_seconds,resolution:f.request.resolution,aspect_ratio:f.request.aspect_ratio,reference_image_count:r.image?.length??0,reference_video_count:r.video?.length??0,reference_audio_count:r.audio?.length??0,asset_reference_count:m.length,artifact_count:f.artifacts.length,warning_count:f.warnings?.length??0}),f.warnings?.length&&he(),n)_(I(f.status==="succeeded"?"generation_completed":"generation_submitted",{task_id:f.task_id,local_task_id:f.local_task_id,tool:f.tool,model:f.model,generation_mode:f.generation_mode,workspace_id:f.workspace_id,status:f.status,references:{images:r.image??[],videos:r.video??[],audios:r.audio??[],assets:m},artifacts:f.artifacts,request:f.request,...f.warnings?{warnings:f.warnings}:{}},[...f.artifacts.length>0?[{command:`oiioii record get ${f.artifacts[0].uri} --json`,description:"Get generation record details"}]:[],{command:`oiioii task status ${f.task_id} --json`,description:"Check task status"}]));else{N(f.status==="succeeded"?"Video generated successfully":"Video generation submitted"),g(` Task ID: ${f.task_id}`),g(` Model: ${f.model.name??f.model.key}${f.model.variant?` (${f.model.variant})`:""}`),g(` Mode: ${f.generation_mode}`),g(` Refs: ${r.image?.length??0} image, ${r.video?.length??0} video, ${r.audio?.length??0} audio, ${m.length} asset`);for(let h of f.artifacts)g(` URI: ${h.uri}`);for(let h of f.warnings??[])K(`Warning: ${h.message}`);f.artifacts.length===0&&g(`
27
- Next: oiioii task wait ${f.task_id} --json`)}}catch(a){if(a instanceof c)n?_(C("generation_failed",a.code,a.message,a.details)):S(a.message);else{let d=a instanceof Error?a.message:String(a);n?_(C("generation_failed",u.GENERATION_FAILED,d)):S(d)}process.exitCode=1}}),t.command("image").description("Generate video from image + prompt").requiredOption("--image <uri>","Source image (hogi:// URI)").requiredOption("--prompt <text>","Video description").option("--model <model>","Model name",ut).option("--model-id <id>","Exact model ID from inspect models").option("--variant <variant>","Exact model variant from inspect models").option("--duration <seconds>","Duration in seconds (defaults to the selected model catalog)").option("--aspect-ratio <ratio>","Aspect ratio (defaults to the selected model catalog)").option("--resolution <resolution>","Video resolution (defaults to the selected model catalog)").option("--dry-run","Validate and preview the resolved request without submitting").action(async(r,o)=>{let n=po(o),i=fo(o),s=e.configStore??new b;try{let a=P(i,s),d=a.baseUrl,{workspaceId:l}=go(i,s),p={image:r.image,prompt:r.prompt,model:r.model,modelId:r.modelId,variant:r.variant,...r.duration!==void 0?{duration:Mt(r.duration)}:{},aspectRatio:r.aspectRatio,resolution:r.resolution};if(r.dryRun===!0){$e(await _o(p,"references",a.apiKey,d,e),n);return}let m=await ei(p,l,a.apiKey,d,e);if(E({media_type:"video",generation_mode:"image",model_key:m.model.key,...m.model.model_id!==void 0?{model_id:m.model.model_id}:{},...m.model.variant?{variant:m.model.variant}:{},duration_seconds:m.request.duration_seconds,resolution:m.request.resolution,aspect_ratio:m.request.aspect_ratio,artifact_count:m.artifacts.length,warning_count:m.warnings?.length??0}),m.warnings?.length&&he(),n)_(I(m.status==="succeeded"?"generation_completed":"generation_submitted",{task_id:m.task_id,local_task_id:m.local_task_id,tool:m.tool,model:m.model,workspace_id:m.workspace_id,status:m.status,artifacts:m.artifacts,request:m.request,...m.warnings?{warnings:m.warnings}:{}},[...m.artifacts.length>0?[{command:`oiioii record get ${m.artifacts[0].uri} --json`,description:"Get generation record details"}]:[],{command:`oiioii task status ${m.task_id} --json`,description:"Check task status"}]));else{N(m.status==="succeeded"?"Video generated from image successfully":"Image-to-video generation submitted"),g(` Task ID: ${m.task_id}`),g(` Model: ${m.model.name??m.model.key}${m.model.variant?` (${m.model.variant})`:""}`),g(` Source: ${r.image}`),g(` Duration: ${m.request.duration_seconds}s`);for(let f of m.artifacts)g(` URI: ${f.uri}`);for(let f of m.warnings??[])K(`Warning: ${f.message}`);m.artifacts.length>0?g(`
26
+ Next: oiioii task wait ${m.task_id} --json`)}}catch(a){if(a instanceof d){n?_(S("generation_failed",a.code,a.message,a.details)):O(a.message),process.exitCode=1;return}let c=a instanceof Error?a.message:String(a);n?_(S("generation_failed",u.GENERATION_FAILED,c)):O(c),process.exitCode=1}}),t.command("generate").description("Generate video from text and model-supported mixed image/video/audio references").requiredOption("--prompt <text>","Video description").option("--image <uri...>","Reference image URIs; may be combined with --video/--audio when supported").option("--video <uri...>","Reference video URIs; may be combined with --image/--audio when supported").option("--audio <uri...>","Reference audio URIs; may be combined with --image/--video when supported").option("--asset <uri...>","Role, scene, or item asset URI used as a visual reference").option("--bind <name=uri...>","Bind @name in the prompt to a role, scene, or item asset URI").option("--mode <mode>",`Generation mode (auto, ${sr.join(", ")})`,"auto").option("--task-type <type>","Seedance 2.5 omni task type (reference, edit, extend)").option("--model <model>","Model name",lt).option("--model-id <id>","Exact model ID from inspect models").option("--variant <variant>","Exact model variant from inspect models").option("--duration <seconds>","Duration in seconds (defaults to the selected model catalog)").option("--aspect-ratio <ratio>","Aspect ratio (defaults to the selected model catalog)").option("--resolution <resolution>","Video resolution (defaults to the selected model catalog)").option("--dry-run","Validate and preview the resolved request without submitting").action(async(r,o)=>{let n=Io(o),i=bo(o),s=e.configStore??new b;try{let a=String(r.mode);if(a!=="auto"&&!sr.includes(a))throw new d(u.INVALID_ARGUMENT,`Invalid video mode: ${a}. Expected auto, ${sr.join(", ")}.`);if(r.taskType!==void 0&&!["reference","edit","extend"].includes(String(r.taskType)))throw new d(u.INVALID_ARGUMENT,`Invalid task type: ${String(r.taskType)}. Expected reference, edit, or extend.`);let c=P(i,s),{workspaceId:l}=vo(i,s),p={prompt:r.prompt,images:r.image,videos:r.video,audios:r.audio,assets:r.asset,bindings:r.bind,mode:a,taskType:r.taskType,model:r.model,modelId:r.modelId,variant:r.variant,...r.duration!==void 0?{duration:$t(r.duration)}:{},aspectRatio:r.aspectRatio,resolution:r.resolution},m=nt({prompt:p.prompt,assets:p.assets,bindings:p.bindings}).references.map(Un);if(r.dryRun===!0){Ge(await Eo(p,"references",c.apiKey,c.baseUrl,e),n);return}let f=await gi(p,l,c.apiKey,c.baseUrl,e);if(A({media_type:"video",generation_mode:f.generation_mode??a,model_key:f.model.key,...f.model.model_id!==void 0?{model_id:f.model.model_id}:{},...f.model.variant?{variant:f.model.variant}:{},duration_seconds:f.request.duration_seconds,resolution:f.request.resolution,aspect_ratio:f.request.aspect_ratio,reference_image_count:r.image?.length??0,reference_video_count:r.video?.length??0,reference_audio_count:r.audio?.length??0,asset_reference_count:m.length,artifact_count:f.artifacts.length,warning_count:f.warnings?.length??0}),f.warnings?.length&&we(),n)_(k(f.status==="succeeded"?"generation_completed":"generation_submitted",{task_id:f.task_id,local_task_id:f.local_task_id,tool:f.tool,model:f.model,generation_mode:f.generation_mode,workspace_id:f.workspace_id,status:f.status,references:{images:r.image??[],videos:r.video??[],audios:r.audio??[],assets:m},artifacts:f.artifacts,request:f.request,...f.warnings?{warnings:f.warnings}:{}},[...f.artifacts.length>0?[{command:`oiioii record get ${f.artifacts[0].uri} --json`,description:"Get generation record details"}]:[],{command:`oiioii task status ${f.task_id} --json`,description:"Check task status"}]));else{U(f.status==="succeeded"?"Video generated successfully":"Video generation submitted"),g(` Task ID: ${f.task_id}`),g(` Model: ${f.model.name??f.model.key}${f.model.variant?` (${f.model.variant})`:""}`),g(` Mode: ${f.generation_mode}`),g(` Refs: ${r.image?.length??0} image, ${r.video?.length??0} video, ${r.audio?.length??0} audio, ${m.length} asset`);for(let h of f.artifacts)g(` URI: ${h.uri}`);for(let h of f.warnings??[])K(`Warning: ${h.message}`);f.artifacts.length===0&&g(`
27
+ Next: oiioii task wait ${f.task_id} --json`)}}catch(a){if(a instanceof d)n?_(S("generation_failed",a.code,a.message,a.details)):O(a.message);else{let c=a instanceof Error?a.message:String(a);n?_(S("generation_failed",u.GENERATION_FAILED,c)):O(c)}process.exitCode=1}}),t.command("image").description("Generate video from image + prompt").requiredOption("--image <uri>","Source image (hogi:// URI)").requiredOption("--prompt <text>","Video description").option("--model <model>","Model name",lt).option("--model-id <id>","Exact model ID from inspect models").option("--variant <variant>","Exact model variant from inspect models").option("--duration <seconds>","Duration in seconds (defaults to the selected model catalog)").option("--aspect-ratio <ratio>","Aspect ratio (defaults to the selected model catalog)").option("--resolution <resolution>","Video resolution (defaults to the selected model catalog)").option("--dry-run","Validate and preview the resolved request without submitting").action(async(r,o)=>{let n=Io(o),i=bo(o),s=e.configStore??new b;try{let a=P(i,s),c=a.baseUrl,{workspaceId:l}=vo(i,s),p={image:r.image,prompt:r.prompt,model:r.model,modelId:r.modelId,variant:r.variant,...r.duration!==void 0?{duration:$t(r.duration)}:{},aspectRatio:r.aspectRatio,resolution:r.resolution};if(r.dryRun===!0){Ge(await Eo(p,"references",a.apiKey,c,e),n);return}let m=await gi(p,l,a.apiKey,c,e);if(A({media_type:"video",generation_mode:"image",model_key:m.model.key,...m.model.model_id!==void 0?{model_id:m.model.model_id}:{},...m.model.variant?{variant:m.model.variant}:{},duration_seconds:m.request.duration_seconds,resolution:m.request.resolution,aspect_ratio:m.request.aspect_ratio,artifact_count:m.artifacts.length,warning_count:m.warnings?.length??0}),m.warnings?.length&&we(),n)_(k(m.status==="succeeded"?"generation_completed":"generation_submitted",{task_id:m.task_id,local_task_id:m.local_task_id,tool:m.tool,model:m.model,workspace_id:m.workspace_id,status:m.status,artifacts:m.artifacts,request:m.request,...m.warnings?{warnings:m.warnings}:{}},[...m.artifacts.length>0?[{command:`oiioii record get ${m.artifacts[0].uri} --json`,description:"Get generation record details"}]:[],{command:`oiioii task status ${m.task_id} --json`,description:"Check task status"}]));else{U(m.status==="succeeded"?"Video generated from image successfully":"Image-to-video generation submitted"),g(` Task ID: ${m.task_id}`),g(` Model: ${m.model.name??m.model.key}${m.model.variant?` (${m.model.variant})`:""}`),g(` Source: ${r.image}`),g(` Duration: ${m.request.duration_seconds}s`);for(let f of m.artifacts)g(` URI: ${f.uri}`);for(let f of m.warnings??[])K(`Warning: ${f.message}`);m.artifacts.length>0?g(`
28
28
  Next: oiioii record get ${m.artifacts[0].uri}`):g(`
29
- Next: oiioii task wait ${m.task_id} --json`)}}catch(a){if(a instanceof c){n?_(C("generation_failed",a.code,a.message,a.details)):S(a.message),process.exitCode=1;return}let d=a instanceof Error?a.message:String(a);n?_(C("generation_failed",u.GENERATION_FAILED,d)):S(d),process.exitCode=1}}),t}import{Command as Sc}from"commander";var ii="generate_music_seed_audio",Ro="generate_music_suno",ar=["wav","mp3","pcm","ogg_opus"];function Oc(e,t){let r=e.workspace;if(typeof r=="string"&&r)return r;let o=process.env.OIIOII_WORKSPACE_ID?.trim();if(o)return o;let n=t.loadResolved().defaultWorkspaceId;if(n)return n;throw new c(u.WORKSPACE_REQUIRED,"No workspace set. Run: oiioii workspace set <workspace_id>")}function dr(e){return[...new Set((e??[]).map(t=>t.trim()).filter(Boolean))]}function si(e){let{audioUrl:t,referenceImages:r,...o}=e;delete o.workspace_id;let n=dr(typeof t=="string"?[t]:Array.isArray(t)?t:[]),i=dr(typeof r=="string"?[r]:Array.isArray(r)?r:[]);return{input:o,references:[...n.map(s=>({kind:"media",mediaType:"audio",uri:s})),...i.map(s=>({kind:"media",mediaType:"image",uri:s}))]}}function ni(e,t,r){let o=e.find(n=>!n.startsWith(t));if(o)throw new c(u.INVALID_ARGUMENT,`${r} must use ${t} URIs: ${o}`)}function yo(e,t,r,o){if(e!==void 0&&(!Number.isFinite(e)||e<r||e>o))throw ve(`${t} must be between ${r} and ${o}.`,{field:t,received:e,minimum:r,maximum:o})}function ve(e,t={}){return new c(u.MODEL_CONSTRAINT_VIOLATION,e,{category:"validation",retryable:!1,...t})}function xc(e,t,r,o,n=0){let i=t.prompt.trim();if(!i)throw new c(u.INVALID_ARGUMENT,"Audio prompt must not be empty.");let s=dr(t.audioUrls),a=dr(t.referenceImages);if(ni(s,"hogi://audio/","Audio references"),ni(a,"hogi://image/","Image references"),e===ii){if(r&&r!=="seed-audio-1.0")throw ve(`Seed Audio only supports variant seed-audio-1.0, received ${r}.`,{field:"variant",received:r,supported:["seed-audio-1.0"]});let d=a.length+n;if(s.length>0&&d>0)throw ve("Seed Audio reference images and reference audio cannot be used together.",{field:"references"});if(s.length>3)throw ve("Seed Audio supports at most 3 audio references.",{field:"audio",received:s.length,supported_max:3});if(d>1)throw ve("Seed Audio supports at most 1 reference image.",{field:"image",received:d,supported_max:1});if(t.custom||t.tags||t.instrumental||t.autoGenerateVideo)throw ve("--custom, --tags, --instrumental, and --auto-generate-video are only valid for Suno.",{field:"suno_options"});if(yo(t.loudnessRate,"--loudness-rate",-50,100),yo(t.pitchRate,"--pitch-rate",-12,12),yo(t.speechRate,"--speech-rate",-50,100),t.sampleRate!==void 0&&(!Number.isInteger(t.sampleRate)||t.sampleRate<=0))throw ve("--sample-rate must be a positive integer.",{field:"sample_rate",received:t.sampleRate});let l={...t.format?{format:t.format}:{},...t.enableSubtitle!==void 0?{enable_subtitle:t.enableSubtitle}:{},...t.loudnessRate!==void 0?{loudness_rate:t.loudnessRate}:{},...t.pitchRate!==void 0?{pitch_rate:t.pitchRate}:{},...t.sampleRate!==void 0?{sample_rate:t.sampleRate}:{},...t.speechRate!==void 0?{speech_rate:t.speechRate}:{}};return{args:{prompt:i,...s.length?{audioUrl:s}:{},...a.length?{referenceImages:a}:{},...Object.keys(l).length?{audioConfig:l}:{},workspace_id:o},audioUrls:s,referenceImages:a,mode:s.length?"audio_reference":d?"image_reference":"text"}}if(e===Ro){if(s.length||a.length||n>0||t.format||t.enableSubtitle!==void 0||t.loudnessRate!==void 0||t.pitchRate!==void 0||t.sampleRate!==void 0||t.speechRate!==void 0)throw ve("Reference and audio configuration options are only valid for Seed Audio.",{field:"seed_audio_options"});let d=t.custom===!0,l=t.instrumental===!0;if(!d&&t.tags)throw ve("--tags requires Suno --custom mode.",{field:"tags",requires:"custom"});let p=t.tags?.trim()||(d&&l?i:void 0);return{args:{custom:d,prompt:i,...d&&p?{tags:p}:{},...d?{}:{gptDescriptionPrompt:i},instrumental:l,autoGenerateVideo:t.autoGenerateVideo===!0,...r?{version:r}:{},workspace_id:o},audioUrls:s,referenceImages:a,mode:d?"music_custom":"music_description"}}throw new c(u.MODEL_NOT_SUPPORTED,`Unsupported audio generation tool: ${e}`,{category:"validation",retryable:!1,tool:e})}function Nc(e,t){if(!t)return;let r=t==="seed-audio"?ii:Ro;if(e!==r)throw new c(u.MODEL_NOT_SUPPORTED,`The audio ${t} command cannot use model tool ${e}.`,{category:"validation",retryable:!1,hint:`Use a ${t} model ID or run oiioii audio ${t==="seed-audio"?"suno":"seed-audio"}.`,expected_tool:r,received_tool:e})}async function ai(e,t,r,o,n,i,s){let a=await nt({domain:"audio",model:e.model,modelId:e.modelId,variant:e.variant,requireActiveCatalog:i,baseUrl:o,apiKey:r,fetch:n.fetch});Nc(a.toolName,s);let d=ot({prompt:e.prompt,assets:e.assets,bindings:e.bindings}),l=xc(a.toolName,{...e,prompt:d.prompt},a.variant,t,d.references.length),p=l.referenceImages.length+d.references.length;if(p===0&&l.audioUrls.length===0)ct(a);else if(wt(a,p),l.audioUrls.length>0&&!tr(a).audio)throw ve(`${a.name??a.key} does not support reference audio.`,{field:"audio",received:l.audioUrls.length,supported:!1});return{selection:a,prepared:l,prompt:d.prompt,assetReferences:d.references}}async function Uc(e,t,r,o,n={},i){let s=n.taskStore??new H,a=await ai(e,t,r,o,n,!0,i),{assetReferences:d,prepared:l,prompt:p,selection:m}=a;y("audio","generation.prepared",{mode:l.mode,model:m.key,model_id:m.modelId,variant:m.variant,reference_audio_count:l.audioUrls.length,reference_image_count:l.referenceImages.length+d.length,output_format:e.format,subtitle_enabled:e.enableSubtitle===!0,custom_mode:e.custom===!0,instrumental:e.instrumental===!0,workspace_id:t});let h=`oiioii audio ${i??"generate"} --prompt "${e.prompt}" ${He(m)}`,U=si(l.args);U.references=Re(U.references,d);let x=n.configStore??new b,T=le(x,U.references),k={transport:T,mediaType:"audio",prompt:p,model:m.variant,...U},R=s.create({workspaceId:t,command:h,toolName:m.toolName,inputArgs:{provider:`async_generation_${T}`,prompt:p,model:m.key,modelId:m.modelId,variant:m.variant,mcpMethodName:m.toolName,workspaceId:t,mode:l.mode,referenceAudioCount:l.audioUrls.length,referenceImageCount:l.referenceImages.length,toolArgs:{format:e.format,enableSubtitle:e.enableSubtitle,custom:e.custom,instrumental:e.instrumental}},pendingSubmission:k,credentialFingerprint:be(r),backendBaseUrl:o,backendTransport:T,mediaType:"audio"});s.update(R.id,{status:"submitting"});let L=me({transport:T,baseUrl:o,apiKey:r,fetch:n.fetch,timeoutMs:n.audioGenerationTimeoutMs??Ue});try{let w=await Pe({client:L,taskStore:s,previewStore:n.previewStore,task:R,mediaType:"audio",prompt:p,model:m.variant,backendBaseUrl:o,backendTransport:T,input:k.input,references:k.references}),G=w.task.resourceUris.map(Z=>({type:"audio",uri:Z,mime_type:"audio/mpeg"})),M=w.previewWarning?[w.previewWarning]:[];return y("audio","generation.submitted",{local_task_id:R.id,backend_task_id:w.submission.taskId,status:w.task.status}),{task_id:w.submission.taskId,local_task_id:R.id,tool:m.toolName,model:Ie(m),workspace_id:t,status:w.task.status,artifacts:G,...M.length?{warnings:M}:{}}}catch(w){let G=w instanceof c?w.code:u.GENERATION_FAILED;throw y("audio","generation.command_failed",{task_id:R.id,backend_task_cached:s.get(R.id)?.backendTaskId!==void 0,error_code:G},"error"),Me({taskStore:s,previewStore:n.previewStore,task:R,error:w})}}function sr(e,t){if(e===void 0)return;let r=Number(e);if(!Number.isFinite(r))throw new c(u.INVALID_ARGUMENT,`${t} must be a number.`);return r}async function Dc(e,t,r,o,n,i){let{assetReferences:s,prepared:a,selection:d}=await ai(e,t,r,o,n,!0,i),l={...a.args};delete l.workspace_id;let p=si(a.args);p.references=Re(p.references,s);let m=le(n.configStore??new b,p.references);return Rt(d,"audio",l,{references:p.references,transport:m})}function Mc(e,t){let r=e.format;if(r!==void 0&&!ar.includes(r))throw new c(u.INVALID_ARGUMENT,`Invalid audio format: ${r}. Expected ${ar.join(", ")}.`);return{prompt:String(e.prompt),model:t??String(e.model??"seed-audio"),modelId:e.modelId,variant:e.variant,audioUrls:e.audio,referenceImages:e.image,assets:e.asset,bindings:e.bind,format:r,enableSubtitle:e.subtitle===!0?!0:void 0,loudnessRate:sr(e.loudnessRate,"--loudness-rate"),pitchRate:sr(e.pitchRate,"--pitch-rate"),sampleRate:sr(e.sampleRate,"--sample-rate"),speechRate:sr(e.speechRate,"--speech-rate"),custom:e.custom===!0,tags:e.tags,instrumental:e.instrumental===!0,autoGenerateVideo:e.autoGenerateVideo===!0}}async function wo(e,t,r,o){let n=A(t),i=O(t),s=r.configStore??new b;try{let a=P(i,s),d=Oc(i,s),l=Mc(e,o);if(e.dryRun===!0){$e(await Dc(l,d,a.apiKey,a.baseUrl,r,o),n);return}let p=await Uc(l,d,a.apiKey,a.baseUrl,r,o),m=p.tool===Ro?l.custom?"music_custom":"music_description":l.audioUrls?.length?"audio_reference":l.referenceImages?.length?"image_reference":"text";if(E({media_type:"audio",generation_mode:m,model_key:p.model.key,...p.model.model_id!==void 0?{model_id:p.model.model_id}:{},...p.model.variant?{variant:p.model.variant}:{},reference_audio_count:l.audioUrls?.length??0,reference_image_count:l.referenceImages?.length??0,...l.format?{output_format:l.format}:{},subtitle_enabled:l.enableSubtitle===!0,custom_mode:l.custom===!0,instrumental:l.instrumental===!0,artifact_count:p.artifacts.length,warning_count:p.warnings?.length??0}),p.warnings?.length&&he(),n)_(I(p.status==="succeeded"?"generation_completed":"generation_submitted",{task_id:p.task_id,local_task_id:p.local_task_id,tool:p.tool,model:p.model,workspace_id:p.workspace_id,status:p.status,artifacts:p.artifacts,...p.warnings?{warnings:p.warnings}:{}},[...p.artifacts.length?[{command:`oiioii record get ${p.artifacts[0].uri} --json`,description:"Get generation record details"}]:[],{command:`oiioii task status ${p.task_id} --json`,description:"Check task status"}]));else{N(p.status==="succeeded"?"Audio generated successfully":"Audio generation submitted"),g(` Task ID: ${p.task_id}`),g(` Model: ${p.model.name??p.model.key}${p.model.variant?` (${p.model.variant})`:""}`);for(let f of p.artifacts)g(` URI: ${f.uri}`);for(let f of p.warnings??[])K(`Warning: ${f.message}`);p.artifacts.length===0&&g(`
30
- Next: oiioii task wait ${p.task_id} --json`)}}catch(a){let d=a instanceof c?a.code:u.GENERATION_FAILED,l=a instanceof Error?a.message:String(a);n?_(C("generation_failed",d,l,a instanceof c?a.details:void 0)):S(l),process.exitCode=1}}function Pc(e){return e.option("--model-id <id>","Exact Seed Audio model ID from inspect models").option("--variant <variant>","Exact Seed Audio variant from inspect models").option("--audio <uri...>","Reference audio URIs (maximum 3)").option("--image <uri...>","Reference image URI (maximum 1)").option("--asset <uri...>","Role, scene, or item asset URI used as a visual reference").option("--bind <name=uri...>","Bind @name in the prompt to a role, scene, or item asset URI").option("--format <format>",`Output format (${ar.join(", ")})`).option("--subtitle","Request subtitle metadata").option("--loudness-rate <number>","Loudness adjustment (-50 to 100)").option("--pitch-rate <number>","Pitch adjustment (-12 to 12)").option("--sample-rate <number>","Output sample rate").option("--speech-rate <number>","Speech rate adjustment (-50 to 100)").option("--dry-run","Validate and preview the resolved request without submitting")}function Lc(e){return e.option("--model-id <id>","Exact Suno model ID from inspect models").option("--variant <variant>","Exact Suno variant from inspect models").option("--custom","Use custom lyrics/style mode").option("--tags <text>","Custom-mode music style tags").option("--instrumental","Generate instrumental music").option("--auto-generate-video","Ask Suno to also generate its provider-side video").option("--dry-run","Validate and preview the resolved request without submitting")}function di(e={}){let t=new Sc("audio").description("Audio and music generation commands");return t.command("generate").description("Generate audio with Seed Audio or Suno").requiredOption("--prompt <text>","Audio description; interpreted as lyrics in Suno custom mode").option("--model <model>","Model name (seed-audio or suno)",nr).option("--model-id <id>","Exact model ID from inspect models").option("--variant <variant>","Exact model variant from inspect models").option("--audio <uri...>","Seed Audio reference audio URIs (maximum 3)").option("--image <uri...>","Seed Audio reference image URI (maximum 1)").option("--asset <uri...>","Seed Audio role, scene, or item asset URI used as a visual reference").option("--bind <name=uri...>","Bind @name in the prompt to a role, scene, or item asset URI").option("--format <format>",`Seed Audio output format (${ar.join(", ")})`).option("--subtitle","Request Seed Audio subtitle metadata").option("--loudness-rate <number>","Seed Audio loudness adjustment (-50 to 100)").option("--pitch-rate <number>","Seed Audio pitch adjustment (-12 to 12)").option("--sample-rate <number>","Seed Audio output sample rate").option("--speech-rate <number>","Seed Audio speech rate adjustment (-50 to 100)").option("--custom","Use Suno custom lyrics/style mode").option("--tags <text>","Suno custom-mode music style tags").option("--instrumental","Generate instrumental music with Suno").option("--auto-generate-video","Ask Suno to also generate its provider-side video").option("--dry-run","Validate and preview the resolved request without submitting").action(async(r,o)=>await wo(r,o,e)),Pc(t.command("seed-audio").description("Generate speech or audio with Seed Audio").requiredOption("--prompt <text>","Audio description")).action(async(r,o)=>await wo(r,o,e,"seed-audio")),Lc(t.command("suno").description("Generate music with Suno").requiredOption("--prompt <text>","Music description; interpreted as lyrics in custom mode")).action(async(r,o)=>await wo(r,o,e,"suno")),t}import{Command as $c}from"commander";function ci(e,t){let r=Number(e);if(!Number.isInteger(r)||r<=0)throw new c(u.INVALID_ARGUMENT,`${t} must be a positive integer.`);return r}function cr(e){g(`${e.backendTaskId??e.id} ${e.status} ${e.toolName} ${e.updatedAt}`)}function ur(e){let t={...e};return delete t.credentialFingerprint,t}function Vc(e){return new c(u.TASK_RETRY_REQUIRED,`Task ${e.id} has an unknown submission outcome. Retry it with the original idempotency key.`,{retryable:!0,local_task_id:e.id,task_status:e.status,retry_command:`oiioii task retry ${e.id}`,...e.error?{last_error:e.error}:{}})}function lr(e,t,r){let o=e instanceof c?e:new c(u.SERVER_ERROR,e instanceof Error?e.message:String(e));je(o.code,o.message),t?_(C(r,o.code,o.message,o.details)):S(o.message),process.exitCode=1}function Gc(e,t,r,o=3e4,n){let i=t.configStore??new b,s=P(O(e),i);return me({transport:n??i.loadResolved().generationTransport??"openapi",baseUrl:r??s.baseUrl,apiKey:s.apiKey,fetch:t.fetch,timeoutMs:o})}async function ui(e,t,r,o){if(!e.backendTaskId||at(e))return e;let n=r.taskStore??new H;return(await no({client:Gc(t,r,e.backendBaseUrl,o,e.backendTransport),taskStore:n,previewStore:r.previewStore,task:e})).task}function li(e={}){let t=new $c("task").description("Generation task management");return t.command("list").description("List recent tasks").option("--limit <count>","Maximum tasks to return","20").action((r,o)=>{let n=A(o);try{let i=ci(r.limit,"limit"),s=(e.taskStore??new H).list(i);if(E({task_count:s.length,limit:i}),y("task","task.listed",{count:s.length,limit:i}),n)_(I("task_list",{tasks:s.map(ur),count:s.length}));else{W("Recent Tasks");for(let a of s)cr(a);s.length===0&&g("No local tasks found.")}}catch(i){lr(i,n,"task_list")}}),t.command("status").description("Get task status").argument("<task_id>","Task ID").action(async(r,o,n)=>{let i=A(n);try{let s=e.taskStore??new H,a=s.getByAnyId(r);if(!a)throw new c(u.TASK_NOT_FOUND,`Task not found: ${r}`);a=await ui(a,n,{...e,taskStore:s}),E({task_status:a.status}),y("task","task.status_read",{task_id:r,status:a.status}),i?_(I("task_status",{task:ur(a)})):cr(a)}catch(s){lr(s,i,"task_status")}}),t.command("retry").description("Retry an ambiguous generation submission with its original idempotency key").argument("<task_id>","Local task ID").action(async(r,o,n)=>{let i=A(n);try{let s=e.taskStore??new H,a=s.get(r);if(!a)throw new c(u.TASK_NOT_FOUND,`Task not found: ${r}`);let d=e.configStore??new b,l=P(O(n),d);if(!a.credentialFingerprint||a.credentialFingerprint!==be(l.apiKey))throw new c(u.AUTH_INVALID,`The current API key does not match the credential used to submit task ${a.id}.`,{retryable:!1,local_task_id:a.id,reason:a.credentialFingerprint?"credential_mismatch":"credential_binding_missing"});let p=a.backendBaseUrl??l.baseUrl,m=a.pendingSubmission?.transport??a.backendTransport??d.loadResolved().generationTransport??"openapi",f=await Gn({client:me({transport:m,baseUrl:p,apiKey:l.apiKey,fetch:e.fetch}),taskStore:s,previewStore:e.previewStore,task:a,backendBaseUrl:p,backendTransport:m});E({task_status:f.task.status}),y("task","task.submission_retried",{local_task_id:f.task.id,backend_task_id:f.task.backendTaskId,status:f.task.status,reused:f.submission.reused}),i?_(I("task_retry",{task:ur(f.task),reused:f.submission.reused})):cr(f.task)}catch(s){lr(s,i,"task_retry")}}),t.command("wait").description("Wait for a task to complete").argument("<task_id>","Task ID").option("--timeout <seconds>","Max wait time","300").action(async(r,o,n)=>{let i=A(n);try{let s=ci(o.timeout,"timeout"),a=e.taskStore??new H,d=Date.now()+s*1e3,l=a.getByAnyId(r);if(!l)throw new c(u.TASK_NOT_FOUND,`Task not found: ${r}`);if(!l.backendTaskId&&l.status==="submitting"&&l.pendingSubmission&&l.error)throw Vc(l);for(;!at(l)&&Date.now()<d;){let p=Math.max(1,Math.min(3e4,d-Date.now()));try{l=await ui(l,n,{...e,taskStore:a},p)}catch(m){throw Date.now()>=d&&m instanceof c&&m.code===u.GENERATION_TIMEOUT?new c(u.TASK_TIMEOUT,`Timed out waiting for task ${r} after ${s}s.`):m}if(!at(l)){let m=Math.max(0,d-Date.now());await new Promise(f=>setTimeout(f,Math.min(e.pollIntervalMs??2e3,m)))}}if(!at(l))throw new c(u.TASK_TIMEOUT,`Timed out waiting for task ${r} after ${s}s.`);if(l.status==="failed"||l.status==="cancelled")throw new c(u.GENERATION_FAILED,l.error?.message??`Generation task ${l.backendTaskId??l.id} ${l.status}.`,{task_id:l.backendTaskId??l.id,local_task_id:l.id,backend_status:l.status,...l.error?{backend_error:l.error}:{}});E({task_status:l.status,timeout_seconds:s}),y("task","task.wait_completed",{task_id:r,status:l.status}),i?_(I("task_wait",{task:ur(l)})):cr(l)}catch(s){lr(s,i,"task_wait")}}),t}import{Command as Fc}from"commander";import{spawn as Bc}from"child_process";var mr=class{baseUrl;apiKey;_fetch;logger;timeoutMs;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this._fetch=t.fetch??globalThis.fetch,this.logger=t.logger,this.timeoutMs=t.timeoutMs}async getByUri(t){if(!t||!t.startsWith("hogi://"))throw new c(u.INVALID_ARGUMENT,`Invalid hogi URI: "${t}". Expected format: hogi://image/<id> or hogi://video/<id>`);let r=encodeURIComponent(t),o=`${this.baseUrl}/genai/image-record/by-uri?uri=${r}`,n=$({source:"hogi_genai_record_client",operation:"record.get_by_uri",method:"GET",path:"/genai/image-record/by-uri"},this.logger),i;try{return await j({operation:"Generation record request",timeoutMs:this.timeoutMs,run:async s=>{if(i=await n.fetch(this._fetch,o,{method:"GET",headers:V({"x-hogi-api-key":this.apiKey}),signal:s}),i.status===400)throw new c(u.INVALID_ARGUMENT,"URI parameter is required");if(i.status===401)throw new c(u.API_KEY_INVALID,"Invalid API key",{status:401});if(i.status===404)throw new c(u.RECORD_NOT_FOUND,`No generation record found for URI: ${t}`);if(!i.ok){let d=await i.text().catch(()=>"");throw new c(u.SERVER_ERROR,`HTTP ${i.status}: ${d||i.statusText}`,{status:i.status})}let a;try{a=await i.json()}catch{throw new c(u.SERVER_ERROR,"Invalid JSON response from server")}if(!a.success||!a.data)throw new c(u.SERVER_ERROR,a.error??"Unexpected response structure from record API");return n.success(i.status,{record_type:a.data.type,success:a.data.success}),a.data}})}catch(s){if(s instanceof B){let l=new c(u.NETWORK_ERROR,s.message,{retryable:!0,timeout_ms:s.timeoutMs});throw n.failure(l,i?.status),l}if(s instanceof c)throw n.failure(s,i?.status),s;let a=s instanceof Error?s.message:String(s),d=new c(u.NETWORK_ERROR,`Network error: ${a}`);throw n.failure(d),d}}};var mi=A;function pi(e){let t=new b,r=P(O(e),t);return{apiKey:r.apiKey,baseUrl:r.baseUrl}}function qc(e){let t=process.platform==="darwin"?"open":process.platform==="win32"?"cmd":"xdg-open",r=process.platform==="win32"?["/c","start","",e]:[e];try{return Bc(t,r,{detached:!0,stdio:"ignore"}).unref(),!0}catch{return!1}}function fi(){let e=new Fc("record").description("GenAI record queries");return e.command("get").description("Get generation record by hogi:// URI").argument("<uri>","hogi:// URI (e.g. hogi://image/abc123)").action(async(t,r,o)=>{let n=mi(o);try{let{apiKey:i,baseUrl:s}=pi(o),d=await new mr({baseUrl:s,apiKey:i}).getByUri(t);if(E({resource_type:Wt(t),record_success:d.success,output_count:d.output_uris.length}),n)_(I("record_get",{id:d.id,type:d.type,workspace_id:d.workspace_id,method:d.mcp_method_name,input_args:d.input_args,output_uris:d.output_uris,success:d.success,error_message:d.error_message,agent:d.agent,created_at:d.created_at,updated_at:d.updated_at}));else{W("Generation Record"),g(` ID: ${d.id}`),g(` Type: ${d.type}`),g(` Workspace: ${d.workspace_id}`),g(` Method: ${d.mcp_method_name}`),g(` Success: ${d.success}`),d.error_message&&g(` Error: ${d.error_message}`),g(" Output URIs:");for(let l of d.output_uris)g(` - ${l}`);g(` Created: ${d.created_at}`)}}catch(i){if(i instanceof c){n?_(C("record_get",i.code,i.message,i.details)):S(i.message),process.exitCode=1;return}let s=i instanceof Error?i.message:String(i);n?_(C("record_get",u.SERVER_ERROR,s)):S(s),process.exitCode=1}}),e.command("open").description("Download and optionally open a hogi:// resource").argument("<uri>","hogi:// URI").option("-o, --output <path>","Output file or directory path").option("--filename <name>","Download filename hint passed to backend").option("--wm","Request watermarked asset").option("--no-open","Download only; do not open the local file").action(async(t,r,o)=>{let n=mi(o);try{let{apiKey:i,baseUrl:s}=pi(o),d=await new gt({baseUrl:s,apiKey:i}).download(t,{output:r.output,filename:r.filename,watermark:r.wm}),l=r.open!==!1,p=l?qc(d.path):!1;E({resource_type:Wt(t),size_bucket:Je(d.bytes),watermark:r.wm===!0,open_requested:l,opened:p}),n?_(I("record_open",{uri:d.uri,path:d.path,bytes:d.bytes,mime_type:d.mimeType,opened:p})):(N(`Downloaded: ${d.path}`),g(` URI: ${d.uri}`),g(` Bytes: ${d.bytes}`),d.mimeType&&g(` Type: ${d.mimeType}`),g(` Opened: ${p}`))}catch(i){if(i instanceof c){n?_(C("record_open",i.code,i.message,i.details)):S(i.message),process.exitCode=1;return}let s=i instanceof Error?i.message:String(i);n?_(C("record_open",u.SERVER_ERROR,s)):S(s),process.exitCode=1}}),e}import{Command as jc}from"commander";var Wc={preferred:"model_id",generation_flag:"--model-id",alternative:"--model <key> --variant <variant>",variant_mcp_argument:"version",points_cost_semantics:"base_cost",empty_input_capabilities:"unknown",image_reference_capability_field:"reference_image_count_max",missing_reference_image_count_max:"fallback_supported",duration_format:"exact_seconds_or_inclusive_range"},Kc=[{name:"text-to-image",domain:"image",description:"Generate images from text prompts",default_model:It,command_template:'oiioii image text --prompt "<text>" [--model <model>] [--aspect-ratio <ratio>] --json'},{name:"image-to-image",domain:"image",description:"Edit or transform an existing image with a text prompt",default_model:It,command_template:'oiioii image edit --image <hogi-uri> --prompt "<text>" [--model <model>] --json'},{name:"text-to-video",domain:"video",description:"Generate videos from text prompts",default_model:ut,command_template:'oiioii video text --prompt "<text>" [--model <model>] [--duration <s>] --json'},{name:"image-to-video",domain:"video",description:"Animate an image into a video with a text prompt",default_model:ut,command_template:'oiioii video image --image <hogi-uri> --prompt "<text>" [--model <model>] --json'},{name:"text-to-audio",domain:"audio",description:"Generate speech or audio from a text prompt and optional references",default_model:nr,command_template:'oiioii audio seed-audio --prompt "<text>" [--audio <hogi-uri...>|--image <hogi-uri>] --json'},{name:"text-to-music",domain:"audio",description:"Generate music from a description or custom lyrics and style tags",default_model:"suno",command_template:'oiioii audio suno --prompt "<text>" [--custom --tags <style>] --json'}];function zc(){return[...Kc]}function Jc(e,t){let r=[];for(let o of e){let n=o.mcp_method_name.startsWith("generate_image_")?"image":o.mcp_method_name.startsWith("generate_video_")?"video":o.mcp_method_name.startsWith("generate_music_")?"audio":void 0;if(!n||t&&n!==t)continue;let i=Ot(o.mcp_method_name,n);if(!i)continue;let s=o.name??o.model;r.push({id:o.id,name:o.display_name??s??i,key:i,domain:n,variant:o.model,selector:{model_id:o.id,cli_args:["--model-id",String(o.id)]},input_capabilities:o.input_capabilities??[],input_capabilities_known:Array.isArray(o.input_capabilities),reference_image_count_min:o.reference_image_count_min??null,reference_image_count_max:o.reference_image_count_max??null,generation_input_contract:Ut({toolName:o.mcp_method_name,...o.model?{variant:o.model}:{},catalog:o}),points_cost:o.points_cost,sizes:o.sizes,aspect_ratios:o.aspect_ratios,durations:o.durations??[],description:o.description_i18n??{},tags:o.tags,members_only:o.members_only===!0})}return r}function gi(e){let t=e;for(;t.parent;)t=t.parent;return t.opts().json===!0}function _i(e={}){let t=new jc("inspect").description("Inspect backend capabilities");return t.command("capabilities").description("List available GenAI capabilities").action((r,o)=>{let n=gi(o),i=zc();if(E({item_count:i.length}),y("inspect","capabilities.listed",{count:i.length}),n)_(I("inspect_capabilities",{capabilities:i},[{command:"oiioii inspect models --json",description:"List available models"}]));else{W("Available Capabilities");for(let s of i)g(` ${s.name} (${s.domain})`),g(` ${s.description}`),g(` Default model: ${s.default_model}`),g(` Example: ${s.command_template}`),g("")}}),t.command("models").description("List available models").option("--domain <domain>","Filter by domain (image, video, or audio)").action(async(r,o)=>{let n=gi(o),i=r.domain;if(i!==void 0&&i!=="image"&&i!=="video"&&i!=="audio")throw new c(u.INVALID_ARGUMENT,`Invalid model domain: "${i}". Expected image, video, or audio.`);let s=i,a=e.configStore??new b,d=P(O(o),a),p=await new ue({baseUrl:d.baseUrl,apiKey:d.apiKey,...e.fetch?{fetch:e.fetch}:{}}).listModels({includeDisplayNames:!0}),m=Jc(p,s);if(E({item_count:m.length,backend_model_count:p.length,...s?{domain:s}:{}}),y("inspect","models.listed",{count:m.length,backend_model_count:p.length,source:"backend_model_catalog",...s?{domain:s}:{}}),n)_(I("inspect_models",{models:m,count:m.length,source:"backend_model_catalog",selection:Wc,...s?{filter:{domain:s}}:{}},[{command:"oiioii inspect capabilities --json",description:"List capabilities"}]));else{let f=s?`Available ${s} models`:"Available models";W(f);for(let h of m)g(` ${h.name} [${h.key}] (${h.domain})`),g(` Points: ${h.points_cost}${h.members_only?" \xB7 members only":""}`),h.variant&&g(` Variant: ${h.variant}`),g(` Select: --model-id ${h.id}`);g(`
31
- Total: ${m.length} models`)}}),t}import{Command as Hc}from"commander";function wi(e,t){if(t.status!=="succeeded"&&t.status!=="failed")return;let r=t.mediaType??(t.toolName.includes("video")?"video":t.toolName.includes("music")||t.toolName.includes("audio")?"audio":"image");return e.createBundle({taskId:t.id,workspaceId:t.workspaceId,command:t.command,tool:t.toolName,inputArgs:t.inputArgs,resources:t.resourceUris.map(o=>({uri:o,mime_type:st(t,r)})),status:t.status,...t.error?{error:{code:t.error.code,message:t.error.message}}:{}})}function Ri(e,t){return t.taskStore??new H({configDir:e.getConfigDir()})}function Yc(e={}){let t=e.previewStore??new De,r=t.getLatest();if(!r){let o=Ri(t,e).list().find(n=>n.status==="succeeded"||n.status==="failed");if(o)try{let n=wi(t,o);n&&(r={manifest:n.manifest,summary:n.summary,bundleDir:n.bundleDir})}catch{}}return r?{ok:!0,data:{bundle_id:r.manifest.bundle_id,bundle_dir:r.bundleDir,task_id:r.manifest.task_id,manifest:r.manifest,summary:r.summary}}:{ok:!1,error:{code:u.RECORD_NOT_FOUND,message:"No preview bundles found. Generate an image or video first."}}}function Qc(e,t={}){let r=t.previewStore??new De,o=r.getBundleByTaskId(e);if(!o){let n=Ri(r,t).getByAnyId(e);if(n)try{let i=wi(r,n);i&&(o={manifest:i.manifest,summary:i.summary,bundleDir:i.bundleDir})}catch{}}return o?{ok:!0,data:{bundle_id:o.manifest.bundle_id,bundle_dir:o.bundleDir,task_id:o.manifest.task_id,manifest:o.manifest,summary:o.summary}}:{ok:!1,error:{code:u.RECORD_NOT_FOUND,message:`No preview bundle found for task ${e}.`}}}function hi(e){let t=e;for(;t.parent;)t=t.parent;return t.opts().json===!0}function yi(e){if(W("Preview Bundle"),g(` Bundle ID: ${e.bundle_id}`),g(` Task ID: ${e.task_id}`),g(` Status: ${e.summary.status}`),g(` Title: ${e.summary.title}`),g(` Summary: ${e.summary.human_summary}`),g(` Bundle dir: ${e.bundle_dir}`),e.manifest.resources.length>0){g(" Resources:");for(let t of e.manifest.resources)g(` - ${t.uri} (${t.mime_type??"unknown"})`)}if(e.summary.next.length>0){g(`
32
- Next steps:`);for(let t of e.summary.next)g(` ${t.command}`)}}function Ii(e={}){let t=new Hc("preview").description("Preview bundles for generation results");return t.command("latest").description("Show the most recent preview bundle").action((r,o)=>{let n=hi(o),i=Yc(e);i.ok&&i.data?(E({found:!0,artifact_count:i.data.manifest.resources.length}),n?_(I("preview_latest",{bundle_id:i.data.bundle_id,bundle_dir:i.data.bundle_dir,task_id:i.data.task_id,manifest:i.data.manifest,summary:i.data.summary},i.data.summary.next)):yi(i.data)):(n?_(C("preview_latest",i.error.code,i.error.message)):S(i.error.message),process.exitCode=1)}),t.command("bundle").description("Show preview bundle for a specific task").argument("<task_id>","Task ID to look up").action((r,o,n)=>{let i=hi(n),s=Qc(r,e);s.ok&&s.data?(E({found:!0,artifact_count:s.data.manifest.resources.length}),i?_(I("preview_bundle",{bundle_id:s.data.bundle_id,bundle_dir:s.data.bundle_dir,task_id:s.data.task_id,manifest:s.data.manifest,summary:s.data.summary},s.data.summary.next)):yi(s.data)):(i?_(C("preview_bundle",s.error.code,s.error.message)):S(s.error.message),process.exitCode=1)}),t}import{Command as Tu}from"commander";import{basename as Ui,resolve as Di}from"path";import{readFile as Mi,stat as Pi}from"fs/promises";import{extname as Xc}from"path";var Zc=new Set(["jpg","jpeg","png","gif","svg","webp","heic","heif","bmp","ico","tiff","jfif"]),eu=new Set(["mp4","webm","avi","mov","flv","mkv"]),tu=new Set(["mp3","wav","ogg","m4a","aac","flac","wma","ape"]),ru=new Set(["txt","doc","docx","pdf","md","lrc","srt","vtt"]);function ee(e){return e.trim().toLowerCase().replace(/^\.+/,"")}function kt(e){let t=ee(e);if(Zc.has(t))return"image";if(eu.has(t))return"video";if(tu.has(t))return"audio"}function Io(e){let t=ee(e);return kt(t)??(ru.has(t)?"document":void 0)}function ko(e){let t=ee(Xc(e));return t.length>0?t:void 0}function bo(e){let t=ee(e),r=kt(t);if(!r)throw new c(u.INVALID_ARGUMENT,`Unsupported file type: ${t||"<empty>"}. Supported image/video/audio extensions only.`);return r}function ou(e){return e&&typeof e=="object"?e:void 0}async function nu(e){let t=await e.text().catch(()=>"");if(!t.trim())return{};try{return JSON.parse(t)}catch{throw new c(u.SERVER_ERROR,"Invalid JSON response from upload API",{status:e.status})}}function ki(e,t){let r=t.error?.code,o=t.error?.message??`Upload failed: HTTP ${e}`,n={status:e,code:r};return e===401?new c(u.API_KEY_INVALID,o||"Invalid API key",n):e===403||r==="workspace_forbidden"?new c(u.WORKSPACE_FORBIDDEN,o,n):e===404||r==="workspace_not_found"?new c(u.WORKSPACE_NOT_FOUND,o,n):e===413||r==="payload_too_large"?new c(u.PAYLOAD_TOO_LARGE,o,n):We(r,o)?Ke(r,o,n):["empty_file","invalid_file_name","invalid_file_type","missing_workspace_id","unsupported_asset_type"].includes(r??"")?new c(u.INVALID_ARGUMENT,o,n):new c(u.SERVER_ERROR,o,n)}function iu(e){if(e.ok===!1)throw ki(400,e);let t=ou(e.data);if(!t)throw new c(u.SERVER_ERROR,"Invalid upload API response: missing data");let r=t.asset_id,o=t.asset_uri,n=t.file_uri,i=t.type,s=t.workspace_id;if(typeof r!="string"||!r)throw new c(u.SERVER_ERROR,"Invalid upload API response: missing asset_id");if(typeof o!="string"||o!==`hogi://asset/${r}`)throw new c(u.SERVER_ERROR,"Invalid upload API response: invalid asset_uri");if(i!=="image"&&i!=="video"&&i!=="audio")throw new c(u.SERVER_ERROR,"Invalid upload API response: unsupported type");if(typeof n!="string"||!n.startsWith(`hogi://${i}/`))throw new c(u.SERVER_ERROR,"Invalid upload API response: file_uri/type mismatch");if(typeof s!="string"||!s)throw new c(u.SERVER_ERROR,"Invalid upload API response: missing workspace_id");return{assetId:r,assetUri:o,fileUri:n,type:i,workspaceId:s}}var pr=class{baseUrl;apiKey;_fetch;logger;timeoutMs;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this._fetch=t.fetch??globalThis.fetch,this.logger=t.logger,this.timeoutMs=t.timeoutMs??3e5}async uploadFile(t){let r=ee(t.fileType),o=kt(r);if(!o)throw new c(u.INVALID_ARGUMENT,`Unsupported file type: ${r||"<empty>"}`);if(!t.workspaceId.trim())throw new c(u.WORKSPACE_REQUIRED,"workspace_id is required");let n=new URLSearchParams({workspace_id:t.workspaceId,file_type:r});t.fileName&&n.set("file_name",t.fileName),t.afterAssetId&&n.set("after_asset_id",t.afterAssetId);let i=$({source:"hogi_res_upload_client",operation:"workspace.upload_asset",method:"POST",path:"/v1/workspace/uploadAsset",metadata:{workspace_id:t.workspaceId,file_type:r,type:o,bytes:t.buffer.byteLength}},this.logger),s;try{return await j({operation:"Workspace file upload request",timeoutMs:this.timeoutMs,run:async a=>{s=await i.fetch(this._fetch,`${this.baseUrl}/v1/workspace/uploadAsset?${n.toString()}`,{method:"POST",headers:V({"x-hogi-api-key":this.apiKey,"content-type":"application/octet-stream",accept:"application/json"}),body:t.buffer,signal:a});let d=await nu(s);if(!s.ok)throw ki(s.status,d);let l=iu(d);if(l.workspaceId!==t.workspaceId)throw new c(u.SERVER_ERROR,"Upload API returned unexpected workspace_id");if(l.type!==o)throw new c(u.SERVER_ERROR,"Upload API returned unexpected asset type");return i.success(s.status,{asset_id:l.assetId,type:l.type}),l}})}catch(a){if(a instanceof B){let l=new c(u.NETWORK_ERROR,a.message,{retryable:!0,timeout_ms:a.timeoutMs});throw i.failure(l,s?.status),l}if(a instanceof c)throw i.failure(a,s?.status),a;let d=new c(u.NETWORK_ERROR,`Network error: ${a instanceof Error?a.message:String(a)}`);throw i.failure(d),d}}};var su=100*1024*1024,au=50*1024*1024,du=10*1024*1024,cu=10*1024*1024;async function uu(e){let t=await e.text().catch(()=>"");if(!t.trim())return{};try{return JSON.parse(t)}catch{throw new c(u.SERVER_ERROR,"Invalid JSON response from resource upload API",{status:e.status})}}function bi(e,t){let r=t.error?.code,o=t.error?.message??`Resource upload failed: HTTP ${e}`,n={status:e,code:r};return e===401?new c(u.API_KEY_INVALID,o||"Invalid API key",n):e===413||r==="payload_too_large"?new c(u.PAYLOAD_TOO_LARGE,o,n):e===429||r==="rate_limited"?new c(u.QUOTA_EXCEEDED,o,n):We(r,o)?Ke(r,o,n):e===400||e===422||r==="invalid_request"||r==="video_requires_vod"?new c(u.INVALID_ARGUMENT,o,n):new c(u.SERVER_ERROR,o,n)}function lu(e){return e==="audio"?au:e==="video"?du:e==="document"?cu:su}function mu(e,t){if(e.ok===!1)throw bi(400,e);let r=e.data;if(!r)throw new c(u.SERVER_ERROR,"Invalid resource upload response: missing data");let o=r.domain,n=r.file_type,i=r.file_uri,s=r.size,a=r.text_len;if(o!==void 0&&o!==t)throw new c(u.SERVER_ERROR,"Resource upload returned unexpected domain");if(typeof n!="string"||Io(n)!==t)throw new c(u.SERVER_ERROR,"Resource upload returned unexpected file_type");if(typeof i!="string"||!i.startsWith(`hogi://${t}/`))throw new c(u.SERVER_ERROR,`Resource upload file_uri must start with hogi://${t}/`);if(typeof s!="number"||!Number.isFinite(s))throw new c(u.SERVER_ERROR,"Resource upload returned invalid size");if(a!==void 0&&(typeof a!="number"||!Number.isFinite(a)))throw new c(u.SERVER_ERROR,"Resource upload returned invalid text_len");return{domain:t,fileType:n,fileUri:i,size:s,...a===void 0?{}:{textLen:a}}}var fr=class{baseUrl;apiKey;fetch;logger;timeoutMs;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this.fetch=t.fetch??globalThis.fetch,this.logger=t.logger,this.timeoutMs=t.timeoutMs??3e5}async uploadFile(t){let r=ee(t.fileType),o=Io(r)??t.domainHint;if(!o)throw new c(u.INVALID_ARGUMENT,`Unsupported resource file type: ${r||"<empty>"}`);if(t.buffer.byteLength===0)throw new c(u.INVALID_ARGUMENT,"Resource file is empty");let n=lu(o);if(t.buffer.byteLength>n||o==="video"&&t.buffer.byteLength>=n)throw new c(u.PAYLOAD_TOO_LARGE,`${o} direct upload limit is ${n} bytes`);let i=new URLSearchParams({file_type:r});t.fileName&&i.set("file_name",t.fileName);let s=$({source:"hogi_resource_upload_client",operation:"res.upload_file",method:"POST",path:"/v1/res/uploadFile",metadata:{bytes:t.buffer.byteLength,domain:o,file_type:r}},this.logger),a;try{return await j({operation:"Resource upload request",timeoutMs:this.timeoutMs,run:async d=>{a=await s.fetch(this.fetch,`${this.baseUrl}/v1/res/uploadFile?${i.toString()}`,{method:"POST",headers:V({"x-hogi-api-key":this.apiKey,"content-type":"application/octet-stream",accept:"application/json"}),body:t.buffer,signal:d});let l=await uu(a);if(!a.ok)throw bi(a.status,l);let p=mu(l,o);if(t.validateResponseSize!==!1&&p.size!==t.buffer.byteLength)throw new c(u.SERVER_ERROR,"Resource upload returned unexpected size");return s.success(a.status,{file_uri:p.fileUri}),p}})}catch(d){if(d instanceof B){let p=new c(u.NETWORK_ERROR,d.message,{retryable:!0,timeout_ms:d.timeoutMs});throw s.failure(p,a?.status),p}if(d instanceof c)throw s.failure(d,a?.status),d;let l=new c(u.NETWORK_ERROR,`Network error: ${d instanceof Error?d.message:String(d)}`);throw s.failure(l,a?.status),l}}};import{createHash as Iu}from"crypto";import{createReadStream as ku}from"fs";import{File as vi}from"buffer";import*as Ei from"fs";import{open as pu}from"fs/promises";function Ti(e){return e&&typeof e=="object"?e:void 0}function fu(e){switch(e.toLowerCase()){case"mov":return"video/quicktime";case"webm":return"video/webm";case"avi":return"video/x-msvideo";case"mkv":return"video/x-matroska";case"flv":return"video/x-flv";default:return"video/mp4"}}var Pt=class e{constructor(t,r,o,n,i){this.filePath=t;this.startOffset=o;this.name=r,this.type=i,this.size=Math.max(0,n-o)}filePath;startOffset;size;type;name;slice(t=0,r=this.size,o=this.type){let n=Math.max(0,Math.min(this.size,t<0?this.size+t:t)),i=Math.max(n,Math.min(this.size,r<0?this.size+r:r));return new e(this.filePath,this.name,this.startOffset+n,this.startOffset+i,o)}async arrayBuffer(){let t=await pu(this.filePath,"r");try{let r=Buffer.allocUnsafe(this.size),o=0;for(;o<r.byteLength;){let{bytesRead:n}=await t.read(r,o,r.byteLength-o,this.startOffset+o);if(n===0)throw new Error("Unexpected end of file while reading VOD upload slice");o+=n}return r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength)}finally{await t.close()}}};async function gu(e){let t=fu(e.fileType),r=Ei.openAsBlob;if(r){let o=await r(e.filePath,{type:t});return new vi([o],e.fileName,{type:t})}return new Pt(e.filePath,e.fileName,0,e.fileSize,t)}function _u(e,t){let r=Ti(e.extra),o=["errorCode","message","requestId"],n={};for(let i of o){let s=r?.[i];typeof s=="number"&&(n[i]=s),typeof s=="string"&&(n[i]=Ai(s,t))}return Object.keys(n).length>0?JSON.stringify(n):"unknown SDK error"}function Ai(e,t){let r=e;for(let o of[t.AccessKeyId,t.SecretAccessKey,t.SessionToken])o&&(r=r.split(o).join("[redacted]"));return r.slice(0,500)}function hu(){let e=globalThis,t=[],r=(o,n)=>{e[o]===void 0&&(e[o]=n,t.push({key:o,value:n}))};return r("File",vi),r("navigator",{userAgent:`oiioii-cli/${process.version}`}),r("window",globalThis),e.FileReader||r("FileReader",class{result=null;error=null;onload=null;onerror=null;readAsArrayBuffer(n){n.arrayBuffer().then(i=>{this.result=i,this.onload?.({target:this})},i=>{this.error=i instanceof Error?i:new Error(String(i)),this.onerror?.({target:this})})}}),r("XMLHttpRequest",vo),()=>{for(let{key:o,value:n}of t.reverse())e[o]===n&&delete e[o]}}function yu(){let e=console.warn,t=(...r)=>{r[0]!=="[TTUploader]:worker not supported!"&&e(...r)};return console.warn=t,()=>{console.warn===t&&(console.warn=e)}}var gr=class{onprogress=null;listeners=new Map;addEventListener(t,r){let o=this.listeners.get(t)??new Set;o.add(r),this.listeners.set(t,o)}removeEventListener(t,r){this.listeners.get(t)?.delete(r)}dispatch(t,r){t==="progress"&&this.onprogress?.(r);for(let o of this.listeners.get(t)??[])o(r)}},vo=class extends gr{readyState=0;status=0;statusText="";responseType="";response=null;responseText="";timeout=0;withCredentials=!1;upload=new gr;onreadystatechange=null;onload=null;onerror=null;ontimeout=null;onabort=null;method="GET";url="";headers=new Headers;responseHeaders=new Headers;controller=null;aborted=!1;open(t,r){this.method=t.toUpperCase(),this.url=r,this.changeReadyState(1)}setRequestHeader(t,r){this.headers.set(t,r)}getResponseHeader(t){return this.responseHeaders.get(t)}getAllResponseHeaders(){return[...this.responseHeaders.entries()].map(([t,r])=>`${t}: ${r}\r
33
- `).join("")}overrideMimeType(){}abort(){this.aborted=!0,this.controller?.abort()}send(t){this.sendAsync(t??null)}changeReadyState(t){this.readyState=t,this.onreadystatechange?.(),this.dispatch("readystatechange",{})}emit(t,r){let o=this[`on${t}`];o?.(r),this.dispatch(t,r)}async sendAsync(t){this.controller=new AbortController;let r=this.timeout>0?setTimeout(()=>this.controller?.abort("timeout"),this.timeout):void 0;try{let o={method:this.method,headers:this.headers,signal:this.controller.signal},n=t instanceof Pt?await t.arrayBuffer():t;this.method!=="GET"&&this.method!=="HEAD"&&n!==null&&(o.body=n);let i=t instanceof Pt||t instanceof Blob?t.size:t instanceof ArrayBuffer?t.byteLength:0;this.upload.dispatch("progress",{lengthComputable:i>0,loaded:0,total:i});let s=await fetch(this.url,o);this.status=s.status,this.statusText=s.statusText,this.responseHeaders=s.headers,this.changeReadyState(2);let a=await s.arrayBuffer();this.changeReadyState(3),this.responseType==="arraybuffer"?this.response=a:this.responseType==="blob"?this.response=new Blob([a]):(this.responseText=new TextDecoder().decode(a),this.response=this.responseType==="json"?JSON.parse(this.responseText||"null"):this.responseText),this.upload.dispatch("progress",{lengthComputable:i>0,loaded:i,total:i}),this.changeReadyState(4),this.emit("load",{})}catch(o){this.controller.signal.aborted?this.emit(this.aborted?"abort":"timeout",{error:o}):this.emit("error",{error:o})}finally{r&&clearTimeout(r)}}};async function wu(e){let{default:t}=await import("tt-uploader"),r=await gu(e),o=new t({appId:e.token.appId,region:e.token.region,userId:e.userId,videoConfig:{spaceName:e.token.spaceName},noLog:!0,useCloudControl:!1,useLocalStorage:!1}),n=o.addFile({file:r,fileName:e.fileName,fileExtension:`.${e.fileType.replace(/^\./u,"")}`,stsToken:{...e.token.stsToken,CurrentTime:e.token.stsToken.CurrentTime??new Date().toISOString()},type:"video"});return await new Promise((i,s)=>{let a=!1,d=e.timeoutMs??1800*1e3,l=setTimeout(()=>{try{o.cancel(n)}catch{}m(()=>s(new c(u.TASK_TIMEOUT,`VOD direct upload timed out after ${d}ms`)))},d),p=()=>{clearTimeout(l),o.removeListener("progress",h),o.removeListener("complete",U),o.removeListener("error",x);try{o.removeFile(n)}catch{}},m=T=>{a||(a=!0,p(),T())},f=T=>T.key===n,h=T=>{f(T)&&typeof T.percent=="number"&&e.onProgress?.(Math.max(0,Math.min(99,Math.round(T.percent))))},U=T=>{if(!f(T))return;let k=Ti(T.uploadResult),R=k?.Vid??k?.vid;m(()=>{typeof R=="string"&&R?i(R):s(new c(u.SERVER_ERROR,"VOD upload completed without Vid"))})},x=T=>{f(T)&&m(()=>s(new c(u.SERVER_ERROR,`VOD direct upload failed: ${_u(T,e.token.stsToken)}`)))};o.on("progress",h),o.on("complete",U),o.on("error",x);try{o.start(n)}catch(T){let k=Ai(T instanceof Error?T.message:String(T),e.token.stsToken);m(()=>s(new c(u.SERVER_ERROR,`VOD direct upload could not start: ${k}`)))}})}var Ci=async e=>{let t=hu(),r=yu();try{return await wu(e)}finally{r(),t()}};function Qe(e){return e&&typeof e=="object"?e:void 0}async function bu(e,t){let r=await e.text().catch(()=>""),o;try{o=r?JSON.parse(r):{}}catch{throw new c(u.SERVER_ERROR,`Invalid JSON response from ${t}`,{status:e.status})}let n=Qe(o)??{};if(!e.ok||n.success===!1){let i=n.error,s=typeof i=="string"?i:typeof Qe(i)?.message=="string"?Qe(i).message:`${t} failed: HTTP ${e.status}`,a={status:e.status,error:typeof i=="string"?i:void 0};throw e.status===401?new c(u.API_KEY_INVALID,s,a):e.status===403?new c(u.WORKSPACE_FORBIDDEN,s,a):e.status===404?new c(u.WORKSPACE_NOT_FOUND,s,a):e.status===413?new c(u.PAYLOAD_TOO_LARGE,s,a):e.status===400?new c(u.INVALID_ARGUMENT,s,a):new c(u.SERVER_ERROR,s,a)}return n}async function Si(e){let t=Iu("md5");for await(let r of ku(e))t.update(r);return t.digest("hex")}function vu(e){return new Promise(t=>setTimeout(t,e))}function Oi(e){let t=Qe(e),r=Qe(t?.stsToken);return typeof t?.appId=="number"&&Number.isFinite(t.appId)&&typeof t.spaceName=="string"&&t.spaceName.length>0&&typeof t.region=="string"&&t.region.length>0&&typeof r?.AccessKeyId=="string"&&r.AccessKeyId.length>0&&typeof r.SecretAccessKey=="string"&&r.SecretAccessKey.length>0&&typeof r.SessionToken=="string"&&r.SessionToken.length>0&&typeof r.ExpiredTime=="string"&&r.ExpiredTime.length>0}var Lt=class{baseUrl;apiKey;fetch;logger;directUpload;pollIntervalMs;timeoutMs;requestTimeoutMs;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this.fetch=t.fetch??globalThis.fetch,this.logger=t.logger,this.directUpload=t.directUpload??Ci,this.pollIntervalMs=t.pollIntervalMs??3e3,this.timeoutMs=t.timeoutMs??600*1e3,this.requestTimeoutMs=t.requestTimeoutMs??3e4}headers(t=!1){return V({"x-hogi-api-key":this.apiKey,accept:"application/json",...t?{"content-type":"application/json"}:{}})}async requestJson(t,r,o,n=this.requestTimeoutMs){let i=$({source:"hogi_vod_upload_client",operation:o,method:r.method??"GET",path:new URL(t).pathname},this.logger),s;try{let a=await j({operation:o,timeoutMs:n,run:async d=>(s=await i.fetch(this.fetch,t,{...r,signal:d}),bu(s,o))});return i.success(s.status),a}catch(a){throw i.failure(a,s?.status),a instanceof B?new c(u.NETWORK_ERROR,a.message,{retryable:!0,request_timeout:!0,timeout_ms:a.timeoutMs}):a instanceof c?a:new c(u.NETWORK_ERROR,`${o} network error: ${a instanceof Error?a.message:String(a)}`)}}async uploadFile(t){if(!t.workspaceId.trim())throw new c(u.WORKSPACE_REQUIRED,"workspace_id is required");if(!t.fileName.trim())throw new c(u.INVALID_ARGUMENT,"file_name is required");let r=ee(t.fileType);if(kt(r)!=="video")throw new c(u.INVALID_ARGUMENT,`VOD upload requires a supported video type: ${r||"<empty>"}`);if(!Number.isSafeInteger(t.fileSize)||t.fileSize<=0)throw new c(u.INVALID_ARGUMENT,"file_size must be a positive integer");if(t.fileSize>524288e3)throw new c(u.PAYLOAD_TOO_LARGE,`VOD upload limit is ${524288e3} bytes (500 MB)`);let o=$({source:"hogi_vod_upload_client",operation:"workspace.vod_upload",method:"POST",path:"/media/vod/commit_upload",metadata:{workspace_id:t.workspaceId,bytes:t.fileSize}},this.logger);try{let n=new URLSearchParams({workspaceId:t.workspaceId,fileSize:String(t.fileSize)}),s=(await this.requestJson(`${this.baseUrl}/media/vod/upload_token?${n}`,{method:"GET",headers:this.headers()},"VOD upload_token")).data;if(!Oi(s))throw new c(u.SERVER_ERROR,"Invalid VOD upload_token response");let[a,d]=await Promise.all([this.directUpload({filePath:t.filePath,fileName:t.fileName,fileSize:t.fileSize,fileType:r,token:s,userId:"oiioii-cli",onProgress:t.onProgress}),Si(t.filePath)]),l=await this.requestJson(`${this.baseUrl}/media/vod/commit_upload`,{method:"POST",headers:this.headers(!0),body:JSON.stringify({vid:a,workspaceId:t.workspaceId,originalFileName:t.fileName,fileSizeBytes:t.fileSize,contentMd5:d})},"VOD commit_upload"),p=Qe(l.data);if(typeof p?.assetId!="string"||typeof p.taskId!="string")throw new c(u.SERVER_ERROR,"Invalid VOD commit_upload response");let m=await this.waitForTranscode(p.taskId,t.workspaceId);return o.success(200,{asset_id:p.assetId,task_id:p.taskId}),{assetId:p.assetId,assetUri:`hogi://asset/${p.assetId}`,fileUri:m.outputUri,taskId:p.taskId,workspaceId:t.workspaceId}}catch(n){throw o.failure(n),n}}async uploadStandaloneFile(t){if(!t.fileName.trim())throw new c(u.INVALID_ARGUMENT,"file_name is required");let r=ee(t.fileType);if(!["mkv","mov","mp4","webm"].includes(r))throw new c(u.INVALID_ARGUMENT,`Standalone VOD upload requires mkv, mov, mp4, or webm: ${r||"<empty>"}`);if(!Number.isSafeInteger(t.fileSize)||t.fileSize<=0)throw new c(u.INVALID_ARGUMENT,"file_size must be a positive integer");if(t.fileSize>524288e3)throw new c(u.PAYLOAD_TOO_LARGE,`VOD upload limit is ${524288e3} bytes (500 MB)`);let o=$({source:"hogi_vod_upload_client",operation:"resource.vod_upload",method:"POST",path:"/media/vod/media_uploads/prepare",metadata:{bytes:t.fileSize}},this.logger);try{let n=await Si(t.filePath),i=await this.requestJson(`${this.baseUrl}/media/vod/media_uploads/prepare`,{method:"POST",headers:this.headers(!0),body:JSON.stringify({contentMd5:n,originalFileName:t.fileName,originalSizeBytes:t.fileSize,...t.forceTranscode===!0?{forceTranscode:!0}:{}})},"VOD media_upload prepare"),s=Qe(i.data);if(!s)throw new c(u.SERVER_ERROR,"Invalid VOD media_upload prepare response");if(typeof s.dedupUri=="string"){if(!s.dedupUri.startsWith("hogi://video/"))throw new c(u.SERVER_ERROR,"Invalid VOD media_upload dedup URI");return o.success(200,{dedupe_hit:!0,file_uri:s.dedupUri}),{fileUri:s.dedupUri}}let a=s.taskId;if(typeof a!="string"||!a)throw new c(u.SERVER_ERROR,"Invalid VOD media_upload task_id");if(s.resume!==!0){if(!Oi(s))throw new c(u.SERVER_ERROR,"Invalid VOD media_upload credentials");let l=await this.directUpload({filePath:t.filePath,fileName:t.fileName,fileSize:t.fileSize,fileType:r,token:s,userId:"oiioii-cli",onProgress:t.onProgress});await this.requestJson(`${this.baseUrl}/media/vod/media_uploads/${encodeURIComponent(a)}/commit`,{method:"POST",headers:this.headers(!0),body:JSON.stringify({vid:l})},"VOD media_upload commit")}let d=await this.waitForStatus(a,`${this.baseUrl}/media/vod/media_uploads/${encodeURIComponent(a)}`,"VOD media_upload status");return o.success(200,{file_uri:d.outputUri,task_id:a}),{fileUri:d.outputUri,taskId:a}}catch(n){throw o.failure(n),n}}async waitForTranscode(t,r){let o=new URLSearchParams({taskId:t,workspaceId:r});return await this.waitForStatus(t,`${this.baseUrl}/media/vod/transcode_status?${o}`,"VOD transcode_status")}async waitForStatus(t,r,o){let n=Date.now()+this.timeoutMs;for(;Date.now()<n;){let i=Math.max(1,n-Date.now()),s;try{s=await this.requestJson(r,{method:"GET",headers:this.headers()},o,Math.min(this.requestTimeoutMs,i))}catch(d){if((d instanceof c&&d.details&&typeof d.details=="object"?d.details:void 0)?.request_timeout===!0){if(Date.now()>=n)break;continue}throw d}let a=Qe(s.data);if(!a||typeof a.status!="string")throw new c(u.SERVER_ERROR,`Invalid ${o} response`);if((a.status==="completed"||a.status==="finished")&&typeof a.outputUri=="string"&&a.outputUri.startsWith("hogi://video/"))return a;if(a.status==="failed"||a.status==="cancelled")throw new c(u.SERVER_ERROR,a.errorMessage||a.errorCode||`VOD transcode ${a.status}`);await vu(Math.min(this.pollIntervalMs,Math.max(0,n-Date.now())))}throw new c(u.TASK_TIMEOUT,`VOD transcode timed out after ${this.timeoutMs}ms`,{task_id:t})}};var xi=A,Ni=O;function Au(e,t){let r=e.workspace;if(typeof r=="string"&&r)return r;let o=process.env.OIIOII_WORKSPACE_ID;if(o)return o;let n=t.loadResolved();if(n.defaultWorkspaceId)return n.defaultWorkspaceId;throw new c(u.WORKSPACE_REQUIRED,"No workspace set. Run: oiioii workspace set <workspace_id>")}function hr(e,t){let r=`hogi://${t}/`;if(!e.startsWith(r))throw new c(u.SERVER_ERROR,`Upload API returned mismatched URI/domain: expected ${r}`)}function Li(e,t,r,o=!1){return e==="video"&&(o||t==="mov"||r>=10485760)}async function $i(e,t){let r;try{r=await t(e)}catch{throw new c(u.INVALID_ARGUMENT,`File not found: ${e}`)}if(!r.isFile())throw new c(u.INVALID_ARGUMENT,`Not a file: ${e}`);if(r.size<=0)throw new c(u.INVALID_ARGUMENT,`File is empty: ${e}`);return r.size}async function Cu(e,t={},r={}){let o=r.configStore??new b,n=r.readFile??Mi,i=r.stat??Pi,s=P(t,o),a=s.baseUrl,d=Di(e.path),l=await $i(d,i),p=e.fileType??ko(d);if(!p)throw new c(u.INVALID_ARGUMENT,`Cannot infer file type from path: ${e.path}. Use --type <ext>.`);let m=ee(p),f=bo(m);if(e.vod===!0&&f!=="video")throw new c(u.INVALID_ARGUMENT,"--vod is only valid for video files");y("upload","upload.file_validated",{file_type:m,domain:f,size:l});let h=Au(t,o),U=e.fileName??Ui(d);if(Li(f,m,l,e.vod===!0)){if(e.afterAssetId)throw new c(u.INVALID_ARGUMENT,"--after-asset-id is not supported by the VOD upload API");let w=await new Lt({baseUrl:a,apiKey:s.apiKey,fetch:r.fetch,directUpload:r.vodDirectUpload,pollIntervalMs:r.vodPollIntervalMs,timeoutMs:r.vodTimeoutMs}).uploadFile({filePath:d,fileSize:l,fileName:U,fileType:m,workspaceId:h});return hr(w.fileUri,"video"),y("upload","upload.vod_completed",{asset_id:w.assetId,task_id:w.taskId,size:l,workspace_id:h}),{uri:w.fileUri,asset_id:w.assetId,asset_uri:w.assetUri,file_uri:w.fileUri,domain:"video",file_type:m,file_name:U,size:l,attached:!0,workspace_id:h,upload_mode:"vod",task_id:w.taskId}}let T=await n(d),R=await new pr({baseUrl:a,apiKey:s.apiKey,fetch:r.fetch}).uploadFile({buffer:T,workspaceId:h,fileType:m,fileName:U,afterAssetId:e.afterAssetId});if(y("upload","upload.completed",{asset_id:R.assetId,domain:R.type,size:l,workspace_id:h}),hr(R.fileUri,R.type),R.type!==f)throw new c(u.SERVER_ERROR,`Upload API returned unexpected domain: ${R.type}`);return y("upload","workspace.asset_attached",{asset_id:R.assetId,domain:R.type,workspace_id:h}),{uri:R.fileUri,asset_id:R.assetId,asset_uri:R.assetUri,file_uri:R.fileUri,domain:R.type,file_type:m,file_name:U,size:l,attached:!0,workspace_id:h,upload_mode:"direct"}}async function Su(e,t={},r={}){let o=r.configStore??new b,n=r.stat??Pi,i=P(t,o),s=Di(e.path),a=await $i(s,n),d=e.fileType??ko(s);if(!d)throw new c(u.INVALID_ARGUMENT,`Cannot infer file type from path: ${e.path}. Use --type <ext>.`);let l=ee(d),p=bo(l);if(e.vod===!0&&p!=="video")throw new c(u.INVALID_ARGUMENT,"--vod is only valid for video files");let m=e.fileName??Ui(s),f=Li(p,l,a,e.vod===!0);if(y("upload","upload.resource_validated",{file_type:l,domain:p,size:a,upload_mode:f?"vod":"direct"}),f){let k=await new Lt({baseUrl:i.baseUrl,apiKey:i.apiKey,fetch:r.fetch,directUpload:r.vodDirectUpload,pollIntervalMs:r.vodPollIntervalMs,timeoutMs:r.vodTimeoutMs}).uploadStandaloneFile({filePath:s,fileName:m,fileSize:a,fileType:l,forceTranscode:e.vod===!0});return hr(k.fileUri,"video"),{uri:k.fileUri,file_uri:k.fileUri,domain:"video",file_type:l,file_name:m,size:a,upload_mode:"vod",...k.taskId?{task_id:k.taskId}:{}}}let h=await(r.readFile??Mi)(s),x=await new fr({baseUrl:i.baseUrl,apiKey:i.apiKey,fetch:r.fetch}).uploadFile({buffer:h,fileType:l,fileName:m});if(x.domain!==p)throw new c(u.SERVER_ERROR,"Resource upload returned unexpected media domain");return hr(x.fileUri,p),{uri:x.fileUri,file_uri:x.fileUri,domain:p,file_type:x.fileType,file_name:m,size:a,upload_mode:"direct"}}function Vi(e={}){let t=new Tu("upload").description("Upload local files to Hogi resources");return t.command("file").description("Upload an image, video, or audio file").argument("<path>","Local file path").option("--type <ext>","File extension override, e.g. png/mp4/mp3").option("--name <name>","Original filename stored for display").option("--after-asset-id <asset_id>","Insert after an existing workspace asset").option("--vod","Force the VOD direct-upload flow for a video").option("--attach","Deprecated compatibility flag; uploads are always attached").action(async(r,o,n)=>{let i=xi(n),s=Ni(n);try{let a=await Cu({path:r,fileType:o.type,fileName:o.name,afterAssetId:o.afterAssetId,attach:o.attach===!0,vod:o.vod===!0},s,e);E({media_type:a.domain,file_extension:a.file_type,size_bucket:Je(a.size),upload_mode:a.upload_mode??"direct",forced_vod:o.vod===!0,attached:a.attached}),i?_(I("upload_file",a,[{command:`oiioii record open ${a.uri} --json`,description:"Download uploaded resource"}])):(N(`Uploaded: ${a.uri}`),g(` Domain: ${a.domain}`),g(` Type: ${a.file_type}`),g(` Size: ${a.size} bytes`),g(` Mode: ${a.upload_mode??"direct"}`),a.task_id&&g(` Task: ${a.task_id}`),a.file_name&&g(` Name: ${a.file_name}`),g(` Attach: ${a.attached?`yes (${a.workspace_id})`:"no"}`))}catch(a){if(a instanceof c){i?_(C("upload_file",a.code,a.message,a.details)):S(a.message),process.exitCode=1;return}let d=a instanceof Error?a.message:String(a);i?_(C("upload_file",u.SERVER_ERROR,d)):S(d),process.exitCode=1}}),t.command("resource").description("Upload an image, video, or audio resource without a workspace").argument("<path>","Local file path").option("--type <ext>","File extension override, e.g. png/mp4/mp3").option("--name <name>","Original filename stored for display").option("--vod","Force the standalone VOD flow for a video").action(async(r,o,n)=>{let i=xi(n),s=Ni(n);try{let a=await Su({path:r,fileType:o.type,fileName:o.name,vod:o.vod===!0},s,e);E({media_type:a.domain,file_extension:a.file_type,size_bucket:Je(a.size),upload_mode:a.upload_mode,forced_vod:o.vod===!0,attached:!1}),i?_(I("upload_resource",a,[{command:`oiioii record open ${a.uri} --json`,description:"Download uploaded resource"}])):(N(`Uploaded resource: ${a.uri}`),g(` Domain: ${a.domain}`),g(` Type: ${a.file_type}`),g(` Size: ${a.size} bytes`),g(` Mode: ${a.upload_mode}`),a.task_id&&g(` Task: ${a.task_id}`),a.file_name&&g(` Name: ${a.file_name}`))}catch(a){if(a instanceof c){i?_(C("upload_resource",a.code,a.message,a.details)):S(a.message),process.exitCode=1;return}let d=a instanceof Error?a.message:String(a);i?_(C("upload_resource",u.SERVER_ERROR,d)):S(d),process.exitCode=1}}),t}import{Command as Ou}from"commander";function Eo(e){let t=e;for(;t.parent;)t=t.parent;return t.opts().json===!0}function xu(e,t){if(e===void 0)return;let r=Number.parseInt(e,10);if(!Number.isInteger(r)||r<=0)throw new c(u.INVALID_ARGUMENT,`${t} must be a positive integer.`);return r}function Gi(e){let t=["debug","info","warn","error"],r=["application","api"];if(e.level&&!t.includes(e.level))throw new c(u.INVALID_ARGUMENT,`Unknown log level: ${e.level}.`);if(e.category&&!r.includes(e.category))throw new c(u.INVALID_ARGUMENT,`Unknown log category: ${e.category}.`);if(e.since&&Number.isNaN(Date.parse(e.since)))throw new c(u.INVALID_ARGUMENT,`Invalid --since timestamp: ${e.since}.`);return{...e.level?{level:e.level}:{},...e.source?{source:e.source}:{},...e.category?{category:e.category}:{},...e.trace?{traceId:e.trace}:{},...e.logid?{logid:e.logid}:{},...e.requestId?{requestId:e.requestId}:{},...e.uid?{uid:e.uid}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{},...e.feature?{feature:e.feature}:{},...e.since?{since:e.since}:{},...e.limit?{limit:xu(e.limit,"--limit")}:{}}}function Fi(e){return e.option("--level <level>","Filter by debug/info/warn/error").option("--source <source>","Filter by exact source name").option("--category <category>","Filter by application/api").option("--trace <trace_id>","Filter by feature trace ID").option("--logid <id>","Filter by backend chain logid").option("--request-id <id>","Filter by gateway requestId (not the local request_id)").option("--uid <id>","Filter by authenticated user ID").option("--workspace-id <id>","Filter by workspace ID").option("--feature <name>","Filter by feature name, e.g. image.text").option("--since <timestamp>","Filter entries at or after an ISO timestamp").option("--limit <count>","Maximum number of newest entries")}function Bi(e,t,r){let o=e instanceof c?e:new c(u.CONFIG_ERROR,e instanceof Error?e.message:String(e));t?_(C(r,o.code,o.message,o.details)):S(o.message),process.exitCode=1}function qi(e={}){let t=new Ou("logs").description("Local structured log management");return Fi(t.command("list").description("List locally stored log entries")).action((r,o)=>{let n=Eo(o);try{let i=e.logStore??new Be,s=Gi(r),a=i.list(s);if(E({entry_count:a.length,has_filter:Object.values(s).some(d=>d!==void 0)}),n)_(I("logs_list",{path:i.path,count:a.length,entries:a}));else if(a.length===0)g(`No logs found.
34
- Path: ${i.path}`);else{W(`Logs (${a.length})`);for(let d of a){let l=d.http?.status?` status=${d.http.status}`:"",m=["logid","requestId","uid","workspaceId"].filter(f=>d[f]).map(f=>` ${f}=${d[f]}`).join("");g(`${d.timestamp} ${d.level.toUpperCase()} ${d.source} ${d.event}${l}${m}`)}}}catch(i){Bi(i,n,"logs_list")}}),Fi(t.command("export").description("Export locally stored logs").requiredOption("-o, --output <path>","Destination JSON or JSONL file").option("--format <format>","Export format: json or jsonl","jsonl").option("--force","Overwrite an existing export file")).action((r,o)=>{let n=Eo(o);try{if(r.format!=="json"&&r.format!=="jsonl")throw new c(u.INVALID_ARGUMENT,`Unknown export format: ${r.format}.`);let s=(e.logStore??new Be).export({output:r.output,format:r.format,filter:Gi(r),force:r.force===!0});E({format:s.format,entry_count:s.count,size_bucket:Je(s.bytes)}),n?_(I("logs_export",s)):N(`Exported ${s.count} log entries to ${s.path}`)}catch(i){Bi(i,n,"logs_export")}}),t.command("path").description("Show the local log file path").action((r,o)=>{let n=Eo(o),i=e.logStore??new Be;E({path_available:!0}),n?_(I("logs_path",{path:i.path})):g(i.path)}),t}import{Command as Pu}from"commander";import{mkdirSync as Nu,writeFileSync as Uu}from"fs";import{dirname as Du}from"path";function ji(e){let t=String(e??"");return/[",\n]/.test(t)?`"${t.replace(/"/g,'""')}"`:t}function Mu(e,t){let r=[e.map(ji).join(",")];for(let o of t)r.push(o.map(ji).join(","));return`\uFEFF${r.join(`\r
35
- `)}`}function Wi(e,t,r){Nu(Du(e),{recursive:!0}),Uu(e,Mu(t,r),"utf-8")}function yr(e,t){let r=t.configStore??new b,o=P(e,r);return{baseUrl:o.baseUrl,apiKey:o.apiKey,...t.fetch?{fetch:t.fetch}:{}}}async function Lu(e){let t=await new ye(e).getBalance();return{points:t.points,tier:t.tier,...typeof t.description=="string"?{description:t.description}:{},...Array.isArray(t.disabledModels)?{disabledModels:t.disabledModels}:{}}}async function $u(e,t){return await new ye(t).getGenerationCosts(e)}async function Vu(e,t){return await new ye(t).getLogs(e)}async function Gu(e,t,r=5e3){let o=new ye(t),n=Math.min(e.limit??50,50),i=[],s;do{let a=await o.getLogs({...s!==void 0?{cursorId:s}:{},...e.days!==void 0?{days:e.days}:{},limit:n,...e.type?{type:e.type}:{}});if(i.push(...a.entries),i.length>=r)return i.slice(0,r);s=a.hasMore?a.nextCursor:void 0}while(s!==void 0&&i.length<r);return i}var Ki=["Time","Type","Points","Status","Model","Reason","TaskId"];function zi(e){return[e.createdAt,e.type,`${e.amount>=0?"+":""}${e.amount}`,e.status,e.model??"-",e.reason??"-",e.taskId??"-"]}async function Fu(e,t){let[r,o]=await Promise.all([new ue(t).listModels(),new ye(t).getBalance()]),n=xt(r,{...e.modelId?{modelId:e.modelId}:{},...e.model?{model:e.model}:{},...e.variant?{variant:e.variant}:{}}),i=_t(n);it(i,{...e.duration!==void 0?{duration:e.duration}:{},...e.resolution?{resolution:e.resolution}:{}});let s=or({pricing:n,tier:o.tier,...e.duration!==void 0?{duration:e.duration}:{},...e.resolution?{resolution:e.resolution}:{},...e.quality?{quality:e.quality}:{},...e.referenceVideoDuration!==void 0?{referenceVideoDuration:e.referenceVideoDuration}:{}});return{...s,model:Ie(i),available_points:o.points,sufficient:o.points>=s.estimated_points}}function $t(e,t,r=!1){let o=Number(e);if(!Number.isFinite(o)||(r?o<0:o<=0))throw new c(u.INVALID_ARGUMENT,`${t} must be ${r?"zero or positive":"positive"}`);return o}function wr(e,t,r){let o=e instanceof c?e:new c(u.SERVER_ERROR,e instanceof Error?e.message:String(e));t?_(C(r,o.code,o.message,o.details)):S(o.message),process.exitCode=1}function Ji(e={}){let t=new Pu("points").description("Inspect points balance, estimates, and actual generation charges");return t.command("balance").description("Show current points balance and membership tier").action(async(r,o)=>{let n=A(o);try{let i=await Lu(yr(O(o),e));E({tier:i.tier}),n?_(I("points_balance",i)):(N(`Available points: ${i.points}`),g(` Tier: ${i.tier}`))}catch(i){wr(i,n,"points_balance")}}),t.command("cost").description("Query actual charged points for generated resource URIs").argument("<uris...>","1-20 hogi:// generation URIs").action(async(r,o,n)=>{let i=A(n);try{let s=await $u(r,yr(O(n),e));if(E({uri_count:r.length,charged_count:s.entries.filter(a=>a.status==="charged").length,no_charge_count:s.entries.filter(a=>a.status==="no_charge").length,not_found_count:s.entries.filter(a=>a.status==="not_found").length}),i)_(I("points_cost",s));else for(let a of s.entries)g(`${a.uri}: ${a.status}${a.consumed_points!==void 0?` \xB7 consumed ${a.consumed_points} points`:""}`),a.pricingExplanation&&g(` ${a.pricingExplanation}`)}catch(s){wr(s,i,"points_cost")}}),t.command("logs").description("List your points consumption history, newest first").option("--cursor <id>","Pagination cursor (the nextCursor from a previous page)").option("--days <n>","Only include the last N days").option("--limit <n>","Rows per page (default 20, max 50)").option("--type <type>","Filter by log type, e.g. limited_consume").option("--table","Print as an ASCII table").option("--csv <path>","Export all matching rows to a CSV file (auto-paginates; ignores --cursor/--limit paging, only --days/--type filter)").action(async(r,o)=>{let n=A(o),i=yr(O(o),e);try{let s=r.days!==void 0?$t(r.days,"days"):void 0,a=r.limit!==void 0?$t(r.limit,"limit"):void 0;if(r.csv){let p=await Gu({...s!==void 0?{days:s}:{},...a!==void 0?{limit:a}:{},...r.type?{type:r.type}:{}},i);Wi(r.csv,Ki,p.map(zi)),E({entry_count:p.length,export_format:"csv"}),n?_(I("points_logs_csv",{path:r.csv,rowCount:p.length})):N(`Exported ${p.length} rows to ${r.csv}`);return}let d=r.cursor!==void 0?$t(r.cursor,"cursor"):void 0,l=await Vu({...d!==void 0?{cursorId:d}:{},...s!==void 0?{days:s}:{},...a!==void 0?{limit:a}:{},...r.type?{type:r.type}:{}},i);if(E({entry_count:l.entries.length,has_more:l.hasMore}),n)_(I("points_logs",l));else if(r.table)pn(Ki,l.entries.map(zi));else for(let p of l.entries)g(`${p.createdAt} \xB7 ${p.type} \xB7 ${p.amount>=0?"+":""}${p.amount}${p.model?` \xB7 ${p.model}`:""}`);!n&&l.hasMore&&l.nextCursor!==void 0&&g(`
36
- More results available \u2014 rerun with --cursor ${l.nextCursor}`)}catch(s){wr(s,n,"points_logs")}}),t.command("quote").description("Estimate generation points from the current backend model catalog").option("--model-id <id>","Exact model ID from inspect models").option("--model <model>","Model key from inspect models").option("--variant <variant>","Exact model variant from inspect models; requires --model").option("--duration <seconds>","Requested generation duration").option("--resolution <resolution>","Requested output resolution").option("--quality <quality>","Requested quality tier").option("--reference-video-duration <seconds>","Referenced video duration","0").action(async(r,o)=>{let n=A(o);try{let i=await Fu({...r.modelId?{modelId:r.modelId}:{},...r.model?{model:r.model}:{},...r.variant?{variant:r.variant}:{},...r.duration!==void 0?{duration:$t(r.duration,"duration")}:{},...r.resolution?{resolution:r.resolution}:{},...r.quality?{quality:r.quality}:{},referenceVideoDuration:$t(r.referenceVideoDuration,"reference video duration",!0)},yr(O(o),e));E({...i.model.model_id!==void 0?{model_id:i.model.model_id}:{},model_key:i.model.key,...i.model.variant?{variant:i.model.variant}:{},...r.duration?{duration_seconds:Number(r.duration)}:{},...r.resolution?{resolution:r.resolution}:{},...r.quality?{quality:r.quality}:{},estimated_points:i.estimated_points,sufficient:i.sufficient}),n?_(I("points_quote",i)):(N(`Estimated points: ${i.estimated_points}`),g(` Available: ${i.available_points} \xB7 ${i.sufficient?"sufficient":"insufficient"}`),K(i.caveat))}catch(i){wr(i,n,"points_quote")}}),t}import{Command as Qu}from"commander";import{createHash as Bu,randomBytes as Hi}from"crypto";import{createServer as qu}from"http";var ju=5e3;function Yi(e){e.close(),e.closeAllConnections()}async function Qi(e){let t=Hi(32).toString("base64url"),r=Hi(32).toString("base64url"),o=Bu("sha256").update(t).digest("base64url"),n=new AbortController,i=!0,s=!1,a,d,l=()=>{},p=new Promise(L=>{l=L}),m=new URL(e.authorizationPageUrl),f=()=>{if(!i||!a)return;let L=a;i=!1,clearTimeout(R),d&&clearTimeout(d),h.close(),l({outcome:"success",exchange:L})},h=qu(async(L,w)=>{w.setHeader("Cache-Control","no-store"),w.setHeader("Referrer-Policy","no-referrer"),w.setHeader("Content-Type","text/plain; charset=utf-8"),w.setHeader("Content-Security-Policy","default-src 'none'; frame-ancestors 'none'");let G=new URL(L.url??"/","http://127.0.0.1"),M=G.searchParams.get("code"),Z=G.searchParams.get("error")==="access_denied",oe=h.address(),pe=oe&&typeof oe=="object"?oe.port:void 0,$o=L.headers.host===`127.0.0.1:${pe}`;if(G.pathname==="/auth/ready"){if(!($o&&G.searchParams.get("state")===r&&L.headers.origin===m.origin)){w.writeHead(400).end("Invalid authorization readiness callback.");return}if(w.setHeader("Access-Control-Allow-Origin",m.origin),w.setHeader("Vary","Origin"),L.method==="OPTIONS"){w.setHeader("Access-Control-Allow-Methods","POST"),w.setHeader("Access-Control-Allow-Private-Network","true"),w.writeHead(204).end();return}if(L.method!=="POST"||!i||!a){w.writeHead(409).end("Authorization is not waiting for page readiness.");return}await new Promise(Ft=>{w.once("finish",Ft),w.once("close",Ft),w.writeHead(204).end()}),f();return}if(L.method!=="GET"||!$o||G.pathname!=="/auth/callback"||G.searchParams.get("state")!==r||!Z&&!/^[a-f0-9]{64}$/.test(M??"")){w.writeHead(400).end("Invalid authorization callback.");return}if(!i||s){w.writeHead(409).end("This authorization request is already being processed.");return}let kr=async(Ge,Ft=!0)=>await new Promise(Ts=>{let Vo=new URL(m.pathname,m.origin);Vo.search=new URLSearchParams({result:Ge,state:r}).toString();let Go=!1,Fo=()=>{Go||(Go=!0,Ft&&h.close(),Ts())};w.once("finish",Fo),w.once("close",Fo),w.writeHead(303,{Location:Vo.href}).end()});if(Z){await kr("cancelled"),i=!1,clearTimeout(R),l({outcome:"cancelled"});return}s=!0;try{let Ge=await e.exchange({code:M,verifier:t,signal:n.signal});if(!i)return;a=Ge,await kr("success",!1),s=!1,i&&(d=setTimeout(f,e.pageReadyTimeoutMs??ju),d.unref())}catch(Ge){i&&(await kr("error"),i=!1,clearTimeout(R),l({outcome:"error",message:Ge instanceof Error?Ge.message:String(Ge)}))}});h.headersTimeout=5e3,h.requestTimeout=1e4,await new Promise((L,w)=>{h.once("error",w),h.listen(0,"127.0.0.1",L)});let U=h.address();if(!U||typeof U=="string")throw new Error("Unable to create local authorization listener");let x=`http://127.0.0.1:${U.port}/auth/callback`,T=new URL(m.href);T.search=new URLSearchParams({app:e.app,challenge:o,state:r,redirectUri:x}).toString();let k=()=>{i&&(i=!1,clearTimeout(R),d&&clearTimeout(d),n.abort(),Yi(h),l({outcome:"cancelled"}))},R=setTimeout(()=>{i&&(i=!1,n.abort(),d&&clearTimeout(d),Yi(h),l({outcome:"expired"}))},e.timeoutMs??3e5);return R.unref(),{cancel:k,result:p,url:T.href}}import{execFile as Wu}from"child_process";var To={terminal:"terminal",codex:"Codex",workbuddy:"WorkBuddy",kimi:"Kimi","claude-code":"Claude Code",deepseek:"DeepSeek"},Ku={codex:"com.openai.codex",workbuddy:"com.workbuddy.workbuddy-ai"},zu={codex:"codex",workbuddy:"workbuddy-ai"},Ju=1e4,Xi=async(e,t)=>await new Promise(r=>{Wu(e,t,{timeout:Ju,windowsHide:!0},o=>r(!o))});async function Zi(e,t=process.platform,r=Xi){return t==="darwin"?await r("/usr/bin/open",[e]):t==="win32"?await r("rundll32.exe",["url.dll,FileProtocolHandler",e]):await r("xdg-open",[e])}async function es(e,t=process.platform,r=Xi){if(t==="darwin"){let o=Ku[e];return o?{requested:await r("/usr/bin/open",["-b",o]),supported:!0}:{requested:!1,supported:!1}}if(t==="win32"){let o=zu[e];return o?await r("reg.exe",["query",`HKCR\\${o}\\shell\\open\\command`,"/ve"])?{requested:await r("rundll32.exe",["url.dll,FileProtocolHandler",`${o}://`]),supported:!0}:{requested:!1,supported:!1}:{requested:!1,supported:!1}}return{requested:!1,supported:!1}}var Hu={en:{opening:"Opening the OiiOii authorization page\u2026",waiting:"Waiting for browser authorization\u2026",saved:"OiiOii authorization completed. The API key was saved securely.",terminalFallback:"Authorization is complete. Return to this terminal to continue.",activating:e=>`Returning to ${e}\u2026`,activationFallback:e=>`Could not open ${e} automatically. Return to ${e} manually to continue.`,browserFallback:e=>`Could not open a browser automatically. Open this URL to continue:
29
+ Next: oiioii task wait ${m.task_id} --json`)}}catch(a){if(a instanceof d){n?_(S("generation_failed",a.code,a.message,a.details)):O(a.message),process.exitCode=1;return}let c=a instanceof Error?a.message:String(a);n?_(S("generation_failed",u.GENERATION_FAILED,c)):O(c),process.exitCode=1}}),t}import{Command as zd}from"commander";var Ri="generate_music_seed_audio",So="generate_music_suno",pr=["wav","mp3","pcm","ogg_opus"];function Jd(e,t){let r=e.workspace;if(typeof r=="string"&&r)return r;let o=process.env.OIIOII_WORKSPACE_ID?.trim();if(o)return o;let n=t.loadResolved().defaultWorkspaceId;if(n)return n;throw new d(u.WORKSPACE_REQUIRED,"No workspace set. Run: oiioii workspace set <workspace_id>")}function fr(e){return[...new Set((e??[]).map(t=>t.trim()).filter(Boolean))]}function ki(e){let{audioUrl:t,referenceImages:r,...o}=e;delete o.workspace_id;let n=fr(typeof t=="string"?[t]:Array.isArray(t)?t:[]),i=fr(typeof r=="string"?[r]:Array.isArray(r)?r:[]);return{input:o,references:[...n.map(s=>({kind:"media",mediaType:"audio",uri:s})),...i.map(s=>({kind:"media",mediaType:"image",uri:s}))]}}function wi(e,t,r){let o=e.find(n=>!n.startsWith(t));if(o)throw new d(u.INVALID_ARGUMENT,`${r} must use ${t} URIs: ${o}`)}function Ao(e,t,r,o){if(e!==void 0&&(!Number.isFinite(e)||e<r||e>o))throw Te(`${t} must be between ${r} and ${o}.`,{field:t,received:e,minimum:r,maximum:o})}function Te(e,t={}){return new d(u.MODEL_CONSTRAINT_VIOLATION,e,{category:"validation",retryable:!1,...t})}function Hd(e,t,r,o,n=0){let i=t.prompt.trim();if(!i)throw new d(u.INVALID_ARGUMENT,"Audio prompt must not be empty.");let s=fr(t.audioUrls),a=fr(t.referenceImages);if(wi(s,"hogi://audio/","Audio references"),wi(a,"hogi://image/","Image references"),e===Ri){if(r&&r!=="seed-audio-1.0")throw Te(`Seed Audio only supports variant seed-audio-1.0, received ${r}.`,{field:"variant",received:r,supported:["seed-audio-1.0"]});let c=a.length+n;if(s.length>0&&c>0)throw Te("Seed Audio reference images and reference audio cannot be used together.",{field:"references"});if(s.length>3)throw Te("Seed Audio supports at most 3 audio references.",{field:"audio",received:s.length,supported_max:3});if(c>1)throw Te("Seed Audio supports at most 1 reference image.",{field:"image",received:c,supported_max:1});if(t.custom||t.tags||t.instrumental||t.autoGenerateVideo)throw Te("--custom, --tags, --instrumental, and --auto-generate-video are only valid for Suno.",{field:"suno_options"});if(Ao(t.loudnessRate,"--loudness-rate",-50,100),Ao(t.pitchRate,"--pitch-rate",-12,12),Ao(t.speechRate,"--speech-rate",-50,100),t.sampleRate!==void 0&&(!Number.isInteger(t.sampleRate)||t.sampleRate<=0))throw Te("--sample-rate must be a positive integer.",{field:"sample_rate",received:t.sampleRate});let l={...t.format?{format:t.format}:{},...t.enableSubtitle!==void 0?{enable_subtitle:t.enableSubtitle}:{},...t.loudnessRate!==void 0?{loudness_rate:t.loudnessRate}:{},...t.pitchRate!==void 0?{pitch_rate:t.pitchRate}:{},...t.sampleRate!==void 0?{sample_rate:t.sampleRate}:{},...t.speechRate!==void 0?{speech_rate:t.speechRate}:{}};return{args:{prompt:i,...s.length?{audioUrl:s}:{},...a.length?{referenceImages:a}:{},...Object.keys(l).length?{audioConfig:l}:{},workspace_id:o},audioUrls:s,referenceImages:a,mode:s.length?"audio_reference":c?"image_reference":"text"}}if(e===So){if(s.length||a.length||n>0||t.format||t.enableSubtitle!==void 0||t.loudnessRate!==void 0||t.pitchRate!==void 0||t.sampleRate!==void 0||t.speechRate!==void 0)throw Te("Reference and audio configuration options are only valid for Seed Audio.",{field:"seed_audio_options"});let c=t.custom===!0,l=t.instrumental===!0;if(!c&&t.tags)throw Te("--tags requires Suno --custom mode.",{field:"tags",requires:"custom"});let p=t.tags?.trim()||(c&&l?i:void 0);return{args:{custom:c,prompt:i,...c&&p?{tags:p}:{},...c?{}:{gptDescriptionPrompt:i},instrumental:l,autoGenerateVideo:t.autoGenerateVideo===!0,...r?{version:r}:{},workspace_id:o},audioUrls:s,referenceImages:a,mode:c?"music_custom":"music_description"}}throw new d(u.MODEL_NOT_SUPPORTED,`Unsupported audio generation tool: ${e}`,{category:"validation",retryable:!1,tool:e})}function Yd(e,t){if(!t)return;let r=t==="seed-audio"?Ri:So;if(e!==r)throw new d(u.MODEL_NOT_SUPPORTED,`The audio ${t} command cannot use model tool ${e}.`,{category:"validation",retryable:!1,hint:`Use a ${t} model ID or run oiioii audio ${t==="seed-audio"?"suno":"seed-audio"}.`,expected_tool:r,received_tool:e})}async function Ii(e,t,r,o,n,i,s){let a=await it({domain:"audio",model:e.model,modelId:e.modelId,variant:e.variant,requireActiveCatalog:i,baseUrl:o,apiKey:r,fetch:n.fetch});Yd(a.toolName,s);let c=nt({prompt:e.prompt,assets:e.assets,bindings:e.bindings}),l=Hd(a.toolName,{...e,prompt:c.prompt},a.variant,t,c.references.length),p=l.referenceImages.length+c.references.length;if(p===0&&l.audioUrls.length===0)ut(a);else if(kt(a,p),l.audioUrls.length>0&&!ar(a).audio)throw Te(`${a.name??a.key} does not support reference audio.`,{field:"audio",received:l.audioUrls.length,supported:!1});return{selection:a,prepared:l,prompt:c.prompt,assetReferences:c.references}}async function Qd(e,t,r,o,n={},i){let s=n.taskStore??new Y,a=await Ii(e,t,r,o,n,!0,i),{assetReferences:c,prepared:l,prompt:p,selection:m}=a;y("audio","generation.prepared",{mode:l.mode,model:m.key,model_id:m.modelId,variant:m.variant,reference_audio_count:l.audioUrls.length,reference_image_count:l.referenceImages.length+c.length,output_format:e.format,subtitle_enabled:e.enableSubtitle===!0,custom_mode:e.custom===!0,instrumental:e.instrumental===!0,workspace_id:t});let h=`oiioii audio ${i??"generate"} --prompt "${e.prompt}" ${Ye(m)}`,D=ki(l.args);D.references=Ie(D.references,c);let N=n.configStore??new b,C=ge(N,D.references),v={transport:C,mediaType:"audio",prompt:p,model:m.variant,...D},I=s.create({workspaceId:t,command:h,toolName:m.toolName,inputArgs:{provider:`async_generation_${C}`,prompt:p,model:m.key,modelId:m.modelId,variant:m.variant,mcpMethodName:m.toolName,workspaceId:t,mode:l.mode,referenceAudioCount:l.audioUrls.length,referenceImageCount:l.referenceImages.length,toolArgs:{format:e.format,enableSubtitle:e.enableSubtitle,custom:e.custom,instrumental:e.instrumental}},pendingSubmission:v,credentialFingerprint:Ee(r),backendBaseUrl:o,backendTransport:C,mediaType:"audio"});s.update(I.id,{status:"submitting"});let V=_e({transport:C,baseUrl:o,apiKey:r,fetch:n.fetch,timeoutMs:n.audioGenerationTimeoutMs??Me});try{let w=await $e({client:V,taskStore:s,previewStore:n.previewStore,task:I,mediaType:"audio",prompt:p,model:m.variant,backendBaseUrl:o,backendTransport:C,input:v.input,references:v.references}),F=w.task.resourceUris.map(ee=>({type:"audio",uri:ee,mime_type:"audio/mpeg"})),L=w.previewWarning?[w.previewWarning]:[];return y("audio","generation.submitted",{local_task_id:I.id,backend_task_id:w.submission.taskId,status:w.task.status}),{task_id:w.submission.taskId,local_task_id:I.id,tool:m.toolName,model:be(m),workspace_id:t,status:w.task.status,artifacts:F,...L.length?{warnings:L}:{}}}catch(w){let F=w instanceof d?w.code:u.GENERATION_FAILED;throw y("audio","generation.command_failed",{task_id:I.id,backend_task_cached:s.get(I.id)?.backendTaskId!==void 0,error_code:F},"error"),Le({taskStore:s,previewStore:n.previewStore,task:I,error:w})}}function mr(e,t){if(e===void 0)return;let r=Number(e);if(!Number.isFinite(r))throw new d(u.INVALID_ARGUMENT,`${t} must be a number.`);return r}async function Zd(e,t,r,o,n,i){let{assetReferences:s,prepared:a,selection:c}=await Ii(e,t,r,o,n,!0,i),l={...a.args};delete l.workspace_id;let p=ki(a.args);p.references=Ie(p.references,s);let m=ge(n.configStore??new b,p.references);return It(c,"audio",l,{references:p.references,transport:m})}function Xd(e,t){let r=e.format;if(r!==void 0&&!pr.includes(r))throw new d(u.INVALID_ARGUMENT,`Invalid audio format: ${r}. Expected ${pr.join(", ")}.`);return{prompt:String(e.prompt),model:t??String(e.model??"seed-audio"),modelId:e.modelId,variant:e.variant,audioUrls:e.audio,referenceImages:e.image,assets:e.asset,bindings:e.bind,format:r,enableSubtitle:e.subtitle===!0?!0:void 0,loudnessRate:mr(e.loudnessRate,"--loudness-rate"),pitchRate:mr(e.pitchRate,"--pitch-rate"),sampleRate:mr(e.sampleRate,"--sample-rate"),speechRate:mr(e.speechRate,"--speech-rate"),custom:e.custom===!0,tags:e.tags,instrumental:e.instrumental===!0,autoGenerateVideo:e.autoGenerateVideo===!0}}async function Co(e,t,r,o){let n=E(t),i=T(t),s=r.configStore??new b;try{let a=P(i,s),c=Jd(i,s),l=Xd(e,o);if(e.dryRun===!0){Ge(await Zd(l,c,a.apiKey,a.baseUrl,r,o),n);return}let p=await Qd(l,c,a.apiKey,a.baseUrl,r,o),m=p.tool===So?l.custom?"music_custom":"music_description":l.audioUrls?.length?"audio_reference":l.referenceImages?.length?"image_reference":"text";if(A({media_type:"audio",generation_mode:m,model_key:p.model.key,...p.model.model_id!==void 0?{model_id:p.model.model_id}:{},...p.model.variant?{variant:p.model.variant}:{},reference_audio_count:l.audioUrls?.length??0,reference_image_count:l.referenceImages?.length??0,...l.format?{output_format:l.format}:{},subtitle_enabled:l.enableSubtitle===!0,custom_mode:l.custom===!0,instrumental:l.instrumental===!0,artifact_count:p.artifacts.length,warning_count:p.warnings?.length??0}),p.warnings?.length&&we(),n)_(k(p.status==="succeeded"?"generation_completed":"generation_submitted",{task_id:p.task_id,local_task_id:p.local_task_id,tool:p.tool,model:p.model,workspace_id:p.workspace_id,status:p.status,artifacts:p.artifacts,...p.warnings?{warnings:p.warnings}:{}},[...p.artifacts.length?[{command:`oiioii record get ${p.artifacts[0].uri} --json`,description:"Get generation record details"}]:[],{command:`oiioii task status ${p.task_id} --json`,description:"Check task status"}]));else{U(p.status==="succeeded"?"Audio generated successfully":"Audio generation submitted"),g(` Task ID: ${p.task_id}`),g(` Model: ${p.model.name??p.model.key}${p.model.variant?` (${p.model.variant})`:""}`);for(let f of p.artifacts)g(` URI: ${f.uri}`);for(let f of p.warnings??[])K(`Warning: ${f.message}`);p.artifacts.length===0&&g(`
30
+ Next: oiioii task wait ${p.task_id} --json`)}}catch(a){let c=a instanceof d?a.code:u.GENERATION_FAILED,l=a instanceof Error?a.message:String(a);n?_(S("generation_failed",c,l,a instanceof d?a.details:void 0)):O(l),process.exitCode=1}}function eu(e){return e.option("--model-id <id>","Exact Seed Audio model ID from inspect models").option("--variant <variant>","Exact Seed Audio variant from inspect models").option("--audio <uri...>","Reference audio URIs (maximum 3)").option("--image <uri...>","Reference image URI (maximum 1)").option("--asset <uri...>","Role, scene, or item asset URI used as a visual reference").option("--bind <name=uri...>","Bind @name in the prompt to a role, scene, or item asset URI").option("--format <format>",`Output format (${pr.join(", ")})`).option("--subtitle","Request subtitle metadata").option("--loudness-rate <number>","Loudness adjustment (-50 to 100)").option("--pitch-rate <number>","Pitch adjustment (-12 to 12)").option("--sample-rate <number>","Output sample rate").option("--speech-rate <number>","Speech rate adjustment (-50 to 100)").option("--dry-run","Validate and preview the resolved request without submitting")}function tu(e){return e.option("--model-id <id>","Exact Suno model ID from inspect models").option("--variant <variant>","Exact Suno variant from inspect models").option("--custom","Use custom lyrics/style mode").option("--tags <text>","Custom-mode music style tags").option("--instrumental","Generate instrumental music").option("--auto-generate-video","Ask Suno to also generate its provider-side video").option("--dry-run","Validate and preview the resolved request without submitting")}function bi(e={}){let t=new zd("audio").description("Audio and music generation commands");return t.command("generate").description("Generate audio with Seed Audio or Suno").requiredOption("--prompt <text>","Audio description; interpreted as lyrics in Suno custom mode").option("--model <model>","Model name (seed-audio or suno)",ur).option("--model-id <id>","Exact model ID from inspect models").option("--variant <variant>","Exact model variant from inspect models").option("--audio <uri...>","Seed Audio reference audio URIs (maximum 3)").option("--image <uri...>","Seed Audio reference image URI (maximum 1)").option("--asset <uri...>","Seed Audio role, scene, or item asset URI used as a visual reference").option("--bind <name=uri...>","Bind @name in the prompt to a role, scene, or item asset URI").option("--format <format>",`Seed Audio output format (${pr.join(", ")})`).option("--subtitle","Request Seed Audio subtitle metadata").option("--loudness-rate <number>","Seed Audio loudness adjustment (-50 to 100)").option("--pitch-rate <number>","Seed Audio pitch adjustment (-12 to 12)").option("--sample-rate <number>","Seed Audio output sample rate").option("--speech-rate <number>","Seed Audio speech rate adjustment (-50 to 100)").option("--custom","Use Suno custom lyrics/style mode").option("--tags <text>","Suno custom-mode music style tags").option("--instrumental","Generate instrumental music with Suno").option("--auto-generate-video","Ask Suno to also generate its provider-side video").option("--dry-run","Validate and preview the resolved request without submitting").action(async(r,o)=>await Co(r,o,e)),eu(t.command("seed-audio").description("Generate speech or audio with Seed Audio").requiredOption("--prompt <text>","Audio description")).action(async(r,o)=>await Co(r,o,e,"seed-audio")),tu(t.command("suno").description("Generate music with Suno").requiredOption("--prompt <text>","Music description; interpreted as lyrics in custom mode")).action(async(r,o)=>await Co(r,o,e,"suno")),t}import{Command as ru}from"commander";function vi(e,t){let r=Number(e);if(!Number.isInteger(r)||r<=0)throw new d(u.INVALID_ARGUMENT,`${t} must be a positive integer.`);return r}function gr(e){g(`${e.backendTaskId??e.id} ${e.status} ${e.toolName} ${e.updatedAt}`)}function _r(e){let t={...e};return delete t.credentialFingerprint,t}function ou(e){return new d(u.TASK_RETRY_REQUIRED,`Task ${e.id} has an unknown submission outcome. Retry it with the original idempotency key.`,{retryable:!0,local_task_id:e.id,task_status:e.status,retry_command:`oiioii task retry ${e.id}`,...e.error?{last_error:e.error}:{}})}function hr(e,t,r){let o=e instanceof d?e:new d(u.SERVER_ERROR,e instanceof Error?e.message:String(e));Ke(o.code,o.message),t?_(S(r,o.code,o.message,o.details)):O(o.message),process.exitCode=1}function nu(e,t,r,o=3e4,n){let i=t.configStore??new b,s=P(T(e),i);return _e({transport:n??i.loadResolved().generationTransport??"openapi",baseUrl:r??s.baseUrl,apiKey:s.apiKey,fetch:t.fetch,timeoutMs:o})}async function Ei(e,t,r,o){if(!e.backendTaskId||ct(e))return e;let n=r.taskStore??new Y;return(await fo({client:nu(t,r,e.backendBaseUrl,o,e.backendTransport),taskStore:n,previewStore:r.previewStore,task:e})).task}function Ti(e={}){let t=new ru("task").description("Generation task management");return t.command("list").description("List recent tasks").option("--limit <count>","Maximum tasks to return","20").action((r,o)=>{let n=E(o);try{let i=vi(r.limit,"limit"),s=(e.taskStore??new Y).list(i);if(A({task_count:s.length,limit:i}),y("task","task.listed",{count:s.length,limit:i}),n)_(k("task_list",{tasks:s.map(_r),count:s.length}));else{z("Recent Tasks");for(let a of s)gr(a);s.length===0&&g("No local tasks found.")}}catch(i){hr(i,n,"task_list")}}),t.command("status").description("Get task status").argument("<task_id>","Task ID").action(async(r,o,n)=>{let i=E(n);try{let s=e.taskStore??new Y,a=s.getByAnyId(r);if(!a)throw new d(u.TASK_NOT_FOUND,`Task not found: ${r}`);a=await Ei(a,n,{...e,taskStore:s}),A({task_status:a.status}),y("task","task.status_read",{task_id:r,status:a.status}),i?_(k("task_status",{task:_r(a)})):gr(a)}catch(s){hr(s,i,"task_status")}}),t.command("retry").description("Retry an ambiguous generation submission with its original idempotency key").argument("<task_id>","Local task ID").action(async(r,o,n)=>{let i=E(n);try{let s=e.taskStore??new Y,a=s.get(r);if(!a)throw new d(u.TASK_NOT_FOUND,`Task not found: ${r}`);let c=e.configStore??new b,l=P(T(n),c);if(!a.credentialFingerprint||a.credentialFingerprint!==Ee(l.apiKey))throw new d(u.AUTH_INVALID,`The current API key does not match the credential used to submit task ${a.id}.`,{retryable:!1,local_task_id:a.id,reason:a.credentialFingerprint?"credential_mismatch":"credential_binding_missing"});let p=a.backendBaseUrl??l.baseUrl,m=a.pendingSubmission?.transport??a.backendTransport??c.loadResolved().generationTransport??"openapi",f=await ti({client:_e({transport:m,baseUrl:p,apiKey:l.apiKey,fetch:e.fetch}),taskStore:s,previewStore:e.previewStore,task:a,backendBaseUrl:p,backendTransport:m});A({task_status:f.task.status}),y("task","task.submission_retried",{local_task_id:f.task.id,backend_task_id:f.task.backendTaskId,status:f.task.status,reused:f.submission.reused}),i?_(k("task_retry",{task:_r(f.task),reused:f.submission.reused})):gr(f.task)}catch(s){hr(s,i,"task_retry")}}),t.command("wait").description("Wait for a task to complete").argument("<task_id>","Task ID").option("--timeout <seconds>","Max wait time","300").action(async(r,o,n)=>{let i=E(n);try{let s=vi(o.timeout,"timeout"),a=e.taskStore??new Y,c=Date.now()+s*1e3,l=a.getByAnyId(r);if(!l)throw new d(u.TASK_NOT_FOUND,`Task not found: ${r}`);if(!l.backendTaskId&&l.status==="submitting"&&l.pendingSubmission&&l.error)throw ou(l);for(;!ct(l)&&Date.now()<c;){let p=Math.max(1,Math.min(3e4,c-Date.now()));try{l=await Ei(l,n,{...e,taskStore:a},p)}catch(m){throw Date.now()>=c&&m instanceof d&&m.code===u.GENERATION_TIMEOUT?new d(u.TASK_TIMEOUT,`Timed out waiting for task ${r} after ${s}s.`):m}if(!ct(l)){let m=Math.max(0,c-Date.now());await new Promise(f=>setTimeout(f,Math.min(e.pollIntervalMs??2e3,m)))}}if(!ct(l))throw new d(u.TASK_TIMEOUT,`Timed out waiting for task ${r} after ${s}s.`);if(l.status==="failed"||l.status==="cancelled")throw new d(u.GENERATION_FAILED,l.error?.message??`Generation task ${l.backendTaskId??l.id} ${l.status}.`,{task_id:l.backendTaskId??l.id,local_task_id:l.id,backend_status:l.status,...l.error?{backend_error:l.error}:{}});A({task_status:l.status,timeout_seconds:s}),y("task","task.wait_completed",{task_id:r,status:l.status}),i?_(k("task_wait",{task:_r(l)})):gr(l)}catch(s){hr(s,i,"task_wait")}}),t}import{Command as iu}from"commander";import{spawn as su}from"child_process";var yr=class{baseUrl;apiKey;_fetch;logger;timeoutMs;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this._fetch=t.fetch??globalThis.fetch,this.logger=t.logger,this.timeoutMs=t.timeoutMs}async getByUri(t){if(!t||!t.startsWith("hogi://"))throw new d(u.INVALID_ARGUMENT,`Invalid hogi URI: "${t}". Expected format: hogi://image/<id> or hogi://video/<id>`);let r=encodeURIComponent(t),o=`${this.baseUrl}/genai/image-record/by-uri?uri=${r}`,n=$({source:"hogi_genai_record_client",operation:"record.get_by_uri",method:"GET",path:"/genai/image-record/by-uri"},this.logger),i;try{return await B({operation:"Generation record request",timeoutMs:this.timeoutMs,run:async s=>{if(i=await n.fetch(this._fetch,o,{method:"GET",headers:G({"x-hogi-api-key":this.apiKey}),signal:s}),i.status===400)throw new d(u.INVALID_ARGUMENT,"URI parameter is required");if(i.status===401)throw new d(u.API_KEY_INVALID,"Invalid API key",{status:401});if(i.status===404)throw new d(u.RECORD_NOT_FOUND,`No generation record found for URI: ${t}`);if(!i.ok){let c=await i.text().catch(()=>"");throw new d(u.SERVER_ERROR,`HTTP ${i.status}: ${c||i.statusText}`,{status:i.status})}let a;try{a=await i.json()}catch{throw new d(u.SERVER_ERROR,"Invalid JSON response from server")}if(!a.success||!a.data)throw new d(u.SERVER_ERROR,a.error??"Unexpected response structure from record API");return n.success(i.status,{record_type:a.data.type,success:a.data.success}),a.data}})}catch(s){if(s instanceof q){let l=new d(u.NETWORK_ERROR,s.message,{retryable:!0,timeout_ms:s.timeoutMs});throw n.failure(l,i?.status),l}if(s instanceof d)throw n.failure(s,i?.status),s;let a=s instanceof Error?s.message:String(s),c=new d(u.NETWORK_ERROR,`Network error: ${a}`);throw n.failure(c),c}}};var Ai=E;function Ci(e){let t=new b,r=P(T(e),t);return{apiKey:r.apiKey,baseUrl:r.baseUrl}}function au(e){let t=process.platform==="darwin"?"open":process.platform==="win32"?"cmd":"xdg-open",r=process.platform==="win32"?["/c","start","",e]:[e];try{return su(t,r,{detached:!0,stdio:"ignore"}).unref(),!0}catch{return!1}}function Si(){let e=new iu("record").description("GenAI record queries");return e.command("get").description("Get generation record by hogi:// URI").argument("<uri>","hogi:// URI (e.g. hogi://image/abc123)").action(async(t,r,o)=>{let n=Ai(o);try{let{apiKey:i,baseUrl:s}=Ci(o),c=await new yr({baseUrl:s,apiKey:i}).getByUri(t);if(A({resource_type:Yt(t),record_success:c.success,output_count:c.output_uris.length}),n)_(k("record_get",{id:c.id,type:c.type,workspace_id:c.workspace_id,method:c.mcp_method_name,input_args:c.input_args,output_uris:c.output_uris,success:c.success,error_message:c.error_message,agent:c.agent,created_at:c.created_at,updated_at:c.updated_at}));else{z("Generation Record"),g(` ID: ${c.id}`),g(` Type: ${c.type}`),g(` Workspace: ${c.workspace_id}`),g(` Method: ${c.mcp_method_name}`),g(` Success: ${c.success}`),c.error_message&&g(` Error: ${c.error_message}`),g(" Output URIs:");for(let l of c.output_uris)g(` - ${l}`);g(` Created: ${c.created_at}`)}}catch(i){if(i instanceof d){n?_(S("record_get",i.code,i.message,i.details)):O(i.message),process.exitCode=1;return}let s=i instanceof Error?i.message:String(i);n?_(S("record_get",u.SERVER_ERROR,s)):O(s),process.exitCode=1}}),e.command("open").description("Download and optionally open a hogi:// resource").argument("<uri>","hogi:// URI").option("-o, --output <path>","Output file or directory path").option("--filename <name>","Download filename hint passed to backend").option("--wm","Request watermarked asset").option("--no-open","Download only; do not open the local file").action(async(t,r,o)=>{let n=Ai(o);try{let{apiKey:i,baseUrl:s}=Ci(o),c=await new ht({baseUrl:s,apiKey:i}).download(t,{output:r.output,filename:r.filename,watermark:r.wm}),l=r.open!==!1,p=l?au(c.path):!1;A({resource_type:Yt(t),size_bucket:He(c.bytes),watermark:r.wm===!0,open_requested:l,opened:p}),n?_(k("record_open",{uri:c.uri,path:c.path,bytes:c.bytes,mime_type:c.mimeType,opened:p})):(U(`Downloaded: ${c.path}`),g(` URI: ${c.uri}`),g(` Bytes: ${c.bytes}`),c.mimeType&&g(` Type: ${c.mimeType}`),g(` Opened: ${p}`))}catch(i){if(i instanceof d){n?_(S("record_open",i.code,i.message,i.details)):O(i.message),process.exitCode=1;return}let s=i instanceof Error?i.message:String(i);n?_(S("record_open",u.SERVER_ERROR,s)):O(s),process.exitCode=1}}),e}import{Command as cu}from"commander";var du={preferred:"model_id",generation_flag:"--model-id",alternative:"--model <key> --variant <variant>",variant_mcp_argument:"version",points_cost_semantics:"base_cost",empty_input_capabilities:"unknown",image_reference_capability_field:"reference_image_count_max",missing_reference_image_count_max:"fallback_supported",duration_format:"exact_seconds_or_inclusive_range"},uu=[{name:"text-to-image",domain:"image",description:"Generate images from text prompts",default_model:bt,command_template:'oiioii image text --prompt "<text>" [--model <model>] [--aspect-ratio <ratio>] --json'},{name:"image-to-image",domain:"image",description:"Edit or transform an existing image with a text prompt",default_model:bt,command_template:'oiioii image edit --image <hogi-uri> --prompt "<text>" [--model <model>] --json'},{name:"text-to-video",domain:"video",description:"Generate videos from text prompts",default_model:lt,command_template:'oiioii video text --prompt "<text>" [--model <model>] [--duration <s>] --json'},{name:"image-to-video",domain:"video",description:"Animate an image into a video with a text prompt",default_model:lt,command_template:'oiioii video image --image <hogi-uri> --prompt "<text>" [--model <model>] --json'},{name:"text-to-audio",domain:"audio",description:"Generate speech or audio from a text prompt and optional references",default_model:ur,command_template:'oiioii audio seed-audio --prompt "<text>" [--audio <hogi-uri...>|--image <hogi-uri>] --json'},{name:"text-to-music",domain:"audio",description:"Generate music from a description or custom lyrics and style tags",default_model:"suno",command_template:'oiioii audio suno --prompt "<text>" [--custom --tags <style>] --json'}];function lu(){return[...uu]}function mu(e,t){let r=[];for(let o of e){let n=o.mcp_method_name.startsWith("generate_image_")?"image":o.mcp_method_name.startsWith("generate_video_")?"video":o.mcp_method_name.startsWith("generate_music_")?"audio":void 0;if(!n||t&&n!==t)continue;let i=Nt(o.mcp_method_name,n);if(!i)continue;let s=o.name??o.model;r.push({id:o.id,name:o.display_name??s??i,key:i,domain:n,variant:o.model,selector:{model_id:o.id,cli_args:["--model-id",String(o.id)]},input_capabilities:o.input_capabilities??[],input_capabilities_known:Array.isArray(o.input_capabilities),reference_image_count_min:o.reference_image_count_min??null,reference_image_count_max:o.reference_image_count_max??null,generation_input_contract:Pt({toolName:o.mcp_method_name,...o.model?{variant:o.model}:{},catalog:o}),points_cost:o.points_cost,sizes:o.sizes,aspect_ratios:o.aspect_ratios,durations:o.durations??[],description:o.description_i18n??{},tags:o.tags,members_only:o.members_only===!0})}return r}function Oi(e){let t=e;for(;t.parent;)t=t.parent;return t.opts().json===!0}function xi(e={}){let t=new cu("inspect").description("Inspect backend capabilities");return t.command("capabilities").description("List available GenAI capabilities").action((r,o)=>{let n=Oi(o),i=lu();if(A({item_count:i.length}),y("inspect","capabilities.listed",{count:i.length}),n)_(k("inspect_capabilities",{capabilities:i},[{command:"oiioii inspect models --json",description:"List available models"}]));else{z("Available Capabilities");for(let s of i)g(` ${s.name} (${s.domain})`),g(` ${s.description}`),g(` Default model: ${s.default_model}`),g(` Example: ${s.command_template}`),g("")}}),t.command("models").description("List available models").option("--domain <domain>","Filter by domain (image, video, or audio)").action(async(r,o)=>{let n=Oi(o),i=r.domain;if(i!==void 0&&i!=="image"&&i!=="video"&&i!=="audio")throw new d(u.INVALID_ARGUMENT,`Invalid model domain: "${i}". Expected image, video, or audio.`);let s=i,a=e.configStore??new b,c=P(T(o),a),p=await new fe({baseUrl:c.baseUrl,apiKey:c.apiKey,...e.fetch?{fetch:e.fetch}:{}}).listModels({includeDisplayNames:!0}),m=mu(p,s);if(A({item_count:m.length,backend_model_count:p.length,...s?{domain:s}:{}}),y("inspect","models.listed",{count:m.length,backend_model_count:p.length,source:"backend_model_catalog",...s?{domain:s}:{}}),n)_(k("inspect_models",{models:m,count:m.length,source:"backend_model_catalog",selection:du,...s?{filter:{domain:s}}:{}},[{command:"oiioii inspect capabilities --json",description:"List capabilities"}]));else{let f=s?`Available ${s} models`:"Available models";z(f);for(let h of m)g(` ${h.name} [${h.key}] (${h.domain})`),g(` Points: ${h.points_cost}${h.members_only?" \xB7 members only":""}`),h.variant&&g(` Variant: ${h.variant}`),g(` Select: --model-id ${h.id}`);g(`
31
+ Total: ${m.length} models`)}}),t}import{Command as pu}from"commander";function Di(e,t){if(t.status!=="succeeded"&&t.status!=="failed")return;let r=t.mediaType??(t.toolName.includes("video")?"video":t.toolName.includes("music")||t.toolName.includes("audio")?"audio":"image");return e.createBundle({taskId:t.id,workspaceId:t.workspaceId,command:t.command,tool:t.toolName,inputArgs:t.inputArgs,resources:t.resourceUris.map(o=>({uri:o,mime_type:at(t,r)})),status:t.status,...t.error?{error:{code:t.error.code,message:t.error.message}}:{}})}function Mi(e,t){return t.taskStore??new Y({configDir:e.getConfigDir()})}function fu(e={}){let t=e.previewStore??new Pe,r=t.getLatest();if(!r){let o=Mi(t,e).list().find(n=>n.status==="succeeded"||n.status==="failed");if(o)try{let n=Di(t,o);n&&(r={manifest:n.manifest,summary:n.summary,bundleDir:n.bundleDir})}catch{}}return r?{ok:!0,data:{bundle_id:r.manifest.bundle_id,bundle_dir:r.bundleDir,task_id:r.manifest.task_id,manifest:r.manifest,summary:r.summary}}:{ok:!1,error:{code:u.RECORD_NOT_FOUND,message:"No preview bundles found. Generate an image or video first."}}}function gu(e,t={}){let r=t.previewStore??new Pe,o=r.getBundleByTaskId(e);if(!o){let n=Mi(r,t).getByAnyId(e);if(n)try{let i=Di(r,n);i&&(o={manifest:i.manifest,summary:i.summary,bundleDir:i.bundleDir})}catch{}}return o?{ok:!0,data:{bundle_id:o.manifest.bundle_id,bundle_dir:o.bundleDir,task_id:o.manifest.task_id,manifest:o.manifest,summary:o.summary}}:{ok:!1,error:{code:u.RECORD_NOT_FOUND,message:`No preview bundle found for task ${e}.`}}}function Ni(e){let t=e;for(;t.parent;)t=t.parent;return t.opts().json===!0}function Ui(e){if(z("Preview Bundle"),g(` Bundle ID: ${e.bundle_id}`),g(` Task ID: ${e.task_id}`),g(` Status: ${e.summary.status}`),g(` Title: ${e.summary.title}`),g(` Summary: ${e.summary.human_summary}`),g(` Bundle dir: ${e.bundle_dir}`),e.manifest.resources.length>0){g(" Resources:");for(let t of e.manifest.resources)g(` - ${t.uri} (${t.mime_type??"unknown"})`)}if(e.summary.next.length>0){g(`
32
+ Next steps:`);for(let t of e.summary.next)g(` ${t.command}`)}}function Pi(e={}){let t=new pu("preview").description("Preview bundles for generation results");return t.command("latest").description("Show the most recent preview bundle").action((r,o)=>{let n=Ni(o),i=fu(e);i.ok&&i.data?(A({found:!0,artifact_count:i.data.manifest.resources.length}),n?_(k("preview_latest",{bundle_id:i.data.bundle_id,bundle_dir:i.data.bundle_dir,task_id:i.data.task_id,manifest:i.data.manifest,summary:i.data.summary},i.data.summary.next)):Ui(i.data)):(n?_(S("preview_latest",i.error.code,i.error.message)):O(i.error.message),process.exitCode=1)}),t.command("bundle").description("Show preview bundle for a specific task").argument("<task_id>","Task ID to look up").action((r,o,n)=>{let i=Ni(n),s=gu(r,e);s.ok&&s.data?(A({found:!0,artifact_count:s.data.manifest.resources.length}),i?_(k("preview_bundle",{bundle_id:s.data.bundle_id,bundle_dir:s.data.bundle_dir,task_id:s.data.task_id,manifest:s.data.manifest,summary:s.data.summary},s.data.summary.next)):Ui(s.data)):(i?_(S("preview_bundle",s.error.code,s.error.message)):O(s.error.message),process.exitCode=1)}),t}import{Command as ju}from"commander";import{basename as Ji,resolve as Hi}from"path";import{readFile as Yi,stat as Qi}from"fs/promises";import{extname as _u}from"path";var hu=new Set(["jpg","jpeg","png","gif","svg","webp","heic","heif","bmp","ico","tiff","jfif"]),yu=new Set(["mp4","webm","avi","mov","flv","mkv"]),wu=new Set(["mp3","wav","ogg","m4a","aac","flac","wma","ape"]),Ru=new Set(["txt","doc","docx","pdf","md","lrc","srt","vtt"]);function ne(e){return e.trim().toLowerCase().replace(/^\.+/,"")}function vt(e){let t=ne(e);if(hu.has(t))return"image";if(yu.has(t))return"video";if(wu.has(t))return"audio"}function Oo(e){let t=ne(e);return vt(t)??(Ru.has(t)?"document":void 0)}function xo(e){let t=ne(_u(e));return t.length>0?t:void 0}function No(e){let t=ne(e),r=vt(t);if(!r)throw new d(u.INVALID_ARGUMENT,`Unsupported file type: ${t||"<empty>"}. Supported image/video/audio extensions only.`);return r}function ku(e){return e&&typeof e=="object"?e:void 0}async function Iu(e){let t=await e.text().catch(()=>"");if(!t.trim())return{};try{return JSON.parse(t)}catch{throw new d(u.SERVER_ERROR,"Invalid JSON response from upload API",{status:e.status})}}function Li(e,t){let r=t.error?.code,o=t.error?.message??`Upload failed: HTTP ${e}`,n={status:e,code:r};return e===401?new d(u.API_KEY_INVALID,o||"Invalid API key",n):e===403||r==="workspace_forbidden"?new d(u.WORKSPACE_FORBIDDEN,o,n):e===404||r==="workspace_not_found"?new d(u.WORKSPACE_NOT_FOUND,o,n):e===413||r==="payload_too_large"?new d(u.PAYLOAD_TOO_LARGE,o,n):ze(r,o)?Je(r,o,n):["empty_file","invalid_file_name","invalid_file_type","missing_workspace_id","unsupported_asset_type"].includes(r??"")?new d(u.INVALID_ARGUMENT,o,n):new d(u.SERVER_ERROR,o,n)}function bu(e){if(e.ok===!1)throw Li(400,e);let t=ku(e.data);if(!t)throw new d(u.SERVER_ERROR,"Invalid upload API response: missing data");let r=t.asset_id,o=t.asset_uri,n=t.file_uri,i=t.type,s=t.workspace_id;if(typeof r!="string"||!r)throw new d(u.SERVER_ERROR,"Invalid upload API response: missing asset_id");if(typeof o!="string"||o!==`hogi://asset/${r}`)throw new d(u.SERVER_ERROR,"Invalid upload API response: invalid asset_uri");if(i!=="image"&&i!=="video"&&i!=="audio")throw new d(u.SERVER_ERROR,"Invalid upload API response: unsupported type");if(typeof n!="string"||!n.startsWith(`hogi://${i}/`))throw new d(u.SERVER_ERROR,"Invalid upload API response: file_uri/type mismatch");if(typeof s!="string"||!s)throw new d(u.SERVER_ERROR,"Invalid upload API response: missing workspace_id");return{assetId:r,assetUri:o,fileUri:n,type:i,workspaceId:s}}var wr=class{baseUrl;apiKey;_fetch;logger;timeoutMs;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this._fetch=t.fetch??globalThis.fetch,this.logger=t.logger,this.timeoutMs=t.timeoutMs??3e5}async uploadFile(t){let r=ne(t.fileType),o=vt(r);if(!o)throw new d(u.INVALID_ARGUMENT,`Unsupported file type: ${r||"<empty>"}`);if(!t.workspaceId.trim())throw new d(u.WORKSPACE_REQUIRED,"workspace_id is required");let n=new URLSearchParams({workspace_id:t.workspaceId,file_type:r});t.fileName&&n.set("file_name",t.fileName),t.afterAssetId&&n.set("after_asset_id",t.afterAssetId);let i=$({source:"hogi_res_upload_client",operation:"workspace.upload_asset",method:"POST",path:"/v1/workspace/uploadAsset",metadata:{workspace_id:t.workspaceId,file_type:r,type:o,bytes:t.buffer.byteLength}},this.logger),s;try{return await B({operation:"Workspace file upload request",timeoutMs:this.timeoutMs,run:async a=>{s=await i.fetch(this._fetch,`${this.baseUrl}/v1/workspace/uploadAsset?${n.toString()}`,{method:"POST",headers:G({"x-hogi-api-key":this.apiKey,"content-type":"application/octet-stream",accept:"application/json"}),body:t.buffer,signal:a});let c=await Iu(s);if(!s.ok)throw Li(s.status,c);let l=bu(c);if(l.workspaceId!==t.workspaceId)throw new d(u.SERVER_ERROR,"Upload API returned unexpected workspace_id");if(l.type!==o)throw new d(u.SERVER_ERROR,"Upload API returned unexpected asset type");return i.success(s.status,{asset_id:l.assetId,type:l.type}),l}})}catch(a){if(a instanceof q){let l=new d(u.NETWORK_ERROR,a.message,{retryable:!0,timeout_ms:a.timeoutMs});throw i.failure(l,s?.status),l}if(a instanceof d)throw i.failure(a,s?.status),a;let c=new d(u.NETWORK_ERROR,`Network error: ${a instanceof Error?a.message:String(a)}`);throw i.failure(c),c}}};var vu=100*1024*1024,Eu=50*1024*1024,Tu=10*1024*1024,Au=10*1024*1024;async function Cu(e){let t=await e.text().catch(()=>"");if(!t.trim())return{};try{return JSON.parse(t)}catch{throw new d(u.SERVER_ERROR,"Invalid JSON response from resource upload API",{status:e.status})}}function $i(e,t){let r=t.error?.code,o=t.error?.message??`Resource upload failed: HTTP ${e}`,n={status:e,code:r};return e===401?new d(u.API_KEY_INVALID,o||"Invalid API key",n):e===413||r==="payload_too_large"?new d(u.PAYLOAD_TOO_LARGE,o,n):e===429||r==="rate_limited"?new d(u.QUOTA_EXCEEDED,o,n):ze(r,o)?Je(r,o,n):e===400||e===422||r==="invalid_request"||r==="video_requires_vod"?new d(u.INVALID_ARGUMENT,o,n):new d(u.SERVER_ERROR,o,n)}function Su(e){return e==="audio"?Eu:e==="video"?Tu:e==="document"?Au:vu}function Ou(e,t){if(e.ok===!1)throw $i(400,e);let r=e.data;if(!r)throw new d(u.SERVER_ERROR,"Invalid resource upload response: missing data");let o=r.domain,n=r.file_type,i=r.file_uri,s=r.size,a=r.text_len;if(o!==void 0&&o!==t)throw new d(u.SERVER_ERROR,"Resource upload returned unexpected domain");if(typeof n!="string"||Oo(n)!==t)throw new d(u.SERVER_ERROR,"Resource upload returned unexpected file_type");if(typeof i!="string"||!i.startsWith(`hogi://${t}/`))throw new d(u.SERVER_ERROR,`Resource upload file_uri must start with hogi://${t}/`);if(typeof s!="number"||!Number.isFinite(s))throw new d(u.SERVER_ERROR,"Resource upload returned invalid size");if(a!==void 0&&(typeof a!="number"||!Number.isFinite(a)))throw new d(u.SERVER_ERROR,"Resource upload returned invalid text_len");return{domain:t,fileType:n,fileUri:i,size:s,...a===void 0?{}:{textLen:a}}}var Rr=class{baseUrl;apiKey;fetch;logger;timeoutMs;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this.fetch=t.fetch??globalThis.fetch,this.logger=t.logger,this.timeoutMs=t.timeoutMs??3e5}async uploadFile(t){let r=ne(t.fileType),o=Oo(r)??t.domainHint;if(!o)throw new d(u.INVALID_ARGUMENT,`Unsupported resource file type: ${r||"<empty>"}`);if(t.buffer.byteLength===0)throw new d(u.INVALID_ARGUMENT,"Resource file is empty");let n=Su(o);if(t.buffer.byteLength>n||o==="video"&&t.buffer.byteLength>=n)throw new d(u.PAYLOAD_TOO_LARGE,`${o} direct upload limit is ${n} bytes`);let i=new URLSearchParams({file_type:r});t.fileName&&i.set("file_name",t.fileName);let s=$({source:"hogi_resource_upload_client",operation:"res.upload_file",method:"POST",path:"/v1/res/uploadFile",metadata:{bytes:t.buffer.byteLength,domain:o,file_type:r}},this.logger),a;try{return await B({operation:"Resource upload request",timeoutMs:this.timeoutMs,run:async c=>{a=await s.fetch(this.fetch,`${this.baseUrl}/v1/res/uploadFile?${i.toString()}`,{method:"POST",headers:G({"x-hogi-api-key":this.apiKey,"content-type":"application/octet-stream",accept:"application/json"}),body:t.buffer,signal:c});let l=await Cu(a);if(!a.ok)throw $i(a.status,l);let p=Ou(l,o);if(t.validateResponseSize!==!1&&p.size!==t.buffer.byteLength)throw new d(u.SERVER_ERROR,"Resource upload returned unexpected size");return s.success(a.status,{file_uri:p.fileUri}),p}})}catch(c){if(c instanceof q){let p=new d(u.NETWORK_ERROR,c.message,{retryable:!0,timeout_ms:c.timeoutMs});throw s.failure(p,a?.status),p}if(c instanceof d)throw s.failure(c,a?.status),c;let l=new d(u.NETWORK_ERROR,`Network error: ${c instanceof Error?c.message:String(c)}`);throw s.failure(l,a?.status),l}}};import{createHash as Vu}from"crypto";import{createReadStream as Gu}from"fs";import{File as Vi}from"buffer";import*as Gi from"fs";import{open as xu}from"fs/promises";function Fi(e){return e&&typeof e=="object"?e:void 0}function Nu(e){switch(e.toLowerCase()){case"mov":return"video/quicktime";case"webm":return"video/webm";case"avi":return"video/x-msvideo";case"mkv":return"video/x-matroska";case"flv":return"video/x-flv";default:return"video/mp4"}}var Vt=class e{constructor(t,r,o,n,i){this.filePath=t;this.startOffset=o;this.name=r,this.type=i,this.size=Math.max(0,n-o)}filePath;startOffset;size;type;name;slice(t=0,r=this.size,o=this.type){let n=Math.max(0,Math.min(this.size,t<0?this.size+t:t)),i=Math.max(n,Math.min(this.size,r<0?this.size+r:r));return new e(this.filePath,this.name,this.startOffset+n,this.startOffset+i,o)}async arrayBuffer(){let t=await xu(this.filePath,"r");try{let r=Buffer.allocUnsafe(this.size),o=0;for(;o<r.byteLength;){let{bytesRead:n}=await t.read(r,o,r.byteLength-o,this.startOffset+o);if(n===0)throw new Error("Unexpected end of file while reading VOD upload slice");o+=n}return r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength)}finally{await t.close()}}};async function Uu(e){let t=Nu(e.fileType),r=Gi.openAsBlob;if(r){let o=await r(e.filePath,{type:t});return new Vi([o],e.fileName,{type:t})}return new Vt(e.filePath,e.fileName,0,e.fileSize,t)}function Du(e,t){let r=Fi(e.extra),o=["errorCode","message","requestId"],n={};for(let i of o){let s=r?.[i];typeof s=="number"&&(n[i]=s),typeof s=="string"&&(n[i]=Wi(s,t))}return Object.keys(n).length>0?JSON.stringify(n):"unknown SDK error"}function Wi(e,t){let r=e;for(let o of[t.AccessKeyId,t.SecretAccessKey,t.SessionToken])o&&(r=r.split(o).join("[redacted]"));return r.slice(0,500)}function Mu(){let e=globalThis,t=[],r=(o,n)=>{e[o]===void 0&&(e[o]=n,t.push({key:o,value:n}))};return r("File",Vi),r("navigator",{userAgent:`oiioii-cli/${process.version}`}),r("window",globalThis),e.FileReader||r("FileReader",class{result=null;error=null;onload=null;onerror=null;readAsArrayBuffer(n){n.arrayBuffer().then(i=>{this.result=i,this.onload?.({target:this})},i=>{this.error=i instanceof Error?i:new Error(String(i)),this.onerror?.({target:this})})}}),r("XMLHttpRequest",Uo),()=>{for(let{key:o,value:n}of t.reverse())e[o]===n&&delete e[o]}}function Pu(){let e=console.warn,t=(...r)=>{r[0]!=="[TTUploader]:worker not supported!"&&e(...r)};return console.warn=t,()=>{console.warn===t&&(console.warn=e)}}var kr=class{onprogress=null;listeners=new Map;addEventListener(t,r){let o=this.listeners.get(t)??new Set;o.add(r),this.listeners.set(t,o)}removeEventListener(t,r){this.listeners.get(t)?.delete(r)}dispatch(t,r){t==="progress"&&this.onprogress?.(r);for(let o of this.listeners.get(t)??[])o(r)}},Uo=class extends kr{readyState=0;status=0;statusText="";responseType="";response=null;responseText="";timeout=0;withCredentials=!1;upload=new kr;onreadystatechange=null;onload=null;onerror=null;ontimeout=null;onabort=null;method="GET";url="";headers=new Headers;responseHeaders=new Headers;controller=null;aborted=!1;open(t,r){this.method=t.toUpperCase(),this.url=r,this.changeReadyState(1)}setRequestHeader(t,r){this.headers.set(t,r)}getResponseHeader(t){return this.responseHeaders.get(t)}getAllResponseHeaders(){return[...this.responseHeaders.entries()].map(([t,r])=>`${t}: ${r}\r
33
+ `).join("")}overrideMimeType(){}abort(){this.aborted=!0,this.controller?.abort()}send(t){this.sendAsync(t??null)}changeReadyState(t){this.readyState=t,this.onreadystatechange?.(),this.dispatch("readystatechange",{})}emit(t,r){let o=this[`on${t}`];o?.(r),this.dispatch(t,r)}async sendAsync(t){this.controller=new AbortController;let r=this.timeout>0?setTimeout(()=>this.controller?.abort("timeout"),this.timeout):void 0;try{let o={method:this.method,headers:this.headers,signal:this.controller.signal},n=t instanceof Vt?await t.arrayBuffer():t;this.method!=="GET"&&this.method!=="HEAD"&&n!==null&&(o.body=n);let i=t instanceof Vt||t instanceof Blob?t.size:t instanceof ArrayBuffer?t.byteLength:0;this.upload.dispatch("progress",{lengthComputable:i>0,loaded:0,total:i});let s=await fetch(this.url,o);this.status=s.status,this.statusText=s.statusText,this.responseHeaders=s.headers,this.changeReadyState(2);let a=await s.arrayBuffer();this.changeReadyState(3),this.responseType==="arraybuffer"?this.response=a:this.responseType==="blob"?this.response=new Blob([a]):(this.responseText=new TextDecoder().decode(a),this.response=this.responseType==="json"?JSON.parse(this.responseText||"null"):this.responseText),this.upload.dispatch("progress",{lengthComputable:i>0,loaded:i,total:i}),this.changeReadyState(4),this.emit("load",{})}catch(o){this.controller.signal.aborted?this.emit(this.aborted?"abort":"timeout",{error:o}):this.emit("error",{error:o})}finally{r&&clearTimeout(r)}}};async function Lu(e){let{default:t}=await import("tt-uploader"),r=await Uu(e),o=new t({appId:e.token.appId,region:e.token.region,userId:e.userId,videoConfig:{spaceName:e.token.spaceName},noLog:!0,useCloudControl:!1,useLocalStorage:!1}),n=o.addFile({file:r,fileName:e.fileName,fileExtension:`.${e.fileType.replace(/^\./u,"")}`,stsToken:{...e.token.stsToken,CurrentTime:e.token.stsToken.CurrentTime??new Date().toISOString()},type:"video"});return await new Promise((i,s)=>{let a=!1,c=e.timeoutMs??1800*1e3,l=setTimeout(()=>{try{o.cancel(n)}catch{}m(()=>s(new d(u.TASK_TIMEOUT,`VOD direct upload timed out after ${c}ms`)))},c),p=()=>{clearTimeout(l),o.removeListener("progress",h),o.removeListener("complete",D),o.removeListener("error",N);try{o.removeFile(n)}catch{}},m=C=>{a||(a=!0,p(),C())},f=C=>C.key===n,h=C=>{f(C)&&typeof C.percent=="number"&&e.onProgress?.(Math.max(0,Math.min(99,Math.round(C.percent))))},D=C=>{if(!f(C))return;let v=Fi(C.uploadResult),I=v?.Vid??v?.vid;m(()=>{typeof I=="string"&&I?i(I):s(new d(u.SERVER_ERROR,"VOD upload completed without Vid"))})},N=C=>{f(C)&&m(()=>s(new d(u.SERVER_ERROR,`VOD direct upload failed: ${Du(C,e.token.stsToken)}`)))};o.on("progress",h),o.on("complete",D),o.on("error",N);try{o.start(n)}catch(C){let v=Wi(C instanceof Error?C.message:String(C),e.token.stsToken);m(()=>s(new d(u.SERVER_ERROR,`VOD direct upload could not start: ${v}`)))}})}var qi=async e=>{let t=Mu(),r=Pu();try{return await Lu(e)}finally{r(),t()}};function Ze(e){return e&&typeof e=="object"?e:void 0}async function Fu(e,t){let r=await e.text().catch(()=>""),o;try{o=r?JSON.parse(r):{}}catch{throw new d(u.SERVER_ERROR,`Invalid JSON response from ${t}`,{status:e.status})}let n=Ze(o)??{};if(!e.ok||n.success===!1){let i=n.error,s=typeof i=="string"?i:typeof Ze(i)?.message=="string"?Ze(i).message:`${t} failed: HTTP ${e.status}`,a={status:e.status,error:typeof i=="string"?i:void 0};throw e.status===401?new d(u.API_KEY_INVALID,s,a):e.status===403?new d(u.WORKSPACE_FORBIDDEN,s,a):e.status===404?new d(u.WORKSPACE_NOT_FOUND,s,a):e.status===413?new d(u.PAYLOAD_TOO_LARGE,s,a):e.status===400?new d(u.INVALID_ARGUMENT,s,a):new d(u.SERVER_ERROR,s,a)}return n}async function ji(e){let t=Vu("md5");for await(let r of Gu(e))t.update(r);return t.digest("hex")}function Wu(e){return new Promise(t=>setTimeout(t,e))}function Bi(e){let t=Ze(e),r=Ze(t?.stsToken);return typeof t?.appId=="number"&&Number.isFinite(t.appId)&&typeof t.spaceName=="string"&&t.spaceName.length>0&&typeof t.region=="string"&&t.region.length>0&&typeof r?.AccessKeyId=="string"&&r.AccessKeyId.length>0&&typeof r.SecretAccessKey=="string"&&r.SecretAccessKey.length>0&&typeof r.SessionToken=="string"&&r.SessionToken.length>0&&typeof r.ExpiredTime=="string"&&r.ExpiredTime.length>0}var Gt=class{baseUrl;apiKey;fetch;logger;directUpload;pollIntervalMs;timeoutMs;requestTimeoutMs;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this.fetch=t.fetch??globalThis.fetch,this.logger=t.logger,this.directUpload=t.directUpload??qi,this.pollIntervalMs=t.pollIntervalMs??3e3,this.timeoutMs=t.timeoutMs??600*1e3,this.requestTimeoutMs=t.requestTimeoutMs??3e4}headers(t=!1){return G({"x-hogi-api-key":this.apiKey,accept:"application/json",...t?{"content-type":"application/json"}:{}})}async requestJson(t,r,o,n=this.requestTimeoutMs){let i=$({source:"hogi_vod_upload_client",operation:o,method:r.method??"GET",path:new URL(t).pathname},this.logger),s;try{let a=await B({operation:o,timeoutMs:n,run:async c=>(s=await i.fetch(this.fetch,t,{...r,signal:c}),Fu(s,o))});return i.success(s.status),a}catch(a){throw i.failure(a,s?.status),a instanceof q?new d(u.NETWORK_ERROR,a.message,{retryable:!0,request_timeout:!0,timeout_ms:a.timeoutMs}):a instanceof d?a:new d(u.NETWORK_ERROR,`${o} network error: ${a instanceof Error?a.message:String(a)}`)}}async uploadFile(t){if(!t.workspaceId.trim())throw new d(u.WORKSPACE_REQUIRED,"workspace_id is required");if(!t.fileName.trim())throw new d(u.INVALID_ARGUMENT,"file_name is required");let r=ne(t.fileType);if(vt(r)!=="video")throw new d(u.INVALID_ARGUMENT,`VOD upload requires a supported video type: ${r||"<empty>"}`);if(!Number.isSafeInteger(t.fileSize)||t.fileSize<=0)throw new d(u.INVALID_ARGUMENT,"file_size must be a positive integer");if(t.fileSize>524288e3)throw new d(u.PAYLOAD_TOO_LARGE,`VOD upload limit is ${524288e3} bytes (500 MB)`);let o=$({source:"hogi_vod_upload_client",operation:"workspace.vod_upload",method:"POST",path:"/media/vod/commit_upload",metadata:{workspace_id:t.workspaceId,bytes:t.fileSize}},this.logger);try{let n=new URLSearchParams({workspaceId:t.workspaceId,fileSize:String(t.fileSize)}),s=(await this.requestJson(`${this.baseUrl}/media/vod/upload_token?${n}`,{method:"GET",headers:this.headers()},"VOD upload_token")).data;if(!Bi(s))throw new d(u.SERVER_ERROR,"Invalid VOD upload_token response");let[a,c]=await Promise.all([this.directUpload({filePath:t.filePath,fileName:t.fileName,fileSize:t.fileSize,fileType:r,token:s,userId:"oiioii-cli",onProgress:t.onProgress}),ji(t.filePath)]),l=await this.requestJson(`${this.baseUrl}/media/vod/commit_upload`,{method:"POST",headers:this.headers(!0),body:JSON.stringify({vid:a,workspaceId:t.workspaceId,originalFileName:t.fileName,fileSizeBytes:t.fileSize,contentMd5:c})},"VOD commit_upload"),p=Ze(l.data);if(typeof p?.assetId!="string"||typeof p.taskId!="string")throw new d(u.SERVER_ERROR,"Invalid VOD commit_upload response");let m=await this.waitForTranscode(p.taskId,t.workspaceId);return o.success(200,{asset_id:p.assetId,task_id:p.taskId}),{assetId:p.assetId,assetUri:`hogi://asset/${p.assetId}`,fileUri:m.outputUri,taskId:p.taskId,workspaceId:t.workspaceId}}catch(n){throw o.failure(n),n}}async uploadStandaloneFile(t){if(!t.fileName.trim())throw new d(u.INVALID_ARGUMENT,"file_name is required");let r=ne(t.fileType);if(!["mkv","mov","mp4","webm"].includes(r))throw new d(u.INVALID_ARGUMENT,`Standalone VOD upload requires mkv, mov, mp4, or webm: ${r||"<empty>"}`);if(!Number.isSafeInteger(t.fileSize)||t.fileSize<=0)throw new d(u.INVALID_ARGUMENT,"file_size must be a positive integer");if(t.fileSize>524288e3)throw new d(u.PAYLOAD_TOO_LARGE,`VOD upload limit is ${524288e3} bytes (500 MB)`);let o=$({source:"hogi_vod_upload_client",operation:"resource.vod_upload",method:"POST",path:"/media/vod/media_uploads/prepare",metadata:{bytes:t.fileSize}},this.logger);try{let n=await ji(t.filePath),i=await this.requestJson(`${this.baseUrl}/media/vod/media_uploads/prepare`,{method:"POST",headers:this.headers(!0),body:JSON.stringify({contentMd5:n,originalFileName:t.fileName,originalSizeBytes:t.fileSize,...t.forceTranscode===!0?{forceTranscode:!0}:{}})},"VOD media_upload prepare"),s=Ze(i.data);if(!s)throw new d(u.SERVER_ERROR,"Invalid VOD media_upload prepare response");if(typeof s.dedupUri=="string"){if(!s.dedupUri.startsWith("hogi://video/"))throw new d(u.SERVER_ERROR,"Invalid VOD media_upload dedup URI");return o.success(200,{dedupe_hit:!0,file_uri:s.dedupUri}),{fileUri:s.dedupUri}}let a=s.taskId;if(typeof a!="string"||!a)throw new d(u.SERVER_ERROR,"Invalid VOD media_upload task_id");if(s.resume!==!0){if(!Bi(s))throw new d(u.SERVER_ERROR,"Invalid VOD media_upload credentials");let l=await this.directUpload({filePath:t.filePath,fileName:t.fileName,fileSize:t.fileSize,fileType:r,token:s,userId:"oiioii-cli",onProgress:t.onProgress});await this.requestJson(`${this.baseUrl}/media/vod/media_uploads/${encodeURIComponent(a)}/commit`,{method:"POST",headers:this.headers(!0),body:JSON.stringify({vid:l})},"VOD media_upload commit")}let c=await this.waitForStatus(a,`${this.baseUrl}/media/vod/media_uploads/${encodeURIComponent(a)}`,"VOD media_upload status");return o.success(200,{file_uri:c.outputUri,task_id:a}),{fileUri:c.outputUri,taskId:a}}catch(n){throw o.failure(n),n}}async waitForTranscode(t,r){let o=new URLSearchParams({taskId:t,workspaceId:r});return await this.waitForStatus(t,`${this.baseUrl}/media/vod/transcode_status?${o}`,"VOD transcode_status")}async waitForStatus(t,r,o){let n=Date.now()+this.timeoutMs;for(;Date.now()<n;){let i=Math.max(1,n-Date.now()),s;try{s=await this.requestJson(r,{method:"GET",headers:this.headers()},o,Math.min(this.requestTimeoutMs,i))}catch(c){if((c instanceof d&&c.details&&typeof c.details=="object"?c.details:void 0)?.request_timeout===!0){if(Date.now()>=n)break;continue}throw c}let a=Ze(s.data);if(!a||typeof a.status!="string")throw new d(u.SERVER_ERROR,`Invalid ${o} response`);if((a.status==="completed"||a.status==="finished")&&typeof a.outputUri=="string"&&a.outputUri.startsWith("hogi://video/"))return a;if(a.status==="failed"||a.status==="cancelled")throw new d(u.SERVER_ERROR,a.errorMessage||a.errorCode||`VOD transcode ${a.status}`);await Wu(Math.min(this.pollIntervalMs,Math.max(0,n-Date.now())))}throw new d(u.TASK_TIMEOUT,`VOD transcode timed out after ${this.timeoutMs}ms`,{task_id:t})}};var Ki=E,zi=T;function Bu(e,t){let r=e.workspace;if(typeof r=="string"&&r)return r;let o=process.env.OIIOII_WORKSPACE_ID;if(o)return o;let n=t.loadResolved();if(n.defaultWorkspaceId)return n.defaultWorkspaceId;throw new d(u.WORKSPACE_REQUIRED,"No workspace set. Run: oiioii workspace set <workspace_id>")}function br(e,t){let r=`hogi://${t}/`;if(!e.startsWith(r))throw new d(u.SERVER_ERROR,`Upload API returned mismatched URI/domain: expected ${r}`)}function Zi(e,t,r,o=!1){return e==="video"&&(o||t==="mov"||r>=10485760)}async function Xi(e,t){let r;try{r=await t(e)}catch{throw new d(u.INVALID_ARGUMENT,`File not found: ${e}`)}if(!r.isFile())throw new d(u.INVALID_ARGUMENT,`Not a file: ${e}`);if(r.size<=0)throw new d(u.INVALID_ARGUMENT,`File is empty: ${e}`);return r.size}async function Ku(e,t={},r={}){let o=r.configStore??new b,n=r.readFile??Yi,i=r.stat??Qi,s=P(t,o),a=s.baseUrl,c=Hi(e.path),l=await Xi(c,i),p=e.fileType??xo(c);if(!p)throw new d(u.INVALID_ARGUMENT,`Cannot infer file type from path: ${e.path}. Use --type <ext>.`);let m=ne(p),f=No(m);if(e.vod===!0&&f!=="video")throw new d(u.INVALID_ARGUMENT,"--vod is only valid for video files");y("upload","upload.file_validated",{file_type:m,domain:f,size:l});let h=Bu(t,o),D=e.fileName??Ji(c);if(Zi(f,m,l,e.vod===!0)){if(e.afterAssetId)throw new d(u.INVALID_ARGUMENT,"--after-asset-id is not supported by the VOD upload API");let w=await new Gt({baseUrl:a,apiKey:s.apiKey,fetch:r.fetch,directUpload:r.vodDirectUpload,pollIntervalMs:r.vodPollIntervalMs,timeoutMs:r.vodTimeoutMs}).uploadFile({filePath:c,fileSize:l,fileName:D,fileType:m,workspaceId:h});return br(w.fileUri,"video"),y("upload","upload.vod_completed",{asset_id:w.assetId,task_id:w.taskId,size:l,workspace_id:h}),{uri:w.fileUri,asset_id:w.assetId,asset_uri:w.assetUri,file_uri:w.fileUri,domain:"video",file_type:m,file_name:D,size:l,attached:!0,workspace_id:h,upload_mode:"vod",task_id:w.taskId}}let C=await n(c),I=await new wr({baseUrl:a,apiKey:s.apiKey,fetch:r.fetch}).uploadFile({buffer:C,workspaceId:h,fileType:m,fileName:D,afterAssetId:e.afterAssetId});if(y("upload","upload.completed",{asset_id:I.assetId,domain:I.type,size:l,workspace_id:h}),br(I.fileUri,I.type),I.type!==f)throw new d(u.SERVER_ERROR,`Upload API returned unexpected domain: ${I.type}`);return y("upload","workspace.asset_attached",{asset_id:I.assetId,domain:I.type,workspace_id:h}),{uri:I.fileUri,asset_id:I.assetId,asset_uri:I.assetUri,file_uri:I.fileUri,domain:I.type,file_type:m,file_name:D,size:l,attached:!0,workspace_id:h,upload_mode:"direct"}}async function zu(e,t={},r={}){let o=r.configStore??new b,n=r.stat??Qi,i=P(t,o),s=Hi(e.path),a=await Xi(s,n),c=e.fileType??xo(s);if(!c)throw new d(u.INVALID_ARGUMENT,`Cannot infer file type from path: ${e.path}. Use --type <ext>.`);let l=ne(c),p=No(l);if(e.vod===!0&&p!=="video")throw new d(u.INVALID_ARGUMENT,"--vod is only valid for video files");let m=e.fileName??Ji(s),f=Zi(p,l,a,e.vod===!0);if(y("upload","upload.resource_validated",{file_type:l,domain:p,size:a,upload_mode:f?"vod":"direct"}),f){let v=await new Gt({baseUrl:i.baseUrl,apiKey:i.apiKey,fetch:r.fetch,directUpload:r.vodDirectUpload,pollIntervalMs:r.vodPollIntervalMs,timeoutMs:r.vodTimeoutMs}).uploadStandaloneFile({filePath:s,fileName:m,fileSize:a,fileType:l,forceTranscode:e.vod===!0});return br(v.fileUri,"video"),{uri:v.fileUri,file_uri:v.fileUri,domain:"video",file_type:l,file_name:m,size:a,upload_mode:"vod",...v.taskId?{task_id:v.taskId}:{}}}let h=await(r.readFile??Yi)(s),N=await new Rr({baseUrl:i.baseUrl,apiKey:i.apiKey,fetch:r.fetch}).uploadFile({buffer:h,fileType:l,fileName:m});if(N.domain!==p)throw new d(u.SERVER_ERROR,"Resource upload returned unexpected media domain");return br(N.fileUri,p),{uri:N.fileUri,file_uri:N.fileUri,domain:p,file_type:N.fileType,file_name:m,size:a,upload_mode:"direct"}}function es(e={}){let t=new ju("upload").description("Upload local files to Hogi resources");return t.command("file").description("Upload an image, video, or audio file").argument("<path>","Local file path").option("--type <ext>","File extension override, e.g. png/mp4/mp3").option("--name <name>","Original filename stored for display").option("--after-asset-id <asset_id>","Insert after an existing workspace asset").option("--vod","Force the VOD direct-upload flow for a video").option("--attach","Deprecated compatibility flag; uploads are always attached").action(async(r,o,n)=>{let i=Ki(n),s=zi(n);try{let a=await Ku({path:r,fileType:o.type,fileName:o.name,afterAssetId:o.afterAssetId,attach:o.attach===!0,vod:o.vod===!0},s,e);A({media_type:a.domain,file_extension:a.file_type,size_bucket:He(a.size),upload_mode:a.upload_mode??"direct",forced_vod:o.vod===!0,attached:a.attached}),i?_(k("upload_file",a,[{command:`oiioii record open ${a.uri} --json`,description:"Download uploaded resource"}])):(U(`Uploaded: ${a.uri}`),g(` Domain: ${a.domain}`),g(` Type: ${a.file_type}`),g(` Size: ${a.size} bytes`),g(` Mode: ${a.upload_mode??"direct"}`),a.task_id&&g(` Task: ${a.task_id}`),a.file_name&&g(` Name: ${a.file_name}`),g(` Attach: ${a.attached?`yes (${a.workspace_id})`:"no"}`))}catch(a){if(a instanceof d){i?_(S("upload_file",a.code,a.message,a.details)):O(a.message),process.exitCode=1;return}let c=a instanceof Error?a.message:String(a);i?_(S("upload_file",u.SERVER_ERROR,c)):O(c),process.exitCode=1}}),t.command("resource").description("Upload an image, video, or audio resource without a workspace").argument("<path>","Local file path").option("--type <ext>","File extension override, e.g. png/mp4/mp3").option("--name <name>","Original filename stored for display").option("--vod","Force the standalone VOD flow for a video").action(async(r,o,n)=>{let i=Ki(n),s=zi(n);try{let a=await zu({path:r,fileType:o.type,fileName:o.name,vod:o.vod===!0},s,e);A({media_type:a.domain,file_extension:a.file_type,size_bucket:He(a.size),upload_mode:a.upload_mode,forced_vod:o.vod===!0,attached:!1}),i?_(k("upload_resource",a,[{command:`oiioii record open ${a.uri} --json`,description:"Download uploaded resource"}])):(U(`Uploaded resource: ${a.uri}`),g(` Domain: ${a.domain}`),g(` Type: ${a.file_type}`),g(` Size: ${a.size} bytes`),g(` Mode: ${a.upload_mode}`),a.task_id&&g(` Task: ${a.task_id}`),a.file_name&&g(` Name: ${a.file_name}`))}catch(a){if(a instanceof d){i?_(S("upload_resource",a.code,a.message,a.details)):O(a.message),process.exitCode=1;return}let c=a instanceof Error?a.message:String(a);i?_(S("upload_resource",u.SERVER_ERROR,c)):O(c),process.exitCode=1}}),t}import{Command as Ju}from"commander";function Do(e){let t=e;for(;t.parent;)t=t.parent;return t.opts().json===!0}function Hu(e,t){if(e===void 0)return;let r=Number.parseInt(e,10);if(!Number.isInteger(r)||r<=0)throw new d(u.INVALID_ARGUMENT,`${t} must be a positive integer.`);return r}function ts(e){let t=["debug","info","warn","error"],r=["application","api"];if(e.level&&!t.includes(e.level))throw new d(u.INVALID_ARGUMENT,`Unknown log level: ${e.level}.`);if(e.category&&!r.includes(e.category))throw new d(u.INVALID_ARGUMENT,`Unknown log category: ${e.category}.`);if(e.since&&Number.isNaN(Date.parse(e.since)))throw new d(u.INVALID_ARGUMENT,`Invalid --since timestamp: ${e.since}.`);return{...e.level?{level:e.level}:{},...e.source?{source:e.source}:{},...e.category?{category:e.category}:{},...e.trace?{traceId:e.trace}:{},...e.logid?{logid:e.logid}:{},...e.requestId?{requestId:e.requestId}:{},...e.uid?{uid:e.uid}:{},...e.workspaceId?{workspaceId:e.workspaceId}:{},...e.feature?{feature:e.feature}:{},...e.since?{since:e.since}:{},...e.limit?{limit:Hu(e.limit,"--limit")}:{}}}function rs(e){return e.option("--level <level>","Filter by debug/info/warn/error").option("--source <source>","Filter by exact source name").option("--category <category>","Filter by application/api").option("--trace <trace_id>","Filter by feature trace ID").option("--logid <id>","Filter by backend chain logid").option("--request-id <id>","Filter by gateway requestId (not the local request_id)").option("--uid <id>","Filter by authenticated user ID").option("--workspace-id <id>","Filter by workspace ID").option("--feature <name>","Filter by feature name, e.g. image.text").option("--since <timestamp>","Filter entries at or after an ISO timestamp").option("--limit <count>","Maximum number of newest entries")}function os(e,t,r){let o=e instanceof d?e:new d(u.CONFIG_ERROR,e instanceof Error?e.message:String(e));t?_(S(r,o.code,o.message,o.details)):O(o.message),process.exitCode=1}function ns(e={}){let t=new Ju("logs").description("Local structured log management");return rs(t.command("list").description("List locally stored log entries")).action((r,o)=>{let n=Do(o);try{let i=e.logStore??new je,s=ts(r),a=i.list(s);if(A({entry_count:a.length,has_filter:Object.values(s).some(c=>c!==void 0)}),n)_(k("logs_list",{path:i.path,count:a.length,entries:a}));else if(a.length===0)g(`No logs found.
34
+ Path: ${i.path}`);else{z(`Logs (${a.length})`);for(let c of a){let l=c.http?.status?` status=${c.http.status}`:"",m=["logid","requestId","uid","workspaceId"].filter(f=>c[f]).map(f=>` ${f}=${c[f]}`).join("");g(`${c.timestamp} ${c.level.toUpperCase()} ${c.source} ${c.event}${l}${m}`)}}}catch(i){os(i,n,"logs_list")}}),rs(t.command("export").description("Export locally stored logs").requiredOption("-o, --output <path>","Destination JSON or JSONL file").option("--format <format>","Export format: json or jsonl","jsonl").option("--force","Overwrite an existing export file")).action((r,o)=>{let n=Do(o);try{if(r.format!=="json"&&r.format!=="jsonl")throw new d(u.INVALID_ARGUMENT,`Unknown export format: ${r.format}.`);let s=(e.logStore??new je).export({output:r.output,format:r.format,filter:ts(r),force:r.force===!0});A({format:s.format,entry_count:s.count,size_bucket:He(s.bytes)}),n?_(k("logs_export",s)):U(`Exported ${s.count} log entries to ${s.path}`)}catch(i){os(i,n,"logs_export")}}),t.command("path").description("Show the local log file path").action((r,o)=>{let n=Do(o),i=e.logStore??new je;A({path_available:!0}),n?_(k("logs_path",{path:i.path})):g(i.path)}),t}import{Command as el}from"commander";import{mkdirSync as Yu,writeFileSync as Qu}from"fs";import{dirname as Zu}from"path";function is(e){let t=String(e??"");return/[",\n]/.test(t)?`"${t.replace(/"/g,'""')}"`:t}function Xu(e,t){let r=[e.map(is).join(",")];for(let o of t)r.push(o.map(is).join(","));return`\uFEFF${r.join(`\r
35
+ `)}`}function ss(e,t,r){Yu(Zu(e),{recursive:!0}),Qu(e,Xu(t,r),"utf-8")}function vr(e,t){let r=t.configStore??new b,o=P(e,r);return{baseUrl:o.baseUrl,apiKey:o.apiKey,...t.fetch?{fetch:t.fetch}:{}}}async function tl(e){let t=await new Re(e).getBalance();return{points:t.points,tier:t.tier,...typeof t.description=="string"?{description:t.description}:{},...Array.isArray(t.disabledModels)?{disabledModels:t.disabledModels}:{}}}async function rl(e,t){return await new Re(t).getGenerationCosts(e)}async function ol(e,t){return await new Re(t).getLogs(e)}async function nl(e,t,r=5e3){let o=new Re(t),n=Math.min(e.limit??50,50),i=[],s;do{let a=await o.getLogs({...s!==void 0?{cursorId:s}:{},...e.days!==void 0?{days:e.days}:{},limit:n,...e.type?{type:e.type}:{}});if(i.push(...a.entries),i.length>=r)return i.slice(0,r);s=a.hasMore?a.nextCursor:void 0}while(s!==void 0&&i.length<r);return i}var as=["Time","Type","Points","Status","Model","Reason","TaskId"];function cs(e){return[e.createdAt,e.type,`${e.amount>=0?"+":""}${e.amount}`,e.status,e.model??"-",e.reason??"-",e.taskId??"-"]}async function il(e,t){let[r,o]=await Promise.all([new fe(t).listModels(),new Re(t).getBalance()]),n=Ut(r,{...e.modelId?{modelId:e.modelId}:{},...e.model?{model:e.model}:{},...e.variant?{variant:e.variant}:{}}),i=yt(n);st(i,{...e.duration!==void 0?{duration:e.duration}:{},...e.resolution?{resolution:e.resolution}:{}});let s=dr({pricing:n,tier:o.tier,...e.duration!==void 0?{duration:e.duration}:{},...e.resolution?{resolution:e.resolution}:{},...e.quality?{quality:e.quality}:{},...e.referenceVideoDuration!==void 0?{referenceVideoDuration:e.referenceVideoDuration}:{}});return{...s,model:be(i),available_points:o.points,sufficient:o.points>=s.estimated_points}}function Ft(e,t,r=!1){let o=Number(e);if(!Number.isFinite(o)||(r?o<0:o<=0))throw new d(u.INVALID_ARGUMENT,`${t} must be ${r?"zero or positive":"positive"}`);return o}function Er(e,t,r){let o=e instanceof d?e:new d(u.SERVER_ERROR,e instanceof Error?e.message:String(e));t?_(S(r,o.code,o.message,o.details)):O(o.message),process.exitCode=1}function ds(e={}){let t=new el("points").description("Inspect points balance, estimates, and actual generation charges");return t.command("balance").description("Show current points balance and membership tier").action(async(r,o)=>{let n=E(o);try{let i=await tl(vr(T(o),e));A({tier:i.tier}),n?_(k("points_balance",i)):(U(`Available points: ${i.points}`),g(` Tier: ${i.tier}`))}catch(i){Er(i,n,"points_balance")}}),t.command("cost").description("Query actual charged points for generated resource URIs").argument("<uris...>","1-20 hogi:// generation URIs").action(async(r,o,n)=>{let i=E(n);try{let s=await rl(r,vr(T(n),e));if(A({uri_count:r.length,charged_count:s.entries.filter(a=>a.status==="charged").length,no_charge_count:s.entries.filter(a=>a.status==="no_charge").length,not_found_count:s.entries.filter(a=>a.status==="not_found").length}),i)_(k("points_cost",s));else for(let a of s.entries)g(`${a.uri}: ${a.status}${a.consumed_points!==void 0?` \xB7 consumed ${a.consumed_points} points`:""}`),a.pricingExplanation&&g(` ${a.pricingExplanation}`)}catch(s){Er(s,i,"points_cost")}}),t.command("logs").description("List your points consumption history, newest first").option("--cursor <id>","Pagination cursor (the nextCursor from a previous page)").option("--days <n>","Only include the last N days").option("--limit <n>","Rows per page (default 20, max 50)").option("--type <type>","Filter by log type, e.g. limited_consume").option("--table","Print as an ASCII table").option("--csv <path>","Export all matching rows to a CSV file (auto-paginates; ignores --cursor/--limit paging, only --days/--type filter)").action(async(r,o)=>{let n=E(o),i=vr(T(o),e);try{let s=r.days!==void 0?Ft(r.days,"days"):void 0,a=r.limit!==void 0?Ft(r.limit,"limit"):void 0;if(r.csv){let p=await nl({...s!==void 0?{days:s}:{},...a!==void 0?{limit:a}:{},...r.type?{type:r.type}:{}},i);ss(r.csv,as,p.map(cs)),A({entry_count:p.length,export_format:"csv"}),n?_(k("points_logs_csv",{path:r.csv,rowCount:p.length})):U(`Exported ${p.length} rows to ${r.csv}`);return}let c=r.cursor!==void 0?Ft(r.cursor,"cursor"):void 0,l=await ol({...c!==void 0?{cursorId:c}:{},...s!==void 0?{days:s}:{},...a!==void 0?{limit:a}:{},...r.type?{type:r.type}:{}},i);if(A({entry_count:l.entries.length,has_more:l.hasMore}),n)_(k("points_logs",l));else if(r.table)In(as,l.entries.map(cs));else for(let p of l.entries)g(`${p.createdAt} \xB7 ${p.type} \xB7 ${p.amount>=0?"+":""}${p.amount}${p.model?` \xB7 ${p.model}`:""}`);!n&&l.hasMore&&l.nextCursor!==void 0&&g(`
36
+ More results available \u2014 rerun with --cursor ${l.nextCursor}`)}catch(s){Er(s,n,"points_logs")}}),t.command("quote").description("Estimate generation points from the current backend model catalog").option("--model-id <id>","Exact model ID from inspect models").option("--model <model>","Model key from inspect models").option("--variant <variant>","Exact model variant from inspect models; requires --model").option("--duration <seconds>","Requested generation duration").option("--resolution <resolution>","Requested output resolution").option("--quality <quality>","Requested quality tier").option("--reference-video-duration <seconds>","Referenced video duration","0").action(async(r,o)=>{let n=E(o);try{let i=await il({...r.modelId?{modelId:r.modelId}:{},...r.model?{model:r.model}:{},...r.variant?{variant:r.variant}:{},...r.duration!==void 0?{duration:Ft(r.duration,"duration")}:{},...r.resolution?{resolution:r.resolution}:{},...r.quality?{quality:r.quality}:{},referenceVideoDuration:Ft(r.referenceVideoDuration,"reference video duration",!0)},vr(T(o),e));A({...i.model.model_id!==void 0?{model_id:i.model.model_id}:{},model_key:i.model.key,...i.model.variant?{variant:i.model.variant}:{},...r.duration?{duration_seconds:Number(r.duration)}:{},...r.resolution?{resolution:r.resolution}:{},...r.quality?{quality:r.quality}:{},estimated_points:i.estimated_points,sufficient:i.sufficient}),n?_(k("points_quote",i)):(U(`Estimated points: ${i.estimated_points}`),g(` Available: ${i.available_points} \xB7 ${i.sufficient?"sufficient":"insufficient"}`),K(i.caveat))}catch(i){Er(i,n,"points_quote")}}),t}import{Command as ll}from"commander";import{createHash as sl,randomBytes as us}from"crypto";import{createServer as al}from"http";var cl=5e3;function ls(e){e.close(),e.closeAllConnections()}async function ms(e){let t=us(32).toString("base64url"),r=us(32).toString("base64url"),o=sl("sha256").update(t).digest("base64url"),n=new AbortController,i=!0,s=!1,a,c,l=()=>{},p=new Promise(V=>{l=V}),m=new URL(e.authorizationPageUrl),f=()=>{if(!i||!a)return;let V=a;i=!1,clearTimeout(I),c&&clearTimeout(c),h.close(),l({outcome:"success",exchange:V})},h=al(async(V,w)=>{w.setHeader("Cache-Control","no-store"),w.setHeader("Referrer-Policy","no-referrer"),w.setHeader("Content-Type","text/plain; charset=utf-8"),w.setHeader("Content-Security-Policy","default-src 'none'; frame-ancestors 'none'");let F=new URL(V.url??"/","http://127.0.0.1"),L=F.searchParams.get("code"),ee=F.searchParams.get("error")==="access_denied",se=h.address(),he=se&&typeof se=="object"?se.port:void 0,Ko=V.headers.host===`127.0.0.1:${he}`;if(F.pathname==="/auth/ready"){if(!(Ko&&F.searchParams.get("state")===r&&V.headers.origin===m.origin)){w.writeHead(400).end("Invalid authorization readiness callback.");return}if(w.setHeader("Access-Control-Allow-Origin",m.origin),w.setHeader("Vary","Origin"),V.method==="OPTIONS"){w.setHeader("Access-Control-Allow-Methods","POST"),w.setHeader("Access-Control-Allow-Private-Network","true"),w.writeHead(204).end();return}if(V.method!=="POST"||!i||!a){w.writeHead(409).end("Authorization is not waiting for page readiness.");return}await new Promise(jt=>{w.once("finish",jt),w.once("close",jt),w.writeHead(204).end()}),f();return}if(V.method!=="GET"||!Ko||F.pathname!=="/auth/callback"||F.searchParams.get("state")!==r||!ee&&!/^[a-f0-9]{64}$/.test(L??"")){w.writeHead(400).end("Invalid authorization callback.");return}if(!i||s){w.writeHead(409).end("This authorization request is already being processed.");return}let Cr=async(We,jt=!0)=>await new Promise($s=>{let zo=new URL(m.pathname,m.origin);zo.search=new URLSearchParams({result:We,state:r}).toString();let Jo=!1,Ho=()=>{Jo||(Jo=!0,jt&&h.close(),$s())};w.once("finish",Ho),w.once("close",Ho),w.writeHead(303,{Location:zo.href}).end()});if(ee){await Cr("cancelled"),i=!1,clearTimeout(I),l({outcome:"cancelled"});return}s=!0;try{let We=await e.exchange({code:L,verifier:t,signal:n.signal});if(!i)return;a=We,await Cr("success",!1),s=!1,i&&(c=setTimeout(f,e.pageReadyTimeoutMs??cl),c.unref())}catch(We){i&&(await Cr("error"),i=!1,clearTimeout(I),l({outcome:"error",message:We instanceof Error?We.message:String(We)}))}});h.headersTimeout=5e3,h.requestTimeout=1e4,await new Promise((V,w)=>{h.once("error",w),h.listen(0,"127.0.0.1",V)});let D=h.address();if(!D||typeof D=="string")throw new Error("Unable to create local authorization listener");let N=`http://127.0.0.1:${D.port}/auth/callback`,C=new URL(m.href);C.search=new URLSearchParams({app:e.app,challenge:o,state:r,redirectUri:N}).toString();let v=()=>{i&&(i=!1,clearTimeout(I),c&&clearTimeout(c),n.abort(),ls(h),l({outcome:"cancelled"}))},I=setTimeout(()=>{i&&(i=!1,n.abort(),c&&clearTimeout(c),ls(h),l({outcome:"expired"}))},e.timeoutMs??3e5);return I.unref(),{cancel:v,result:p,url:C.href}}var dl={en:{opening:"Opening the OiiOii authorization page\u2026",waiting:"Waiting for browser authorization\u2026",saved:"OiiOii authorization completed. The API key was saved securely.",terminalFallback:"Authorization is complete. Return to this terminal to continue.",activating:e=>`Returning to ${e}\u2026`,activationFallback:e=>`Could not open ${e} automatically. Return to ${e} manually to continue.`,browserFallback:e=>`Could not open a browser automatically. Open this URL to continue:
37
37
  ${e}`,manualUrl:e=>`Open this URL to authorize OiiOii CLI:
38
38
  ${e}`},es:{opening:"Abriendo la p\xE1gina de autorizaci\xF3n de OiiOii\u2026",waiting:"Esperando la autorizaci\xF3n en el navegador\u2026",saved:"La autorizaci\xF3n de OiiOii se complet\xF3. La clave API se guard\xF3 de forma segura.",terminalFallback:"La autorizaci\xF3n ha terminado. Vuelve a este terminal para continuar.",activating:e=>`Volviendo a ${e}\u2026`,activationFallback:e=>`No se pudo abrir ${e} autom\xE1ticamente. Vuelve a ${e} manualmente para continuar.`,browserFallback:e=>`No se pudo abrir el navegador autom\xE1ticamente. Abre esta URL para continuar:
39
39
  ${e}`,manualUrl:e=>`Abre esta URL para autorizar OiiOii CLI:
@@ -43,7 +43,7 @@ ${e}`},zh:{opening:"\u6B63\u5728\u6253\u5F00 OiiOii \u6388\u6743\u9875\u9762\u20
43
43
  ${e}`,manualUrl:e=>`\u8BF7\u6253\u5F00\u4EE5\u4E0B\u5730\u5740\u6388\u6743 OiiOii CLI\uFF1A
44
44
  ${e}`},"zh-Hant":{opening:"\u6B63\u5728\u958B\u555F OiiOii \u6388\u6B0A\u9801\u9762\u2026",waiting:"\u6B63\u5728\u7B49\u5F85\u700F\u89BD\u5668\u6388\u6B0A\u2026",saved:"OiiOii \u6388\u6B0A\u5DF2\u5B8C\u6210\uFF0CAPI Key \u5DF2\u5B89\u5168\u5132\u5B58\u3002",terminalFallback:"\u6388\u6B0A\u5DF2\u5B8C\u6210\uFF0C\u8ACB\u8FD4\u56DE\u76EE\u524D\u7D42\u7AEF\u7E7C\u7E8C\u3002",activating:e=>`\u6B63\u5728\u8FD4\u56DE ${e}\u2026`,activationFallback:e=>`\u672A\u80FD\u81EA\u52D5\u958B\u555F ${e}\uFF0C\u8ACB\u624B\u52D5\u8FD4\u56DE ${e} \u7E7C\u7E8C\u3002`,browserFallback:e=>`\u7121\u6CD5\u81EA\u52D5\u958B\u555F\u700F\u89BD\u5668\uFF0C\u8ACB\u958B\u555F\u4EE5\u4E0B\u7DB2\u5740\u7E7C\u7E8C\u6388\u6B0A\uFF1A
45
45
  ${e}`,manualUrl:e=>`\u8ACB\u958B\u555F\u4EE5\u4E0B\u7DB2\u5740\u6388\u6B0A OiiOii CLI\uFF1A
46
- ${e}`}};function Yu(e=process.env){let t=(e.OIIOII_LANG||e.LC_ALL||e.LC_MESSAGES||e.LANG||"en").toLowerCase();return/^zh[-_](?:tw|hk|mo|hant)/.test(t)?"zh-Hant":t.startsWith("zh")?"zh":t.startsWith("ja")?"ja":t.startsWith("es")?"es":"en"}function ts(e=process.env){return Hu[Yu(e)]}function Xu(e){try{let t=new URL(e);return(t.protocol==="https:"||t.protocol==="http:")&&t.pathname==="/"&&!t.search&&!t.hash}catch{return!1}}function Zu(){let e=jo(),t=new URL(e);if(t.protocol!=="https:"&&t.protocol!=="http:"||t.username||t.password||t.search||t.hash)throw new Error("The build authorization page must be an HTTP(S) URL without credentials, query, or fragment.");let r=t.protocol==="http:"&&(t.hostname==="127.0.0.1"||t.hostname==="localhost");if(t.protocol==="http:"&&!r||t.pathname!=="/auth/cli")throw new Error("The build authorization page must use HTTPS (or loopback HTTP) and end with /auth/cli.");return t.href}function el(e){return[e.codex?"codex":void 0,e.workbuddy?"workbuddy":void 0,e.kimi?"kimi":void 0,e.claudeCode?"claude-code":void 0,e.deepseek?"deepseek":void 0].filter(t=>t!==void 0)}async function tl(e,t,r,o){let n=$({source:"cli_auth",operation:"auth.exchange",method:"POST",path:"/auth/cli/exchange"}),i;try{let s=await n.fetch(o,`${e.replace(/\/$/,"")}/auth/cli/exchange`,{method:"POST",headers:V({"content-type":"application/json",accept:"application/json"}),body:JSON.stringify({code:r.code,verifier:r.verifier}),signal:r.signal});i=s.status;let a=await s.json();if(!s.ok||a.code!=="SUCCESS")throw new Error(a.error||"Unable to exchange CLI authorization");let d=a.data;if(!d||d.app!==t||typeof d.apiKey!="string"||!/^oii_sk_[A-Za-z0-9_-]{40}$/.test(d.apiKey)||typeof d.keyId!="string"||typeof d.keyPrefix!="string")throw new Error("The authorization server returned an invalid API key response");return n.success(s.status),{apiKey:d.apiKey,app:t,keyId:d.keyId,keyPrefix:d.keyPrefix}}catch(s){throw n.failure(s,i),s}}function rs(e={}){let t=new Qu("auth").description("Authentication configuration");return t.command("login").description("Authorize in a browser or persist an existing API key").option("--api-key <key>","Paste and persist an existing OiiOii API key instead of opening a browser").option("--codex","Authorize OiiOii CLI for Codex and return to the app").option("--workbuddy","Authorize OiiOii CLI for WorkBuddy and return to the app").option("--kimi","Authorize OiiOii CLI for Kimi").option("--claude-code","Authorize OiiOii CLI for Claude Code").option("--deepseek","Authorize OiiOii CLI for DeepSeek").option("--no-browser","Print the authorization URL instead of opening a browser").option("--base-url <url>","Persist the backend base URL with the API key").option("--reset-base-url","Remove the persisted backend override and use this build's default").action(async(r,o)=>{let n=A(o),i=el(r),s=r.apiKey?.trim(),a=r.apiKey!==void 0,d=i[0]??(a?void 0:"terminal"),l=(R,L,w)=>{n?_(C("auth_login",R,L,w)):S(L),process.exitCode=1};if(i.length>1){l(u.INVALID_ARGUMENT,"Choose only one target application for browser authorization.");return}if(i.length>0&&a){l(u.INVALID_ARGUMENT,"--api-key cannot be used with an application authorization option.");return}if(a&&!s){l(u.INVALID_ARGUMENT,"--api-key must not be empty.");return}let p=O(o).baseUrl,m=(r.baseUrl??(typeof p=="string"?p:void 0))?.trim();if(m&&r.resetBaseUrl){l(u.INVALID_ARGUMENT,"--base-url and --reset-base-url cannot be used together.");return}if(m&&!Xu(m)){l(u.INVALID_ARGUMENT,"--base-url must be an HTTP(S) origin without a path, query, or fragment.");return}let f=e.configStore??new b,h=vt().replace(/\/$/,""),U=process.env.OIIOII_BASE_URL?.trim().replace(/\/$/,""),x=m?.replace(/\/$/,"")||U||(r.resetBaseUrl?h:f.load().baseUrl.replace(/\/$/,""));if(d){if(x!==h){l(u.CONFIG_ERROR,`Browser authorization must use this build's backend (${h}). Run 'oiioii auth login --reset-base-url' after removing OIIOII_BASE_URL, or use '--api-key' with a custom backend.`);return}let R=ts(),L;try{let w=await(e.createBrowserAuthorization??Qi)({app:d,authorizationPageUrl:Zu(),exchange:async oe=>{let pe=await tl(x,d,oe,e.fetch??globalThis.fetch);return f.update({apiKey:pe.apiKey,baseUrl:x},{resetBaseUrl:r.resetBaseUrl===!0}),pe}});L=w.cancel,n||g(R.opening);let G=r.browser===!1?!1:await(e.openBrowser??Zi)(w.url);r.browser===!1?K(R.manualUrl(w.url)):G?n||g(R.waiting):K(R.browserFallback(w.url));let M=await w.result;if(M.outcome!=="success"){let oe=M.outcome==="cancelled"?"Authorization was cancelled.":M.outcome==="expired"?"Authorization expired. Run the login command again.":M.outcome==="error"?M.message:"Authorization failed.";l(M.outcome==="expired"?u.AUTH_TIMEOUT:u.AUTH_INVALID,oe);return}let Z=d==="terminal"?{requested:!1,supported:!1}:await(e.activateApp??es)(d);n?_(I("auth_login",{activated:Z.requested,activation_supported:Z.supported,app:d,authenticated:!0,base_url:f.load().baseUrl,config_file:f.getConfigPath()})):(N(R.saved),d==="terminal"?g(R.terminalFallback):Z.requested?g(R.activating(To[d])):K(R.activationFallback(To[d])))}catch(w){L?.(),l(u.NETWORK_ERROR,w instanceof Error?w.message:String(w))}return}f.update({apiKey:s,...m?{baseUrl:m.replace(/\/$/,"")}:{}},{resetBaseUrl:r.resetBaseUrl===!0});let T=f.load(),k=f.getConfigPath();n?_(I("auth_login",{authenticated:!0,base_url:T.baseUrl,config_file:k})):(N(`API key saved to ${k}`),g(` Base URL: ${T.baseUrl}`))}),t.command("status").description("Check whether authentication is configured without exposing the API key").action((r,o)=>{let n=A(o),i=e.configStore??new b,s=!!process.env.OIIOII_API_KEY?.trim(),a=!!i.load().apiKey,d=s?"environment":a?"config":null,l=d!==null;n?_(I("auth_status",{authenticated:l,credential_source:d,config_file:i.getConfigPath()})):d==="environment"?N("Authenticated through OIIOII_API_KEY."):d==="config"?N("Authenticated through local configuration."):K("Not authenticated. Run 'oiioii auth login'."),l||(process.exitCode=1)}),t.command("logout").description("Remove locally persisted authentication without exposing the API key").action((r,o)=>{let n=A(o),i=e.configStore??new b,s=i.removeApiKey(),a=!!process.env.OIIOII_API_KEY?.trim();n?_(I("auth_logout",{authenticated:a,local_credentials_removed:s,environment_override:a,config_file:i.getConfigPath()})):(s?N("Local authentication removed."):g("No local authentication was configured."),a&&K("OIIOII_API_KEY is still set for this process; unset it to disable effective authentication."))}),t}import{Command as cl}from"commander";import{randomUUID as as}from"crypto";import{readFileSync as ul,statSync as ll}from"fs";import{fetch as rl}from"undici";function X(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Xe(e){return typeof e=="string"&&e.length>0?e:void 0}var Ao=new Set(["idempotency_conflict","idempotency_state_invalid","invalid_cursor","invalid_request","invalid_resource_uri","member_asset_not_found","member_not_visible_to_subgroup","missing_face_image","missing_idempotency_key","request_in_progress","subgroup_not_found"]),ns=new Set(["asset_not_found","collection_asset_not_found","collection_not_found"]);function os(e){let t=X(e.details)&&typeof e.details.backend_code=="string"?e.details.backend_code:void 0;if(!t)return e;let r=Ao.has(t)?u.INVALID_ARGUMENT:ns.has(t)?u.RECORD_NOT_FOUND:e.code;return r===e.code?e:new c(r,e.message,e.details)}function ol(e,t,r){if(!X(e))throw new c(u.SERVER_ERROR,`Invalid ${t} asset at index ${r}`);let o=t==="role"?"role":t==="scene"?"scene":"item",n=e.documentId,i=e.uri,s=e[`${o}Name`];if(typeof n!="string"||!n||typeof i!="string"||!i||typeof s!="string")throw new c(u.SERVER_ERROR,`Invalid ${t} asset at index ${r}`);let a;try{a=we(i)}catch{throw new c(u.SERVER_ERROR,`Invalid ${t} asset URI at index ${r}`)}if(a.assetType!==t||a.assetId!==n)throw new c(u.SERVER_ERROR,`Mismatched ${t} asset identity at index ${r}`);return{asset_id:n,asset_uri:i,type:t,name:s,...Xe(e[`${o}Description`])?{description:String(e[`${o}Description`])}:{},...Xe(e[t==="role"?"roleMainImageUri":`${o}ImageUri`])?{image_uri:String(e[t==="role"?"roleMainImageUri":`${o}ImageUri`])}:{},...Xe(e.createdAt)?{created_at:String(e.createdAt)}:{}}}function nl(e,t){if(!X(e)||e.ok!==!0||!X(e.data)||!Array.isArray(e.data.items)||typeof e.data.hasMore!="boolean")throw new c(u.SERVER_ERROR,`Invalid ${t} asset library response`);let r=Xe(e.data.nextCursor);if(e.data.hasMore&&!r)throw new c(u.SERVER_ERROR,`Invalid ${t} asset library response: missing next cursor`);return{type:t,items:e.data.items.map((o,n)=>ol(o,t,n)),has_more:e.data.hasMore,...r?{next_cursor:r}:{}}}function il(e){if(!X(e)||e.ok!==!0||!X(e.data)||e.data.type!=="collection"||!Array.isArray(e.data.items)||typeof e.data.has_more!="boolean")throw new c(u.SERVER_ERROR,"Invalid collection asset library response");let t=Xe(e.data.next_cursor);if(e.data.has_more&&!t)throw new c(u.SERVER_ERROR,"Invalid collection asset library response: missing next cursor");return{type:"collection",items:e.data.items.map((o,n)=>{if(!X(o)||o.type!=="collection"||o.asset_uri!==null||typeof o.asset_id!="string"||!o.asset_id||typeof o.name!="string"||!o.name||!Number.isInteger(o.member_count)||Number(o.member_count)<0||o.description!==void 0&&typeof o.description!="string"||o.image_uri!==void 0&&(typeof o.image_uri!="string"||!o.image_uri.startsWith("hogi://image/"))||o.subgroup_id!==void 0&&o.subgroup_id!==null&&typeof o.subgroup_id!="string"||o.created_at!==void 0&&typeof o.created_at!="string"||o.updated_at!==void 0&&typeof o.updated_at!="string")throw new c(u.SERVER_ERROR,`Invalid collection asset at index ${n}`);return o}),has_more:e.data.has_more,...t?{next_cursor:t}:{}}}function sl(e,t){if(!X(e)||e.ok!==!0||!X(e.data)||e.data.collection_id!==t||!Array.isArray(e.data.items)||typeof e.data.has_more!="boolean")throw new c(u.SERVER_ERROR,"Invalid collection members response");let r=Xe(e.data.next_cursor);if(e.data.has_more&&!r)throw new c(u.SERVER_ERROR,"Invalid collection members response: missing next cursor");let o=e.data.items.map((n,i)=>{if(!X(n)||n.type!=="role"&&n.type!=="scene"&&n.type!=="item"&&n.type!=="group"||typeof n.asset_id!="string"||!n.asset_id||typeof n.asset_ref!="string"||!n.asset_ref||typeof n.name!="string"||!n.name||n.description!==void 0&&typeof n.description!="string"||n.image_uri!==void 0&&(typeof n.image_uri!="string"||!n.image_uri.startsWith("hogi://image/"))||n.state!==null&&typeof n.state!="string"||n.subgroup_id!==null&&typeof n.subgroup_id!="string"||typeof n.created_at!="string"||!n.created_at||n.updated_at!==void 0&&typeof n.updated_at!="string")throw new c(u.SERVER_ERROR,`Invalid collection member at index ${i}`);let s=n.type==="group"?`group:${n.asset_id}`:`hogi://${n.type}_asset/${n.asset_id}`;if(n.asset_ref!==s)throw new c(u.SERVER_ERROR,`Mismatched collection member identity at index ${i}`);return n});return{collection_id:t,items:o,has_more:e.data.has_more,...r?{next_cursor:r}:{}}}function al(e,t,r){if(!X(e)||e.ok!==!0||!X(e.data))throw new c(u.SERVER_ERROR,"Invalid asset creation response");let o=e.data,n=t==="collection"?o.asset_uri===null:typeof o.asset_uri=="string"&&o.asset_uri.length>0;if(o.type!==t||typeof o.asset_id!="string"||!o.asset_id||typeof o.name!="string"||typeof o.reused!="boolean"||!n||o.member_count!==void 0&&(typeof o.member_count!="number"||!Number.isInteger(o.member_count)||o.member_count<0))throw new c(u.SERVER_ERROR,"Invalid asset creation response");if(t!=="collection"){let i;try{i=we(o.asset_uri)}catch{throw new c(u.SERVER_ERROR,"Invalid created asset URI")}if(i.assetType!==t||i.assetId!==o.asset_id)throw new c(u.SERVER_ERROR,"Mismatched created asset identity")}return{asset_id:o.asset_id,asset_uri:o.asset_uri,type:t,name:o.name,reused:o.reused,idempotency_key:r,...Xe(o.description)?{description:String(o.description)}:{},...Xe(o.image_uri)?{image_uri:String(o.image_uri)}:{},...typeof o.member_count=="number"?{member_count:o.member_count}:{},...typeof o.subgroup_id=="string"||o.subgroup_id===null?{subgroup_id:o.subgroup_id}:{}}}function dl(e,t,r){if(!X(e)||e.ok!==!0||!X(e.data)||e.data.type!==t||e.data.asset_id!==r||e.data.name!==void 0&&typeof e.data.name!="string"||e.data.state!==void 0&&e.data.state!=="trash"||e.data.trash_time!==void 0&&typeof e.data.trash_time!="string"||e.data.updated_at!==void 0&&typeof e.data.updated_at!="string"||e.data.member_count!==void 0&&(!Number.isInteger(e.data.member_count)||Number(e.data.member_count)<0)||e.data.expression_image_uri!==void 0&&(typeof e.data.expression_image_uri!="string"||!e.data.expression_image_uri.startsWith("hogi://image/"))||e.data.reused!==void 0&&typeof e.data.reused!="boolean")throw new c(u.SERVER_ERROR,"Invalid asset library mutation response");return e.data}var lt=class{baseUrl;apiKey;fetch;logger;timeoutMs;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this.fetch=t.fetch??rl,this.logger=t.logger,this.timeoutMs=t.timeoutMs??3e4}async list(t,r={}){let o=t==="collection"?"/v1/library/collections":`/v1/${t}/listAssets`,n=new URLSearchParams;r.keyword&&n.set("keyword",r.keyword),r.cursor&&n.set("cursor",r.cursor),r.limit!==void 0&&n.set("pageSize",String(r.limit));let i=$({source:"hogi_asset_library_client",operation:"asset_library.list",method:"GET",path:o,metadata:{asset_type:t,has_keyword:!!r.keyword,page_size:r.limit}},this.logger),s=new AbortController,a=setTimeout(()=>s.abort(),this.timeoutMs);typeof a=="object"&&"unref"in a&&a.unref();let d;try{if(d=await i.fetch(this.fetch,`${this.baseUrl}${o}${n.size?`?${n}`:""}`,{method:"GET",headers:V({authorization:`Bearer ${this.apiKey}`,accept:"application/json"}),signal:s.signal}),!d.ok)throw await Oe(d);let l=await d.json().catch(()=>{}),p=t==="collection"?il(l):nl(l,t);return i.success(d.status,{asset_type:t,count:p.items.length,has_more:p.has_more}),p}catch(l){let p=xe(l)?new c(u.NETWORK_ERROR,`Asset library request timed out after ${this.timeoutMs}ms`,{retryable:!0}):l instanceof c?os(l):new c(u.NETWORK_ERROR,l instanceof Error?l.message:String(l),{retryable:!0});throw i.failure(p,d?.status),p}finally{clearTimeout(a)}}async listCollectionMembers(t,r={}){let o=`/v1/library/collections/${encodeURIComponent(t)}/members`,n=new URLSearchParams;r.type&&n.set("type",r.type),r.keyword&&n.set("keyword",r.keyword),r.cursor&&n.set("cursor",r.cursor),r.limit!==void 0&&n.set("pageSize",String(r.limit));let i=$({source:"hogi_asset_library_client",operation:"asset_library.collection.members.list",method:"GET",path:o,metadata:{asset_type:r.type,has_keyword:!!r.keyword,page_size:r.limit}},this.logger),s=new AbortController,a=setTimeout(()=>s.abort(),this.timeoutMs);typeof a=="object"&&"unref"in a&&a.unref();let d;try{if(d=await i.fetch(this.fetch,`${this.baseUrl}${o}${n.size?`?${n}`:""}`,{method:"GET",headers:V({authorization:`Bearer ${this.apiKey}`,accept:"application/json"}),signal:s.signal}),!d.ok)throw await Oe(d);let l=sl(await d.json().catch(()=>{}),t);return i.success(d.status,{count:l.items.length,has_more:l.has_more}),l}catch(l){let p=xe(l)?new c(u.NETWORK_ERROR,`Collection members request timed out after ${this.timeoutMs}ms`,{retryable:!0}):l instanceof c?os(l):new c(u.NETWORK_ERROR,l instanceof Error?l.message:String(l),{retryable:!0});throw i.failure(p,d?.status),p}finally{clearTimeout(a)}}async create(t,r){let o="/v1/library/assets",n=$({source:"hogi_asset_library_client",operation:"asset_library.create",method:"POST",path:o,metadata:{asset_type:t.type}},this.logger),i=new AbortController,s=setTimeout(()=>i.abort(),this.timeoutMs);typeof s=="object"&&"unref"in s&&s.unref();let a;try{if(a=await n.fetch(this.fetch,`${this.baseUrl}${o}`,{method:"POST",headers:V({authorization:`Bearer ${this.apiKey}`,accept:"application/json","content-type":"application/json","idempotency-key":r}),body:JSON.stringify(t),signal:i.signal}),!a.ok)throw await Oe(a);let d=al(await a.json().catch(()=>{}),t.type,r);return n.success(a.status,{asset_type:t.type,asset_id:d.asset_id,reused:d.reused}),d}catch(d){let l=xe(d)?new c(u.NETWORK_ERROR,`Asset creation timed out after ${this.timeoutMs}ms`,{retryable:!0,idempotency_key:r}):d instanceof c?new c(X(d.details)&&typeof d.details.backend_code=="string"&&Ao.has(d.details.backend_code)?u.INVALID_ARGUMENT:d.code,d.message,{...X(d.details)?d.details:{},idempotency_key:r}):new c(u.NETWORK_ERROR,d instanceof Error?d.message:String(d),{retryable:!0,idempotency_key:r});throw n.failure(l,a?.status),l}finally{clearTimeout(s)}}async mutate(t,r,o,n,i,s,a=this.timeoutMs,d){let l=$({source:"hogi_asset_library_client",operation:t,method:r,path:o,metadata:{asset_type:n}},this.logger),p=new AbortController,m=setTimeout(()=>p.abort(),a);typeof m=="object"&&"unref"in m&&m.unref();let f;try{if(f=await l.fetch(this.fetch,`${this.baseUrl}${o}`,{method:r,headers:V({authorization:`Bearer ${this.apiKey}`,accept:"application/json",...s===void 0?{}:{"content-type":"application/json"},...d}),...s===void 0?{}:{body:JSON.stringify(s)},signal:p.signal}),!f.ok)throw await Oe(f);let h=dl(await f.json().catch(()=>{}),n,i);return l.success(f.status,{asset_type:n,asset_id:i}),h}catch(h){let U=xe(h)?new c(u.NETWORK_ERROR,`Asset library ${t} timed out after ${a}ms`,{retryable:!0}):h instanceof c?new c(X(h.details)&&typeof h.details.backend_code=="string"?Ao.has(h.details.backend_code)?u.INVALID_ARGUMENT:ns.has(h.details.backend_code)?u.RECORD_NOT_FOUND:h.code:h.code,h.message,h.details):new c(u.NETWORK_ERROR,h instanceof Error?h.message:String(h),{retryable:!0});throw l.failure(U,f?.status),U}finally{clearTimeout(m)}}async update(t,r){let{type:o,...n}=r;return this.mutate("asset_library.update","POST",`/v1/library/assets/${o}/${encodeURIComponent(t)}`,o,t,n)}async delete(t,r){return this.mutate("asset_library.delete","DELETE",`/v1/library/assets/${r}/${encodeURIComponent(t)}`,r,t)}async addCollectionMembers(t,r){return this.mutate("asset_library.collection.add_members","POST",`/v1/library/collections/${encodeURIComponent(t)}/members`,"collection",t,{members:r})}async removeCollectionMembers(t,r){return this.mutate("asset_library.collection.remove_members","POST",`/v1/library/assets/collection/${encodeURIComponent(t)}`,"collection",t,{remove_members:r})}async generateExpression(t,r,o){return{...await this.mutate("asset_library.expression.generate","POST",`/v1/library/assets/role/${encodeURIComponent(t)}/expression`,"role",t,o?{reference_image_uri:o}:{},3e5,{"idempotency-key":r}),idempotency_key:r}}};function ds(e){if(e==="role"||e==="scene"||e==="item"||e==="collection")return e;throw new c(u.INVALID_ARGUMENT,`Invalid asset type: ${e}. Expected role, scene, item, or collection.`)}function Oo(e){return ds(e)}function bt(e,t){let r=t.trim();if(!r||r.length>200)throw new c(u.INVALID_ARGUMENT,"Asset ID must contain 1-200 characters.");if(e==="collection"||!r.startsWith("hogi://")){if(!/^[A-Za-z0-9_-]+$/.test(r))throw new c(u.INVALID_ARGUMENT,`Invalid ${e} asset ID: ${t}`);return r}let o=we(r);if(o.assetType!==e)throw new c(u.INVALID_ARGUMENT,`Asset URI type does not match ${e}.`);return o.assetId}function Co(e){let t=Number(e);if(!Number.isInteger(t)||t<1||t>100)throw new c(u.INVALID_ARGUMENT,"--limit must be an integer between 1 and 100.");return t}async function is(e,t,r={}){let o=ds(e.type),n=e.keyword?.trim();if(e.keyword!==void 0&&!n)throw new c(u.INVALID_ARGUMENT,"Search keyword must not be empty.");if(n&&o==="collection"&&n.length>100)throw new c(u.INVALID_ARGUMENT,"Collection search keyword must contain at most 100 characters.");if(n&&n.length>200)throw new c(u.INVALID_ARGUMENT,"Search keyword must contain at most 200 characters.");if(e.cursor&&e.cursor.length>1e3)throw new c(u.INVALID_ARGUMENT,"Pagination cursor is too long.");let i=r.configStore??new b,s=P(t,i),a=await new lt({baseUrl:s.baseUrl,apiKey:s.apiKey,...r.fetch?{fetch:r.fetch}:{}}).list(o,{...n?{keyword:n}:{},...e.cursor?{cursor:e.cursor}:{},...e.limit!==void 0?{limit:e.limit}:{}});return y("library",n?"assets.searched":"assets.listed",{asset_type:o,count:a.items.length,has_more:a.has_more}),a}var ml=new Set(["name","description","idempotencyKey"]),pl={role:new Set(["faceIdImage","emoImage","mainImage","threeViewImage","voice","epithet","feature","personality","voiceStyle"]),scene:new Set(["image","multiViewImage"]),item:new Set(["image"]),collection:new Set(["coverImage","member","subgroupId"])};function fl(e,t){let r=Object.entries(t).filter(([,i])=>i!==void 0).map(([i])=>i),o=t.input?new Set(["input","idempotencyKey"]):new Set([...ml,...pl[e]]),n=r.filter(i=>!o.has(i));if(n.length)throw new c(u.INVALID_ARGUMENT,`Unsupported option for ${e}: --${n[0].replace(/[A-Z]/g,i=>`-${i.toLowerCase()}`)}.`)}function xo(e){if(e.startsWith("group:")){let r=e.slice(6).trim();if(!r||r.length>200)throw new c(u.INVALID_ARGUMENT,`Invalid collection member: ${e}`);return{type:"group",asset_id:r}}let t=we(e);return{type:t.assetType,asset_id:t.assetId}}function gl(e){if(e==="role"||e==="scene"||e==="item"||e==="group")return e;throw new c(u.INVALID_ARGUMENT,`Invalid collection member type: ${e}. Expected role, scene, item, or group.`)}function mt(e){let t=Object.entries(e).filter(r=>!!r[1]);return t.length?Object.fromEntries(t):void 0}function _l(e,t){if(fl(e,t),t.input){let o;try{if(ll(t.input).size>1024*1024)throw new Error("file exceeds 1 MiB");o=JSON.parse(ul(t.input,"utf8"))}catch(n){throw new c(u.INVALID_ARGUMENT,`Unable to read --input JSON: ${n instanceof Error?n.message:String(n)}`)}if(!o||typeof o!="object"||Array.isArray(o)||o.type!==e)throw new c(u.INVALID_ARGUMENT,`--input must contain an object with type "${e}".`);return o}let r=t.name?.trim();if(!r)throw new c(u.INVALID_ARGUMENT,"--name is required unless --input is used.");return e==="role"?{type:e,name:r,...t.description!==void 0?{description:t.description}:{},...mt({face_id_image_uri:t.faceIdImage,emo_image_uri:t.emoImage,main_image_uri:t.mainImage,three_view_image_uri:t.threeViewImage,voice_uri:t.voice})?{media:mt({face_id_image_uri:t.faceIdImage,emo_image_uri:t.emoImage,main_image_uri:t.mainImage,three_view_image_uri:t.threeViewImage,voice_uri:t.voice})}:{},...mt({epithet:t.epithet,feature:t.feature,personality:t.personality,voice_style:t.voiceStyle})?{attributes:mt({epithet:t.epithet,feature:t.feature,personality:t.personality,voice_style:t.voiceStyle})}:{}}:e==="scene"?{type:e,name:r,...t.description!==void 0?{description:t.description}:{},...mt({image_uri:t.image,multi_view_image_uri:t.multiViewImage})?{media:mt({image_uri:t.image,multi_view_image_uri:t.multiViewImage})}:{}}:e==="item"?{type:e,name:r,...t.description!==void 0?{description:t.description}:{},...t.image?{media:{image_uri:t.image}}:{}}:{type:e,name:r,...t.description!==void 0?{description:t.description}:{},...t.coverImage?{cover_image_uri:t.coverImage}:{},members:(t.member??[]).map(xo),...t.subgroupId?{subgroup_id:t.subgroupId}:{}}}async function hl(e,t,r={}){let o=Oo(e.type),n=_l(o,e.options),i=e.options.idempotencyKey?.trim();if(e.options.idempotencyKey!==void 0&&!i)throw new c(u.INVALID_ARGUMENT,"--idempotency-key must not be empty.");let s=i??as();if(s.length>200)throw new c(u.INVALID_ARGUMENT,"--idempotency-key must contain at most 200 characters.");let a=r.configStore??new b,d=P(t,a),l=await new lt({baseUrl:d.baseUrl,apiKey:d.apiKey,...r.fetch?{fetch:r.fetch}:{}}).create(n,s);return y("library","asset.created",{asset_type:o,asset_id:l.asset_id,reused:l.reused}),l}function Vt(e,t){let r=P(e,t.configStore??new b);return new lt({baseUrl:r.baseUrl,apiKey:r.apiKey,...t.fetch?{fetch:t.fetch}:{}})}function yl(e,t){let r=t.find(([s,a])=>e[s]!==void 0&&e[a]===!0);if(!r)return;let[o,n]=r,i=s=>`--${String(s).replace(/[A-Z]/g,a=>`-${a.toLowerCase()}`)}`;throw new c(u.INVALID_ARGUMENT,`${i(o)} cannot be used with ${i(n)}.`)}function wl(e,t){let r=new Set(["name","description"]),o={role:new Set(["faceIdImage","emoImage","mainImage","threeViewImage","voice","clearFaceIdImage","clearEmoImage","clearMainImage","clearThreeViewImage","clearVoice","epithet","feature","personality","voiceStyle"]),scene:new Set(["image","multiViewImage","clearImage","clearMultiViewImage"]),item:new Set(["image","clearImage"]),collection:new Set(["coverImage","clearCoverImage"])},n=Object.entries(t).find(([a,d])=>d!==void 0&&!r.has(a)&&!o[e].has(a));if(n)throw new c(u.INVALID_ARGUMENT,`Unsupported option for ${e}: --${n[0].replace(/[A-Z]/g,a=>`-${a.toLowerCase()}`)}.`);yl(t,[["faceIdImage","clearFaceIdImage"],["emoImage","clearEmoImage"],["mainImage","clearMainImage"],["threeViewImage","clearThreeViewImage"],["voice","clearVoice"],["image","clearImage"],["multiViewImage","clearMultiViewImage"],["coverImage","clearCoverImage"]]);let i=t.name?.trim();if(t.name!==void 0&&!i)throw new c(u.INVALID_ARGUMENT,"--name must not be empty.");let s={type:e,...i!==void 0?{name:i}:{},...t.description!==void 0?{description:t.description}:{}};return e==="role"?{...s,type:e,media:{...t.clearFaceIdImage?{face_id_image_uri:null}:t.faceIdImage?{face_id_image_uri:t.faceIdImage}:{},...t.clearEmoImage?{emo_image_uri:null}:t.emoImage?{emo_image_uri:t.emoImage}:{},...t.clearMainImage?{main_image_uri:null}:t.mainImage?{main_image_uri:t.mainImage}:{},...t.clearThreeViewImage?{three_view_image_uri:null}:t.threeViewImage?{three_view_image_uri:t.threeViewImage}:{},...t.clearVoice?{voice_uri:null}:t.voice?{voice_uri:t.voice}:{}},attributes:mt({epithet:t.epithet,feature:t.feature,personality:t.personality,voice_style:t.voiceStyle})}:e==="scene"?{...s,type:e,media:{...t.clearImage?{image_uri:null}:t.image?{image_uri:t.image}:{},...t.clearMultiViewImage?{multi_view_image_uri:null}:t.multiViewImage?{multi_view_image_uri:t.multiViewImage}:{}}}:e==="item"?{...s,type:e,media:{...t.clearImage?{image_uri:null}:t.image?{image_uri:t.image}:{}}}:{...s,type:e,...t.clearCoverImage?{cover_image_uri:null}:t.coverImage?{cover_image_uri:t.coverImage}:{}}}function Gt(e,t,r){if(t)return _(I(r,e));W(`${e.type} asset ${e.state==="trash"?"moved to trash":"updated"}`),g(` ${e.name??e.asset_id} ${e.asset_id}`),e.expression_image_uri&&g(` ${e.expression_image_uri}`)}function ss(e,t,r){if(E({asset_type:e.type,asset_count:e.items.length,has_more:e.has_more}),t){_(I(r,e));return}W(`${e.type} assets (${e.items.length})`);for(let o of e.items)g(` ${o.name||"(unnamed)"} ${o.asset_uri??o.asset_id}`),o.description&&g(` ${o.description}`);e.next_cursor&&g(`
47
- Next cursor: ${e.next_cursor}`)}function Rl(e,t){if(E({asset_type:"collection",asset_count:e.items.length,has_more:e.has_more}),t){_(I("asset_library_collection_members",e));return}W(`collection members (${e.items.length})`);for(let r of e.items)g(` ${r.name} ${r.asset_ref}`),r.description&&g(` ${r.description}`);e.next_cursor&&g(`
48
- Next cursor: ${e.next_cursor}`)}function Il(e,t){if(E({asset_type:e.type,asset_id:e.asset_id,reused:e.reused}),t)return _(I("asset_library_create",e));W(`${e.type} asset created${e.reused?" (reused)":""}`),g(` ${e.name} ${e.asset_uri??e.asset_id}`),g(` Idempotency key: ${e.idempotency_key}`)}function Ve(e,t,r){let o=e instanceof c?e:new c(u.SERVER_ERROR,e instanceof Error?e.message:String(e));t?_(C(r,o.code,o.message,o.details)):S(o.message),process.exitCode=1}function So(e){return e.option("--cursor <cursor>","Pagination cursor returned by the previous page").option("--limit <count>","Page size (1-100)","20")}function cs(e={}){let t=new cl("library").description("Create, query, update, and organize reusable assets");return So(t.command("list").description("List assets by type").argument("<type>","Asset type: role, scene, item, or collection")).action(async(r,o,n)=>{let i=A(n);try{ss(await is({type:r,cursor:o.cursor,limit:Co(o.limit)},O(n),e),i,"asset_library_list")}catch(s){Ve(s,i,"asset_library_list")}}),So(t.command("search").description("Search asset names and descriptions by type").argument("<type>","Asset type: role, scene, item, or collection").argument("<keyword>","Search keyword")).action(async(r,o,n,i)=>{let s=A(i);try{ss(await is({type:r,keyword:o,cursor:n.cursor,limit:Co(n.limit)},O(i),e),s,"asset_library_search")}catch(a){Ve(a,s,"asset_library_search")}}),So(t.command("members").description("List members of an existing collection").argument("<collection>","Collection asset ID").option("--type <type>","Member type: role, scene, item, or group").option("--keyword <keyword>","Search member names and descriptions")).action(async(r,o,n)=>{let i=A(n);try{let s=bt("collection",r),a=o.keyword?.trim();if(o.keyword!==void 0&&!a)throw new c(u.INVALID_ARGUMENT,"Collection member keyword must not be empty.");if(a&&a.length>100)throw new c(u.INVALID_ARGUMENT,"Collection member keyword must contain at most 100 characters.");if(o.cursor&&o.cursor.length>1e3)throw new c(u.INVALID_ARGUMENT,"Pagination cursor is too long.");let d=e.configStore??new b,l=P(O(n),d),p=await new lt({baseUrl:l.baseUrl,apiKey:l.apiKey,...e.fetch?{fetch:e.fetch}:{}}).listCollectionMembers(s,{...o.type?{type:gl(o.type)}:{},...a?{keyword:a}:{},...o.cursor?{cursor:o.cursor}:{},limit:Co(o.limit)});y("library","collection.members.listed",{collection_id:s,count:p.items.length,has_more:p.has_more}),Rl(p,i)}catch(s){Ve(s,i,"asset_library_collection_members")}}),t.command("create").description("Create a reusable role, scene, item, or collection asset").argument("<type>","Asset type: role, scene, item, or collection").option("--input <file>","Read the complete JSON request from a file").option("--name <name>","Asset name").option("--description <text>","Asset description").option("--idempotency-key <key>","Stable retry key (generated when omitted)").option("--face-id-image <uri>","Role face image URI").option("--emo-image <uri>","Role expression image URI").option("--main-image <uri>","Role main image URI").option("--three-view-image <uri>","Role three-view image URI").option("--voice <uri>","Role voice URI").option("--epithet <text>","Role epithet").option("--feature <text>","Role visual features").option("--personality <text>","Role personality").option("--voice-style <text>","Role voice style").option("--image <uri>","Scene or item image URI").option("--multi-view-image <uri>","Scene multi-view image URI").option("--cover-image <uri>","Collection cover image URI").option("--member <reference...>","Collection members: asset-library URIs or group:<id>").option("--subgroup-id <id>","Collection subgroup ID").action(async(r,o,n)=>{let i=A(n);try{Il(await hl({type:r,options:o},O(n),e),i)}catch(s){Ve(s,i,"asset_library_create")}}),t.command("update").description("Rename or update a role, scene, item, or collection asset").argument("<type>","Asset type: role, scene, item, or collection").argument("<asset>","Asset ID or asset-library URI").option("--name <name>","New asset name").option("--description <text>","New description").option("--face-id-image <uri>").option("--emo-image <uri>").option("--main-image <uri>").option("--three-view-image <uri>").option("--voice <uri>").option("--image <uri>").option("--multi-view-image <uri>").option("--cover-image <uri>").option("--clear-face-id-image").option("--clear-emo-image").option("--clear-main-image").option("--clear-three-view-image").option("--clear-voice").option("--clear-image").option("--clear-multi-view-image").option("--clear-cover-image").option("--epithet <text>").option("--feature <text>").option("--personality <text>").option("--voice-style <text>").action(async(r,o,n,i)=>{let s=A(i);try{let a=Oo(r),d=wl(a,n),l={...d};if(delete l.type,!Object.values(l).some(p=>p!==void 0&&(typeof p!="object"||p===null||Object.keys(p).length>0)))throw new c(u.INVALID_ARGUMENT,"At least one update option is required.");Gt(await Vt(O(i),e).update(bt(a,o),d),s,"asset_library_update")}catch(a){Ve(a,s,"asset_library_update")}}),t.command("delete").description("Move a reusable asset to trash").argument("<type>","Asset type: role, scene, item, or collection").argument("<asset>","Asset ID or asset-library URI").action(async(r,o,n,i)=>{let s=A(i);try{let a=Oo(r);Gt(await Vt(O(i),e).delete(bt(a,o),a),s,"asset_library_delete")}catch(a){Ve(a,s,"asset_library_delete")}}),t.command("add-members").description("Add members to a collection without replacing existing members").argument("<collection-id>","Collection ID").argument("<members...>","Asset-library URIs or group:<id>").action(async(r,o,n,i)=>{let s=A(i);try{let a=bt("collection",r);Gt(await Vt(O(i),e).addCollectionMembers(a,o.map(xo)),s,"asset_library_add_members")}catch(a){Ve(a,s,"asset_library_add_members")}}),t.command("remove-members").description("Remove members from a collection").argument("<collection-id>","Collection ID").argument("<members...>","Asset-library URIs or group:<id>").action(async(r,o,n,i)=>{let s=A(i);try{let a=bt("collection",r);Gt(await Vt(O(i),e).removeCollectionMembers(a,o.map(xo)),s,"asset_library_remove_members")}catch(a){Ve(a,s,"asset_library_remove_members")}}),t.command("expression").description("Generate and save a role expression image").argument("<role>","Role asset ID or hogi://role_asset URI").option("--reference-image <uri>","Override the role face image used as reference").option("--idempotency-key <key>","Stable retry key (generated when omitted)").action(async(r,o,n)=>{let i=A(n);try{let s=o.idempotencyKey?.trim()||as();if(o.idempotencyKey!==void 0&&!o.idempotencyKey.trim())throw new c(u.INVALID_ARGUMENT,"--idempotency-key must not be empty.");if(s.length>200)throw new c(u.INVALID_ARGUMENT,"--idempotency-key must contain at most 200 characters.");let a=o.referenceImage?.trim();if(o.referenceImage!==void 0&&!a)throw new c(u.INVALID_ARGUMENT,"--reference-image must not be empty.");Gt(await Vt(O(n),e).generateExpression(bt("role",r),s,a),i,"asset_library_expression")}catch(s){Ve(s,i,"asset_library_expression")}}),t}import{Command as Po}from"commander";import Tl from"cross-spawn";import de from"semver";import{existsSync as Al}from"fs";import{existsSync as kl,readFileSync as bl}from"fs";import{homedir as us}from"os";import{join as Rr}from"path";function vl(){if(process.env.OIIOII_INSTALL_DIR?.trim())return process.env.OIIOII_INSTALL_DIR.trim();if(process.platform==="win32"){let e=process.env.LOCALAPPDATA?.trim();return Rr(e||Rr(us(),"AppData","Local"),"oiioii-cli")}return Rr(us(),".local","share","oiioii-cli")}function El(){return process.env.OIIOII_INSTALL_RECORD?.trim()||Rr(vl(),"install.json")}function Ze(e){return typeof e=="string"&&e.trim().length>0}function ls(e=El()){if(!kl(e))throw new c(u.CLI_INSTALLATION_UNMANAGED,`This oiioii installation is not managed by the official installer. Update it with 'npm install -g ${Tt}@latest'.`,{path:e,retryable:!1});let t;try{t=JSON.parse(bl(e,"utf8").replace(/^\uFEFF/,""))}catch(n){throw new c(u.CONFIG_ERROR,`Cannot read CLI install record: ${e}`,{path:e,cause:n instanceof Error?n.message:String(n)})}let r=t;if(r.schemaVersion!==1||r.manager!=="npm"||!Ze(r.environment)||!Ze(r.packageName)||!Ze(r.distTag)||!Ze(r.installRoot)||!Ze(r.npmPrefix)||!Ze(r.nodePath)||!Ze(r.npmPath)||!Ze(r.entryPath))throw new c(u.CONFIG_ERROR,`Invalid CLI install record: ${e}`,{path:e});let o=ne();if(r.environment!==o)throw new c(u.CONFIG_ERROR,`Install record environment '${r.environment}' does not match this '${o}' build.`,{path:e,installed_environment:r.environment,build_environment:o});if(r.packageName!==Tt)throw new c(u.CONFIG_ERROR,`Install record package '${r.packageName}' does not match this build package '${Tt}'.`,{path:e,installed_package:r.packageName,build_package:Tt});return r}var No=(e,t,r)=>new Promise((o,n)=>{let i=Tl(e,t,{stdio:r.inherit?"inherit":["ignore","pipe","pipe"],env:process.env}),s="",a="";r.inherit||(i.stdout?.setEncoding("utf8"),i.stderr?.setEncoding("utf8"),i.stdout?.on("data",d=>{s+=d}),i.stderr?.on("data",d=>{a+=d})),i.on("error",n),i.on("close",d=>o({exitCode:d??1,stdout:s,stderr:a}))});function Uo(e,t){return e.registry?[...t,"--registry",e.registry]:t}async function Ir(e,t,r,o){let n;try{n=await e(t,r,{inherit:o.inherit===!0})}catch(i){throw new c(u.CLI_UPDATE_FAILED,`Failed to start npm while ${o.operation}.`,{cause:i instanceof Error?i.message:String(i),retryable:!0})}if(n.exitCode!==0)throw new c(u.CLI_UPDATE_FAILED,`npm failed while ${o.operation}.`,{exit_code:n.exitCode,stderr:n.stderr.trim()||void 0,retryable:!0});return n}function ps(e,t){try{return JSON.parse(e.trim())}catch{throw new c(u.CLI_UPDATE_FAILED,`npm returned invalid JSON while ${t}.`,{output:e.trim(),retryable:!0})}}function Cl(e){let t=e.trim().replace(/^v(?=\d)/,"");if(de.valid(t)===null)throw new c(u.INVALID_ARGUMENT,`Invalid CLI version '${e}'. Use one exact version such as 0.3.0; ranges, tags, and URLs are not supported.`);return t}function Do(e){let t=ne(),r=Et();if(!r.managed)throw new c(u.CLI_INSTALLATION_UNMANAGED,"Local builds cannot update or install CLI versions from npm. Rebuild the local checkout instead.");let o=de.prerelease(e);if(r.prerelease==="forbidden"&&o!==null)throw new c(u.INVALID_ARGUMENT,`The production build only installs stable versions; '${e}' is a prerelease.`);if(r.prerelease==="required"&&o===null)throw new c(u.INVALID_ARGUMENT,`The ${t} build only installs prerelease versions; '${e}' is stable.`)}function Mo(){let e=Et();if(!e.managed||!e.distTag)throw new c(u.CLI_INSTALLATION_UNMANAGED,"Local builds cannot update or install CLI versions from npm. Rebuild the local checkout instead.");let t=ls();if(t.distTag!==e.distTag)throw new c(u.CONFIG_ERROR,`Install record dist-tag '${t.distTag}' does not match '${e.distTag}'.`);return t}async function fs(e,t,r){let o=await Ir(r,e.npmPath,Uo(e,["view",`${e.packageName}@${t}`,"version","--json"]),{operation:`resolving ${t}`}),n=ps(o.stdout,`resolving ${t}`);if(typeof n!="string"||de.valid(n)===null)throw new c(u.CLI_UPDATE_FAILED,`npm returned an invalid version for '${t}'.`,{value:n,retryable:!0});return Do(n),n}async function Sl(e,t,r){if(!Al(e.entryPath))throw new c(u.CLI_UPDATE_FAILED,`Installed CLI entry was not found: ${e.entryPath}`);let o=await Ir(r,e.nodePath,[e.entryPath,"--version"],{operation:"verifying the installed CLI"});if(o.stdout.trim()!==t)throw new c(u.CLI_UPDATE_FAILED,"Installed CLI version verification failed.",{expected:t,actual:o.stdout.trim(),retryable:!0})}async function ms(e,t,r){await Ir(r,e.npmPath,Uo(e,["install","--global","--prefix",e.npmPrefix,"--no-audit","--no-fund",`${e.packageName}@${t}`]),{inherit:!0,operation:`installing ${e.packageName}@${t}`}),await Sl(e,t,r)}async function gs(e,t,r){try{await ms(e,t,r)}catch(o){let n="not_attempted",i;if(de.valid(z)!==null&&de.neq(z,t))try{await ms(e,z,r),n="succeeded"}catch(s){n="failed",i=s instanceof Error?s.message:String(s)}throw new c(u.CLI_UPDATE_FAILED,`Failed to install ${e.packageName}@${t}.`,{cause:o instanceof Error?o.message:String(o),rollback:n,...i?{rollback_error:i}:{},retryable:!0})}}async function _s(e={},t=No){let r=Et();if(!r.managed||!r.distTag)throw Do(z),new Error("unreachable");let o=Mo(),n=await fs(o,r.distTag,t),i=de.gt(n,z),s=!e.check&&(i||e.force===!0);return s&&await gs(o,n,t),{environment:ne(),package:o.packageName,dist_tag:r.distTag,previous_version:z,version:n,update_available:i,changed:s,checked_only:e.check===!0}}async function hs(e,t=No){let r=Mo(),o=Cl(e);Do(o);let n=await fs(r,o,t);return await gs(r,n,t),{environment:ne(),package:r.packageName,dist_tag:r.distTag,previous_version:z,version:n,update_available:de.gt(n,z),changed:de.neq(z,n),checked_only:!1}}async function ys(e=No){let t=Et(),r=Mo(),o=await Ir(e,r.npmPath,Uo(r,["view",r.packageName,"versions","--json"]),{operation:"listing CLI versions"}),n=ps(o.stdout,"listing CLI versions"),s=(Array.isArray(n)?n:[n]).filter(a=>typeof a=="string"&&de.valid(a)!==null).filter(a=>t.prerelease==="required"?de.prerelease(a)!==null:de.prerelease(a)===null).sort(de.rcompare);return{environment:ne(),package:r.packageName,dist_tag:t.distTag,versions:s}}function ws(e,t,r){if(A(r)){_(I(e,t));return}if(t.checked_only){t.update_available?g(`Update available: ${t.previous_version} -> ${t.version} (${t.dist_tag})`):t.previous_version===t.version?N(`oiioii ${t.previous_version} is up to date (${t.dist_tag}).`):g(`Current version ${t.previous_version} is newer than channel version ${t.version}; no downgrade will be performed.`);return}t.changed?N(`oiioii ${t.previous_version} -> ${t.version}`):N(`oiioii ${t.version} is already installed.`)}function Rs(){return new Po("update").description("Update oiioii from the npm channel for this build environment").option("--check","Check for an update without installing it").option("--force","Reinstall the channel version even when already current").action(async(e,t)=>{ws("cli_update",await _s(e),t)})}function Is(){return new Po("install").description("Install one exact oiioii version from npm").argument("<version>","Exact stable or prerelease version allowed by this build environment").action(async(e,t,r)=>{ws("cli_install",await hs(e),r)})}function ks(){return new Po("versions").description("List npm versions available to this build environment").action(async(e,t)=>{let r=await ys();if(A(t)){_(I("cli_versions",r));return}W(`Available oiioii versions (${r.environment})`),r.versions.length===0?g("No matching versions found."):r.versions.forEach(o=>g(o))})}function bs(){let e=new Ol;return e.name("oiioii").description("Agent-native CLI for Oiioii / Hogi GenAI capabilities").version(z,"-V, --version","Output the current version").option("--json","Output machine-readable JSON").option("--base-url <url>","Hogi backend base URL").option("--workspace <id>","Workspace ID override").option("--verbose","Enable verbose/debug output").option("--no-color","Disable colored output"),e.addCommand(rs()),e.addCommand(xn()),e.addCommand(cs()),e.addCommand(Zn()),e.addCommand(oi()),e.addCommand(di()),e.addCommand(li()),e.addCommand(fi()),e.addCommand(_i()),e.addCommand(Ii()),e.addCommand(Vi()),e.addCommand(qi()),e.addCommand(Ji()),e.addCommand(Rs()),e.addCommand(Is()),e.addCommand(ks()),e.hook("preAction",async(t,r)=>{let o=[],n=r;for(;n?.parent;)o.push(n.name()),n=n.parent;let i=o.reverse().join("."),s=i.startsWith("logs.")?void 0:Or(i);await Gr(r,i,s)}),e.hook("postAction",()=>{let t=typeof process.exitCode=="number"?process.exitCode:0;Jt(F()?.failure?.code),Ht(t),xr(t)}),e}async function vs(e,t){e.exitOverride();try{return await e.parseAsync(t),typeof process.exitCode=="number"?process.exitCode:0}catch(r){if(r instanceof Lo&&(r.code==="commander.helpDisplayed"||r.code==="commander.version"))return 0;F()||Or("cli.parse");let o=r instanceof c?r:r instanceof Lo?new c(u.INVALID_ARGUMENT,r.message):new c(u.SERVER_ERROR,r instanceof Error?r.message:String(r));return e.opts().json===!0?_(C("cli_error",o.code,o.message,o.details)):(je(o.code,o.message),r instanceof Lo||S(o.message)),process.exitCode=1,Jt(o.code),Ht(1),xr(1),1}}async function Es(e){await Fr(),process.exit(e)}var Dl=bs;var Ml=Nl(import.meta.url),Pl=process.argv[1]!==void 0?xl(Ul(process.argv[1])):void 0;Pl===Ml&&vs(Dl(),process.argv).then(Es);export{Dl as createProgram,vs as runProgram};
46
+ ${e}`}};function ul(e=process.env){let t=(e.OIIOII_LANG||e.LC_ALL||e.LC_MESSAGES||e.LANG||"en").toLowerCase();return/^zh[-_](?:tw|hk|mo|hant)/.test(t)?"zh-Hant":t.startsWith("zh")?"zh":t.startsWith("ja")?"ja":t.startsWith("es")?"es":"en"}function ps(e=process.env){return dl[ul(e)]}function ml(e){try{let t=new URL(e);return(t.protocol==="https:"||t.protocol==="http:")&&t.pathname==="/"&&!t.search&&!t.hash}catch{return!1}}function pl(){let e=Kt(),t=new URL(e);if(t.protocol!=="https:"&&t.protocol!=="http:"||t.username||t.password||t.search||t.hash)throw new Error("The build authorization page must be an HTTP(S) URL without credentials, query, or fragment.");let r=t.protocol==="http:"&&(t.hostname==="127.0.0.1"||t.hostname==="localhost");if(t.protocol==="http:"&&!r||t.pathname!=="/auth/cli")throw new Error("The build authorization page must use HTTPS (or loopback HTTP) and end with /auth/cli.");return t.href}function fl(e){return[e.codex?"codex":void 0,e.workbuddy?"workbuddy":void 0,e.kimi?"kimi":void 0,e.claudeCode?"claude-code":void 0,e.deepseek?"deepseek":void 0].filter(t=>t!==void 0)}async function gl(e,t,r,o){let n=$({source:"cli_auth",operation:"auth.exchange",method:"POST",path:"/auth/cli/exchange"}),i;try{let s=await n.fetch(o,`${e.replace(/\/$/,"")}/auth/cli/exchange`,{method:"POST",headers:G({"content-type":"application/json",accept:"application/json"}),body:JSON.stringify({code:r.code,verifier:r.verifier}),signal:r.signal});i=s.status;let a=await s.json();if(!s.ok||a.code!=="SUCCESS")throw new Error(a.error||"Unable to exchange CLI authorization");let c=a.data;if(!c||c.app!==t||typeof c.apiKey!="string"||!/^oii_sk_[A-Za-z0-9_-]{40}$/.test(c.apiKey)||typeof c.keyId!="string"||typeof c.keyPrefix!="string")throw new Error("The authorization server returned an invalid API key response");return n.success(s.status),{apiKey:c.apiKey,app:t,keyId:c.keyId,keyPrefix:c.keyPrefix}}catch(s){throw n.failure(s,i),s}}function fs(e={}){let t=new ll("auth").description("Authentication configuration");return t.command("login").description("Authorize in a browser or persist an existing API key").option("--api-key <key>","Paste and persist an existing OiiOii API key instead of opening a browser").option("--codex","Authorize OiiOii CLI for Codex and return to the app").option("--workbuddy","Authorize OiiOii CLI for WorkBuddy and return to the app").option("--kimi","Authorize OiiOii CLI for Kimi").option("--claude-code","Authorize OiiOii CLI for Claude Code").option("--deepseek","Authorize OiiOii CLI for DeepSeek").option("--no-browser","Print the authorization URL instead of opening a browser").option("--base-url <url>","Persist the backend base URL with the API key").option("--reset-base-url","Remove the persisted backend override and use this build's default").action(async(r,o)=>{let n=E(o),i=fl(r),s=r.apiKey?.trim(),a=r.apiKey!==void 0,c=i[0]??(a?void 0:"terminal"),l=(I,V,w)=>{n?_(S("auth_login",I,V,w)):O(V),process.exitCode=1};if(i.length>1){l(u.INVALID_ARGUMENT,"Choose only one target application for browser authorization.");return}if(i.length>0&&a){l(u.INVALID_ARGUMENT,"--api-key cannot be used with an application authorization option.");return}if(a&&!s){l(u.INVALID_ARGUMENT,"--api-key must not be empty.");return}let p=T(o).baseUrl,m=(r.baseUrl??(typeof p=="string"?p:void 0))?.trim();if(m&&r.resetBaseUrl){l(u.INVALID_ARGUMENT,"--base-url and --reset-base-url cannot be used together.");return}if(m&&!ml(m)){l(u.INVALID_ARGUMENT,"--base-url must be an HTTP(S) origin without a path, query, or fragment.");return}let f=e.configStore??new b,h=Tt().replace(/\/$/,""),D=process.env.OIIOII_BASE_URL?.trim().replace(/\/$/,""),N=m?.replace(/\/$/,"")||D||(r.resetBaseUrl?h:f.load().baseUrl.replace(/\/$/,""));if(c){if(N!==h){l(u.CONFIG_ERROR,`Browser authorization must use this build's backend (${h}). Run 'oiioii auth login --reset-base-url' after removing OIIOII_BASE_URL, or use '--api-key' with a custom backend.`);return}let I=ps(),V;try{let w=await(e.createBrowserAuthorization??ms)({app:c,authorizationPageUrl:pl(),exchange:async se=>{let he=await gl(N,c,se,e.fetch??globalThis.fetch);return f.update({apiKey:he.apiKey,baseUrl:N},{resetBaseUrl:r.resetBaseUrl===!0}),he}});V=w.cancel,n||g(I.opening);let F=r.browser===!1?!1:await(e.openBrowser??Bt)(w.url);r.browser===!1?K(I.manualUrl(w.url)):F?n||g(I.waiting):K(I.browserFallback(w.url));let L=await w.result;if(L.outcome!=="success"){let se=L.outcome==="cancelled"?"Authorization was cancelled.":L.outcome==="expired"?"Authorization expired. Run the login command again.":L.outcome==="error"?L.message:"Authorization failed.";l(L.outcome==="expired"?u.AUTH_TIMEOUT:u.AUTH_INVALID,se);return}let ee=c==="terminal"?{requested:!1,supported:!1}:await(e.activateApp??Qo)(c);n?_(k("auth_login",{activated:ee.requested,activation_supported:ee.supported,app:c,authenticated:!0,base_url:f.load().baseUrl,config_file:f.getConfigPath()})):(U(I.saved),c==="terminal"?g(I.terminalFallback):ee.requested?g(I.activating(Sr[c])):K(I.activationFallback(Sr[c])))}catch(w){V?.(),l(u.NETWORK_ERROR,w instanceof Error?w.message:String(w))}return}f.update({apiKey:s,...m?{baseUrl:m.replace(/\/$/,"")}:{}},{resetBaseUrl:r.resetBaseUrl===!0});let C=f.load(),v=f.getConfigPath();n?_(k("auth_login",{authenticated:!0,base_url:C.baseUrl,config_file:v})):(U(`API key saved to ${v}`),g(` Base URL: ${C.baseUrl}`))}),t.command("status").description("Check whether authentication is configured without exposing the API key").action((r,o)=>{let n=E(o),i=e.configStore??new b,s=!!process.env.OIIOII_API_KEY?.trim(),a=!!i.load().apiKey,c=s?"environment":a?"config":null,l=c!==null;n?_(k("auth_status",{authenticated:l,credential_source:c,config_file:i.getConfigPath()})):c==="environment"?U("Authenticated through OIIOII_API_KEY."):c==="config"?U("Authenticated through local configuration."):K("Not authenticated. Run 'oiioii auth login'."),l||(process.exitCode=1)}),t.command("logout").description("Remove locally persisted authentication without exposing the API key").action((r,o)=>{let n=E(o),i=e.configStore??new b,s=i.removeApiKey(),a=!!process.env.OIIOII_API_KEY?.trim();n?_(k("auth_logout",{authenticated:a,local_credentials_removed:s,environment_override:a,config_file:i.getConfigPath()})):(s?U("Local authentication removed."):g("No local authentication was configured."),a&&K("OIIOII_API_KEY is still set for this process; unset it to disable effective authentication."))}),t}import{Command as bl}from"commander";import{randomUUID as ws}from"crypto";import{readFileSync as vl,statSync as El}from"fs";import{fetch as _l}from"undici";function X(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Xe(e){return typeof e=="string"&&e.length>0?e:void 0}var Mo=new Set(["idempotency_conflict","idempotency_state_invalid","invalid_cursor","invalid_request","invalid_resource_uri","member_asset_not_found","member_not_visible_to_subgroup","missing_face_image","missing_idempotency_key","request_in_progress","subgroup_not_found"]),_s=new Set(["asset_not_found","collection_asset_not_found","collection_not_found"]);function gs(e){let t=X(e.details)&&typeof e.details.backend_code=="string"?e.details.backend_code:void 0;if(!t)return e;let r=Mo.has(t)?u.INVALID_ARGUMENT:_s.has(t)?u.RECORD_NOT_FOUND:e.code;return r===e.code?e:new d(r,e.message,e.details)}function hl(e,t,r){if(!X(e))throw new d(u.SERVER_ERROR,`Invalid ${t} asset at index ${r}`);let o=t==="role"?"role":t==="scene"?"scene":"item",n=e.documentId,i=e.uri,s=e[`${o}Name`];if(typeof n!="string"||!n||typeof i!="string"||!i||typeof s!="string")throw new d(u.SERVER_ERROR,`Invalid ${t} asset at index ${r}`);let a;try{a=ke(i)}catch{throw new d(u.SERVER_ERROR,`Invalid ${t} asset URI at index ${r}`)}if(a.assetType!==t||a.assetId!==n)throw new d(u.SERVER_ERROR,`Mismatched ${t} asset identity at index ${r}`);return{asset_id:n,asset_uri:i,type:t,name:s,...Xe(e[`${o}Description`])?{description:String(e[`${o}Description`])}:{},...Xe(e[t==="role"?"roleMainImageUri":`${o}ImageUri`])?{image_uri:String(e[t==="role"?"roleMainImageUri":`${o}ImageUri`])}:{},...Xe(e.createdAt)?{created_at:String(e.createdAt)}:{}}}function yl(e,t){if(!X(e)||e.ok!==!0||!X(e.data)||!Array.isArray(e.data.items)||typeof e.data.hasMore!="boolean")throw new d(u.SERVER_ERROR,`Invalid ${t} asset library response`);let r=Xe(e.data.nextCursor);if(e.data.hasMore&&!r)throw new d(u.SERVER_ERROR,`Invalid ${t} asset library response: missing next cursor`);return{type:t,items:e.data.items.map((o,n)=>hl(o,t,n)),has_more:e.data.hasMore,...r?{next_cursor:r}:{}}}function wl(e){if(!X(e)||e.ok!==!0||!X(e.data)||e.data.type!=="collection"||!Array.isArray(e.data.items)||typeof e.data.has_more!="boolean")throw new d(u.SERVER_ERROR,"Invalid collection asset library response");let t=Xe(e.data.next_cursor);if(e.data.has_more&&!t)throw new d(u.SERVER_ERROR,"Invalid collection asset library response: missing next cursor");return{type:"collection",items:e.data.items.map((o,n)=>{if(!X(o)||o.type!=="collection"||o.asset_uri!==null||typeof o.asset_id!="string"||!o.asset_id||typeof o.name!="string"||!o.name||!Number.isInteger(o.member_count)||Number(o.member_count)<0||o.description!==void 0&&typeof o.description!="string"||o.image_uri!==void 0&&(typeof o.image_uri!="string"||!o.image_uri.startsWith("hogi://image/"))||o.subgroup_id!==void 0&&o.subgroup_id!==null&&typeof o.subgroup_id!="string"||o.created_at!==void 0&&typeof o.created_at!="string"||o.updated_at!==void 0&&typeof o.updated_at!="string")throw new d(u.SERVER_ERROR,`Invalid collection asset at index ${n}`);return o}),has_more:e.data.has_more,...t?{next_cursor:t}:{}}}function Rl(e,t){if(!X(e)||e.ok!==!0||!X(e.data)||e.data.collection_id!==t||!Array.isArray(e.data.items)||typeof e.data.has_more!="boolean")throw new d(u.SERVER_ERROR,"Invalid collection members response");let r=Xe(e.data.next_cursor);if(e.data.has_more&&!r)throw new d(u.SERVER_ERROR,"Invalid collection members response: missing next cursor");let o=e.data.items.map((n,i)=>{if(!X(n)||n.type!=="role"&&n.type!=="scene"&&n.type!=="item"&&n.type!=="group"||typeof n.asset_id!="string"||!n.asset_id||typeof n.asset_ref!="string"||!n.asset_ref||typeof n.name!="string"||!n.name||n.description!==void 0&&typeof n.description!="string"||n.image_uri!==void 0&&(typeof n.image_uri!="string"||!n.image_uri.startsWith("hogi://image/"))||n.state!==null&&typeof n.state!="string"||n.subgroup_id!==null&&typeof n.subgroup_id!="string"||typeof n.created_at!="string"||!n.created_at||n.updated_at!==void 0&&typeof n.updated_at!="string")throw new d(u.SERVER_ERROR,`Invalid collection member at index ${i}`);let s=n.type==="group"?`group:${n.asset_id}`:`hogi://${n.type}_asset/${n.asset_id}`;if(n.asset_ref!==s)throw new d(u.SERVER_ERROR,`Mismatched collection member identity at index ${i}`);return n});return{collection_id:t,items:o,has_more:e.data.has_more,...r?{next_cursor:r}:{}}}function kl(e,t,r){if(!X(e)||e.ok!==!0||!X(e.data))throw new d(u.SERVER_ERROR,"Invalid asset creation response");let o=e.data,n=t==="collection"?o.asset_uri===null:typeof o.asset_uri=="string"&&o.asset_uri.length>0;if(o.type!==t||typeof o.asset_id!="string"||!o.asset_id||typeof o.name!="string"||typeof o.reused!="boolean"||!n||o.member_count!==void 0&&(typeof o.member_count!="number"||!Number.isInteger(o.member_count)||o.member_count<0))throw new d(u.SERVER_ERROR,"Invalid asset creation response");if(t!=="collection"){let i;try{i=ke(o.asset_uri)}catch{throw new d(u.SERVER_ERROR,"Invalid created asset URI")}if(i.assetType!==t||i.assetId!==o.asset_id)throw new d(u.SERVER_ERROR,"Mismatched created asset identity")}return{asset_id:o.asset_id,asset_uri:o.asset_uri,type:t,name:o.name,reused:o.reused,idempotency_key:r,...Xe(o.description)?{description:String(o.description)}:{},...Xe(o.image_uri)?{image_uri:String(o.image_uri)}:{},...typeof o.member_count=="number"?{member_count:o.member_count}:{},...typeof o.subgroup_id=="string"||o.subgroup_id===null?{subgroup_id:o.subgroup_id}:{}}}function Il(e,t,r){if(!X(e)||e.ok!==!0||!X(e.data)||e.data.type!==t||e.data.asset_id!==r||e.data.name!==void 0&&typeof e.data.name!="string"||e.data.state!==void 0&&e.data.state!=="trash"||e.data.trash_time!==void 0&&typeof e.data.trash_time!="string"||e.data.updated_at!==void 0&&typeof e.data.updated_at!="string"||e.data.member_count!==void 0&&(!Number.isInteger(e.data.member_count)||Number(e.data.member_count)<0)||e.data.expression_image_uri!==void 0&&(typeof e.data.expression_image_uri!="string"||!e.data.expression_image_uri.startsWith("hogi://image/"))||e.data.reused!==void 0&&typeof e.data.reused!="boolean")throw new d(u.SERVER_ERROR,"Invalid asset library mutation response");return e.data}var mt=class{baseUrl;apiKey;fetch;logger;timeoutMs;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this.fetch=t.fetch??_l,this.logger=t.logger,this.timeoutMs=t.timeoutMs??3e4}async list(t,r={}){let o=t==="collection"?"/v1/library/collections":`/v1/${t}/listAssets`,n=new URLSearchParams;r.keyword&&n.set("keyword",r.keyword),r.cursor&&n.set("cursor",r.cursor),r.limit!==void 0&&n.set("pageSize",String(r.limit));let i=$({source:"hogi_asset_library_client",operation:"asset_library.list",method:"GET",path:o,metadata:{asset_type:t,has_keyword:!!r.keyword,page_size:r.limit}},this.logger),s=new AbortController,a=setTimeout(()=>s.abort(),this.timeoutMs);typeof a=="object"&&"unref"in a&&a.unref();let c;try{if(c=await i.fetch(this.fetch,`${this.baseUrl}${o}${n.size?`?${n}`:""}`,{method:"GET",headers:G({authorization:`Bearer ${this.apiKey}`,accept:"application/json"}),signal:s.signal}),!c.ok)throw await Ne(c);let l=await c.json().catch(()=>{}),p=t==="collection"?wl(l):yl(l,t);return i.success(c.status,{asset_type:t,count:p.items.length,has_more:p.has_more}),p}catch(l){let p=Ue(l)?new d(u.NETWORK_ERROR,`Asset library request timed out after ${this.timeoutMs}ms`,{retryable:!0}):l instanceof d?gs(l):new d(u.NETWORK_ERROR,l instanceof Error?l.message:String(l),{retryable:!0});throw i.failure(p,c?.status),p}finally{clearTimeout(a)}}async listCollectionMembers(t,r={}){let o=`/v1/library/collections/${encodeURIComponent(t)}/members`,n=new URLSearchParams;r.type&&n.set("type",r.type),r.keyword&&n.set("keyword",r.keyword),r.cursor&&n.set("cursor",r.cursor),r.limit!==void 0&&n.set("pageSize",String(r.limit));let i=$({source:"hogi_asset_library_client",operation:"asset_library.collection.members.list",method:"GET",path:o,metadata:{asset_type:r.type,has_keyword:!!r.keyword,page_size:r.limit}},this.logger),s=new AbortController,a=setTimeout(()=>s.abort(),this.timeoutMs);typeof a=="object"&&"unref"in a&&a.unref();let c;try{if(c=await i.fetch(this.fetch,`${this.baseUrl}${o}${n.size?`?${n}`:""}`,{method:"GET",headers:G({authorization:`Bearer ${this.apiKey}`,accept:"application/json"}),signal:s.signal}),!c.ok)throw await Ne(c);let l=Rl(await c.json().catch(()=>{}),t);return i.success(c.status,{count:l.items.length,has_more:l.has_more}),l}catch(l){let p=Ue(l)?new d(u.NETWORK_ERROR,`Collection members request timed out after ${this.timeoutMs}ms`,{retryable:!0}):l instanceof d?gs(l):new d(u.NETWORK_ERROR,l instanceof Error?l.message:String(l),{retryable:!0});throw i.failure(p,c?.status),p}finally{clearTimeout(a)}}async create(t,r){let o="/v1/library/assets",n=$({source:"hogi_asset_library_client",operation:"asset_library.create",method:"POST",path:o,metadata:{asset_type:t.type}},this.logger),i=new AbortController,s=setTimeout(()=>i.abort(),this.timeoutMs);typeof s=="object"&&"unref"in s&&s.unref();let a;try{if(a=await n.fetch(this.fetch,`${this.baseUrl}${o}`,{method:"POST",headers:G({authorization:`Bearer ${this.apiKey}`,accept:"application/json","content-type":"application/json","idempotency-key":r}),body:JSON.stringify(t),signal:i.signal}),!a.ok)throw await Ne(a);let c=kl(await a.json().catch(()=>{}),t.type,r);return n.success(a.status,{asset_type:t.type,asset_id:c.asset_id,reused:c.reused}),c}catch(c){let l=Ue(c)?new d(u.NETWORK_ERROR,`Asset creation timed out after ${this.timeoutMs}ms`,{retryable:!0,idempotency_key:r}):c instanceof d?new d(X(c.details)&&typeof c.details.backend_code=="string"&&Mo.has(c.details.backend_code)?u.INVALID_ARGUMENT:c.code,c.message,{...X(c.details)?c.details:{},idempotency_key:r}):new d(u.NETWORK_ERROR,c instanceof Error?c.message:String(c),{retryable:!0,idempotency_key:r});throw n.failure(l,a?.status),l}finally{clearTimeout(s)}}async mutate(t,r,o,n,i,s,a=this.timeoutMs,c){let l=$({source:"hogi_asset_library_client",operation:t,method:r,path:o,metadata:{asset_type:n}},this.logger),p=new AbortController,m=setTimeout(()=>p.abort(),a);typeof m=="object"&&"unref"in m&&m.unref();let f;try{if(f=await l.fetch(this.fetch,`${this.baseUrl}${o}`,{method:r,headers:G({authorization:`Bearer ${this.apiKey}`,accept:"application/json",...s===void 0?{}:{"content-type":"application/json"},...c}),...s===void 0?{}:{body:JSON.stringify(s)},signal:p.signal}),!f.ok)throw await Ne(f);let h=Il(await f.json().catch(()=>{}),n,i);return l.success(f.status,{asset_type:n,asset_id:i}),h}catch(h){let D=Ue(h)?new d(u.NETWORK_ERROR,`Asset library ${t} timed out after ${a}ms`,{retryable:!0}):h instanceof d?new d(X(h.details)&&typeof h.details.backend_code=="string"?Mo.has(h.details.backend_code)?u.INVALID_ARGUMENT:_s.has(h.details.backend_code)?u.RECORD_NOT_FOUND:h.code:h.code,h.message,h.details):new d(u.NETWORK_ERROR,h instanceof Error?h.message:String(h),{retryable:!0});throw l.failure(D,f?.status),D}finally{clearTimeout(m)}}async update(t,r){let{type:o,...n}=r;return this.mutate("asset_library.update","POST",`/v1/library/assets/${o}/${encodeURIComponent(t)}`,o,t,n)}async delete(t,r){return this.mutate("asset_library.delete","DELETE",`/v1/library/assets/${r}/${encodeURIComponent(t)}`,r,t)}async addCollectionMembers(t,r){return this.mutate("asset_library.collection.add_members","POST",`/v1/library/collections/${encodeURIComponent(t)}/members`,"collection",t,{members:r})}async removeCollectionMembers(t,r){return this.mutate("asset_library.collection.remove_members","POST",`/v1/library/assets/collection/${encodeURIComponent(t)}`,"collection",t,{remove_members:r})}async generateExpression(t,r,o){return{...await this.mutate("asset_library.expression.generate","POST",`/v1/library/assets/role/${encodeURIComponent(t)}/expression`,"role",t,o?{reference_image_uri:o}:{},3e5,{"idempotency-key":r}),idempotency_key:r}}};function Rs(e){if(e==="role"||e==="scene"||e==="item"||e==="collection")return e;throw new d(u.INVALID_ARGUMENT,`Invalid asset type: ${e}. Expected role, scene, item, or collection.`)}function $o(e){return Rs(e)}function Et(e,t){let r=t.trim();if(!r||r.length>200)throw new d(u.INVALID_ARGUMENT,"Asset ID must contain 1-200 characters.");if(e==="collection"||!r.startsWith("hogi://")){if(!/^[A-Za-z0-9_-]+$/.test(r))throw new d(u.INVALID_ARGUMENT,`Invalid ${e} asset ID: ${t}`);return r}let o=ke(r);if(o.assetType!==e)throw new d(u.INVALID_ARGUMENT,`Asset URI type does not match ${e}.`);return o.assetId}function Po(e){let t=Number(e);if(!Number.isInteger(t)||t<1||t>100)throw new d(u.INVALID_ARGUMENT,"--limit must be an integer between 1 and 100.");return t}async function hs(e,t,r={}){let o=Rs(e.type),n=e.keyword?.trim();if(e.keyword!==void 0&&!n)throw new d(u.INVALID_ARGUMENT,"Search keyword must not be empty.");if(n&&o==="collection"&&n.length>100)throw new d(u.INVALID_ARGUMENT,"Collection search keyword must contain at most 100 characters.");if(n&&n.length>200)throw new d(u.INVALID_ARGUMENT,"Search keyword must contain at most 200 characters.");if(e.cursor&&e.cursor.length>1e3)throw new d(u.INVALID_ARGUMENT,"Pagination cursor is too long.");let i=r.configStore??new b,s=P(t,i),a=await new mt({baseUrl:s.baseUrl,apiKey:s.apiKey,...r.fetch?{fetch:r.fetch}:{}}).list(o,{...n?{keyword:n}:{},...e.cursor?{cursor:e.cursor}:{},...e.limit!==void 0?{limit:e.limit}:{}});return y("library",n?"assets.searched":"assets.listed",{asset_type:o,count:a.items.length,has_more:a.has_more}),a}var Tl=new Set(["name","description","idempotencyKey"]),Al={role:new Set(["faceIdImage","emoImage","mainImage","threeViewImage","voice","epithet","feature","personality","voiceStyle"]),scene:new Set(["image","multiViewImage"]),item:new Set(["image"]),collection:new Set(["coverImage","member","subgroupId"])};function Cl(e,t){let r=Object.entries(t).filter(([,i])=>i!==void 0).map(([i])=>i),o=t.input?new Set(["input","idempotencyKey"]):new Set([...Tl,...Al[e]]),n=r.filter(i=>!o.has(i));if(n.length)throw new d(u.INVALID_ARGUMENT,`Unsupported option for ${e}: --${n[0].replace(/[A-Z]/g,i=>`-${i.toLowerCase()}`)}.`)}function Vo(e){if(e.startsWith("group:")){let r=e.slice(6).trim();if(!r||r.length>200)throw new d(u.INVALID_ARGUMENT,`Invalid collection member: ${e}`);return{type:"group",asset_id:r}}let t=ke(e);return{type:t.assetType,asset_id:t.assetId}}function Sl(e){if(e==="role"||e==="scene"||e==="item"||e==="group")return e;throw new d(u.INVALID_ARGUMENT,`Invalid collection member type: ${e}. Expected role, scene, item, or group.`)}function pt(e){let t=Object.entries(e).filter(r=>!!r[1]);return t.length?Object.fromEntries(t):void 0}function Ol(e,t){if(Cl(e,t),t.input){let o;try{if(El(t.input).size>1024*1024)throw new Error("file exceeds 1 MiB");o=JSON.parse(vl(t.input,"utf8"))}catch(n){throw new d(u.INVALID_ARGUMENT,`Unable to read --input JSON: ${n instanceof Error?n.message:String(n)}`)}if(!o||typeof o!="object"||Array.isArray(o)||o.type!==e)throw new d(u.INVALID_ARGUMENT,`--input must contain an object with type "${e}".`);return o}let r=t.name?.trim();if(!r)throw new d(u.INVALID_ARGUMENT,"--name is required unless --input is used.");return e==="role"?{type:e,name:r,...t.description!==void 0?{description:t.description}:{},...pt({face_id_image_uri:t.faceIdImage,emo_image_uri:t.emoImage,main_image_uri:t.mainImage,three_view_image_uri:t.threeViewImage,voice_uri:t.voice})?{media:pt({face_id_image_uri:t.faceIdImage,emo_image_uri:t.emoImage,main_image_uri:t.mainImage,three_view_image_uri:t.threeViewImage,voice_uri:t.voice})}:{},...pt({epithet:t.epithet,feature:t.feature,personality:t.personality,voice_style:t.voiceStyle})?{attributes:pt({epithet:t.epithet,feature:t.feature,personality:t.personality,voice_style:t.voiceStyle})}:{}}:e==="scene"?{type:e,name:r,...t.description!==void 0?{description:t.description}:{},...pt({image_uri:t.image,multi_view_image_uri:t.multiViewImage})?{media:pt({image_uri:t.image,multi_view_image_uri:t.multiViewImage})}:{}}:e==="item"?{type:e,name:r,...t.description!==void 0?{description:t.description}:{},...t.image?{media:{image_uri:t.image}}:{}}:{type:e,name:r,...t.description!==void 0?{description:t.description}:{},...t.coverImage?{cover_image_uri:t.coverImage}:{},members:(t.member??[]).map(Vo),...t.subgroupId?{subgroup_id:t.subgroupId}:{}}}async function xl(e,t,r={}){let o=$o(e.type),n=Ol(o,e.options),i=e.options.idempotencyKey?.trim();if(e.options.idempotencyKey!==void 0&&!i)throw new d(u.INVALID_ARGUMENT,"--idempotency-key must not be empty.");let s=i??ws();if(s.length>200)throw new d(u.INVALID_ARGUMENT,"--idempotency-key must contain at most 200 characters.");let a=r.configStore??new b,c=P(t,a),l=await new mt({baseUrl:c.baseUrl,apiKey:c.apiKey,...r.fetch?{fetch:r.fetch}:{}}).create(n,s);return y("library","asset.created",{asset_type:o,asset_id:l.asset_id,reused:l.reused}),l}function Wt(e,t){let r=P(e,t.configStore??new b);return new mt({baseUrl:r.baseUrl,apiKey:r.apiKey,...t.fetch?{fetch:t.fetch}:{}})}function Nl(e,t){let r=t.find(([s,a])=>e[s]!==void 0&&e[a]===!0);if(!r)return;let[o,n]=r,i=s=>`--${String(s).replace(/[A-Z]/g,a=>`-${a.toLowerCase()}`)}`;throw new d(u.INVALID_ARGUMENT,`${i(o)} cannot be used with ${i(n)}.`)}function Ul(e,t){let r=new Set(["name","description"]),o={role:new Set(["faceIdImage","emoImage","mainImage","threeViewImage","voice","clearFaceIdImage","clearEmoImage","clearMainImage","clearThreeViewImage","clearVoice","epithet","feature","personality","voiceStyle"]),scene:new Set(["image","multiViewImage","clearImage","clearMultiViewImage"]),item:new Set(["image","clearImage"]),collection:new Set(["coverImage","clearCoverImage"])},n=Object.entries(t).find(([a,c])=>c!==void 0&&!r.has(a)&&!o[e].has(a));if(n)throw new d(u.INVALID_ARGUMENT,`Unsupported option for ${e}: --${n[0].replace(/[A-Z]/g,a=>`-${a.toLowerCase()}`)}.`);Nl(t,[["faceIdImage","clearFaceIdImage"],["emoImage","clearEmoImage"],["mainImage","clearMainImage"],["threeViewImage","clearThreeViewImage"],["voice","clearVoice"],["image","clearImage"],["multiViewImage","clearMultiViewImage"],["coverImage","clearCoverImage"]]);let i=t.name?.trim();if(t.name!==void 0&&!i)throw new d(u.INVALID_ARGUMENT,"--name must not be empty.");let s={type:e,...i!==void 0?{name:i}:{},...t.description!==void 0?{description:t.description}:{}};return e==="role"?{...s,type:e,media:{...t.clearFaceIdImage?{face_id_image_uri:null}:t.faceIdImage?{face_id_image_uri:t.faceIdImage}:{},...t.clearEmoImage?{emo_image_uri:null}:t.emoImage?{emo_image_uri:t.emoImage}:{},...t.clearMainImage?{main_image_uri:null}:t.mainImage?{main_image_uri:t.mainImage}:{},...t.clearThreeViewImage?{three_view_image_uri:null}:t.threeViewImage?{three_view_image_uri:t.threeViewImage}:{},...t.clearVoice?{voice_uri:null}:t.voice?{voice_uri:t.voice}:{}},attributes:pt({epithet:t.epithet,feature:t.feature,personality:t.personality,voice_style:t.voiceStyle})}:e==="scene"?{...s,type:e,media:{...t.clearImage?{image_uri:null}:t.image?{image_uri:t.image}:{},...t.clearMultiViewImage?{multi_view_image_uri:null}:t.multiViewImage?{multi_view_image_uri:t.multiViewImage}:{}}}:e==="item"?{...s,type:e,media:{...t.clearImage?{image_uri:null}:t.image?{image_uri:t.image}:{}}}:{...s,type:e,...t.clearCoverImage?{cover_image_uri:null}:t.coverImage?{cover_image_uri:t.coverImage}:{}}}function qt(e,t,r){if(t)return _(k(r,e));z(`${e.type} asset ${e.state==="trash"?"moved to trash":"updated"}`),g(` ${e.name??e.asset_id} ${e.asset_id}`),e.expression_image_uri&&g(` ${e.expression_image_uri}`)}function ys(e,t,r){if(A({asset_type:e.type,asset_count:e.items.length,has_more:e.has_more}),t){_(k(r,e));return}z(`${e.type} assets (${e.items.length})`);for(let o of e.items)g(` ${o.name||"(unnamed)"} ${o.asset_uri??o.asset_id}`),o.description&&g(` ${o.description}`);e.next_cursor&&g(`
47
+ Next cursor: ${e.next_cursor}`)}function Dl(e,t){if(A({asset_type:"collection",asset_count:e.items.length,has_more:e.has_more}),t){_(k("asset_library_collection_members",e));return}z(`collection members (${e.items.length})`);for(let r of e.items)g(` ${r.name} ${r.asset_ref}`),r.description&&g(` ${r.description}`);e.next_cursor&&g(`
48
+ Next cursor: ${e.next_cursor}`)}function Ml(e,t){if(A({asset_type:e.type,asset_id:e.asset_id,reused:e.reused}),t)return _(k("asset_library_create",e));z(`${e.type} asset created${e.reused?" (reused)":""}`),g(` ${e.name} ${e.asset_uri??e.asset_id}`),g(` Idempotency key: ${e.idempotency_key}`)}function Fe(e,t,r){let o=e instanceof d?e:new d(u.SERVER_ERROR,e instanceof Error?e.message:String(e));t?_(S(r,o.code,o.message,o.details)):O(o.message),process.exitCode=1}function Lo(e){return e.option("--cursor <cursor>","Pagination cursor returned by the previous page").option("--limit <count>","Page size (1-100)","20")}function ks(e={}){let t=new bl("library").description("Create, query, update, and organize reusable assets");return Lo(t.command("list").description("List assets by type").argument("<type>","Asset type: role, scene, item, or collection")).action(async(r,o,n)=>{let i=E(n);try{ys(await hs({type:r,cursor:o.cursor,limit:Po(o.limit)},T(n),e),i,"asset_library_list")}catch(s){Fe(s,i,"asset_library_list")}}),Lo(t.command("search").description("Search asset names and descriptions by type").argument("<type>","Asset type: role, scene, item, or collection").argument("<keyword>","Search keyword")).action(async(r,o,n,i)=>{let s=E(i);try{ys(await hs({type:r,keyword:o,cursor:n.cursor,limit:Po(n.limit)},T(i),e),s,"asset_library_search")}catch(a){Fe(a,s,"asset_library_search")}}),Lo(t.command("members").description("List members of an existing collection").argument("<collection>","Collection asset ID").option("--type <type>","Member type: role, scene, item, or group").option("--keyword <keyword>","Search member names and descriptions")).action(async(r,o,n)=>{let i=E(n);try{let s=Et("collection",r),a=o.keyword?.trim();if(o.keyword!==void 0&&!a)throw new d(u.INVALID_ARGUMENT,"Collection member keyword must not be empty.");if(a&&a.length>100)throw new d(u.INVALID_ARGUMENT,"Collection member keyword must contain at most 100 characters.");if(o.cursor&&o.cursor.length>1e3)throw new d(u.INVALID_ARGUMENT,"Pagination cursor is too long.");let c=e.configStore??new b,l=P(T(n),c),p=await new mt({baseUrl:l.baseUrl,apiKey:l.apiKey,...e.fetch?{fetch:e.fetch}:{}}).listCollectionMembers(s,{...o.type?{type:Sl(o.type)}:{},...a?{keyword:a}:{},...o.cursor?{cursor:o.cursor}:{},limit:Po(o.limit)});y("library","collection.members.listed",{collection_id:s,count:p.items.length,has_more:p.has_more}),Dl(p,i)}catch(s){Fe(s,i,"asset_library_collection_members")}}),t.command("create").description("Create a reusable role, scene, item, or collection asset").argument("<type>","Asset type: role, scene, item, or collection").option("--input <file>","Read the complete JSON request from a file").option("--name <name>","Asset name").option("--description <text>","Asset description").option("--idempotency-key <key>","Stable retry key (generated when omitted)").option("--face-id-image <uri>","Role face image URI").option("--emo-image <uri>","Role expression image URI").option("--main-image <uri>","Role main image URI").option("--three-view-image <uri>","Role three-view image URI").option("--voice <uri>","Role voice URI").option("--epithet <text>","Role epithet").option("--feature <text>","Role visual features").option("--personality <text>","Role personality").option("--voice-style <text>","Role voice style").option("--image <uri>","Scene or item image URI").option("--multi-view-image <uri>","Scene multi-view image URI").option("--cover-image <uri>","Collection cover image URI").option("--member <reference...>","Collection members: asset-library URIs or group:<id>").option("--subgroup-id <id>","Collection subgroup ID").action(async(r,o,n)=>{let i=E(n);try{Ml(await xl({type:r,options:o},T(n),e),i)}catch(s){Fe(s,i,"asset_library_create")}}),t.command("update").description("Rename or update a role, scene, item, or collection asset").argument("<type>","Asset type: role, scene, item, or collection").argument("<asset>","Asset ID or asset-library URI").option("--name <name>","New asset name").option("--description <text>","New description").option("--face-id-image <uri>").option("--emo-image <uri>").option("--main-image <uri>").option("--three-view-image <uri>").option("--voice <uri>").option("--image <uri>").option("--multi-view-image <uri>").option("--cover-image <uri>").option("--clear-face-id-image").option("--clear-emo-image").option("--clear-main-image").option("--clear-three-view-image").option("--clear-voice").option("--clear-image").option("--clear-multi-view-image").option("--clear-cover-image").option("--epithet <text>").option("--feature <text>").option("--personality <text>").option("--voice-style <text>").action(async(r,o,n,i)=>{let s=E(i);try{let a=$o(r),c=Ul(a,n),l={...c};if(delete l.type,!Object.values(l).some(p=>p!==void 0&&(typeof p!="object"||p===null||Object.keys(p).length>0)))throw new d(u.INVALID_ARGUMENT,"At least one update option is required.");qt(await Wt(T(i),e).update(Et(a,o),c),s,"asset_library_update")}catch(a){Fe(a,s,"asset_library_update")}}),t.command("delete").description("Move a reusable asset to trash").argument("<type>","Asset type: role, scene, item, or collection").argument("<asset>","Asset ID or asset-library URI").action(async(r,o,n,i)=>{let s=E(i);try{let a=$o(r);qt(await Wt(T(i),e).delete(Et(a,o),a),s,"asset_library_delete")}catch(a){Fe(a,s,"asset_library_delete")}}),t.command("add-members").description("Add members to a collection without replacing existing members").argument("<collection-id>","Collection ID").argument("<members...>","Asset-library URIs or group:<id>").action(async(r,o,n,i)=>{let s=E(i);try{let a=Et("collection",r);qt(await Wt(T(i),e).addCollectionMembers(a,o.map(Vo)),s,"asset_library_add_members")}catch(a){Fe(a,s,"asset_library_add_members")}}),t.command("remove-members").description("Remove members from a collection").argument("<collection-id>","Collection ID").argument("<members...>","Asset-library URIs or group:<id>").action(async(r,o,n,i)=>{let s=E(i);try{let a=Et("collection",r);qt(await Wt(T(i),e).removeCollectionMembers(a,o.map(Vo)),s,"asset_library_remove_members")}catch(a){Fe(a,s,"asset_library_remove_members")}}),t.command("expression").description("Generate and save a role expression image").argument("<role>","Role asset ID or hogi://role_asset URI").option("--reference-image <uri>","Override the role face image used as reference").option("--idempotency-key <key>","Stable retry key (generated when omitted)").action(async(r,o,n)=>{let i=E(n);try{let s=o.idempotencyKey?.trim()||ws();if(o.idempotencyKey!==void 0&&!o.idempotencyKey.trim())throw new d(u.INVALID_ARGUMENT,"--idempotency-key must not be empty.");if(s.length>200)throw new d(u.INVALID_ARGUMENT,"--idempotency-key must contain at most 200 characters.");let a=o.referenceImage?.trim();if(o.referenceImage!==void 0&&!a)throw new d(u.INVALID_ARGUMENT,"--reference-image must not be empty.");qt(await Wt(T(n),e).generateExpression(Et("role",r),s,a),i,"asset_library_expression")}catch(s){Fe(s,i,"asset_library_expression")}}),t}import{Command as jo}from"commander";import Gl from"cross-spawn";import le from"semver";import{existsSync as Fl}from"fs";import{existsSync as Pl,readFileSync as Ll}from"fs";import{homedir as Is}from"os";import{join as Tr}from"path";function $l(){if(process.env.OIIOII_INSTALL_DIR?.trim())return process.env.OIIOII_INSTALL_DIR.trim();if(process.platform==="win32"){let e=process.env.LOCALAPPDATA?.trim();return Tr(e||Tr(Is(),"AppData","Local"),"oiioii-cli")}return Tr(Is(),".local","share","oiioii-cli")}function Vl(){return process.env.OIIOII_INSTALL_RECORD?.trim()||Tr($l(),"install.json")}function et(e){return typeof e=="string"&&e.trim().length>0}function bs(e=Vl()){if(!Pl(e))throw new d(u.CLI_INSTALLATION_UNMANAGED,`This oiioii installation is not managed by the official installer. Update it with 'npm install -g ${Ct}@latest'.`,{path:e,retryable:!1});let t;try{t=JSON.parse(Ll(e,"utf8").replace(/^\uFEFF/,""))}catch(n){throw new d(u.CONFIG_ERROR,`Cannot read CLI install record: ${e}`,{path:e,cause:n instanceof Error?n.message:String(n)})}let r=t;if(r.schemaVersion!==1||r.manager!=="npm"||!et(r.environment)||!et(r.packageName)||!et(r.distTag)||!et(r.installRoot)||!et(r.npmPrefix)||!et(r.nodePath)||!et(r.npmPath)||!et(r.entryPath))throw new d(u.CONFIG_ERROR,`Invalid CLI install record: ${e}`,{path:e});let o=ae();if(r.environment!==o)throw new d(u.CONFIG_ERROR,`Install record environment '${r.environment}' does not match this '${o}' build.`,{path:e,installed_environment:r.environment,build_environment:o});if(r.packageName!==Ct)throw new d(u.CONFIG_ERROR,`Install record package '${r.packageName}' does not match this build package '${Ct}'.`,{path:e,installed_package:r.packageName,build_package:Ct});return r}var Go=(e,t,r)=>new Promise((o,n)=>{let i=Gl(e,t,{stdio:r.inherit?"inherit":["ignore","pipe","pipe"],env:process.env}),s="",a="";r.inherit||(i.stdout?.setEncoding("utf8"),i.stderr?.setEncoding("utf8"),i.stdout?.on("data",c=>{s+=c}),i.stderr?.on("data",c=>{a+=c})),i.on("error",n),i.on("close",c=>o({exitCode:c??1,stdout:s,stderr:a}))});function Fo(e,t){return e.registry?[...t,"--registry",e.registry]:t}async function Ar(e,t,r,o){let n;try{n=await e(t,r,{inherit:o.inherit===!0})}catch(i){throw new d(u.CLI_UPDATE_FAILED,`Failed to start npm while ${o.operation}.`,{cause:i instanceof Error?i.message:String(i),retryable:!0})}if(n.exitCode!==0)throw new d(u.CLI_UPDATE_FAILED,`npm failed while ${o.operation}.`,{exit_code:n.exitCode,stderr:n.stderr.trim()||void 0,retryable:!0});return n}function Es(e,t){try{return JSON.parse(e.trim())}catch{throw new d(u.CLI_UPDATE_FAILED,`npm returned invalid JSON while ${t}.`,{output:e.trim(),retryable:!0})}}function Wl(e){let t=e.trim().replace(/^v(?=\d)/,"");if(le.valid(t)===null)throw new d(u.INVALID_ARGUMENT,`Invalid CLI version '${e}'. Use one exact version such as 0.3.0; ranges, tags, and URLs are not supported.`);return t}function Wo(e){let t=ae(),r=At();if(!r.managed)throw new d(u.CLI_INSTALLATION_UNMANAGED,"Local builds cannot update or install CLI versions from npm. Rebuild the local checkout instead.");let o=le.prerelease(e);if(r.prerelease==="forbidden"&&o!==null)throw new d(u.INVALID_ARGUMENT,`The production build only installs stable versions; '${e}' is a prerelease.`);if(r.prerelease==="required"&&o===null)throw new d(u.INVALID_ARGUMENT,`The ${t} build only installs prerelease versions; '${e}' is stable.`)}function qo(){let e=At();if(!e.managed||!e.distTag)throw new d(u.CLI_INSTALLATION_UNMANAGED,"Local builds cannot update or install CLI versions from npm. Rebuild the local checkout instead.");let t=bs();if(t.distTag!==e.distTag)throw new d(u.CONFIG_ERROR,`Install record dist-tag '${t.distTag}' does not match '${e.distTag}'.`);return t}async function Ts(e,t,r){let o=await Ar(r,e.npmPath,Fo(e,["view",`${e.packageName}@${t}`,"version","--json"]),{operation:`resolving ${t}`}),n=Es(o.stdout,`resolving ${t}`);if(typeof n!="string"||le.valid(n)===null)throw new d(u.CLI_UPDATE_FAILED,`npm returned an invalid version for '${t}'.`,{value:n,retryable:!0});return Wo(n),n}async function ql(e,t,r){if(!Fl(e.entryPath))throw new d(u.CLI_UPDATE_FAILED,`Installed CLI entry was not found: ${e.entryPath}`);let o=await Ar(r,e.nodePath,[e.entryPath,"--version"],{operation:"verifying the installed CLI"});if(o.stdout.trim()!==t)throw new d(u.CLI_UPDATE_FAILED,"Installed CLI version verification failed.",{expected:t,actual:o.stdout.trim(),retryable:!0})}async function vs(e,t,r){await Ar(r,e.npmPath,Fo(e,["install","--global","--prefix",e.npmPrefix,"--no-audit","--no-fund",`${e.packageName}@${t}`]),{inherit:!0,operation:`installing ${e.packageName}@${t}`}),await ql(e,t,r)}async function As(e,t,r){try{await vs(e,t,r)}catch(o){let n="not_attempted",i;if(le.valid(H)!==null&&le.neq(H,t))try{await vs(e,H,r),n="succeeded"}catch(s){n="failed",i=s instanceof Error?s.message:String(s)}throw new d(u.CLI_UPDATE_FAILED,`Failed to install ${e.packageName}@${t}.`,{cause:o instanceof Error?o.message:String(o),rollback:n,...i?{rollback_error:i}:{},retryable:!0})}}async function Cs(e={},t=Go){let r=At();if(!r.managed||!r.distTag)throw Wo(H),new Error("unreachable");let o=qo(),n=await Ts(o,r.distTag,t),i=le.gt(n,H),s=!e.check&&(i||e.force===!0);return s&&await As(o,n,t),{environment:ae(),package:o.packageName,dist_tag:r.distTag,previous_version:H,version:n,update_available:i,changed:s,checked_only:e.check===!0}}async function Ss(e,t=Go){let r=qo(),o=Wl(e);Wo(o);let n=await Ts(r,o,t);return await As(r,n,t),{environment:ae(),package:r.packageName,dist_tag:r.distTag,previous_version:H,version:n,update_available:le.gt(n,H),changed:le.neq(H,n),checked_only:!1}}async function Os(e=Go){let t=At(),r=qo(),o=await Ar(e,r.npmPath,Fo(r,["view",r.packageName,"versions","--json"]),{operation:"listing CLI versions"}),n=Es(o.stdout,"listing CLI versions"),s=(Array.isArray(n)?n:[n]).filter(a=>typeof a=="string"&&le.valid(a)!==null).filter(a=>t.prerelease==="required"?le.prerelease(a)!==null:le.prerelease(a)===null).sort(le.rcompare);return{environment:ae(),package:r.packageName,dist_tag:t.distTag,versions:s}}function xs(e,t,r){if(E(r)){_(k(e,t));return}if(t.checked_only){t.update_available?g(`Update available: ${t.previous_version} -> ${t.version} (${t.dist_tag})`):t.previous_version===t.version?U(`oiioii ${t.previous_version} is up to date (${t.dist_tag}).`):g(`Current version ${t.previous_version} is newer than channel version ${t.version}; no downgrade will be performed.`);return}t.changed?U(`oiioii ${t.previous_version} -> ${t.version}`):U(`oiioii ${t.version} is already installed.`)}function Ns(e={}){return new jo("update").description("Update oiioii from the npm channel for this build environment").option("--check","Check for an update without installing it").option("--force","Reinstall the channel version even when already current").action(async(t,r)=>{await e.handleAdditionalOptions?.(t,r)||xs("cli_update",await Cs(t),r)})}function Us(){return new jo("install").description("Install one exact oiioii version from npm").argument("<version>","Exact stable or prerelease version allowed by this build environment").action(async(e,t,r)=>{xs("cli_install",await Ss(e),r)})}function Ds(){return new jo("versions").description("List npm versions available to this build environment").action(async(e,t)=>{let r=await Os();if(E(t)){_(k("cli_versions",r));return}z(`Available oiioii versions (${r.environment})`),r.versions.length===0?g("No matching versions found."):r.versions.forEach(o=>g(o))})}function Ms(e={}){let t=new jl;return t.name("oiioii").description("Agent-native CLI for Oiioii / Hogi GenAI capabilities").version(H,"-V, --version","Output the current version").option("--json","Output machine-readable JSON").option("--base-url <url>","Hogi backend base URL").option("--workspace <id>","Workspace ID override").option("--verbose","Enable verbose/debug output").option("--no-color","Disable colored output"),t.addCommand(fs()),t.addCommand(jn()),t.addCommand(Kn()),t.addCommand(ks()),t.addCommand(fi()),t.addCommand(yi()),t.addCommand(bi()),t.addCommand(Ti()),t.addCommand(Si()),t.addCommand(xi()),t.addCommand(Pi()),t.addCommand(es()),t.addCommand(ns()),t.addCommand(ds()),t.addCommand(e.updateCommand??Ns()),t.addCommand(Us()),t.addCommand(Ds()),t.hook("preAction",async(r,o)=>{let n=[],i=o;for(;i?.parent;)n.push(i.name()),i=i.parent;let s=n.reverse().join("."),a=s.startsWith("logs.")?void 0:Lr(s);await zr(o,s,a)}),t.hook("postAction",()=>{let r=typeof process.exitCode=="number"?process.exitCode:0;Xt(W()?.failure?.code),er(r),$r(r)}),t}async function Ps(e,t){e.exitOverride();try{return await e.parseAsync(t),typeof process.exitCode=="number"?process.exitCode:0}catch(r){if(r instanceof Bo&&(r.code==="commander.helpDisplayed"||r.code==="commander.version"))return 0;W()||Lr("cli.parse");let o=r instanceof d?r:r instanceof Bo?new d(u.INVALID_ARGUMENT,r.message):new d(u.SERVER_ERROR,r instanceof Error?r.message:String(r));return e.opts().json===!0?_(S("cli_error",o.code,o.message,o.details)):(Ke(o.code,o.message),r instanceof Bo||O(o.message)),process.exitCode=1,Xt(o.code),er(1),$r(1),1}}async function Ls(e){await Jr(),process.exit(e)}var Jl=Ms;var Hl=Kl(import.meta.url),Yl=process.argv[1]!==void 0?Bl(zl(process.argv[1])):void 0;Yl===Hl&&Ps(Jl(),process.argv).then(Ls);export{Jl as createProgram,Ps as runProgram};
49
49
  //# sourceMappingURL=cli.js.map