@oiioii/cli 0.1.11 → 0.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +70 -0
- package/dist/cli.js +30 -30
- package/package.json +5 -5
package/dist/cli.js
CHANGED
|
@@ -1,39 +1,39 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{realpathSync as
|
|
3
|
-
`;
|
|
4
|
-
`);for(let i of n)if(i.trim())try{let s=JSON.parse(i);s.schema_version===1&&
|
|
2
|
+
import{realpathSync as Wp}from"fs";import{fileURLToPath as qp}from"url";import{resolve as Kp}from"path";import{Command as Fp,CommanderError as Rn}from"commander";import{Command as Uo}from"commander";import{execFile as Ma}from"child_process";var Zr={terminal:"terminal",codex:"Codex",workbuddy:"WorkBuddy",kimi:"Kimi","claude-code":"Claude Code",deepseek:"DeepSeek"},Da={codex:"com.openai.codex",workbuddy:"com.workbuddy.workbuddy-ai"},Pa={codex:"codex",workbuddy:"workbuddy-ai"},La=1e4,En=async(e,t)=>await new Promise(r=>{Ma(e,t,{timeout:La,windowsHide:!0},o=>r(!o))});async function cr(e,t=process.platform,r=En){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 Tn(e,t=process.platform,r=En){if(t==="darwin"){let o=Da[e];return o?{requested:await r("/usr/bin/open",["-b",o]),supported:!0}:{requested:!1,supported:!1}}if(t==="win32"){let o=Pa[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 An={production:"OIIOII_PRODUCTION_BASE_URL",test:"OIIOII_TEST_BASE_URL",local:void 0},Cn={production:"https://api.oiioii.ai",test:void 0,local:"http://localhost:4000"},$a={production:void 0,test:"OIIOII_TEST_AUTHORIZATION_PAGE_URL",local:void 0},Va={production:"https://oiioii.ai/auth/cli",test:void 0,local:"http://localhost:3000/auth/cli"},Ga={production:{managed:!0,distTag:"latest",prerelease:"forbidden"},test:{managed:!0,distTag:"test",prerelease:"required"},local:{managed:!1,prerelease:"required"}};function Fa(e){return Object.prototype.hasOwnProperty.call(Cn,e)}function Wa(){return"production"}function qa(){return"https://api.oiioii.ai"?.trim()||void 0}function Ka(){return"https://oiioii.ai/auth/cli"?.trim()||void 0}function Ba(e){let t=An[e];return t&&process.env[t]?.trim()||void 0}function de(){let e=Wa()??"local";return Fa(e)?e:"local"}function ja(){let e=de(),t=qa()??Ba(e)??Cn[e];if(!t){let r=An[e]??"OIIOII_BUILD_BASE_URL";throw new Error(`${r} is required for ${e} builds.`)}return{environment:e,baseUrl:t}}function Lt(){return ja().baseUrl}function ur(){let e=de(),t=$a[e],r=Ka()??(t&&process.env[t]?.trim()||void 0)??Va[e];if(!r)throw new Error(`${t??"OIIOII_BUILD_AUTHORIZATION_PAGE_URL"} is required for ${e} builds.`);return r}function $t(){return Ga[de()]}import{readFileSync as Vn,writeFileSync as _d,mkdirSync as hd,existsSync as uo,chmodSync as Gn,rmSync as yd}from"fs";import{join as wd}from"path";import{randomBytes as fd}from"crypto";import{randomBytes as md}from"crypto";import{appendFileSync as ed,chmodSync as eo,existsSync as Qe,mkdirSync as Nn,readFileSync as td,renameSync as xn,statSync as to,unlinkSync as Un,writeFileSync as rd}from"fs";import{dirname as od,join as Mn,resolve as nd}from"path";import{homedir as za}from"os";import{join as Ha}from"path";function Se(){return process.env.OIIOII_CONFIG_DIR??Ha(za(),".oiioii")}import{closeSync as Ja,fstatSync as Ya,openSync as Qa,statSync as Sn,unlinkSync as On}from"fs";var Xa=new Int32Array(new SharedArrayBuffer(4));function Za(e){Atomics.wait(Xa,0,0,e)}function Oe(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=Qa(e,"wx",384)}catch(u){if(u.code!=="EEXIST")throw u;try{if(Date.now()-Sn(e).mtimeMs>n){On(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}`);Za(Math.min(i,Math.max(1,s-Date.now())))}try{return t()}finally{let u=Ya(a);Ja(a);try{let l=Sn(e);l.dev===u.dev&&l.ino===u.ino&&On(e)}catch(l){if(l.code!=="ENOENT")throw l}}}function id(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 Xe=class{logsDir;logsPath;maxBytes;maxFiles;constructor(t={}){let r=t.configDir??Se();this.logsDir=Mn(r,"logs"),this.logsPath=Mn(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
|
+
`;Oe(`${this.logsPath}.lock`,()=>{Qe(this.logsPath)&&to(this.logsPath).size>0&&to(this.logsPath).size+Buffer.byteLength(r)>this.maxBytes&&this.rotate(),ed(this.logsPath,r,{encoding:"utf-8",mode:384}),eo(this.logsPath,384)})}list(t={}){let r=[];for(let o of this.logPathsOldestFirst()){if(!Qe(o))continue;let n=td(o,"utf-8").split(`
|
|
4
|
+
`);for(let i of n)if(i.trim())try{let s=JSON.parse(i);s.schema_version===1&&id(s,t)&&r.push(s)}catch{}}return r.reverse(),t.limit&&t.limit>0?r.slice(0,t.limit):r}export(t){let r=nd(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
|
|
8
|
-
${t}`).digest("hex")}catch{return}}function
|
|
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(!Gr(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 va(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(){Gr(this.dirPath)||ba(this.dirPath,{recursive:!0,mode:448}),mn(this.dirPath,448)}};import{z as x}from"zod";import{randomBytes as Ca}from"crypto";function Sa(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 Wr=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_"+Ca(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=Mr(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=Mr(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:Sa(t)}))}};function V(e,t=Se()){return new Wr(t,e)}var H="0.1.11",Ct="@oiioii/cli";var Oa={clientType:"x-hogi-client-type",clientVersion:"x-hogi-client-version",clientOS:"x-hogi-client-os"};function xa(e){return e==="win32"?"windows":e==="darwin"?"mac":e}function Na(){return{clientType:"cli",clientVersion:H,clientOS:xa(process.platform)}}function F(e){let t=Na();return{...e,...Object.fromEntries(Object.entries(Oa).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 ne(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function Ua(e){let t=ne(e);if(t)return t;if(typeof e!="string")return;let r=e.trim();try{return ne(JSON.parse(r))}catch{}let o=r.lastIndexOf("{");for(;o>=0;){try{let n=ne(JSON.parse(r.slice(o)));if(n)return n}catch{}o=r.lastIndexOf("{",o-1)}}async function gt(e){let t=await e.text().catch(()=>"");if(!t.trim())return{};try{let r=JSON.parse(t);return ne(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 qr(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 qr(`missing ${t}`);return e}function Da(e,t){if(e.ok===!1)throw me(400,e);let r=ne(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=ne(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=ne(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 Ma(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 Pa(e){if(e.ok===!1)throw me(400,e);let t=ne(e.data);if(!t||t.status!=="empty"||!["audio","image","video"].includes(String(t.type))||typeof t.updated!="boolean")throw qr("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 La(e){if(e.ok===!1)throw me(400,e);let t=Ua(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 $a(e){if(e.ok===!1)throw me(400,e);let t=ne(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 Va(e){if(e.ok===!1)throw me(400,e);let t=ne(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=ne(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=V({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:F({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 gt(o);if(!o.ok)throw me(o.status,i);let s=La(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,{...ne(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=V({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 gt(i);if(!i.ok)throw me(i.status,a);let c=$a(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=V({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:F({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 gt(a);if(!a.ok)throw me(a.status,l);let p=n!==void 0,m=Da(l,p);return Ma(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=ne(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=V({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:F({authorization:`Bearer ${this.apiKey}`,"content-type":"application/json",accept:"application/json"}),body:JSON.stringify({workspace_id:t,...o}),signal:a});let c=await gt(s);if(!s.ok)throw me(s.status,c);let l=Pa(c);if(l.workspace_id!==t||l.asset_id!==r)throw qr("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=V({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 gt(i);if(!i.ok)throw me(i.status,a);let c=Va(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=V({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:F({authorization:`Bearer ${this.apiKey}`,accept:"application/json","content-type":"application/json"}),...n!==void 0?{body:JSON.stringify(n)}:{}});let c=await gt(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,{...ne(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("POST",`/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("POST",`/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("POST",`/v1/workspace/folders/${encodeURIComponent(t)}/${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 A(e){let t=e;for(;t.parent;)t=t.parent;return t.opts()}function v(e){return A(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 k(e,t){return{domain:e,action:t,calledEvent:gn[e].called,resultEvent:gn[e].result}}var _n={"auth.login":k("auth","login"),"auth.status":k("auth","status"),"auth.logout":k("auth","logout"),"workspace.list":k("workspace","list"),"workspaces.list":k("workspace","list"),"workspace.delete":k("workspace","delete"),"workspace.create":k("workspace","create"),"workspace.folder.list":k("workspace","folder_list"),"workspace.folder.get":k("workspace","folder_get"),"workspace.folder.create":k("workspace","folder_create"),"workspace.folder.rename":k("workspace","folder_rename"),"workspace.folder.favorite":k("workspace","folder_favorite"),"workspace.folder.unfavorite":k("workspace","folder_unfavorite"),"workspace.folder.workspaces":k("workspace","folder_workspaces"),"workspace.folder.move":k("workspace","folder_move"),"workspace.folder.remove":k("workspace","folder_remove"),"workspace.folder.trash":k("workspace","folder_trash"),"workspace.folder.restore":k("workspace","folder_restore"),"workspace.folder.purge":k("workspace","folder_purge"),"workspace.subgroup.list":k("workspace","subgroup_list"),"workspace.open":k("workspace","open"),"workspace.set":k("workspace","set"),"workspace.current":k("workspace","current"),"workspace.rename":k("workspace","rename"),"workspace.assets.list":k("workspace","assets_list"),"workspace.assets.download":k("workspace","asset_download"),"workspace.canvas.create":k("workspace","canvas_composition_create"),"workspace.canvas.group.create":k("workspace","canvas_group_create"),"workspace.canvas.node.update":k("workspace","canvas_node_update"),"library.list":k("workspace","asset_library_list"),"library.search":k("workspace","asset_library_search"),"library.create":k("workspace","asset_library_create"),"library.update":k("workspace","asset_library_update"),"library.delete":k("workspace","asset_library_delete"),"library.add-members":k("workspace","asset_library_add_members"),"library.remove-members":k("workspace","asset_library_remove_members"),"library.members":k("workspace","asset_library_collection_members"),"library.expression":k("generation","asset_library_expression"),"image.text":k("generation","image_text"),"image.edit":k("generation","image_edit"),"video.text":k("generation","video_text"),"video.image":k("generation","video_image"),"video.generate":k("generation","video_generate"),"audio.generate":k("generation","audio_generate"),"audio.seed-audio":k("generation","audio_seed_audio"),"audio.suno":k("generation","audio_suno"),"upload.file":k("upload","file"),"upload.resource":k("upload","resource"),"task.list":k("task","list"),"task.retry":k("task","retry"),"task.status":k("task","status"),"task.wait":k("task","wait"),"record.get":k("record","get"),"record.open":k("record","open"),"inspect.capabilities":k("inspect","capabilities"),"inspect.models":k("inspect","models"),"preview.latest":k("preview","latest"),"preview.bundle":k("preview","bundle"),"logs.list":k("logs","list"),"logs.export":k("logs","export"),"logs.path":k("logs","path"),"points.balance":k("points","balance"),"points.cost":k("points","cost"),"points.logs":k("points","logs"),"points.quote":k("points","quote"),update:k("cli","update"),install:k("cli","install"),versions:k("cli","versions")};function jr(e){return _n[e]}import{randomBytes as za}from"crypto";import{AsyncLocalStorage as Ga}from"async_hooks";var Br=new Ga;function hn(e){Br.enterWith(e)}function Oe(){return Br.getStore()}function yn(){Br.enterWith(void 0)}var Fa=/(?:authorization|api[_-]?key|token|password|secret|credential|cookie|prompt|file[_-]?path|request[_-]?body|response[_-]?body)/i,Wa=256;function Kr(e){let t={};for(let[r,o]of Object.entries(e))o===void 0||Fa.test(r)||(t[r]=typeof o=="string"?rt(o).slice(0,Wa):o);return t}import{DataRangersSDK as qa}from"@datarangers/sdk-node";import{httpPlugin as ja}from"@datarangers/node-plugin-http";var Ba=20011588,Ka="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 qa({app_id:t.appId??Ba,logLevel:"silent"}),o=t.httpController??ja({channel_domain:t.channelDomain??Ka,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 Ja(){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 Ha(){return`op_${za(8).toString("hex")}`}function Ya(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 zr=class{transport;now;operationId;commonParams;constructor(t={}){this.transport=t.transport??new Ht,this.now=t.now??Date.now,this.operationId=t.operationId??Ha,this.commonParams=t.commonParams??Ja}startCommand(t){let r=t.command.trim();if(!r)return;let o=jr(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,Kr(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=Ya(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:Kr({...r,...n})})}},Rn;function xe(){return Rn??=new zr,Rn}function C(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 Za}from"undici";import{Agent as Qa}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 Qa({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(
|
|
11
|
-
`))}catch{throw
|
|
12
|
-
`)}function g(e){console.log(e)}function U(e){console.log(`\u2713 ${e}`)}function
|
|
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 sc}from"zod";function tr(e,t){let r=sc.string().trim().uuid().safeParse(e);if(!r.success)throw new d(u.INVALID_ARGUMENT,`${t} must be a UUID`);return r.data}function Yr(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 ac(e,t,r,o={}){let n=Yr({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));v(t)?_(S(r,o.code,o.message,o.details)):O(o.message),process.exitCode=1}function En(e,t,r){v(t)?_(I(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 ac(o,a,A(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(A(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 yc}from"commander";import{mkdir as cc,writeFile as dc}from"fs/promises";import{existsSync as uc,statSync as lc}from"fs";import{basename as mc,dirname as pc,join as fc,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 gc(e){try{let t=new URL(e),r=mc(t.pathname);if(r&&r!=="."&&r!=="/")return r}catch{}return"resource.bin"}function _c(e,t){let r=gc(e);if(!t)return Cn(process.cwd(),r);let o=Cn(t);return uc(o)&&lc(o).isDirectory()?fc(o,r):o}function hc(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 yt=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=_c(t,r.output),i=V({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:F({"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(hc(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 cc(pc(n),{recursive:!0}),await dc(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 wc(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 Rc(e){return e.startsWith("hogi://asset/")?e.slice(13):e}function kc(e,t){let r=Rc(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 Ic(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=kc(await s.listAssets(a),o),l=await new yt({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 yc("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=v(n);try{let s=await wc({workspaceId:r},A(n),e);if(re(s.workspace_id),C({asset_count:s.count}),i)_(I("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=v(n);try{let s=await Ic({asset:r,...o.output?{output:o.output}:{},...o.filename?{filename:o.filename}:{},...o.wm!==void 0?{watermark:o.wm}:{}},A(n),e);re(s.workspace_id),C({resource_type:new URL(s.uri).hostname,size_bytes:s.bytes}),i?_(I("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 zc}from"fs/promises";import{resolve as Jc}from"path";import{Command as Hc}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=V({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:F({"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=>!bc(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 bc(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 nt=M.string().trim().min(1).max(200),Qr=M.string().trim().min(1).max(100),ot=M.string().trim().min(1).max(100);function vc(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 Ec=M.object({duration:M.union([M.number().positive().finite(),M.literal("auto")]).optional(),mcp_method_name:nt.optional(),model_version:nt.optional(),quality:ot.optional(),ratio:ot.optional(),resolution:ot.optional()}).strict().refine(e=>Object.values(e).some(t=>t!==void 0),{message:"generation_config must include at least one parameter"}),Zr=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`})}),Xr=M.object({kind:M.literal("workspace_asset"),asset_id:nt,asset_type:M.enum(["item","role","scene"])}).strict(),Tc=M.union([M.object({client_node_id:Qr}).strict(),M.object({asset_id:nt}).strict()]),Ac=M.object({nodes:M.array(M.object({client_id:Qr,type:M.enum(["audio","image","video"]),title:M.string().trim().max(100).optional(),prompt:M.string().max(2e4).optional(),generation_config:Ec.optional(),references:M.array(M.union([Zr,Xr])).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=vc(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:Qr,title:M.string().trim().max(100).optional(),existing_member_policy:M.enum(["move","reject"]).optional(),members:M.array(Tc).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 Cc(e){return e.length>0?e.join("."):"input"}function eo(e){let t=Ac.safeParse(e);if(t.success)return t.data;let r=t.error.issues.map(n=>({path:Cc(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 Sc=/^hogi:\/\/(role|scene|item)_asset\/([A-Za-z0-9_-]+)$/,Oc=/\[(Role|Scene|Item):([^\]]+)]/g,xc=/^[A-Za-z0-9_-]+$/;function Nc(e){return e==="Role"?"role":e==="Scene"?"scene":"item"}function Uc(e){return e==="role"?"Role":e==="scene"?"Scene":"Item"}function ke(e){let t=e.trim(),r=Sc.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 Dc(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 to(e){return`${e.assetType}:${e.assetId}`}function Mc(e){let t=new Set;return e.filter(r=>{let o=to(r);return t.has(o)?!1:(t.add(o),!0)})}function it(e){let t=e.prompt,r=(e.assets??[]).map(ke),o=(e.bindings??[]).map(Dc),n=new Map;for(let c of o){let l=n.get(c.alias);if(l&&to(l)!==to(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(`[${Uc(l.assetType)}:${l.assetId}]`),r.push(l)}let i=new RegExp(Oc.source,"g"),s=null;for(;(s=i.exec(t))!==null;){let c=s[2]?.trim();if(!c||c.length>200||!xc.test(c))throw new d(u.INVALID_ARGUMENT,`Invalid asset placeholder in prompt: ${s[0]}`);r.push({kind:"workspace_asset",assetType:Nc(s[1]),assetId:c})}let a=Mc(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 Pc=De.object({duration:De.union([De.number().positive().finite(),De.literal("auto"),De.null()]).optional(),mcp_method_name:nt.nullable().optional(),model_version:nt.nullable().optional(),quality:ot.nullable().optional(),ratio:ot.nullable().optional(),resolution:ot.nullable().optional()}).strict().refine(e=>Object.keys(e).length>0,{message:"generation_config must include at least one parameter"}),Lc=De.object({generation_config:Pc.optional(),prompt:De.string().max(2e4).nullable().optional(),references:De.array(De.union([Zr,Xr])).max(50).optional()}).strict().refine(e=>Object.keys(e).length>0,{message:"update input must include generation_config, prompt, or references"});function $c(e){return e.length>0?e.join("."):"input"}function ro(e){let t=Lc.safeParse(e);if(t.success)return t.data;let r=t.error.issues.map(n=>({path:$c(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 oo(e){return e.startsWith("hogi://")?e.slice(7):e}function Vc(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 Gc(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:${oo(e.uri)}]`;if(e.media_type==="audio")return`[Audio:${oo(e.uri)}]`;if(e.media_type==="video")return`[Video:${oo(e.uri)}]`}function no(e,t,r,o){let n=t.filter(i=>Vc(i)===r).map(Gc);return e.replace(o,(i,s)=>{let a=Number(s)-1;return n[a]??i})}function io(e,t){let r=no(e,t,"image",/@(?:图片|图)\s*([1-9]\d*)/g),o=no(r,t,"audio",/@音频\s*([1-9]\d*)/g);return no(o,t,"video",/@视频\s*([1-9]\d*)/g)}var Fc={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"},Wc={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"},qc={"seed-audio":"generate_music_seed_audio","seed-audio-1.0":"generate_music_seed_audio",suno:"generate_music_suno"};function Dn(e){return e==="image"?Fc:e==="video"?Wc:qc}function jc(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 Bc(e){let t=Dn(e);return Object.entries(t).map(([r,o])=>({name:r,tool:o}))}function Nt(e,t){let r=jc(t);return!e.startsWith(r)||e.length===r.length?void 0:Bc(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=so(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 so(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 wt(e,t){let r=so(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=Kc(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 Kc(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 st(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=>so(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?{...wt(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=wt(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 at(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 Yc=16*1024*1024;async function Qc(e,t,r=async o=>zc(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(Jc(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")>Yc)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 Zc(e,t){return await Qc(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=eo(e.input),i=eo({...n,nodes:n.nodes.map(p=>p.prompt===void 0?p:{...p,prompt:io(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 Xc(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 Rt(e,t,r,o){if(e!==void 0&&t)throw new d(u.INVALID_ARGUMENT,`${r} cannot be combined with ${o}`)}function ed(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 td(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 rd(e,t,r){if(Rt(e.prompt,e.clearPrompt,"--prompt","--clear-prompt"),Rt(e.ratio,e.clearRatio,"--ratio","--clear-ratio"),Rt(e.duration,e.clearDuration,"--duration","--clear-duration"),Rt(e.resolution,e.clearResolution,"--resolution","--clear-resolution"),Rt(e.quality,e.clearQuality,"--quality","--clear-quality"),Rt(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=wt(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=ed(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(td):e.clearReferences&&(o.references=[]);let i=ro(o);return typeof i.prompt!="string"?i:ro({...i,prompt:io(i.prompt,i.references??[])})}async function od(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 rd(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 nd(e,t){if(re(e.workspace_id),C({node_count:e.nodes.length,group_count:e.groups.length,reused:e.reused}),t){_(I("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 ao(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 id(e,t){if(re(e.workspace_id),C({asset_id:e.asset_id,updated:e.updated,type:e.type}),t){_(I("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 sd(e,t){if(re(e.workspace_id),C({group_id:e.group_id,member_count:e.member_asset_ids.length,reused:e.reused}),t){_(I("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 Hc("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=v(s);try{let c=await Zc(i.input,e.readInputFile),l=await Fn({input:c,workspaceId:n,idempotencyKey:i.idempotencyKey},A(s),e);nd(l,a)}catch(c){ao(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=v(s);try{let c=await od({assetId:n,...i},A(s),e);id(c,a)}catch(c){ao(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=v(s);try{let c=await Xc({assetIds:n,title:i.title,workspaceId:i.workspaceId,idempotencyKey:i.idempotencyKey},A(s),e);sd(c,a)}catch(c){ao(c,a,"workspace_canvas_group_created")}}),t}function ad(e){let t=e;for(;t.parent;)t=t.parent;return t.opts().workspace}var qn=["en","zh","zh-Hant","ja"];async function cd(e,t,r={}){let o=Yr(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 dd(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 co("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=v(o);try{let i=await cd(r,A(o),e);re(i.workspace_id),C({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"}])):(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=v(n);try{let s=await ud(r,A(n),e);re(s.workspace_id),i?_(I("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=v(n);try{let s=ce(A(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?_(I("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=v(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?_(I("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=v(o),s=(e.configStore??new b).loadResolved(),a=ad(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),C({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=v(n);try{let s=await dd({workspaceId:r,name:o.name},A(n),e);re(s.workspace_id),i?_(I("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 ud(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 co("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=v(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(A(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?_(I("workspaces",s)):g(JSON.stringify(s,null,2))}catch(n){Mt(n,o,"workspaces")}})}function Kn(e={}){return new co("workspaces").description("List workspaces").addCommand(Bn(e))}import{Command as Gd,Option as di}from"commander";import{fetch as ld}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
|
|
15
|
-
`,{encoding:"utf-8",mode:384}),
|
|
7
|
+
`:"");return Nn(od(r),{recursive:!0}),rd(r,i,{encoding:"utf-8",mode:384,flag:t.force?"w":"wx"}),eo(r,384),{path:r,format:o,count:n.length,bytes:to(r).size}}ensureDir(){Qe(this.logsDir)||Nn(this.logsDir,{recursive:!0,mode:448}),eo(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)&&Un(t);for(let r=this.maxFiles-2;r>=1;r--){let o=this.rotatedPath(r);Qe(o)&&xn(o,this.rotatedPath(r+1))}this.maxFiles>1&&Qe(this.logsPath)?xn(this.logsPath,this.rotatedPath(1)):Qe(this.logsPath)&&Un(this.logsPath)}};var sd=/(?:authorization|api[_-]?key|token|password|secret|credential|cookie)/i,ad=/([?&](?:api[_-]?key|token|password|secret)=)[^&\s]*/gi,dd=/\boii_sk_[A-Za-z0-9._-]+\b/g,cd=/\bBearer\s+[^\s,;]+/gi;function lt(e){return e.replace(ad,"$1[REDACTED]").replace(dd,"[REDACTED]").replace(cd,"Bearer [REDACTED]")}function ro(e,t,r){if(r>10)return"[MAX_DEPTH]";if(typeof e=="string")return lt(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=>ro(n,t,r+1));let o={};for(let[n,i]of Object.entries(e))o[n]=sd.test(n)?"[REDACTED]":ro(i,t,r+1);return o}function lr(e){return ro(e,new WeakSet,0)}import{AsyncLocalStorage as ud}from"async_hooks";var oo=new ud;function Dn(e){oo.enterWith(e)}function B(){return oo.getStore()}function Pn(){oo.enterWith(void 0)}import{createHash as ld}from"crypto";function j(e){if(typeof e!="string")return;let t=e.trim();return t&&t.length<=256&&!/[\x00-\x1f\x7f]/.test(t)&<(t)===t?t:void 0}function mr(e,t){try{return ld("sha256").update(`${new URL(e).origin}
|
|
8
|
+
${t}`).digest("hex")}catch{return}}function Ze(e){if(!e||typeof e!="object")return;let t=e;return j(t.workspaceId)??j(t.workspace_id)}function Ln(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 Ze(o)??Ze(o?.data)??Ze(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 no(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 $n(e,t){let r=B();r&&t&&t!=="anonymous_user"&&e&&r.identityKey===e&&(r.uid=t)}function pd(){return"log_"+md(8).toString("hex")}var io=class{constructor(t=new Xe){this.store=t}store;record(t){try{let r={schema_version:1,id:pd(),timestamp:new Date().toISOString(),level:t.level,category:t.category??"application",source:t.source,event:t.event,...t.trace_id??B()?.traceId?{trace_id:t.trace_id??B().traceId}:{},...t.feature??B()?.feature?{feature:t.feature??B().feature}:{},...t.message?{message:lt(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:B()?.uid),workspaceId:j(t.workspaceId)??Ze(t.metadata)??B()?.workspaceId}).filter(([,o])=>o!==void 0)),...t.operation?{operation:t.operation}:{},...t.http?{http:lr(t.http)}:{},...t.error?{error:lr(t.error)}:{},...t.metadata?{metadata:lr(t.metadata)}:{}};return this.store.append(r),r}catch{return}}},so=class{record(){}};function Ne(){return process.env.OIIOII_LOG_DISABLED==="1"?new so:new io}function gd(){return"trace_"+fd(8).toString("hex")}function ao(e){let t=gd();return Dn({traceId:t,feature:e,startedAt:Date.now()}),Ne().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=B();n&&Ne().record({level:o,category:"application",source:e,event:"feature.step",trace_id:n.traceId,operation:n.feature,message:t,metadata:{step:t,...r}})}function et(e,t){let r=B();r&&(r.failure={...e?{code:e}:{},message:t},Ne().record({level:"error",category:"application",source:"cli",event:"feature.diagnostic",trace_id:r.traceId,operation:r.feature,error:{...e?{code:e}:{},message:t}}))}function co(e=0){let t=B();if(!t)return;let r=t.failure!==void 0||e!==0;Ne().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}}),Pn()}var c={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_NOT_CANCELLABLE:"TASK_NOT_CANCELLABLE",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 tt(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 rt(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?c.IP_CHARACTER_RESTRICTED:c.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 Rd="openapi";function lo(e){return e==="openapi"||e==="mcp"?e:void 0}function kd(e){if(e===void 0||e.trim()==="")return;let t=lo(e.trim());if(t)return t;throw new d(c.CONFIG_ERROR,"OIIOII_GENERATION_TRANSPORT must be openapi or mcp.",{category:"configuration",retryable:!1})}function Fn(){return{baseUrl:Lt()}}var I=class{configPath;dirPath;constructor(t){this.dirPath=t??Se(),this.configPath=wd(this.dirPath,"config.json")}getConfigPath(){return this.configPath}load(){if(!uo(this.configPath))return y("config_store","config.defaulted",{reason:"missing"}),Fn();try{let t=Vn(this.configPath,"utf-8"),r=JSON.parse(t),o={baseUrl:typeof r.baseUrl=="string"?r.baseUrl:Lt(),...typeof r.apiKey=="string"&&r.apiKey.trim()?{apiKey:r.apiKey.trim()}:{},...typeof r.defaultWorkspaceId=="string"?{defaultWorkspaceId:r.defaultWorkspaceId}:{},...lo(r.generationTransport)?{generationTransport:lo(r.generationTransport)}:{}};return y("config_store","config.loaded"),o}catch{return y("config_store","config.defaulted",{reason:"invalid"},"warn"),Fn()}}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:kd(process.env.OIIOII_GENERATION_TRANSPORT)??t.generationTransport??Rd}}save(t){this._ensureDir(),Oe(`${this.configPath}.lock`,()=>this._write(t)),y("config_store","config.saved")}_write(t){_d(this.configPath,JSON.stringify(t,null,2)+`
|
|
9
|
+
`,{encoding:"utf-8",mode:384}),Gn(this.configPath,384)}update(t,r={}){this._ensureDir(),Oe(`${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(!uo(this.configPath))return!1;this._ensureDir();let t=Oe(`${this.configPath}.lock`,()=>{let r;try{r=JSON.parse(Vn(this.configPath,"utf-8"))}catch{return yd(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(){uo(this.dirPath)||hd(this.dirPath,{recursive:!0,mode:448}),Gn(this.dirPath,448)}};import{z as M}from"zod";import{randomBytes as bd}from"crypto";function Id(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 mo=class{constructor(t,r){this.logger=t;this.context=r;this.correlation={uid:void 0,workspaceId:Ze(r.metadata)??this.trace?.workspaceId}}logger;context;requestId="req_"+bd(8).toString("hex");startedAt=Date.now();completed=!1;started=!1;correlation;trace=B();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 u=new Headers(o?.headers??(r instanceof Request?r.headers:void 0)),l=r instanceof Request?r.url:String(r),p=u.get("x-hogi-api-key")??u.get("authorization")?.replace(/^Bearer\s+/i,"");i=p?mr(l,p):void 0,this.correlation.uid=i&&i===this.trace?.identityKey?this.trace.uid:void 0;let m=Ln(r,o)??Ze(this.context.metadata)??j(u.get("x-workspace-id"))??this.trace?.workspaceId;this.correlation.workspaceId=m,m&&u.set("x-workspace-id",m),n={...o,headers:Object.fromEntries(u.entries())}}catch{}this.start();let s=await t(r,n),a=no(s,r instanceof Request?r.url:String(r));return this.correlation={...a,uid:a.uid??this.correlation.uid,workspaceId:a.workspaceId??this.correlation.workspaceId},$n(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 u=n.headers.get("location");if(!u)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(u,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=no(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:Id(t)}))}};function V(e,t=Ne()){return new mo(t,e)}var Y="0.1.12",Vt="@oiioii/cli";var vd={clientType:"x-hogi-client-type",clientVersion:"x-hogi-client-version",clientOS:"x-hogi-client-os"};function Ed(e){return e==="win32"?"windows":e==="darwin"?"mac":e}function Td(){return{clientType:"cli",clientVersion:Y,clientOS:Ed(process.platform)}}function F(e){let t=Td();return{...e,...Object.fromEntries(Object.entries(vd).map(([r,o])=>[o,t[r]]))}}var W=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 q(e){let t=e.timeoutMs??3e4,r=new AbortController,o,n=new Promise((i,s)=>{o=setTimeout(()=>{r.abort(),s(new W(e.operation,t))},t)});o?.unref();try{return await Promise.race([e.run(r.signal),n])}catch(i){throw i instanceof W?i:r.signal.aborted?new W(e.operation,t):i}finally{o&&clearTimeout(o)}}function ne(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function Ad(e){let t=ne(e);if(t)return t;if(typeof e!="string")return;let r=e.trim();try{return ne(JSON.parse(r))}catch{}let o=r.lastIndexOf("{");for(;o>=0;){try{let n=ne(JSON.parse(r.slice(o)));if(n)return n}catch{}o=r.lastIndexOf("{",o-1)}}async function vt(e){let t=await e.text().catch(()=>"");if(!t.trim())return{};try{let r=JSON.parse(t);return ne(r)??{}}catch{throw new d(c.SERVER_ERROR,"Invalid JSON response from workspace API",{status:e.status})}}function pe(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(c.API_KEY_INVALID,o,n):e===403?new d(r==="feature_not_enabled"?c.NOT_IMPLEMENTED:c.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"?c.RECORD_NOT_FOUND:c.WORKSPACE_NOT_FOUND,o,n):e===400||e===422?new d(c.INVALID_ARGUMENT,o,n):e===409?new d(c.INVALID_ARGUMENT,o,n):e===429?new d(c.QUOTA_EXCEEDED,o,n):new d(c.SERVER_ERROR,o,n)}function Gt(e,t,r){if(typeof e!="string"||!e.trim())throw Re(`missing ${t}`,r);return e}function Re(e,t){return new d(c.SERVER_ERROR,`Invalid canvas composition response: ${e}`,{category:"response_protocol",request_outcome:"unknown",retryable:t})}function po(e){return new d(c.SERVER_ERROR,`Invalid canvas node update response: ${e}`,{category:"response_protocol",request_outcome:"unknown",retryable:!1})}function Wn(e,t){if(typeof e!="string"||!e.trim())throw po(`missing ${t}`);return e}function Cd(e,t){if(e.ok===!1)throw pe(400,e);let r=ne(e.data);if(!r||!Array.isArray(r.nodes)||!Array.isArray(r.groups)||typeof r.reused!="boolean")throw Re("missing result fields",t);let o=r.nodes.map((i,s)=>{let a=ne(i);if(!a)throw Re(`invalid nodes.${s}`,t);return{asset_id:Gt(a.asset_id,`nodes.${s}.asset_id`,t),client_id:Gt(a.client_id,`nodes.${s}.client_id`,t)}}),n=r.groups.map((i,s)=>{let a=ne(i);if(!Array.isArray(a?.member_asset_ids)||a.member_asset_ids.some(u=>typeof u!="string"||!u.trim()))throw Re(`invalid groups.${s}.member_asset_ids`,t);return{client_id:Gt(a.client_id,`groups.${s}.client_id`,t),group_id:Gt(a.group_id,`groups.${s}.group_id`,t),member_asset_ids:a.member_asset_ids}});return{workspace_id:Gt(r.workspace_id,"workspace_id",t),nodes:o,groups:n,reused:r.reused}}function Sd(e,t,r,o){if(e.workspace_id!==t)throw Re("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 Re("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 Re("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 Re("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 Re("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(u=>"client_node_id"in u?n.get(u.client_node_id):u.asset_id);if(a.some(u=>!u)||a.length!==i.member_asset_ids.length||a.some((u,l)=>u!==i.member_asset_ids[l]))throw Re(`groups.${s}.member_asset_ids do not preserve request order`,o)})}function Od(e){if(e.ok===!1)throw pe(400,e);let t=ne(e.data);if(!t||t.status!=="empty"||!["audio","image","video"].includes(String(t.type))||typeof t.updated!="boolean")throw po("missing result fields");return{asset_id:Wn(t.asset_id,"asset_id"),status:"empty",type:t.type,updated:t.updated,workspace_id:Wn(t.workspace_id,"workspace_id")}}function Nd(e){if(e.ok===!1)throw pe(400,e);let t=Ad(e.data),r=t?.workspaceId,o=t?.name;if(typeof r!="string"||!r.trim())throw new d(c.SERVER_ERROR,"Invalid workspace API response: missing workspaceId");if(typeof o!="string"||!o.trim())throw new d(c.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(c.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 xd(e){if(e.ok===!1)throw pe(400,e);let t=ne(e.data),r=t?.workspace_id,o=t?.name;if(typeof r!="string"||!r.trim())throw new d(c.SERVER_ERROR,"Invalid workspace rename response: missing workspace_id");if(typeof o!="string"||!o.trim())throw new d(c.SERVER_ERROR,"Invalid workspace rename response: missing name");return{workspaceId:r,name:o}}function Ud(e){if(e.ok===!1)throw pe(400,e);let t=ne(e.data);if(!Array.isArray(t?.asset))throw new d(c.SERVER_ERROR,"Invalid workspace detail response: missing asset list");return t.asset.map((r,o)=>{let n=ne(r);if(!n||typeof n.assetId!="string"||typeof n.type!="string"||typeof n.uri!="string")throw new d(c.SERVER_ERROR,`Invalid workspace asset at index ${o}`);return n})}var Ft=M.object({id:M.string().min(1),name:M.string().min(1),project_count:M.number().int().nonnegative(),subgroup_id:M.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=V({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 q({operation:"Workspace creation request",timeoutMs:this.timeoutMs,run:async n=>{o=await r.fetch(this._fetch,`${this.baseUrl}/v1/workspace/create`,{method:"POST",headers:F({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 vt(o);if(!o.ok)throw pe(o.status,i);let s=Nd(i);if(t.folderId!==void 0&&s.folderId===void 0||t.subgroupId!==void 0&&s.subgroupId===void 0)throw new d(c.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 W){let s=new d(c.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===c.SERVER_ERROR||n.code===c.NETWORK_ERROR?new d(n.code,n.message,{...ne(n.details)??{},retryable:!1,request_outcome:"unknown"}):n;throw r.failure(s,o?.status),s}let i=new d(c.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=V({source:"hogi_workspace_client",operation:"workspace.rename",method:"POST",path:o,metadata:{workspace_id:t}},this.logger),i;try{return await q({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 vt(i);if(!i.ok)throw pe(i.status,a);let u=xd(a);return n.success(i.status,{workspace_id:u.workspaceId}),u}})}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=V({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 q({operation:"Canvas composition creation request",timeoutMs:this.timeoutMs,run:async u=>{a=await s.fetch(this._fetch,`${this.baseUrl}${i}`,{method:"POST",headers:F({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:u});let l=await vt(a);if(!a.ok)throw pe(a.status,l);let p=n!==void 0,m=Cd(l,p);return Sd(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(u){let l=this.mapRequestError(u,"Canvas composition creation request",s,a);if(l.code!==c.NETWORK_ERROR&&l.code!==c.SERVER_ERROR)throw l;let p=ne(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=V({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 q({operation:"Canvas node update request",timeoutMs:this.timeoutMs,run:async a=>{s=await i.fetch(this._fetch,`${this.baseUrl}${n}`,{method:"POST",headers:F({authorization:`Bearer ${this.apiKey}`,"content-type":"application/json",accept:"application/json"}),body:JSON.stringify({workspace_id:t,...o}),signal:a});let u=await vt(s);if(!s.ok)throw pe(s.status,u);let l=Od(u);if(l.workspace_id!==t||l.asset_id!==r)throw po("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=V({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 q({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 vt(i);if(!i.ok)throw pe(i.status,a);let u=Ud(a);return o.success(i.status,{workspace_id:t,asset_count:u.length}),u}})}catch(s){throw this.mapRequestError(s,"Workspace asset list request",o,i)}}async organizationRequest(t,r,o,n){let i=V({source:"hogi_workspace_client",operation:"workspace.organization",method:t,path:r},this.logger),s;try{return await q({operation:"Workspace organization request",timeoutMs:this.timeoutMs,run:async a=>{s=await i.fetch(this._fetch,`${this.baseUrl}${r}`,{method:t,signal:a,headers:F({authorization:`Bearer ${this.apiKey}`,accept:"application/json","content-type":"application/json"}),...n!==void 0?{body:JSON.stringify(n)}:{}});let u=await vt(s);if(!s.ok||u.ok===!1)throw pe(s.status,u);let l=o.safeParse(u.data);if(!l.success)throw new d(c.SERVER_ERROR,"Invalid workspace organization response",{category:"response_protocol",retryable:!1});return i.success(s.status),l.data}})}catch(a){let u=this.mapRequestError(a,"Workspace organization request",i,s);throw t!=="GET"&&(u.code===c.NETWORK_ERROR||u.code===c.SERVER_ERROR)?new d(u.code,u.message,{...ne(u.details)??{},retryable:!1,request_outcome:"unknown"}):u}}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}`,M.object({workspaces:M.array(M.object({workspace_id:M.string().min(1),conversation_count:M.number().int().nonnegative(),name:M.string().nullable(),created_at:M.string(),updated_at:M.string()})),has_more:M.boolean(),next_cursor:M.string().nullable()}))}async deleteWorkspace(t){let r=await this.organizationRequest("POST","/v1/workspace/delete",M.object({workspace_id:M.string().min(1),state:M.literal("trash"),trash_time:M.string().min(1)}),{workspace_id:t});if(r.workspace_id!==t)throw new d(c.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}`,M.object({folders:M.array(Ft),has_more:M.boolean(),next_cursor:M.string().optional()}))}getFolder(t){return this.organizationRequest("GET",`/v1/workspace/folders/${encodeURIComponent(t)}`,M.object({folder:Ft}))}createFolder(t){return this.organizationRequest("POST","/v1/workspace/folders",M.object({folder:Ft,workspace_id:M.string().optional()}),t)}updateFolder(t,r){return this.organizationRequest("POST",`/v1/workspace/folders/${encodeURIComponent(t)}`,M.object({folder:Ft}),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}`,M.object({workspaces:M.array(M.record(M.unknown())),has_more:M.boolean(),next_cursor:M.string().optional()}))}setWorkspaceFolder(t,r){return this.organizationRequest("POST",`/v1/workspace/${encodeURIComponent(t)}/folder`,M.object({workspace_id:M.string(),folder_id:M.string().nullable(),previous_folder_id:M.string().optional(),folder:Ft.optional()}),{folder_id:r})}folderLifecycle(t,r){return this.organizationRequest("POST",`/v1/workspace/folders/${encodeURIComponent(t)}/${r}`,M.object({folder_id:M.string(),workspace_ids:M.array(M.string())}))}listCreationSubgroups(){return this.organizationRequest("GET","/v1/workspace/subgroups",M.object({subgroups:M.array(M.object({id:M.string(),name:M.string(),can_create:M.boolean()}))}))}mapRequestError(t,r,o,n){if(t instanceof W){let s=new d(c.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(c.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 v(e){return T(e).json===!0}function D(e,t){let r=t.loadResolved(),o=r.apiKey?.trim();if(!o)throw new d(c.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(c.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(c.WORKSPACE_REQUIRED,"No workspace set. Pass a workspace ID, use --workspace <id>, set OIIOII_WORKSPACE_ID, or set an active workspace.");return i}var qn={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 k(e,t){return{domain:e,action:t,calledEvent:qn[e].called,resultEvent:qn[e].result}}var Kn={"auth.login":k("auth","login"),"auth.status":k("auth","status"),"auth.logout":k("auth","logout"),"workspace.list":k("workspace","list"),"workspaces.list":k("workspace","list"),"workspace.delete":k("workspace","delete"),"workspace.create":k("workspace","create"),"workspace.folder.list":k("workspace","folder_list"),"workspace.folder.get":k("workspace","folder_get"),"workspace.folder.create":k("workspace","folder_create"),"workspace.folder.rename":k("workspace","folder_rename"),"workspace.folder.favorite":k("workspace","folder_favorite"),"workspace.folder.unfavorite":k("workspace","folder_unfavorite"),"workspace.folder.workspaces":k("workspace","folder_workspaces"),"workspace.folder.move":k("workspace","folder_move"),"workspace.folder.remove":k("workspace","folder_remove"),"workspace.folder.trash":k("workspace","folder_trash"),"workspace.folder.restore":k("workspace","folder_restore"),"workspace.folder.purge":k("workspace","folder_purge"),"workspace.subgroup.list":k("workspace","subgroup_list"),"workspace.open":k("workspace","open"),"workspace.set":k("workspace","set"),"workspace.current":k("workspace","current"),"workspace.rename":k("workspace","rename"),"workspace.assets.list":k("workspace","assets_list"),"workspace.assets.download":k("workspace","asset_download"),"workspace.canvas.create":k("workspace","canvas_composition_create"),"workspace.canvas.group.create":k("workspace","canvas_group_create"),"workspace.canvas.node.update":k("workspace","canvas_node_update"),"library.list":k("workspace","asset_library_list"),"library.search":k("workspace","asset_library_search"),"library.create":k("workspace","asset_library_create"),"library.update":k("workspace","asset_library_update"),"library.delete":k("workspace","asset_library_delete"),"library.add-members":k("workspace","asset_library_add_members"),"library.remove-members":k("workspace","asset_library_remove_members"),"library.members":k("workspace","asset_library_collection_members"),"library.expression":k("generation","asset_library_expression"),"image.text":k("generation","image_text"),"image.edit":k("generation","image_edit"),"video.text":k("generation","video_text"),"video.image":k("generation","video_image"),"video.generate":k("generation","video_generate"),"audio.generate":k("generation","audio_generate"),"audio.seed-audio":k("generation","audio_seed_audio"),"audio.suno":k("generation","audio_suno"),"audio.elevenlabs":k("generation","audio_elevenlabs"),"media.create":k("generation","media_create"),"media.status":k("generation","media_status"),"story.create":k("generation","story_create"),"story.cancel":k("task","story_cancel"),"story.list":k("task","story_list"),"story.status":k("task","story_status"),"upload.file":k("upload","file"),"upload.resource":k("upload","resource"),"task.list":k("task","list"),"task.retry":k("task","retry"),"task.status":k("task","status"),"task.wait":k("task","wait"),"record.get":k("record","get"),"record.open":k("record","open"),"inspect.capabilities":k("inspect","capabilities"),"inspect.models":k("inspect","models"),"preview.latest":k("preview","latest"),"preview.bundle":k("preview","bundle"),"logs.list":k("logs","list"),"logs.export":k("logs","export"),"logs.path":k("logs","path"),"points.balance":k("points","balance"),"points.cost":k("points","cost"),"points.logs":k("points","logs"),"points.quote":k("points","quote"),update:k("cli","update"),install:k("cli","install"),versions:k("cli","versions")};function fo(e){return Kn[e]}import{randomBytes as Fd}from"crypto";import{AsyncLocalStorage as Md}from"async_hooks";var go=new Md;function Bn(e){go.enterWith(e)}function xe(){return go.getStore()}function jn(){go.enterWith(void 0)}var Dd=/(?:authorization|api[_-]?key|token|password|secret|credential|cookie|prompt|file[_-]?path|request[_-]?body|response[_-]?body)/i,Pd=256;function _o(e){let t={};for(let[r,o]of Object.entries(e))o===void 0||Dd.test(r)||(t[r]=typeof o=="string"?lt(o).slice(0,Pd):o);return t}import{DataRangersSDK as Ld}from"@datarangers/sdk-node";import{httpPlugin as $d}from"@datarangers/node-plugin-http";var Vd=20011588,Gd="https://gator.volces.com",zn=1e3,pr=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??Ne(),!this.disabled)try{let r=t.sdk??new Ld({app_id:t.appId??Vd,logLevel:"silent"}),o=t.httpController??$d({channel_domain:t.channelDomain??Gd,retry:0,timeout:{request:zn}});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=zn){if(!this.httpController||this.pendingEvents===0)return;let r=this.httpController;await new Promise(o=>{let n=!1,i=u=>{n||(n=!0,clearTimeout(a),r.removeListener("drain",s),u&&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 Wd(){let e=de(),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:Y,os:process.platform,arch:process.arch,node_major:Number.isFinite(t)?t:0}}function qd(){return`op_${Fd(8).toString("hex")}`}function Kd(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 ho=class{transport;now;operationId;commonParams;constructor(t={}){this.transport=t.transport??new pr,this.now=t.now??Date.now,this.operationId=t.operationId??qd,this.commonParams=t.commonParams??Wd}startCommand(t){let r=t.command.trim();if(!r)return;let o=fo(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()}:{}};Bn(n),this.emitCalled()}identify(t){let r=xe(),o=t.trim();!r||!o||(r.userId=o,this.emitCalled())}addBusinessInfo(t){let r=xe();r&&Object.assign(r.businessParams,_o(t))}markPartialSuccess(){let t=xe();t&&(t.resultOverride="partial_success")}setWorkspaceId(t){let r=xe(),o=t.trim();r&&o&&(r.workspaceId=o)}reportCommandFailure(t){let r=xe();r&&t&&(r.failureCode=t)}completeCommand(t=0){let r=xe();if(!r)return;this.emitCalled();let o=Kd(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}:{}}),jn()}async flush(t){await this.transport.flush(t)}emitCalled(){let t=xe();!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=xe();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:_o({...r,...n})})}},Hn;function Ue(){return Hn??=new ho,Hn}function N(e){Ue().addBusinessInfo(e)}function ke(){Ue().markPartialSuccess()}function re(e){let t=B(),r=j(e);t&&r&&(t.workspaceId=r),Ue().setWorkspaceId(e)}function ot(e){return e<10*1024*1024?"0_10mb":e<100*1024*1024?"10_100mb":e<500*1024*1024?"100_500mb":"500mb_plus"}function fr(e){return e.startsWith("hogi://audio/")?"audio":e.startsWith("hogi://image/")?"image":e.startsWith("hogi://video/")?"video":"other"}import{fetch as jd}from"undici";import{Agent as Bd}from"undici";async function Me(e){let t=await e.text().catch(()=>""),r;try{let u=t?JSON.parse(t):void 0;u&&typeof u=="object"&&!Array.isArray(u)&&(r=u)}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(u=>typeof u=="string"),s=[r?.message,o?.message,typeof r?.error=="string"?r.error:void 0].find(u=>typeof u=="string"&&u.trim().length>0)??(t.trim()?t.trim():void 0),a={status:e.status,...i?{backend_code:i}:{}};return tt(i,s)?rt(i,s,a):e.status===401?new d(c.API_KEY_INVALID,s??"Invalid API key",a):e.status===426||i==="CLI_UPGRADE_REQUIRED"?new d(c.CLI_UPGRADE_REQUIRED,s??"Upgrade oiioii CLI and retry.",{...a,category:"client_version",retryable:!1}):e.status===403&&i==="MEMBERSHIP_REQUIRED"?new d(c.MEMBERSHIP_REQUIRED,s??"An active membership is required.",{...a,category:"auth",retryable:!1}):e.status===429?new d(c.QUOTA_EXCEEDED,s??"Rate limit exceeded",a):i&&/INVALID_PARAMS|RESOLUTION_NOT_SUPPORTED|DURATION_NOT_SUPPORTED/.test(i)?new d(c.MODEL_CONSTRAINT_VIOLATION,s??"The generation request violates model constraints.",{...a,category:"validation",retryable:!1}):e.status>=500?new d(c.SERVER_ERROR,s??`Server error: ${e.statusText||e.status}`,{...a,category:"server",retryable:!0,request_outcome:"unknown"}):new d(c.GENERATION_FAILED,s??`Request failed: ${e.statusText||e.status}`,a)}function fe(e,t){return new d(c.SERVER_ERROR,e,{...t!==void 0?{status:t}:{},category:"response_protocol",retryable:!0,response_protocol:!0})}function ue(e){if(!(!e||typeof e!="object")){if("code"in e&&typeof e.code=="string")return e.code;if("cause"in e)return ue(e.cause)}}function De(e){return e instanceof Error&&e.name==="AbortError"?!0:["UND_ERR_HEADERS_TIMEOUT","UND_ERR_BODY_TIMEOUT","UND_ERR_CONNECT_TIMEOUT"].includes(ue(e)??"")}function gr(e){return new Bd({headersTimeout:e,bodyTimeout:e})}function _r(e,t){let r=typeof e.errorCode=="string"?e.errorCode:void 0,n=(e.content??[]).filter(u=>u?.type==="text"&&typeof u.text=="string").map(u=>u.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(c.QUOTA_EXCEEDED,n,{...a,category:"quota",retryable:!1}):tt(r,s)?rt(r,s,a):r?.includes("MEMBER_ONLY")?new d(c.MEMBERSHIP_REQUIRED,n,{...a,category:"auth",retryable:!1}):r?.includes("TASK_NOT_FOUND")?new d(c.TASK_NOT_FOUND,n,{...a,category:"task",retryable:!1}):r?.includes("TIMEOUT")?new d(c.GENERATION_TIMEOUT,n,{...a,category:"timeout",retryable:!0}):r&&(r.includes("INVALID_PARAMS")||r.includes("RESOLUTION_NOT_SUPPORTED"))?new d(c.MODEL_CONSTRAINT_VIOLATION,n,{...a,category:"validation",retryable:!1}):r&&(r.includes("MODEL_SERVICE_ERROR")||r.includes("CAPACITY_UNAVAILABLE"))?new d(c.PROVIDER_UNAVAILABLE,n,{...a,category:"provider",retryable:!0}):new d(c.GENERATION_FAILED,n,Object.keys(a).length?{...a,category:"provider",retryable:!1}:void 0)}function zd(e){let t=e.message??"MCP tool call failed";if(/\btool\b.*\bnot found\b/i.test(t))return new d(c.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(c.MODEL_CONSTRAINT_VIOLATION,t,r):Number(e.code)===-32601?new d(c.MODEL_NOT_SUPPORTED,t,r):Number(e.code)===-32700||Number(e.code)===-32600?new d(c.SERVER_ERROR,t,{...e,category:"protocol",retryable:!1}):new d(c.SERVER_ERROR,t,{...e,category:"server",retryable:!0,request_outcome:"unknown"})}var Hd=1;function Jd(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 fe("Invalid SSE response from server",t);try{return JSON.parse(r.join(`
|
|
11
|
+
`))}catch{throw fe("Invalid JSON in SSE response from server",t)}}async function Yd(e){let r=(await e.text()).trim();if(!r)throw fe("Empty response from server",e.status);if(r.startsWith("event:")||r.startsWith("data:"))return Jd(r,e.status);try{return JSON.parse(r)}catch{throw fe("Invalid JSON response from server",e.status)}}function Qd(e,t){if(!e||typeof e!="object")throw fe("Invalid MCP response from server",t);return e}var Et=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??jd,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 fe("Invalid MCP tool result from server");return i}async requestJsonRpc(t,r,o,n,i){let s=V({source:"hogi_mcp_client",operation:n,method:"POST",path:`/mcp/${t}/sse`,...i?{metadata:i}:{}},this.logger),a=new AbortController,u=setTimeout(()=>a.abort(),this.timeoutMs);typeof u=="object"&&"unref"in u&&u.unref();let l;try{if(l=await s.fetch(this._fetch,`${this.baseUrl}/mcp/${t}/sse`,{method:"POST",headers:F({"content-type":"application/json",accept:"application/json, text/event-stream","x-hogi-api-key":this.apiKey,"x-oiioii-cli-version":Y}),body:JSON.stringify({jsonrpc:"2.0",id:Hd++,method:r,params:o}),...this.usesDefaultUndiciTransport?{dispatcher:gr(this.timeoutMs)}:{},signal:a.signal}),!l.ok)throw await Me(l);let p=Qd(await Yd(l),l.status);if(p.error)throw zd(p.error);if(p.result===void 0)throw fe("Missing MCP result from server",l.status);return s.success(l.status),p.result}catch(p){let m=p;if(a.signal.aborted||De(p))m=new d(c.GENERATION_TIMEOUT,`Request timed out after ${this.timeoutMs}ms`,{retryable:!0,...ue(p)?{cause_code:ue(p)}:{}});else if(!(p instanceof d)){let f=p instanceof Error?p.message:String(p);m=new d(c.NETWORK_ERROR,`Network error: ${f}`,{retryable:!0,...ue(p)?{cause_code:ue(p)}:{}})}throw s.failure(m,l?.status),m}finally{clearTimeout(u)}}};function Jn(e,t){if(e.isError)throw _r(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(c.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(c.SERVER_ERROR,`Invalid ${t} response: malformed JSON`)}}var be=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 Et(t)}async getBalance(){let t=Jn(await this.mcp.callTool("get_user_info",{},{serverName:"res"}),"points balance");if(typeof t.points!="number"||typeof t.tier!="string")throw new d(c.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(c.INVALID_ARGUMENT,"Provide 1-20 hogi:// generation URIs");let r=Jn(await this.mcp.callTool("query_generation_cost",{uris:t},{serverName:"res"}),"generation cost query");if(!Array.isArray(r.entries))throw new d(c.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=V({source:"hogi_points_client",operation:"points.logs",method:"GET",path:o},this.logger),i;try{return await q({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:F({accept:"application/json","x-hogi-api-key":this.apiKey}),signal:s}),i.status===401)throw new d(c.API_KEY_INVALID,"Invalid API key",{status:401});let a;try{a=await i.json()}catch{throw new d(c.SERVER_ERROR,"Invalid JSON response from points logs API")}if(!i.ok||a.ok!==!0)throw new d(c.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(c.SERVER_ERROR,"Invalid points logs response");let u=a.data;if(!Array.isArray(u.entries)||typeof u.hasMore!="boolean")throw new d(c.SERVER_ERROR,"Invalid points logs response");let l={entries:u.entries,hasMore:u.hasMore,...typeof u.nextCursor=="number"?{nextCursor:u.nextCursor}:{}};if(l.hasMore&&l.nextCursor===void 0)throw new d(c.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 W){let u=new d(c.NETWORK_ERROR,s.message,{retryable:!0,timeout_ms:s.timeoutMs});throw n.failure(u,i?.status),u}if(s instanceof d)throw n.failure(s,i?.status),s;let a=new d(c.NETWORK_ERROR,`Network error: ${s instanceof Error?s.message:String(s)}`);throw n.failure(a,i?.status),a}}};var Xd=1e3,Zd={record:()=>{}};function Tt(e){return typeof e=="string"&&e.trim()?e.trim():void 0}async function yo(e,t,r,o=Ue(),n={}){try{let i=T(e),s=(n.configStore??new I).loadResolved(),a=e.registeredArguments.findIndex(x=>x.name()==="workspace_id"),u=j(e.processedArgs[a])??j(e.opts().workspaceId)??Tt(i.workspace)??Tt(process.env.OIIOII_WORKSPACE_ID)??Tt(s.defaultWorkspaceId);o.startCommand({command:t,...u?{workspaceId:u}:{},...r?{traceId:r}:{}});let l=B(),p=Tt(i.baseUrl)??s.baseUrl;if(l&&(l.workspaceId=u,l.identityKey=s.apiKey?mr(p,s.apiKey.trim()):void 0),process.env.OIIOII_TELEMETRY_DISABLED==="1")return;let m=Tt(s.apiKey);if(!m)return;let f=await new be({baseUrl:p,apiKey:m,timeoutMs:n.identityTimeoutMs??Xd,logger:Zd,...n.fetch?{fetch:n.fetch}:{}}).getBalance(),h=Tt(f.userId);h&&(o.identify(h),l&&(l.uid=h))}catch{}}function hr(e,t=Ue()){t.reportCommandFailure(e)}function yr(e=0,t=Ue()){t.completeCommand(e)}async function wo(e,t=Ue()){await t.flush(e)}function b(e,t,r){return{ok:!0,type:e,data:t,...r?{next:r}:{}}}function S(e,t,r,o){et(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 z(e){console.error(`\u26A0 ${e}`)}function C(e){et(void 0,e),console.error(`\u2717 ${e}`)}function J(e){console.log(`
|
|
13
|
+
${e}`),console.log("\u2500".repeat(e.length))}function Yn(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 Qn}from"commander";import{z as ec}from"zod";function wr(e,t){let r=ec.string().trim().uuid().safeParse(e);if(!r.success)throw new d(c.INVALID_ARGUMENT,`${t} must be a UUID`);return r.data}function Ro(e){if(e.subgroup!==void 0&&e.public)throw new d(c.INVALID_ARGUMENT,"--subgroup and --public are mutually exclusive");return{...e.folder!==void 0?{folderId:wr(e.folder,"--folder")}:{},...e.subgroup!==void 0?{subgroupId:wr(e.subgroup,"--subgroup")}:e.public?{subgroupId:null}:{}}}async function tc(e,t,r,o={}){let n=Ro({subgroup:t.subgroup,public:t.public}),i=t.folderId!==void 0?wr(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(c.INVALID_ARGUMENT,"--limit must be an integer from 1 to 100");if(t.cursor!==void 0&&!t.cursor.trim())throw new d(c.INVALID_ARGUMENT,"--cursor must not be empty");let a=t.name?.trim();if((e==="create"||e==="rename")&&(!a||a.length>100))throw new d(c.INVALID_ARGUMENT,"--name must contain 1 to 100 characters");if(!["list","create","remove"].includes(e)&&!i)throw new d(c.INVALID_ARGUMENT,"folder_id is required");let u=o.configStore??new I,l=D(r,u),p=new te({baseUrl:l.baseUrl,apiKey:l.apiKey,...o.fetch?{fetch:o.fetch}:{}}),m=()=>wr(ce(r,u,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 Xn(e,t,r){let o=e instanceof d?e:new d(c.SERVER_ERROR,e instanceof Error?e.message:String(e));v(t)?_(S(r,o.code,o.message,o.details)):C(o.message),process.exitCode=1}function Zn(e,t,r){v(t)?_(b(r,e)):g(JSON.stringify(e,null,2))}function ei(e={}){let t=new Qn("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]}:{}};Zn(await tc(o,a,T(s),e),s,`workspace_folder_${o}`)}catch(a){Xn(a,s,`workspace_folder_${o}`)}})}return t}function ti(e={}){let t=new Qn("subgroup").description("Workspace subgroup choices");return t.command("list").description("List visible subgroups and creation permission").action(async(r,o)=>{try{let n=D(T(o),e.configStore??new I),i=new te({baseUrl:n.baseUrl,apiKey:n.apiKey,...e.fetch?{fetch:e.fetch}:{}});Zn(await i.listCreationSubgroups(),o,"workspace_subgroup_list")}catch(n){Xn(n,o,"workspace_subgroup_list")}}),t}import{Command as mc}from"commander";import{mkdir as rc,writeFile as oc}from"fs/promises";import{existsSync as nc,statSync as ic}from"fs";import{basename as sc,dirname as ac,join as dc,resolve as ri}from"path";function oi(e){if(!e||!e.startsWith("hogi://"))throw new d(c.INVALID_ARGUMENT,`Invalid hogi URI: "${e}". Expected format: hogi://image/<id> or hogi://video/<id>`)}function cc(e){try{let t=new URL(e),r=sc(t.pathname);if(r&&r!=="."&&r!=="/")return r}catch{}return"resource.bin"}function uc(e,t){let r=cc(e);if(!t)return ri(process.cwd(),r);let o=ri(t);return nc(o)&&ic(o).isDirectory()?dc(o,r):o}function lc(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 nt=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={}){oi(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={}){oi(t);let o=this.getReadUrl(t,r),n=uc(t,r.output),i=V({source:"hogi_res_client",operation:"resource.read",method:"GET",path:"/v1/res/read_file"},this.logger),s,a;try{a=await q({operation:"Resource download request",timeoutMs:this.timeoutMs,run:async u=>{if(s=await i.fetchResource(this._fetch,o,{method:"GET",headers:F({"x-hogi-api-key":this.apiKey,accept:"image/*,video/*,application/octet-stream,application/json;q=0.5,*/*;q=0.1"}),signal:u}),s.status===401)throw new d(c.API_KEY_INVALID,"Invalid API key",{status:401});if(s.status===404)throw new d(c.RECORD_NOT_FOUND,`Resource not found for URI: ${t}`,{status:404});if(!s.ok){let m=await s.text().catch(()=>"");throw new d(c.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(lc(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(c.SERVER_ERROR,m)}return{contentType:l,buffer:p}}})}catch(u){if(u instanceof W){let m=new d(c.NETWORK_ERROR,u.message,{retryable:!0,timeout_ms:u.timeoutMs});throw i.failure(m,s?.status),m}if(u instanceof d)throw i.failure(u,s?.status),u;let l=u instanceof Error?u.message:String(u),p=new d(c.NETWORK_ERROR,`Network error: ${l}`);throw i.failure(p),p}return i.success(s.status,{bytes:a.buffer.byteLength,mime_type:a.contentType}),await rc(ac(n),{recursive:!0}),await oc(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 ii(e,t){let r=t.configStore??new I,o=D(e,r);return{auth:o,configStore:r,workspaceClient:new te({baseUrl:o.baseUrl,apiKey:o.apiKey,...t.fetch?{fetch:t.fetch}:{}})}}async function pc(e,t,r={}){let{configStore:o,workspaceClient:n}=ii(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 fc(e){return e.startsWith("hogi://asset/")?e.slice(13):e}function gc(e,t){let r=fc(t.trim()),o=e.find(n=>n.assetId===r);if(!o)throw new d(c.RECORD_NOT_FOUND,`Workspace asset not found: ${t}`,{asset_reference:t});if(o.status)throw new d(c.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(c.INVALID_ARGUMENT,`Workspace asset ${o.assetId} has no downloadable resource URI.`,{asset_id:o.assetId,uri:o.uri});return o}async function _c(e,t,r={}){let o=e.asset.trim();if(!o)throw new d(c.INVALID_ARGUMENT,"Asset ID is required");let{auth:n,configStore:i,workspaceClient:s}=ii(t,r),a=ce(t,i,e.workspaceId),u=gc(await s.listAssets(a),o),l=await new nt({baseUrl:n.baseUrl,apiKey:n.apiKey,...r.fetch?{fetch:r.fetch}:{}}).download(u.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:u.assetId,bytes:l.bytes}),{workspace_id:a,asset_id:u.assetId,uri:u.uri,path:l.path,bytes:l.bytes,mime_type:l.mimeType}}function ni(e,t,r){let o=e instanceof d?e:new d(c.SERVER_ERROR,e instanceof Error?e.message:String(e));t?_(S(r,o.code,o.message,o.details)):C(o.message),process.exitCode=1}function si(e={}){let t=new mc("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=v(n);try{let s=await pc({workspaceId:r},T(n),e);if(re(s.workspace_id),N({asset_count:s.count}),i)_(b("workspace_assets_list",s));else{J(`Workspace assets (${s.count})`);for(let a of s.assets)g(` ${a.assetId} ${a.type} ${a.status??"ready"} ${a.uri||"-"}`)}}catch(s){ni(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=v(n);try{let s=await _c({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),N({resource_type:new URL(s.uri).hostname,size_bytes:s.bytes}),i?_(b("workspace_asset_download",s)):U(`Downloaded workspace asset ${s.asset_id}: ${s.path}`)}catch(s){ni(s,i,"workspace_asset_download")}}),t}import{readFile as Fc}from"fs/promises";import{resolve as Wc}from"path";import{Command as qc}from"commander";var ge=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=V({source:"hogi_model_catalog_client",operation:"models.list",method:"POST",path:"/points/mcp_model_pricings"},this.logger),o;try{return await q({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:F({"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(c.API_KEY_INVALID,"Invalid API key",{status:401});if(!o.ok)throw new d(c.SERVER_ERROR,`Model catalog request failed: HTTP ${o.status}`,{status:o.status});let i;try{i=await o.json()}catch{throw new d(c.SERVER_ERROR,"Invalid JSON response from model catalog")}if(i.code==="UNAUTHORIZED")throw new d(c.API_KEY_INVALID,"Invalid API key",{status:401});let s=i.data?.pricings;if(i.code!=="SUCCESS"||!Array.isArray(s)||s.some(a=>!hc(a)))throw new d(c.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 W){let a=new d(c.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(c.NETWORK_ERROR,`Network error: ${i}`);throw r.failure(s),s}}};function hc(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 $}from"zod";var yc={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"},wc={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"},Wt="generate_audio_elevenlabs",Rc={"seed-audio":"generate_music_seed_audio","seed-audio-1.0":"generate_music_seed_audio",suno:"generate_music_suno",elevenlabs:Wt,"elevenlabs-tts-v4":Wt},ko={generate_music_elevenlabs:"elevenlabs",generate_music_elevenlabs_v4:"elevenlabs",generate_audio_elevenlabs_v4:"elevenlabs"},kc=new Set([Wt,...Object.keys(ko)]);function bo(e){return kc.has(e)}function ai(e){return e==="image"?yc:e==="video"?wc:Rc}function Rr(e){return e==="audio"?["generate_music_","generate_audio_"]:[`generate_${e}_`]}function At(e){if(Rr("image").some(t=>e.startsWith(t)))return"image";if(Rr("video").some(t=>e.startsWith(t)))return"video";if(Rr("audio").some(t=>e.startsWith(t)))return"audio"}function di(e,t){let r=ai(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(c.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 bc(e){let t=ai(e);return Object.entries(t).map(([r,o])=>({name:r,tool:o}))}function qt(e,t){let r=Rr(t).find(n=>e.startsWith(n)&&e.length>n.length);return r?t==="audio"&&ko[e]?ko[e]:bc(t).find(n=>n.tool===e)?.name??e.slice(r.length):void 0}var pt=$.string().trim().min(1).max(200),Io=$.string().trim().min(1).max(100),mt=$.string().trim().min(1).max(100);function Ic(e){let t=At(e);if(t)return t;if(e.startsWith("generate_text_"))return"text"}var vc=$.object({duration:$.union([$.number().positive().finite(),$.literal("auto")]).optional(),mcp_method_name:pt.optional(),model_version:pt.optional(),quality:mt.optional(),ratio:mt.optional(),resolution:mt.optional()}).strict().refine(e=>Object.values(e).some(t=>t!==void 0),{message:"generation_config must include at least one parameter"}),vo=$.object({kind:$.literal("media"),media_type:$.enum(["audio","image","text","video"]),uri:$.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:$.ZodIssueCode.custom,path:["uri"],message:`URI must start with ${r} and include a resource key`})}),Eo=$.object({kind:$.literal("workspace_asset"),asset_id:pt,asset_type:$.enum(["item","role","scene"])}).strict(),Ec=$.union([$.object({client_node_id:Io}).strict(),$.object({asset_id:pt}).strict()]),Tc=$.object({nodes:$.array($.object({client_id:Io,type:$.enum(["audio","image","video"]),title:$.string().trim().max(100).optional(),prompt:$.string().max(2e4).optional(),generation_config:vc.optional(),references:$.array($.union([vo,Eo])).max(50).optional()}).strict().superRefine((e,t)=>{let r=e.generation_config;if(!r||(r.model_version&&!r.mcp_method_name&&t.addIssue({code:$.ZodIssueCode.custom,path:["generation_config","model_version"],message:"model_version requires mcp_method_name"}),!r.mcp_method_name))return;let o=Ic(r.mcp_method_name);o?o!==e.type&&t.addIssue({code:$.ZodIssueCode.custom,path:["generation_config","mcp_method_name"],message:`Generation model type ${o} does not match node type ${e.type}`}):t.addIssue({code:$.ZodIssueCode.custom,path:["generation_config","mcp_method_name"],message:"Unknown generation model method"})})).max(100).optional().default([]),groups:$.array($.object({client_id:Io,title:$.string().trim().max(100).optional(),existing_member_policy:$.enum(["move","reject"]).optional(),members:$.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:$.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:$.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:$.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((u,l)=>{let p="client_node_id"in u?`client:${u.client_node_id}`:`asset:${u.asset_id}`;"client_node_id"in u&&!r.has(u.client_node_id)&&t.addIssue({code:$.ZodIssueCode.custom,path:["groups",s,"members",l],message:`Unknown client node: ${u.client_node_id}`}),a.has(p)&&t.addIssue({code:$.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:$.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 To(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(c.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 Nc(e){return e==="Role"?"role":e==="Scene"?"scene":"item"}function xc(e){return e==="role"?"Role":e==="scene"?"Scene":"Item"}function Ie(e){let t=e.trim(),r=Cc.exec(t);if(!r)throw new d(c.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(c.INVALID_ARGUMENT,`Asset library ID is too long: ${o.slice(0,40)}...`);return{kind:"workspace_asset",assetType:r[1],assetId:o}}function ci(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(c.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(c.INVALID_ARGUMENT,`Invalid asset binding name: ${e.slice(0,t).trim()}`);return{alias:r,reference:Ie(e.slice(t+1))}}function Ao(e){return`${e.assetType}:${e.assetId}`}function Mc(e){let t=new Set;return e.filter(r=>{let o=Ao(r);return t.has(o)?!1:(t.add(o),!0)})}function ft(e){let t=e.prompt,r=(e.assets??[]).map(Ie),o=(e.bindings??[]).map(Uc),n=new Map;for(let u of o){let l=n.get(u.alias);if(l&&Ao(l)!==Ao(u.reference))throw new d(c.INVALID_ARGUMENT,`Asset binding @${u.alias} maps to more than one asset.`);n.set(u.alias,u.reference)}for(let[u,l]of[...n.entries()].sort(([p],[m])=>m.length-p.length)){let p=`@${u}`;if(!t.includes(p))throw new d(c.INVALID_ARGUMENT,`Asset binding ${p} was not found in the prompt.`);t=t.split(p).join(`[${xc(l.assetType)}:${l.assetId}]`),r.push(l)}let i=new RegExp(Sc.source,"g"),s=null;for(;(s=i.exec(t))!==null;){let u=s[2]?.trim();if(!u||u.length>200||!Oc.test(u))throw new d(c.INVALID_ARGUMENT,`Invalid asset placeholder in prompt: ${s[0]}`);r.push({kind:"workspace_asset",assetType:Nc(s[1]),assetId:u})}let a=Mc(r);if(a.length>50)throw new d(c.INVALID_ARGUMENT,`Too many asset references: ${a.length}. Maximum is 50.`);return{prompt:t,references:a}}function _e(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 ve(...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 Le}from"zod";var Dc=Le.object({duration:Le.union([Le.number().positive().finite(),Le.literal("auto"),Le.null()]).optional(),mcp_method_name:pt.nullable().optional(),model_version:pt.nullable().optional(),quality:mt.nullable().optional(),ratio:mt.nullable().optional(),resolution:mt.nullable().optional()}).strict().refine(e=>Object.keys(e).length>0,{message:"generation_config must include at least one parameter"}),Pc=Le.object({generation_config:Dc.optional(),prompt:Le.string().max(2e4).nullable().optional(),references:Le.array(Le.union([vo,Eo])).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 Co(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(c.INVALID_ARGUMENT,`Invalid canvas node update input${o?` at ${o.path}: ${o.message}`:""}`,{category:"validation",retryable:!1,issues:r})}function So(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:${So(e.uri)}]`;if(e.media_type==="audio")return`[Audio:${So(e.uri)}]`;if(e.media_type==="video")return`[Video:${So(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)}function ui(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"")}function mi(e,t){let r=Kt(e);if(!r)return!1;let o=ui(t),n=qt(e.mcp_method_name,r);return[e.name,e.model,n,n&&e.model?`${n}${e.model}`:void 0].filter(s=>typeof s=="string").some(s=>ui(s)===o)}function Kt(e){return At(e.mcp_method_name)}function pi(e){return[...e].sort((t,r)=>t.sort_order-r.sort_order||t.id-r.id)[0]}function Ct(e,t){let r=Kt(e);if(!r||t&&r!==t)throw new d(c.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=qt(e.mcp_method_name,r);if(!o)throw new d(c.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 Bt(e,t){if(t.modelId&&(t.model||t.variant))throw new d(c.INVALID_ARGUMENT,"Use --model-id or --model [--variant], not both.");if(t.variant&&!t.model)throw new d(c.INVALID_ARGUMENT,"--variant requires --model.");if(!t.modelId&&!t.model)throw new d(c.INVALID_ARGUMENT,"Provide --model-id or --model [--variant].");if(t.modelId){let i=Gc(t.modelId),s=e.find(a=>a.id===i);if(s)return s;throw new d(c.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=>mi(i,t.model)),o=t.variant?r.filter(i=>i.model===t.variant):r,n=pi(o);if(n)return n;throw new d(c.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 Gc(e){if(!/^\d+$/.test(e))throw new d(c.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(c.INVALID_ARGUMENT,`Invalid model ID: "${e}". Expected a positive integer from inspect models.`);return t}async function $e(e){if(e.modelId&&e.variant)throw new d(c.INVALID_ARGUMENT,"Use either --model-id or --variant, not both.");if(!e.modelId&&!e.model)throw new d(c.INVALID_ARGUMENT,"Provide --model-id or --model [--variant].");if(!e.modelId&&!e.variant){let n=e.model,i;try{i=di(n,e.domain)}catch(l){if(!e.allowCatalogOnlyModel||!e.requireActiveCatalog||!(l instanceof d)||l.code!==c.MODEL_NOT_SUPPORTED)throw l}if(!e.requireActiveCatalog)return{key:n,toolName:i};let a=(await new ge({baseUrl:e.baseUrl,apiKey:e.apiKey,...e.fetch?{fetch:e.fetch}:{}}).listModels()).filter(l=>Kt(l)===e.domain&&(l.mcp_method_name===i||mi(l,n)));if(a.length===0)throw new d(c.MODEL_NOT_SUPPORTED,`Model ${n} 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:n});let u=a.find(l=>l.mcp_method_name===i&&l.model===null)??pi(a);return{...Ct(u,e.domain),key:n}}let t=await new ge({baseUrl:e.baseUrl,apiKey:e.apiKey,...e.fetch?{fetch:e.fetch}:{}}).listModels(),r=Bt(t,e.modelId?{modelId:e.modelId}:{model:e.model,variant:e.variant}),o=Ct(r,e.domain);return e.modelId?o:{...o,key:e.model}}function fi(e){return[...new Set(e.catalog?.input_capabilities??[])]}function jt(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 li(e){let t=e.trim().toLowerCase();return t==="adaptive"?"auto":t}function gt(e,t){let r=e.catalog;if(r){if(t.aspectRatio&&r.aspect_ratios.length>0){let o=li(t.aspectRatio);if(!r.aspect_ratios.map(li).includes(o))throw new d(c.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(c.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(c.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 Ee(e){return{key:e.key,...e.modelId!==void 0?{model_id:e.modelId}:{},...e.name?{name:e.name}:{},...e.variant?{variant:e.variant}:{}}}function it(e){return e.modelId!==void 0?`--model-id ${e.modelId}`:e.variant?`--model ${e.key} --variant ${e.variant}`:`--model ${e.key}`}var Kc=16*1024*1024;async function Bc(e,t,r=async o=>Fc(o,"utf8")){let o=e.trim();if(!o)throw new d(c.INVALID_ARGUMENT,"--input must not be empty");let n;try{n=await r(Wc(o))}catch(i){throw new d(c.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")>Kc)throw new d(c.INVALID_ARGUMENT,"Canvas composition input must not exceed 16 MiB");try{return JSON.parse(n)}catch(i){throw new d(c.INVALID_ARGUMENT,`Canvas composition input is not valid JSON: ${i instanceof Error?i.message:String(i)}`,{category:"validation",retryable:!1,path:o})}}async function jc(e,t){return await Bc(e,"canvas composition",t)}async function gi(e,t,r={}){let o=e.idempotencyKey?.trim();if(e.idempotencyKey!==void 0&&!o)throw new d(c.INVALID_ARGUMENT,"--idempotency-key must not be empty");if(o&&o.length>200)throw new d(c.INVALID_ARGUMENT,"--idempotency-key must not exceed 200 characters");let n=To(e.input),i=To({...n,nodes:n.nodes.map(p=>p.prompt===void 0?p:{...p,prompt:No(p.prompt,p.references??[])})}),s=r.configStore??new I,a=D(t,s),u=ce(t,s,e.workspaceId);y("workspace_canvas","composition.create_requested",{workspace_id:u,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(u,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(c.INVALID_ARGUMENT,"A canvas group requires at least two asset IDs");if(new Set(o).size!==o.length)throw new d(c.INVALID_ARGUMENT,"A canvas group cannot contain duplicate asset IDs");let n=await gi({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(c.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 St(e,t,r,o){if(e!==void 0&&t)throw new d(c.INVALID_ARGUMENT,`${r} cannot be combined with ${o}`)}function Hc(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(c.INVALID_ARGUMENT,"--duration must be a positive number or auto");return r}function Jc(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=Ie(t);return{kind:"workspace_asset",asset_id:o.assetId,asset_type:o.assetType}}async function Yc(e,t,r){if(St(e.prompt,e.clearPrompt,"--prompt","--clear-prompt"),St(e.ratio,e.clearRatio,"--ratio","--clear-ratio"),St(e.duration,e.clearDuration,"--duration","--clear-duration"),St(e.resolution,e.clearResolution,"--resolution","--clear-resolution"),St(e.quality,e.clearQuality,"--quality","--clear-quality"),St(e.reference,e.clearReferences,"--reference","--clear-references"),e.clearModel&&(e.model!==void 0||e.modelId!==void 0||e.variant!==void 0))throw new d(c.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(c.INVALID_ARGUMENT,"--variant requires --model.");if(e.modelId!==void 0&&(e.model!==void 0||e.variant!==void 0))throw new d(c.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 ge({baseUrl:t.baseUrl,apiKey:t.apiKey,...r.fetch?{fetch:r.fetch}:{}}).listModels(),a=Bt(s,{...e.model!==void 0?{model:e.model}:{},...e.modelId!==void 0?{modelId:e.modelId}:{},...e.variant!==void 0?{variant:e.variant}:{}}),u=Ct(a);n.mcp_method_name=u.toolName,n.model_version=u.variant??null}e.ratio!==void 0?n.ratio=e.ratio:e.clearRatio&&(n.ratio=null),e.duration!==void 0?n.duration=Hc(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(Jc):e.clearReferences&&(o.references=[]);let i=Co(o);return typeof i.prompt!="string"?i:Co({...i,prompt:No(i.prompt,i.references??[])})}async function Qc(e,t,r={}){let o=e.assetId.trim();if(!o||o.length>200)throw new d(c.INVALID_ARGUMENT,"asset_id must contain between 1 and 200 characters");let n=r.configStore??new I,i=D(t,n),s=ce(t,n,e.workspaceId),a=await Yc(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 u=await new te({baseUrl:i.baseUrl,apiKey:i.apiKey,...r.fetch?{fetch:r.fetch}:{}}).updateEmptyCanvasNode(s,o,a);return y("workspace_canvas",u.updated?"node.updated":"node.unchanged",{workspace_id:u.workspace_id,asset_id:u.asset_id}),u}function Xc(e,t){if(re(e.workspace_id),N({node_count:e.nodes.length,group_count:e.groups.length,reused:e.reused}),t){_(b("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 xo(e,t,r="workspace_canvas_composition_created"){let o=e instanceof d?e:new d(c.SERVER_ERROR,e instanceof Error?e.message:String(e));t?_(S(r,o.code,o.message,o.details)):C(o.message),process.exitCode=1}function Zc(e,t){if(re(e.workspace_id),N({asset_id:e.asset_id,updated:e.updated,type:e.type}),t){_(b("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 eu(e,t){if(re(e.workspace_id),N({group_id:e.group_id,member_count:e.member_asset_ids.length,reused:e.reused}),t){_(b("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 _i(e={}){let t=new qc("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=v(s);try{let u=await jc(i.input,e.readInputFile),l=await gi({input:u,workspaceId:n,idempotencyKey:i.idempotencyKey},T(s),e);Xc(l,a)}catch(u){xo(u,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=v(s);try{let u=await Qc({assetId:n,...i},T(s),e);Zc(u,a)}catch(u){xo(u,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=v(s);try{let u=await zc({assetIds:n,title:i.title,workspaceId:i.workspaceId,idempotencyKey:i.idempotencyKey},T(s),e);eu(u,a)}catch(u){xo(u,a,"workspace_canvas_group_created")}}),t}function tu(e){let t=e;for(;t.parent;)t=t.parent;return t.opts().workspace}var hi=["en","zh","zh-Hant","ja"];async function ru(e,t,r={}){let o=Ro(e),n=e.name?.trim();if(e.name!==void 0&&!n)throw new d(c.INVALID_ARGUMENT,"--name must not be empty");if(n&&n.length>100)throw new d(c.INVALID_ARGUMENT,"--name must not exceed 100 characters");if(e.language!==void 0&&!hi.includes(e.language))throw new d(c.INVALID_ARGUMENT,`--language must be one of: ${hi.join(", ")}`);let i=r.configStore??new I,s=D(t,i),a=e.language;y("workspace","workspace.create_requested",{has_name:n!==void 0,language:a??null,set_current:e.setCurrent===!0});let u=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:u.workspaceId}),y("workspace","workspace.current_updated",{workspace_id:u.workspaceId})),y("workspace","workspace.created",{workspace_id:u.workspaceId}),{workspace_id:u.workspaceId,...u.folderId!==void 0?{folder_id:u.folderId}:{},...u.subgroupId!==void 0?{subgroup_id:u.subgroupId}:{},name:u.name,...a!==void 0?{language:a}:{},set_current:e.setCurrent===!0}}async function ou(e,t,r={}){let o=e.name.trim();if(!o)throw new d(c.INVALID_ARGUMENT,"--name must not be empty");if(o.length>100)throw new d(c.INVALID_ARGUMENT,"--name must not exceed 100 characters");let n=r.configStore??new I,i=D(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 zt(e,t,r){let o=e instanceof d?e:new d(c.SERVER_ERROR,e instanceof Error?e.message:String(e));t?_(S(r,o.code,o.message,o.details)):C(o.message),process.exitCode=1}function yi(e={}){let t=new Uo("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=v(o);try{let i=await ru(r,T(o),e);re(i.workspace_id),N({set_current:i.set_current,...i.language?{language:i.language}:{}}),n?_(b("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){zt(i,n,"workspace_created")}}),t.addCommand(wi(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=v(n);try{let s=await nu(r,T(n),e);re(s.workspace_id),i?_(b("workspace_deleted",s)):U(`Workspace moved to trash: ${s.workspace_id}`)}catch(s){zt(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=v(n);try{let s=ce(T(n),e.configStore??new I,r);if(!/^[A-Za-z0-9_-]+$/.test(s))throw new d(c.INVALID_ARGUMENT,"Workspace ID must contain only letters, numbers, underscores, or hyphens");let a=new URL(`/space/${encodeURIComponent(s)}`,ur()).href,u=o.browser===!1?!1:await(e.openBrowser??cr)(a);re(s),i?_(b("workspace_opened",{workspace_id:s,url:a,opened:u})):(g(a),o.browser!==!1&&!u&&z("Unable to open a browser. Open the workspace URL manually."))}catch(s){zt(s,i,"workspace_opened")}}),t.command("set").description("Set active workspace").argument("<workspace_id>","Workspace ID").action((r,o,n)=>{let i=v(n);if(!r||r.trim()===""){i?_(S("workspace_set",c.INVALID_ARGUMENT,"Workspace ID is required.")):C("Workspace ID is required."),process.exitCode=1;return}(e.configStore??new I).update({defaultWorkspaceId:r.trim()}),re(r.trim()),i?_(b("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=v(o),s=(e.configStore??new I).loadResolved(),a=tu(o),u=process.env.OIIOII_WORKSPACE_ID,l=a??u??s.defaultWorkspaceId,p=a?"flag":u?"env":s.defaultWorkspaceId?"config":"none";if(!l){n?_(S("workspace_current",c.WORKSPACE_REQUIRED,"No workspace set. Use 'oiioii workspace set <id>' or set OIIOII_WORKSPACE_ID.",{hint:"oiioii workspace set <workspace_id>"})):(C("No workspace set."),g(" Use: oiioii workspace set <workspace_id>"),g(" Or set: OIIOII_WORKSPACE_ID=<id>")),process.exitCode=1;return}re(l),N({has_workspace:!0}),n?_(b("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=v(n);try{let s=await ou({workspaceId:r,name:o.name},T(n),e);re(s.workspace_id),i?_(b("workspace_renamed",s)):U(`Workspace renamed to: ${s.name}`)}catch(s){zt(s,i,"workspace_renamed")}}),t.addCommand(ei(e)),t.addCommand(ti(e)),t.addCommand(si(e)),t.addCommand(_i(e)),t}async function nu(e,t,r={}){let o=r.configStore??new I,n=D(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 wi(e={}){return new Uo("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=v(r);try{let n=Number(t.limit);if(!Number.isInteger(n)||n<1||n>50)throw new d(c.INVALID_ARGUMENT,"--limit must be an integer from 1 to 50");if(t.cursor!==void 0&&!t.cursor.trim())throw new d(c.INVALID_ARGUMENT,"--cursor must not be empty");let i=D(T(r),e.configStore??new I),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?_(b("workspaces",s)):g(JSON.stringify(s,null,2))}catch(n){zt(n,o,"workspaces")}})}function Ri(e={}){return new Uo("workspaces").description("List workspaces").addCommand(wi(e))}import{Command as Mu,Option as Li}from"commander";import{fetch as iu}from"undici";var Ve=3e4;function X(e){return new d(c.SERVER_ERROR,e,{category:"response_protocol",retryable:!0,response_protocol:!0})}function ki(e,t){if(e.isError)throw _r(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 X(`${t}: empty response`);try{return JSON.parse(r)}catch{throw X(`${t}: invalid JSON response`)}}function le(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function kr(e){if(e==="pending"||e==="processing"||e==="succeeded"||e==="failed"||e==="cancelled")return e;throw X(`Invalid backend async task status: ${String(e)}`)}function br(e){if(e==="image"||e==="video"||e==="audio")return e;throw X(`Invalid backend async media type: ${String(e)}`)}var Mo=class{constructor(t){this.mcp=t}mcp;async submit(t){let r=t.references?.filter(u=>u.kind==="media")??[];if((t.references?.filter(u=>u.kind==="workspace_asset")??[]).length>0)throw new d(c.MODEL_CONSTRAINT_VIOLATION,"Workspace asset references require the OpenAPI generation transport.",{category:"validation",retryable:!1,transport:"mcp"});let n={...t.input,...r.some(u=>u.mediaType==="image")?{referenceImages:r.filter(u=>u.mediaType==="image").map(u=>u.uri)}:{},...r.some(u=>u.mediaType==="audio")?{audioUrl:r.filter(u=>u.mediaType==="audio").map(u=>u.uri)}:{},...r.some(u=>u.mediaType==="video")?{videoUrl:r.filter(u=>u.mediaType==="video").map(u=>u.uri)}:{},...r.some(u=>u.mediaType==="text")?{referenceTexts:r.filter(u=>u.mediaType==="text").map(u=>u.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=ki(i,"Async generation submission failed");if(!le(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 X("Invalid async generation submission response");let a={assetId:s.assetId,...typeof s.createdAt=="string"?{createdAt:s.createdAt}:{},mediaType:br(s.mediaType),reused:s.reused===!0,status:kr(s.status),taskId:s.taskId,workspaceId:s.workspaceId};if(a.workspaceId!==t.workspaceId||a.mediaType!==t.mediaType)throw X("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=ki(o,"Async generation query failed"),i=le(n)&&le(n.task)?n.task:void 0;if(!i||typeof i.taskId!="string"||typeof i.workspaceId!="string"||!Array.isArray(i.outputUris))throw X("Invalid async generation query response");if(!i.outputUris.every(u=>typeof u=="string"))throw X("Invalid async generation output URI list");if(typeof i.progress!="number"||!Number.isFinite(i.progress))throw X("Invalid async generation progress");if(i.error!==null&&i.error!==void 0&&(!le(i.error)||typeof i.error.code!="string"||typeof i.error.message!="string"))throw X("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:le(i.error)&&typeof i.error.code=="string"&&typeof i.error.message=="string"?{code:i.error.code,message:i.error.message}:null,mediaType:br(i.mediaType),outputUris:s,progress:Math.max(0,Math.min(100,i.progress)),status:kr(i.status),taskId:i.taskId,...typeof i.updatedAt=="string"?{updatedAt:i.updatedAt}:{},workspaceId:i.workspaceId};if(a.taskId!==r||a.workspaceId!==t)throw X("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 su(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 bi(e,t){if(!le(e)||e.ok!==!0||!le(e.data))throw X(`${t}: invalid response envelope`);return e.data}async function au(e){let t=await Me(e);return e.status===400?new d(c.MODEL_CONSTRAINT_VIOLATION,t.message,{...le(t.details)?t.details:{},category:"validation",retryable:!1}):e.status===403&&t.code!==c.MEMBERSHIP_REQUIRED?new d(c.WORKSPACE_FORBIDDEN,t.message,{...le(t.details)?t.details:{},category:"auth",retryable:!1}):e.status===404?new d(c.TASK_NOT_FOUND,t.message,{...le(t.details)?t.details:{},category:"task",retryable:!1}):t}function du(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 X("Invalid async generation submission response");return{assetId:e.asset_id,...typeof e.created_at=="string"?{createdAt:e.created_at}:{},mediaType:br(e.media_type),reused:e.reused,status:kr(e.status),taskId:e.task_id,workspaceId:e.workspace_id}}function cu(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 X("Invalid async generation query response");if(e.error!==null&&e.error!==void 0&&(!le(e.error)||typeof e.error.code!="string"||typeof e.error.message!="string"))throw X("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:le(e.error)?{code:String(e.error.code),message:String(e.error.message)}:null,mediaType:br(e.media_type),outputUris:e.output_uris,progress:Math.max(0,Math.min(100,e.progress)),status:kr(e.status),taskId:e.task_id,...typeof e.updated_at=="string"?{updatedAt:e.updated_at}:{},workspaceId:e.workspace_id}}var Do=class{baseUrl;apiKey;timeoutMs;_fetch;usesDefaultUndiciTransport;logger;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this.timeoutMs=t.timeoutMs??Ve,this.usesDefaultUndiciTransport=t.fetch===void 0,this._fetch=t.fetch??iu,this.logger=t.logger}async submit(t){let r=bi(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(su)}:{}}}),"Async generation submission failed"),o=du(r);if(o.workspaceId!==t.workspaceId||o.mediaType!==t.mediaType)throw X("Async generation submission response does not match the request");return o}async query(t,r){let o=new URLSearchParams({workspace_id:t}),n=bi(await this.request("GET",`/v1/media/generations/${encodeURIComponent(r)}?${o}`,{cache:"no-store"}),"Async generation query failed"),i=cu(n);if(i.taskId!==r||i.workspaceId!==t)throw X("Async generation query response does not match the requested task");return i}async request(t,r,o){let n=V({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:F({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:gr(this.timeoutMs)}:{},signal:i.signal}),!a.ok)throw await au(a);let u=await a.text();if(!u.trim())throw fe("Empty response from server",a.status);let l;try{l=JSON.parse(u)}catch{throw fe("Invalid JSON response from server",a.status)}return n.success(a.status),l}catch(u){let l=u;throw i.signal.aborted||De(u)?l=new d(c.GENERATION_TIMEOUT,`Request timed out after ${this.timeoutMs}ms`,{retryable:!0,...ue(u)?{cause_code:ue(u)}:{}}):u instanceof d||(l=new d(c.NETWORK_ERROR,`Network error: ${u instanceof Error?u.message:String(u)}`,{retryable:!0,...ue(u)?{cause_code:ue(u)}:{}})),n.failure(l,a?.status),l}finally{clearTimeout(s)}}};function he(e){return e.transport==="openapi"?new Do(e):new Mo(new Et(e))}import{readFileSync as uu,writeFileSync as lu,appendFileSync as mu,mkdirSync as pu,existsSync as Ii,chmodSync as Po}from"fs";import{join as fu,dirname as gu}from"path";import{randomBytes as _u}from"crypto";function hu(){return"task_"+_u(8).toString("hex")}var Q=class{configDir;tasksPath;constructor(t){this.configDir=t?.configDir??Se(),this.tasksPath=fu(this.configDir,"tasks.jsonl")}getConfigDir(){return this.configDir}create(t){let r=new Date().toISOString(),o={id:hu(),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(),Oe(`${this.tasksPath}.lock`,()=>{mu(this.tasksPath,JSON.stringify(o)+`
|
|
15
|
+
`,{encoding:"utf-8",mode:384}),Po(this.tasksPath,384)}),y("task_store","task.created",{task_id:o.id,tool:o.toolName}),o}update(t,r){this._ensureDir();let o=Oe(`${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(!Ii(this.tasksPath))return[];try{return uu(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
|
-
`;
|
|
19
|
-
`,{encoding:"utf-8",mode:384}),
|
|
20
|
-
`,{encoding:"utf-8",mode:384}),kt(f,384),kt(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(po(o,"utf-8")),s=JSON.parse(po(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=vd(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(po(n,"utf-8"));r.push(i)}catch{}}return r}};function fo(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 Od={image:"image/jpeg",video:"video/mp4",audio:"audio/mpeg"};function ct(e,t=e.mediaType){if(t)return t==="image"&&e.pendingSubmission?.input.transparent===!0?"image/png":Od[t]}var xd={image:"hogi://image/",video:"hogi://video/",audio:"hogi://audio/"};function Xn(e){return e==="pending"?"queued":e==="processing"?"running":e}function dt(e){return e.status==="succeeded"||e.status==="failed"||e.status==="cancelled"}function Nd(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(Nd(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 fo({taskStore:e.taskStore,previewStore:e.previewStore,task:o,resources:[],status:"failed",error:{code:t,message:r}}),e.error}function Ud(e){let t=xd[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 Dd(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 fo({taskStore:e.taskStore,previewStore:t,task:e.task,resources:e.task.resourceUris.map(o=>({uri:o,mime_type:ct(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 go({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 go(e){if(!e.task.backendTaskId){if(dt(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=Ud(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}),!dt(o))return{task:o};let n=Dd({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 Md}from"crypto";function Ee(e){return`sha256:${Md("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}),ut=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 Pd(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 Ld(e){return e?.toLowerCase()==="kling-v3-omni"?{fields:{image:ut(),video:Ve()},modes:Qe}:{fields:{image:ut()},modes:e==="2.6"?oi:["text2Video","firstframe2Video","frame2Video"]}}function $d(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 wo(e,t){return e==="generate_video_wan"?Pd(t):e==="generate_video_kling"?Ld(t):e==="generate_video_vidu"?$d(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:ut(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:ut()}},generate_video_sora2_pro:{fields:{image:ut()}},generate_video_kling_o1:{fields:{image:ut()}},generate_video_midjourney:{fields:{image:ut()}},generate_video_veo3:{fields:{image:Z(1,!0)}},generate_video_hailuo02:{fields:{image:Z(2)}}}[e]}function ni(e,t){let r=wo(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=wo(e,t);return!r||!r.modes?!0:r.modes.includes("text2Video")}function _o(e){return[...new Set((e??[]).map(t=>t.trim()).filter(Boolean))]}function ho(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 yo(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 Vd(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:_o(e.images),videos:_o(e.videos),audios:_o(e.audios)};ho(t.images,"images","hogi://image/"),ho(t.videos,"videos","hogi://video/"),ho(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=wo(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:Vd(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 yo(a,e.toolName,"image",t.images,i.fields.image),yo(a,e.toolName,"video",t.videos,i.fields.video),yo(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 lt(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 It(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 Ro(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,E=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)&&(E=he)}let T=(i>0?Lt(D,E):void 0)??Lt(h,E)??c,R=t.promo_active===!0&&ci(t.promo_discount_percent)!==void 0,$=R?t.promo_discount_percent/100:1,w=T*$,G=e.duration??(o?10:void 0),L=G!==void 0?G+(o?i:0):void 0;return{estimate:!0,estimated_points:o&&L!==void 0?Ro(w*L):n&&G!==void 0?Ro(w*G):R?Ro(w):T,unit_points:T,tier:r,billing_unit:o||n?"second":"request",...L!==void 0&&(o||n)?{billed_duration:L}:{},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 bt(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){_(I("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 vt="seedream45",mt="seedance20",ur="seed-audio";var ui=v,li=A;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 Fd(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 Wd(e,t){let r=Dt(e,{aspectRatio:"1:1",resolution:"2K"}),o=t.aspectRatio??(t.size?Fd(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 at(e,{aspectRatio:o,resolution:n}),{args:i,aspectRatio:o,resolution:n}}function ko(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 Io(e,t,r,o,n,i){let s=await st({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=it({prompt:e.prompt,assets:e.assets,bindings:e.bindings}),c=a.references.length+(t==="edit"?1:0);c===0?lt(s):It(s,c);let l=Wd(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 Io(e,t,r,o,n,!0),s=ko(i.args);s.references=Ie(s.references,i.assetReferences);let a=ge(n.configStore??new b,s.references);return bt(i.selection,"image",i.args,{references:s.references,transport:a})}async function qd(e,t,r,o,n={}){let i=n.taskStore??new Y,s=await Io(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=ko(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 E=_e({transport:f,baseUrl:o,apiKey:r,fetch:n.fetch,timeoutMs:n.imageTextTimeoutMs??Me});try{let T=await $e({client:E,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}),R=T.task.resourceUris.map(w=>({type:"image",uri:w,mime_type:ct(T.task)})),$=T.previewWarning?[T.previewWarning]:[];return y("image","generation.submitted",{local_task_id:N.id,backend_task_id:T.submission.taskId,status:T.task.status}),{task_id:T.submission.taskId,local_task_id:N.id,tool:c,model:be(a),workspace_id:t,status:T.task.status,artifacts:R,request:{aspect_ratio:s.resolved.aspectRatio,resolution:s.resolved.resolution,...e.transparent?{transparent:!0}:{}},...$.length>0?{warnings:$}:{}}}catch(T){let R=T instanceof d?T.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:R},"error"),Le({taskStore:i,previewStore:n.previewStore,task:N,error:T})}}async function jd(e,t,r,o,n={}){let i=n.taskStore??new Y,s=await Io(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=ko(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 E=_e({transport:f,baseUrl:o,apiKey:r,fetch:n.fetch,timeoutMs:n.imageTextTimeoutMs??Me});try{let T=await $e({client:E,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}),R=T.task.resourceUris.map(w=>({type:"image",uri:w,mime_type:ct(T.task)})),$=T.previewWarning?[T.previewWarning]:[];return y("image","generation.submitted",{local_task_id:N.id,backend_task_id:T.submission.taskId,status:T.task.status}),{task_id:T.submission.taskId,local_task_id:N.id,tool:c,model:be(a),workspace_id:t,status:T.task.status,artifacts:R,request:{aspect_ratio:s.resolved.aspectRatio,resolution:s.resolved.resolution,...e.transparent?{transparent:!0}:{}},...$.length>0?{warnings:$}:{}}}catch(T){let R=T instanceof d?T.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:R},"error"),Le({taskStore:i,previewStore:n.previewStore,task:N,error:T})}}function fi(e={}){let t=new Gd("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",vt).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 qd(p,l,a.apiKey,c,e);if(C({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)_(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{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(`
|
|
18
|
+
`;lu(this.tasksPath,r,{encoding:"utf-8",mode:384}),Po(this.tasksPath,384)}_ensureDir(){let t=gu(this.tasksPath);Ii(t)||pu(t,{recursive:!0,mode:448}),Po(t,448)}};import{readFileSync as Lo,writeFileSync as vi,mkdirSync as Ei,existsSync as Ir,readdirSync as yu,chmodSync as Ot}from"fs";import{join as Te}from"path";import{randomBytes as wu}from"crypto";function Ru(){return"preview_"+wu(8).toString("hex")}function ku(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 bu(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 Iu=0;function Ti(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 Ge=class{configDir;previewsDir;constructor(t){this.configDir=t?.configDir??Se(),this.previewsDir=Te(this.configDir,"previews")}getConfigDir(){return this.configDir}createBundle(t){let r=Ru(),o=Te(this.previewsDir,r);Ei(o,{recursive:!0,mode:448}),Ei(Te(o,"artifacts"),{recursive:!0,mode:448}),Ot(this.configDir,448),Ot(this.previewsDir,448),Ot(o,448),Ot(Te(o,"artifacts"),448);let n=new Date().toISOString(),i={schema_version:1,bundle_id:r,created_at:n,created_sequence:++Iu,...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",u,l,p=[];if(t.status==="succeeded"){let x=t.inputArgs.size?` ${t.inputArgs.size}`:"";u=`Generated ${s}${x} ${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(...bu(t.resources))}else u=`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:ku(t.tool),status:t.status,human_summary:u,agent_summary:l,next:p},f=Te(o,"manifest.json"),h=Te(o,"summary.json");return vi(f,JSON.stringify(i,null,2)+`
|
|
19
|
+
`,{encoding:"utf-8",mode:384}),vi(h,JSON.stringify(m,null,2)+`
|
|
20
|
+
`,{encoding:"utf-8",mode:384}),Ot(f,384),Ot(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=Te(this.previewsDir,t),o=Te(r,"manifest.json"),n=Te(r,"summary.json");if(!Ir(o)||!Ir(n)){y("preview_store","preview.read",{bundle_id:t,found:!1});return}try{let i=JSON.parse(Lo(o,"utf-8")),s=JSON.parse(Lo(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(Ti),this.getBundle(t[0].bundle_id)}listBundles(t){let r=this._scanBundles();return r.sort(Ti),t!==void 0&&t>0?r.slice(0,t):r}_scanBundles(){if(!Ir(this.previewsDir))return[];let t=yu(this.previewsDir,{withFileTypes:!0}),r=[];for(let o of t){if(!o.isDirectory())continue;let n=Te(this.previewsDir,o.name,"manifest.json");if(Ir(n))try{let i=JSON.parse(Lo(n,"utf-8"));r.push(i)}catch{}}return r}};function $o(e){let t=e.previewStore??new Ge({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 vu={image:"image/jpeg",video:"video/mp4",audio:"audio/mpeg"};function _t(e,t=e.mediaType){if(t)return t==="image"&&e.pendingSubmission?.input.transparent===!0?"image/png":vu[t]}var Eu={image:"hogi://image/",video:"hogi://video/",audio:"hogi://audio/"};function Ai(e){return e==="pending"?"queued":e==="processing"?"running":e}function ht(e){return e.status==="succeeded"||e.status==="failed"||e.status==="cancelled"}function Tu(e){if(!(e instanceof d))return!1;if(e.code===c.NETWORK_ERROR||e.code===c.GENERATION_TIMEOUT)return!0;let t=Ci(e);return t.response_protocol===!0||t.request_outcome==="unknown"}function Ci(e){return e.details&&typeof e.details=="object"&&!Array.isArray(e.details)?e.details:{}}function Fe(e){if(e.taskStore.get(e.task.id)?.backendTaskId)return e.error;let t=e.error instanceof d?e.error.code:c.GENERATION_FAILED,r=e.error instanceof Error?e.error.message:String(e.error);if(Tu(e.error))return e.taskStore.update(e.task.id,{status:"submitting",error:{code:t,message:r}}),new d(t,r,{...Ci(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 $o({taskStore:e.taskStore,previewStore:e.previewStore,task:o,resources:[],status:"failed",error:{code:t,message:r}}),e.error}function Au(e){let t=Eu[e.mediaType],r=e.outputUris.find(o=>!o.startsWith(t));if(r)throw new d(c.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(c.SERVER_ERROR,`Backend task ${e.taskId} succeeded without an output URI`);return e.outputUris}function Cu(e){let t=e.previewStore??new Ge({configDir:e.taskStore.getConfigDir()});if(t.getBundleByTaskId(e.task.id))return;let r=e.task.status==="failed"||e.task.status==="cancelled";return $o({taskStore:e.taskStore,previewStore:t,task:e.task,resources:e.task.resourceUris.map(o=>({uri:o,mime_type:_t(e.task)})),status:r?"failed":"succeeded",...r?{error:e.task.error??{code:e.task.status==="cancelled"?"GENERATION_CANCELLED":c.GENERATION_FAILED,message:e.task.status==="cancelled"?"Generation was cancelled":"Generation failed"}}:{}})}async function We(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":Ai(t.status),progress:0,lastSyncedAt:new Date().toISOString(),error:null});if(!r)throw new d(c.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 Vo({client:e.client,taskStore:e.taskStore,previewStore:e.previewStore,task:r});if(n.task.status==="failed"||n.task.status==="cancelled")throw new d(c.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 Si(e){if(e.task.backendTaskId)throw new d(c.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(c.INVALID_ARGUMENT,`Task ${e.task.id} is not an ambiguous submission that can be retried.`);let t=e.task.pendingSubmission;try{return await We({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 Fe({taskStore:e.taskStore,previewStore:e.previewStore,task:e.task,error:r})}}async function Vo(e){if(!e.task.backendTaskId){if(ht(e.task))return{task:e.task};throw new d(c.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(c.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=Au(t),o=e.taskStore.update(e.task.id,{backendAssetId:t.assetId,mediaType:t.mediaType,status:Ai(t.status),progress:t.progress,resourceUris:r,lastSyncedAt:new Date().toISOString(),error:t.error});if(!o)throw new d(c.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}),!ht(o))return{task:o};let n=Cu({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 Su}from"crypto";function Ae(e){return`sha256:${Su("sha256").update("oiioii-cli-task-credential-v1\0").update(e).digest("hex")}`}var Er=["text2Video","firstframe2Video","endframe2Video","frame2Video","image2Video","omni2Video"],Z=(e,t=!1)=>({name:"imageUrl",max:e,single:t}),yt=e=>({name:"images",max:e}),qe=(e,t=!1)=>({name:"videoUrl",max:e,single:t}),vr=e=>({name:"audioUrl",max:e}),Ni=["text2Video","firstframe2Video"],Oi=["text2Video","image2Video","omni2Video"],st=["text2Video","firstframe2Video","frame2Video","image2Video","omni2Video"];function Ou(e){return e==="2.7"?{fields:{image:Z(5),video:qe(1,!0)},modes:st,totalMax:5}:{fields:{image:Z(10),video:qe(5),audio:vr(5)},modes:st}}function Nu(e){return e?.toLowerCase()==="kling-v3-omni"?{fields:{image:yt(),video:qe()},modes:st}:{fields:{image:yt()},modes:e==="2.6"?Ni:["text2Video","firstframe2Video","frame2Video"]}}function xu(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:st}}function qo(e,t){return e==="generate_video_wan"?Ou(t):e==="generate_video_kling"?Nu(t):e==="generate_video_vidu"?xu(t):{generate_video_seedance20:{fields:{image:Z(9),video:qe(3),audio:vr(3)},modes:st},generate_video_seedance25:{fields:{image:Z(30),video:qe(10),audio:vr(10)},modes:st,totalMax:50},generate_video_minimax_h3:{fields:{image:Z(9),video:qe(3),audio:vr(3)},modes:[...st,"endframe2Video"],audioRequiresVisual:!0},generate_video_wan27:{fields:{image:Z(5),video:qe(1,!0)},modes:st,totalMax:5},generate_video_wan26:{fields:{image:Z(5),video:qe(1,!0)},modes:["text2Video","firstframe2Video","image2Video","omni2Video"]},generate_video_gemini_omni:{fields:{image:yt(5),video:qe(1,!0)},modes:Oi,totalMax:5},generate_video_grok_imagine:{fields:{image:Z(1,!0)},modes:Ni},generate_video_grok_imagine_15:{fields:{image:Z(1,!0)},modes:["firstframe2Video"]},generate_video_grok_imagine_15_fast:{fields:{image:Z(7)},modes:Oi},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:yt()}},generate_video_sora2_pro:{fields:{image:yt()}},generate_video_kling_o1:{fields:{image:yt()}},generate_video_midjourney:{fields:{image:yt()}},generate_video_veo3:{fields:{image:Z(1,!0)}},generate_video_hailuo02:{fields:{image:Z(2)}}}[e]}function xi(e,t){let r=qo(e,t);if(r)return{image:r.fields.image!==void 0,video:r.fields.video!==void 0,audio:r.fields.audio!==void 0}}function Ui(e,t){let r=qo(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 Fo(e,t,r){let o=e.find(n=>!n.startsWith(r));if(o)throw new d(c.INVALID_ARGUMENT,`Video ${t} references must use ${r} URIs: ${o}`)}function se(e,t={}){return new d(c.MODEL_CONSTRAINT_VIOLATION,e,{category:"validation",retryable:!1,...t})}function Wo(e,t,r,o,n){if(o.length!==0){if(!n)throw se(`${t} does not support ${r} references.`,{field:r});if(n.max!==void 0&&o.length>n.max)throw se(`${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 se(`${t} supports only one ${r} reference.`,{field:r,received:o.length,supported_max:1});e[n.name]=n.single?o[0]:o}}function Uu(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 Mi(e){let t={images:Go(e.images),videos:Go(e.videos),audios:Go(e.audios)};Fo(t.images,"images","hogi://image/"),Fo(t.videos,"videos","hogi://video/"),Fo(t.audios,"audios","hogi://audio/");let r=e.additionalImageReferenceCount??0;if(!Number.isInteger(r)||r<0)throw new d(c.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=qo(e.toolName,e.version);if(!i){if(n===0)return{args:{},mode:"text2Video",references:t};throw new d(c.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 se(`${e.toolName} supports at most ${i.totalMax} total references; received ${n}.`,{field:"references",received:n,supported_max:i.totalMax});if(r>0){let u=i.fields.image;if(!u)throw se(`${e.toolName} does not support image references.`,{field:"image"});if(u.max!==void 0&&o>u.max)throw se(`${e.toolName} supports at most ${u.max} image references; received ${o}.`,{field:"image",received:o,supported_max:u.max});if(u.single&&o>1)throw se(`${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 se(`${e.toolName} audio references require at least one image or video reference.`,{field:"audio"});let s=e.mode&&e.mode!=="auto"?e.mode:Uu(i,t,r);if(e.mode&&e.mode!=="auto"&&!i.modes)throw new d(c.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(c.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 se("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 se(`${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 se("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 se("image2Video requires image references and does not accept video or audio references.",{field:"references",mode:s});if(s==="omni2Video"&&n===0)throw se("omni2Video requires at least one reference; use text2Video for prompt-only generation.",{field:"references",mode:s});let a={};return Wo(a,e.toolName,"image",t.images,i.fields.image),Wo(a,e.toolName,"video",t.videos,i.fields.video),Wo(a,e.toolName,"audio",t.audios,i.fields.audio),i.modes&&(a.generateMode=s),{args:a,mode:s,references:t}}var Di={image:!1,video:!1,audio:!1};function Tr(e){let t=Di;if(e.toolName.startsWith("generate_image_"))t={image:!0,video:!1,audio:!1};else if(e.toolName.startsWith("generate_video_"))t=xi(e.toolName,e.variant)??Di;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 Ht(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_")||Ui(e.toolName,e.variant))}}function wt(e){if(Ht(e).prompt_only_supported)return;let t=e.catalog?.reference_image_count_min,r=typeof t=="number"&&t>0;throw new d(c.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 Nt(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(c.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 d(c.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(c.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 Ar(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 Jt(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 Pi(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function Ko(e){let t=Number.EPSILON*Math.max(1,Math.abs(e))*8;return e<=0?0:Math.max(1,Math.ceil(e-t))}function Cr(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(c.INVALID_ARGUMENT,"Duration must be a positive number");if(!Number.isFinite(i)||i<0)throw new d(c.INVALID_ARGUMENT,"Reference video duration must be zero or positive");let s=t.points_cost,a=Pi(t.free_user_points_cost)??s,u=r==="free"?a:s,l=Ar(t.resolution_pricing),p=Ar(t.free_user_resolution_pricing)??l,m=Ar(t.resolution_pricing_with_video),f=Ar(t.free_user_resolution_pricing_with_video)??m,h=r==="free"?p:l,x=r==="free"?f:m,O=i>0?x:h,E=e.resolution;if(t.mcp_method_name==="generate_image_gpt_image2"&&e.resolution&&Jt(O,e.resolution)===void 0&&/^[124]k$/i.test(e.resolution)){let ae=e.quality?.trim().toLowerCase()??(e.resolution.toLowerCase()==="1k"?"low":"medium"),we=`${e.resolution}-${ae}`;(Jt(O,we)!==void 0||Jt(h,we)!==void 0)&&(E=we)}let A=(i>0?Jt(x,E):void 0)??Jt(h,E)??u,w=t.promo_active===!0&&Pi(t.promo_discount_percent)!==void 0,P=w?t.promo_discount_percent/100:1,R=A*P,G=e.duration??(o?10:void 0),L=G!==void 0?G+(o?i:0):void 0;return{estimate:!0,estimated_points:o&&L!==void 0?Ko(R*L):n&&G!==void 0?Ko(R*G):w?Ko(R):A,unit_points:A,tier:r,billing_unit:o||n?"second":"request",...L!==void 0&&(o||n)?{billed_duration:L}:{},promo_applied:w,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 xt(e,t,r,o){let n=e.catalog,i=n?Cr({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:fi(e),input_capabilities_scope:"model_input_modalities",generation_input_contract:Ht(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 Ke(e,t){if(t){_(b("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)z(`${r.code}: ${r.message}`)}var Ut="seedream45",Rt="seedance20",Sr="seed-audio";var $i=v,Vi=T;function Gi(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(c.WORKSPACE_REQUIRED,"No workspace set. Run: oiioii workspace set <workspace_id>")}function Du(e){let t=/^(\d+)x(\d+)$/.exec(e.trim());if(!t)throw new d(c.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(c.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 Pu(e,t){let r=jt(e,{aspectRatio:"1:1",resolution:"2K"}),o=t.aspectRatio??(t.size?Du(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 gt(e,{aspectRatio:o,resolution:n}),{args:i,aspectRatio:o,resolution:n}}function Bo(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 jo(e,t,r,o,n,i){let s=await $e({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(c.MODEL_CONSTRAINT_VIOLATION,"--transparent is supported only with GPT Image 2.");let a=ft({prompt:e.prompt,assets:e.assets,bindings:e.bindings}),u=a.references.length+(t==="edit"?1:0);u===0?wt(s):Nt(s,u);let l=Pu(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 Fi(e,t,r,o,n){let i=await jo(e,t,r,o,n,!0),s=Bo(i.args);s.references=ve(s.references,i.assetReferences);let a=_e(n.configStore??new I,s.references);return xt(i.selection,"image",i.args,{references:s.references,transport:a})}async function Lu(e,t,r,o,n={}){let i=n.taskStore??new Q,s=await jo(e,"text",r,o,n,!0),{selection:a}=s,u=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=Bo(s.args);p.references=ve(p.references,s.assetReferences);let m=n.configStore??new I,f=_e(m,p.references),h={transport:f,mediaType:"image",prompt:s.prompt,model:a.variant,...p},x=`oiioii image text --prompt "${e.prompt}" ${it(a)}${e.aspectRatio?` --aspect-ratio ${e.aspectRatio}`:""}${e.size?` --size ${e.size}`:""}${e.resolution?` --resolution ${e.resolution}`:""}${e.transparent?" --transparent":""}`,O=i.create({workspaceId:t,command:x,toolName:u,inputArgs:{provider:`async_generation_${f}`,prompt:s.prompt,model:a.key,modelId:a.modelId,variant:a.variant,mcpMethodName:u,workspaceId:t,toolArgs:{aspectRatio:l.aspectRatio,size:l.size,resolution:l.resolution,transparent:l.transparent}},pendingSubmission:h,credentialFingerprint:Ae(r),backendBaseUrl:o,backendTransport:f,mediaType:"image"});i.update(O.id,{status:"submitting"});let E=he({transport:f,baseUrl:o,apiKey:r,fetch:n.fetch,timeoutMs:n.imageTextTimeoutMs??Ve});try{let A=await We({client:E,taskStore:i,previewStore:n.previewStore,task:O,mediaType:"image",prompt:s.prompt,model:a.variant,backendBaseUrl:o,backendTransport:f,input:h.input,references:h.references}),w=A.task.resourceUris.map(R=>({type:"image",uri:R,mime_type:_t(A.task)})),P=A.previewWarning?[A.previewWarning]:[];return y("image","generation.submitted",{local_task_id:O.id,backend_task_id:A.submission.taskId,status:A.task.status}),{task_id:A.submission.taskId,local_task_id:O.id,tool:u,model:Ee(a),workspace_id:t,status:A.task.status,artifacts:w,request:{aspect_ratio:s.resolved.aspectRatio,resolution:s.resolved.resolution,...e.transparent?{transparent:!0}:{}},...P.length>0?{warnings:P}:{}}}catch(A){let w=A instanceof d?A.code:c.GENERATION_FAILED;throw y("image","generation.command_failed",{task_id:O.id,backend_task_cached:i.get(O.id)?.backendTaskId!==void 0,error_code:w},"error"),Fe({taskStore:i,previewStore:n.previewStore,task:O,error:A})}}async function $u(e,t,r,o,n={}){let i=n.taskStore??new Q,s=await jo(e,"edit",r,o,n,!0),{selection:a}=s,u=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=Bo(s.args);p.references=ve(p.references,s.assetReferences);let m=n.configStore??new I,f=_e(m,p.references),h={transport:f,mediaType:"image",prompt:s.prompt,model:a.variant,...p},x=`oiioii image edit --image ${e.image} --prompt "${e.prompt}" ${it(a)}${e.aspectRatio?` --aspect-ratio ${e.aspectRatio}`:""}${e.size?` --size ${e.size}`:""}${e.resolution?` --resolution ${e.resolution}`:""}${e.transparent?" --transparent":""}`,O=i.create({workspaceId:t,command:x,toolName:u,inputArgs:{provider:`async_generation_${f}`,prompt:s.prompt,model:a.key,modelId:a.modelId,variant:a.variant,sourceImage:e.image,mcpMethodName:u,workspaceId:t,toolArgs:{images:l.images,aspectRatio:l.aspectRatio,size:l.size,resolution:l.resolution,transparent:l.transparent}},pendingSubmission:h,credentialFingerprint:Ae(r),backendBaseUrl:o,backendTransport:f,mediaType:"image"});i.update(O.id,{status:"submitting"});let E=he({transport:f,baseUrl:o,apiKey:r,fetch:n.fetch,timeoutMs:n.imageTextTimeoutMs??Ve});try{let A=await We({client:E,taskStore:i,previewStore:n.previewStore,task:O,mediaType:"image",prompt:s.prompt,model:a.variant,backendBaseUrl:o,backendTransport:f,input:h.input,references:h.references}),w=A.task.resourceUris.map(R=>({type:"image",uri:R,mime_type:_t(A.task)})),P=A.previewWarning?[A.previewWarning]:[];return y("image","generation.submitted",{local_task_id:O.id,backend_task_id:A.submission.taskId,status:A.task.status}),{task_id:A.submission.taskId,local_task_id:O.id,tool:u,model:Ee(a),workspace_id:t,status:A.task.status,artifacts:w,request:{aspect_ratio:s.resolved.aspectRatio,resolution:s.resolved.resolution,...e.transparent?{transparent:!0}:{}},...P.length>0?{warnings:P}:{}}}catch(A){let w=A instanceof d?A.code:c.GENERATION_FAILED;throw y("image","generation.command_failed",{task_id:O.id,backend_task_cached:i.get(O.id)?.backendTaskId!==void 0,error_code:w},"error"),Fe({taskStore:i,previewStore:n.previewStore,task:O,error:A})}}function Wi(e={}){let t=new Mu("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",Ut).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 Li("--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=$i(o),i=Vi(o),s=e.configStore??new I;try{let a=D(i,s),u=a.baseUrl,{workspaceId:l}=Gi(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){Ke(await Fi(p,"text",a.apiKey,u,e),n);return}let m=await Lu(p,l,a.apiKey,u,e);if(N({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&&ke(),n)_(b(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??[])z(`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 d){n?_(S("generation_failed",a.code,a.message,a.details)):
|
|
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)):C(a.message),process.exitCode=1;return}let u=a instanceof Error?a.message:String(a);n?_(S("generation_failed",c.GENERATION_FAILED,u)):C(u),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",Ut).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 Li("--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=$i(o),i=Vi(o),s=e.configStore??new I;try{let a=D(i,s),u=a.baseUrl,{workspaceId:l}=Gi(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){Ke(await Fi(p,"edit",a.apiKey,u,e),n);return}let m=await $u(p,l,a.apiKey,u,e);if(N({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&&ke(),n)_(b(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??[])z(`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 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 Bd}from"commander";var Kd="generate_video_grok_imagine",bo=v,vo=A;function lr(e){return typeof e=="string"&&e?[e]:Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.length>0):[]}function Ao(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 Eo(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 st({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 lt(i),at(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===Kd?{generateMode:"text2Video"}:{},...i.variant?{version:i.variant}:{}}}}async function hi(e,t,r,o,n){let i=await st({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=it({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?lt(i):It(i,m.references.images.length+p.references.length),at(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 To(e,t,r,o,n){let i=t==="text"?await _i(e,r,o,n,!0):await hi(e,r,o,n,!0),s=Ao(i.args),a=t==="references"?i.assetReferences:[];s.references=Ie(s.references,a);let c=ge(n.configStore??new b,s.references);return bt(i.selection,"video",i.args,{references:s.references,transport:c})}async function zd(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=Ao(s.args),D=n.configStore??new b,N=ge(D,h.references),E={transport:N,mediaType:"video",prompt:e.prompt,model:p.variant,...h},T=`oiioii video text --prompt "${e.prompt}" ${Ye(p)} --duration ${a} --aspect-ratio ${c} --resolution ${l}`,R=i.create({workspaceId:t,command:T,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:E,credentialFingerprint:Ee(r),backendBaseUrl:o,backendTransport:N,mediaType:"video"});i.update(R.id,{status:"submitting"});let $=_e({transport:N,baseUrl:o,apiKey:r,fetch:n.fetch,timeoutMs:n.videoTextTimeoutMs??Me});try{let w=await $e({client:$,taskStore:i,previewStore:n.previewStore,task:R,mediaType:"video",prompt:e.prompt,model:p.variant,backendBaseUrl:o,backendTransport:N,input:E.input,references:E.references}),G=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: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:be(p),workspace_id:t,status:w.task.status,generation_mode:"text2Video",artifacts:G,request:{duration_seconds:a,aspect_ratio:c,resolution:l},...L.length>0?{warnings:L}:{}}}catch(w){let G=w instanceof d?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"),Le({taskStore:i,previewStore:n.previewStore,task:R,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=Ao(s.args);D.references=Ie(D.references,s.assetReferences);let N=n.configStore??new b,E=ge(N,D.references),T={transport:E,mediaType:"video",prompt:s.prompt,model:p.variant,...D},$=`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:$,toolName:m,inputArgs:{provider:`async_generation_${E}`,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:T,credentialFingerprint:Ee(r),backendBaseUrl:o,backendTransport:E,mediaType:"video"});i.update(w.id,{status:"submitting"});let G=_e({transport:E,baseUrl:o,apiKey:r,fetch:n.fetch,timeoutMs:n.videoTextTimeoutMs??Me});try{let L=await $e({client:G,taskStore:i,previewStore:n.previewStore,task:w,mediaType:"video",prompt:s.prompt,model:p.variant,backendBaseUrl:o,backendTransport:E,input:T.input,references:T.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 Bd("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",mt).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=bo(o),i=vo(o),s=e.configStore??new b;try{let a=P(i,s),c=a.baseUrl,{workspaceId:l}=Eo(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 To(p,"text",a.apiKey,c,e),n);return}let m=await zd(p,l,a.apiKey,c,e);if(C({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)_(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{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(`
|
|
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)):C(a.message),process.exitCode=1;return}let u=a instanceof Error?a.message:String(a);n?_(S("generation_failed",c.GENERATION_FAILED,u)):C(u),process.exitCode=1}}),t}import{Command as Vu}from"commander";var Gu="generate_video_grok_imagine",zo=v,Ho=T;function Or(e){return typeof e=="string"&&e?[e]:Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.length>0):[]}function Qo(e){let{imageUrl:t,images:r,videoUrl:o,audioUrl:n,...i}=e,a=[...[...new Set([...Or(t),...Or(r)])].map(u=>({kind:"media",mediaType:"image",uri:u})),...Or(o).map(u=>({kind:"media",mediaType:"video",uri:u})),...Or(n).map(u=>({kind:"media",mediaType:"audio",uri:u}))];return{input:i,references:a}}function Jo(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(c.WORKSPACE_REQUIRED,"No workspace set. Run: oiioii workspace set <workspace_id>")}function Yt(e){let t=typeof e=="number"?e:Number.parseInt(String(e),10);if(!Number.isInteger(t)||t<=0)throw new d(c.INVALID_ARGUMENT,`Invalid duration: ${String(e)}. Duration must be a positive integer number of seconds.`);return t}async function Ki(e,t,r,o,n){let i=await $e({domain:"video",model:e.model,modelId:e.modelId,variant:e.variant,requireActiveCatalog:n,baseUrl:r,apiKey:t,fetch:o.fetch}),s=jt(i,{aspectRatio:"16:9",resolution:"720p",duration:5}),a=e.duration===void 0?s.duration:Yt(e.duration),u=e.aspectRatio??s.aspectRatio,l=e.resolution??s.resolution;return wt(i),gt(i,{aspectRatio:u,resolution:l,duration:a}),{duration:a,aspectRatio:u,resolution:l,selection:i,args:{prompt:e.prompt,resolution:l,duration:a,aspectRatio:u,...i.toolName===Gu?{generateMode:"text2Video"}:{},...i.variant?{version:i.variant}:{}}}}async function Bi(e,t,r,o,n){let i=await $e({domain:"video",model:e.model,modelId:e.modelId,variant:e.variant,requireActiveCatalog:n,baseUrl:r,apiKey:t,fetch:o.fetch}),s=jt(i,{aspectRatio:"16:9",resolution:"720p",duration:5}),a=e.duration===void 0?s.duration:Yt(e.duration),u=e.aspectRatio??s.aspectRatio,l=e.resolution??s.resolution,p=ft({prompt:e.prompt,assets:e.assets,bindings:e.bindings}),m=Mi({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(c.MODEL_CONSTRAINT_VIOLATION,"--task-type requires Seedance 2.5 with --mode omni2Video.");if(h==="reference"&&f===0)throw new d(c.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(c.MODEL_CONSTRAINT_VIOLATION,`Seedance 2.5 ${h} tasks require a video reference.`);return f===0?wt(i):Nt(i,m.references.images.length+p.references.length),gt(i,{aspectRatio:u,resolution:l,duration:a}),{duration:a,aspectRatio:u,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:u,...i.variant?{version:i.variant}:{}}}}async function Yo(e,t,r,o,n){let i=t==="text"?await Ki(e,r,o,n,!0):await Bi(e,r,o,n,!0),s=Qo(i.args),a=t==="references"?i.assetReferences:[];s.references=ve(s.references,a);let u=_e(n.configStore??new I,s.references);return xt(i.selection,"video",i.args,{references:s.references,transport:u})}async function Fu(e,t,r,o,n={}){let i=n.taskStore??new Q,s=await Ki(e,r,o,n,!0),{duration:a,aspectRatio:u,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=Qo(s.args),x=n.configStore??new I,O=_e(x,h.references),E={transport:O,mediaType:"video",prompt:e.prompt,model:p.variant,...h},A=`oiioii video text --prompt "${e.prompt}" ${it(p)} --duration ${a} --aspect-ratio ${u} --resolution ${l}`,w=i.create({workspaceId:t,command:A,toolName:m,inputArgs:{provider:`async_generation_${O}`,prompt:e.prompt,model:p.key,modelId:p.modelId,variant:p.variant,mcpMethodName:m,workspaceId:t,aspectRatio:u,duration:a,toolArgs:f},pendingSubmission:E,credentialFingerprint:Ae(r),backendBaseUrl:o,backendTransport:O,mediaType:"video"});i.update(w.id,{status:"submitting"});let P=he({transport:O,baseUrl:o,apiKey:r,fetch:n.fetch,timeoutMs:n.videoTextTimeoutMs??Ve});try{let R=await We({client:P,taskStore:i,previewStore:n.previewStore,task:w,mediaType:"video",prompt:e.prompt,model:p.variant,backendBaseUrl:o,backendTransport:O,input:E.input,references:E.references}),G=R.task.resourceUris.map(K=>({type:"video",uri:K,mime_type:"video/mp4"})),L=R.previewWarning?[R.previewWarning]:[];return y("video","generation.submitted",{local_task_id:w.id,backend_task_id:R.submission.taskId,status:R.task.status}),{task_id:R.submission.taskId,local_task_id:w.id,tool:m,model:Ee(p),workspace_id:t,status:R.task.status,generation_mode:"text2Video",artifacts:G,request:{duration_seconds:a,aspect_ratio:u,resolution:l},...L.length>0?{warnings:L}:{}}}catch(R){let G=R instanceof d?R.code:c.GENERATION_FAILED;throw y("video","generation.command_failed",{task_id:w.id,backend_task_cached:i.get(w.id)?.backendTaskId!==void 0,error_code:G},"error"),Fe({taskStore:i,previewStore:n.previewStore,task:w,error:R})}}async function qi(e,t,r,o,n={}){let i=n.taskStore??new Q,s=await Bi(e,r,o,n,!0),{duration:a,aspectRatio:u,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},x=Qo(s.args);x.references=ve(x.references,s.assetReferences);let O=n.configStore??new I,E=_e(O,x.references),A={transport:E,mediaType:"video",prompt:s.prompt,model:p.variant,...x},P=`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}" ${it(p)} --duration ${a} --aspect-ratio ${u} --resolution ${l} --mode ${f.mode}`,R=i.create({workspaceId:t,command:P,toolName:m,inputArgs:{provider:`async_generation_${E}`,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:A,credentialFingerprint:Ae(r),backendBaseUrl:o,backendTransport:E,mediaType:"video"});i.update(R.id,{status:"submitting"});let G=he({transport:E,baseUrl:o,apiKey:r,fetch:n.fetch,timeoutMs:n.videoTextTimeoutMs??Ve});try{let L=await We({client:G,taskStore:i,previewStore:n.previewStore,task:R,mediaType:"video",prompt:s.prompt,model:p.variant,backendBaseUrl:o,backendTransport:E,input:A.input,references:A.references}),K=L.task.resourceUris.map(we=>({type:"video",uri:we,mime_type:"video/mp4"})),ae=L.previewWarning?[L.previewWarning]:[];return y("video","generation.submitted",{local_task_id:R.id,backend_task_id:L.submission.taskId,status:L.task.status}),{task_id:L.submission.taskId,local_task_id:R.id,tool:m,model:Ee(p),workspace_id:t,status:L.task.status,generation_mode:f.mode,artifacts:K,request:{duration_seconds:a,aspect_ratio:u,resolution:l},...ae.length>0?{warnings:ae}:{}}}catch(L){let K=L instanceof d?L.code:c.GENERATION_FAILED;throw y("video","generation.command_failed",{task_id:R.id,backend_task_cached:i.get(R.id)?.backendTaskId!==void 0,error_code:K},"error"),Fe({taskStore:i,previewStore:n.previewStore,task:R,error:L})}}function ji(e={}){let t=new Vu("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",Rt).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=zo(o),i=Ho(o),s=e.configStore??new I;try{let a=D(i,s),u=a.baseUrl,{workspaceId:l}=Jo(i,s),p={prompt:r.prompt,model:r.model,modelId:r.modelId,variant:r.variant,...r.duration!==void 0?{duration:Yt(r.duration)}:{},aspectRatio:r.aspectRatio,resolution:r.resolution};if(r.dryRun===!0){Ke(await Yo(p,"text",a.apiKey,u,e),n);return}let m=await Fu(p,l,a.apiKey,u,e);if(N({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&&ke(),n)_(b(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??[])z(`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 d){n?_(S("generation_failed",a.code,a.message,a.details)):
|
|
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)):
|
|
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)):C(a.message),process.exitCode=1;return}let u=a instanceof Error?a.message:String(a);n?_(S("generation_failed",c.GENERATION_FAILED,u)):C(u),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",Rt).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=zo(o),i=Ho(o),s=e.configStore??new I;try{let a=String(r.mode);if(a!=="auto"&&!Er.includes(a))throw new d(c.INVALID_ARGUMENT,`Invalid video mode: ${a}. Expected auto, ${Er.join(", ")}.`);if(r.taskType!==void 0&&!["reference","edit","extend"].includes(String(r.taskType)))throw new d(c.INVALID_ARGUMENT,`Invalid task type: ${String(r.taskType)}. Expected reference, edit, or extend.`);let u=D(i,s),{workspaceId:l}=Jo(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:Yt(r.duration)}:{},aspectRatio:r.aspectRatio,resolution:r.resolution},m=ft({prompt:p.prompt,assets:p.assets,bindings:p.bindings}).references.map(ci);if(r.dryRun===!0){Ke(await Yo(p,"references",u.apiKey,u.baseUrl,e),n);return}let f=await qi(p,l,u.apiKey,u.baseUrl,e);if(N({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&&ke(),n)_(b(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??[])z(`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)):C(a.message);else{let u=a instanceof Error?a.message:String(a);n?_(S("generation_failed",c.GENERATION_FAILED,u)):C(u)}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",Rt).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=zo(o),i=Ho(o),s=e.configStore??new I;try{let a=D(i,s),u=a.baseUrl,{workspaceId:l}=Jo(i,s),p={image:r.image,prompt:r.prompt,model:r.model,modelId:r.modelId,variant:r.variant,...r.duration!==void 0?{duration:Yt(r.duration)}:{},aspectRatio:r.aspectRatio,resolution:r.resolution};if(r.dryRun===!0){Ke(await Yo(p,"references",a.apiKey,u,e),n);return}let m=await qi(p,l,a.apiKey,u,e);if(N({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&&ke(),n)_(b(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??[])z(`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 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 Ri="generate_music_seed_audio",Oo="generate_music_suno",pr=["wav","mp3","pcm","ogg_opus"];function Hd(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 Co(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 Yd(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(Co(t.loudnessRate,"--loudness-rate",-50,100),Co(t.pitchRate,"--pitch-rate",-12,12),Co(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===Oo){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 Qd(e,t){if(!t)return;let r=t==="seed-audio"?Ri:Oo;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 st({domain:"audio",model:e.model,modelId:e.modelId,variant:e.variant,requireActiveCatalog:i,baseUrl:o,apiKey:r,fetch:n.fetch});Qd(a.toolName,s);let c=it({prompt:e.prompt,assets:e.assets,bindings:e.bindings}),l=Yd(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)lt(a);else if(It(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 Zd(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,E=ge(N,D.references),T={transport:E,mediaType:"audio",prompt:p,model:m.variant,...D},R=s.create({workspaceId:t,command:h,toolName:m.toolName,inputArgs:{provider:`async_generation_${E}`,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:T,credentialFingerprint:Ee(r),backendBaseUrl:o,backendTransport:E,mediaType:"audio"});s.update(R.id,{status:"submitting"});let $=_e({transport:E,baseUrl:o,apiKey:r,fetch:n.fetch,timeoutMs:n.audioGenerationTimeoutMs??Me});try{let w=await $e({client:$,taskStore:s,previewStore:n.previewStore,task:R,mediaType:"audio",prompt:p,model:m.variant,backendBaseUrl:o,backendTransport:E,input:T.input,references:T.references}),G=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: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:be(m),workspace_id:t,status:w.task.status,artifacts:G,...L.length?{warnings:L}:{}}}catch(w){let G=w instanceof d?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"),Le({taskStore:s,previewStore:n.previewStore,task:R,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 Xd(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 bt(c,"audio",l,{references:p.references,transport:m})}function eu(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 So(e,t,r,o){let n=v(t),i=A(t),s=r.configStore??new b;try{let a=P(i,s),c=Hd(i,s),l=eu(e,o);if(e.dryRun===!0){Ge(await Xd(l,c,a.apiKey,a.baseUrl,r,o),n);return}let p=await Zd(l,c,a.apiKey,a.baseUrl,r,o),m=p.tool===Oo?l.custom?"music_custom":"music_description":l.audioUrls?.length?"audio_reference":l.referenceImages?.length?"image_reference":"text";if(C({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)_(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{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 tu(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 ru(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 Jd("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 So(r,o,e)),tu(t.command("seed-audio").description("Generate speech or audio with Seed Audio").requiredOption("--prompt <text>","Audio description")).action(async(r,o)=>await So(r,o,e,"seed-audio")),ru(t.command("suno").description("Generate music with Suno").requiredOption("--prompt <text>","Music description; interpreted as lyrics in custom mode")).action(async(r,o)=>await So(r,o,e,"suno")),t}import{Command as ou}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 nu(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 iu(e,t,r,o=3e4,n){let i=t.configStore??new b,s=P(A(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||dt(e))return e;let n=r.taskStore??new Y;return(await go({client:iu(t,r,e.backendBaseUrl,o,e.backendTransport),taskStore:n,previewStore:r.previewStore,task:e})).task}function Ti(e={}){let t=new ou("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=v(o);try{let i=vi(r.limit,"limit"),s=(e.taskStore??new Y).list(i);if(C({task_count:s.length,limit:i}),y("task","task.listed",{count:s.length,limit:i}),n)_(I("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=v(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}),C({task_status:a.status}),y("task","task.status_read",{task_id:r,status:a.status}),i?_(I("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=v(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(A(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});C({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:_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=v(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 nu(l);for(;!dt(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(!dt(l)){let m=Math.max(0,c-Date.now());await new Promise(f=>setTimeout(f,Math.min(e.pollIntervalMs??2e3,m)))}}if(!dt(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}:{}});C({task_status:l.status,timeout_seconds:s}),y("task","task.wait_completed",{task_id:r,status:l.status}),i?_(I("task_wait",{task:_r(l)})):gr(l)}catch(s){hr(s,i,"task_wait")}}),t}import{Command as su}from"commander";import{spawn as au}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=V({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:F({"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=v;function Ci(e){let t=new b,r=P(A(e),t);return{apiKey:r.apiKey,baseUrl:r.baseUrl}}function cu(e){let t=process.platform==="darwin"?"open":process.platform==="win32"?"cmd":"xdg-open",r=process.platform==="win32"?["/c","start","",e]:[e];try{return au(t,r,{detached:!0,stdio:"ignore"}).unref(),!0}catch{return!1}}function Si(){let e=new su("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(C({resource_type:Yt(t),record_success:c.success,output_count:c.output_uris.length}),n)_(I("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 yt({baseUrl:s,apiKey:i}).download(t,{output:r.output,filename:r.filename,watermark:r.wm}),l=r.open!==!1,p=l?cu(c.path):!1;C({resource_type:Yt(t),size_bucket:He(c.bytes),watermark:r.wm===!0,open_requested:l,opened:p}),n?_(I("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 du}from"commander";var uu={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"},lu=[{name:"text-to-image",domain:"image",description:"Generate images from text prompts",default_model:vt,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:vt,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:mt,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:mt,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 mu(){return[...lu]}function pu(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 du("inspect").description("Inspect backend capabilities");return t.command("capabilities").description("List available GenAI capabilities").action((r,o)=>{let n=Oi(o),i=mu();if(C({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{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(A(o),a),p=await new fe({baseUrl:c.baseUrl,apiKey:c.apiKey,...e.fetch?{fetch:e.fetch}:{}}).listModels({includeDisplayNames:!0}),m=pu(p,s);if(C({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:uu,...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 fu}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:ct(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 gu(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 _u(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 fu("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=gu(e);i.ok&&i.data?(C({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)):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=_u(r,e);s.ok&&s.data?(C({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)):Ui(s.data)):(i?_(S("preview_bundle",s.error.code,s.error.message)):O(s.error.message),process.exitCode=1)}),t}import{Command as Bu}from"commander";import{basename as Ji,extname as Ku,resolve as Hi}from"path";import{readFile as Yi,stat as Qi}from"fs/promises";import{extname as hu}from"path";var yu=new Set(["jpg","jpeg","png","gif","svg","webp","heic","heif","bmp","ico","tiff","jfif"]),wu=new Set(["mp4","webm","avi","mov","flv","mkv"]),Ru=new Set(["mp3","wav","ogg","m4a","aac","flac","wma","ape"]),ku=new Set(["txt","doc","docx","pdf","md","lrc","srt","vtt"]);function oe(e){return e.trim().toLowerCase().replace(/^\.+/,"")}function Ze(e){let t=oe(e);if(yu.has(t))return"image";if(wu.has(t))return"video";if(Ru.has(t))return"audio"}function xo(e){let t=oe(e);return Ze(t)??(ku.has(t)?"document":void 0)}function wr(e){let t=oe(hu(e));return t.length>0?t:void 0}function No(e){let t=oe(e),r=Ze(t);if(!r)throw new d(u.INVALID_ARGUMENT,`Unsupported file type: ${t||"<empty>"}. Supported image/video/audio extensions only.`);return r}function Iu(e){return e&&typeof e=="object"?e:void 0}async function bu(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 vu(e){if(e.ok===!1)throw Li(400,e);let t=Iu(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 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=oe(t.fileType),o=Ze(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=V({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:F({"x-hogi-api-key":this.apiKey,"content-type":"application/octet-stream",accept:"application/json"}),body:t.buffer,signal:a});let c=await bu(s);if(!s.ok)throw Li(s.status,c);let l=vu(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 Eu=100*1024*1024,Tu=50*1024*1024,Au=10*1024*1024,Cu=10*1024*1024;async function Su(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 Ou(e){return e==="audio"?Tu:e==="video"?Au:e==="document"?Cu:Eu}function xu(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"||xo(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 kr=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=oe(t.fileType),o=xo(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=Ou(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=V({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:F({"x-hogi-api-key":this.apiKey,"content-type":"application/octet-stream",accept:"application/json"}),body:t.buffer,signal:c});let l=await Su(a);if(!a.ok)throw $i(a.status,l);let p=xu(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 Gu}from"crypto";import{createReadStream as Fu}from"fs";import{File as Vi}from"buffer";import*as Gi from"fs";import{open as Nu}from"fs/promises";function Fi(e){return e&&typeof e=="object"?e:void 0}function Uu(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 Nu(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 Du(e){let t=Uu(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 Mu(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 Pu(){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 Lu(){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 Ir=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 Ir{readyState=0;status=0;statusText="";responseType="";response=null;responseText="";timeout=0;withCredentials=!1;upload=new Ir;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 $u(e){let{default:t}=await import("tt-uploader"),r=await Du(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=E=>{a||(a=!0,p(),E())},f=E=>E.key===n,h=E=>{f(E)&&typeof E.percent=="number"&&e.onProgress?.(Math.max(0,Math.min(99,Math.round(E.percent))))},D=E=>{if(!f(E))return;let T=Fi(E.uploadResult),R=T?.Vid??T?.vid;m(()=>{typeof R=="string"&&R?i(R):s(new d(u.SERVER_ERROR,"VOD upload completed without Vid"))})},N=E=>{f(E)&&m(()=>s(new d(u.SERVER_ERROR,`VOD direct upload failed: ${Mu(E,e.token.stsToken)}`)))};o.on("progress",h),o.on("complete",D),o.on("error",N);try{o.start(n)}catch(E){let T=Wi(E instanceof Error?E.message:String(E),e.token.stsToken);m(()=>s(new d(u.SERVER_ERROR,`VOD direct upload could not start: ${T}`)))}})}var qi=async e=>{let t=Pu(),r=Lu();try{return await $u(e)}finally{r(),t()}};function Xe(e){return e&&typeof e=="object"?e:void 0}async function Wu(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=Xe(o)??{};if(!e.ok||n.success===!1){let i=n.error,s=typeof i=="string"?i:typeof Xe(i)?.message=="string"?Xe(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=Gu("md5");for await(let r of Fu(e))t.update(r);return t.digest("hex")}function qu(e){return new Promise(t=>setTimeout(t,e))}function Bi(e){let t=Xe(e),r=Xe(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 F({"x-hogi-api-key":this.apiKey,accept:"application/json",...t?{"content-type":"application/json"}:{}})}async requestJson(t,r,o,n=this.requestTimeoutMs){let i=V({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}),Wu(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=oe(t.fileType);if(Ze(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=V({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=Xe(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=oe(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=V({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=Xe(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=Xe(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 qu(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=v,zi=A;function zu(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 vr(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)}function Xi(e,t,r,o){if(o!=="audio")return{fileType:t,fileName:r};let n=wr(e)??t;if(Ze(n)!=="audio")throw new d(u.SERVER_ERROR,"Upload API returned an unsupported audio extension");let i=Ku(r);return oe(i)===n?{fileType:n,fileName:r}:{fileType:n,fileName:`${i?r.slice(0,-i.length):r}.${n}`}}async function es(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 Ju(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 es(c,i),p=e.fileType??wr(c);if(!p)throw new d(u.INVALID_ARGUMENT,`Cannot infer file type from path: ${e.path}. Use --type <ext>.`);let m=oe(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=zu(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 G=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 vr(G.fileUri,"video"),y("upload","upload.vod_completed",{asset_id:G.assetId,task_id:G.taskId,size:l,workspace_id:h}),{uri:G.fileUri,asset_id:G.assetId,asset_uri:G.assetUri,file_uri:G.fileUri,domain:"video",file_type:m,file_name:D,size:l,attached:!0,workspace_id:h,upload_mode:"vod",task_id:G.taskId}}let E=await n(c),R=await new Rr({baseUrl:a,apiKey:s.apiKey,fetch:r.fetch}).uploadFile({buffer:E,workspaceId:h,fileType:m,fileName:D,afterAssetId:e.afterAssetId});if(y("upload","upload.completed",{asset_id:R.assetId,domain:R.type,size:l,workspace_id:h}),vr(R.fileUri,R.type),R.type!==f)throw new d(u.SERVER_ERROR,`Upload API returned unexpected domain: ${R.type}`);y("upload","workspace.asset_attached",{asset_id:R.assetId,domain:R.type,workspace_id:h});let $=Xi(R.fileUri,m,D,R.type);return{uri:R.fileUri,asset_id:R.assetId,asset_uri:R.assetUri,file_uri:R.fileUri,domain:R.type,file_type:$.fileType,file_name:$.fileName,size:l,attached:!0,workspace_id:h,upload_mode:"direct"}}async function Hu(e,t={},r={}){let o=r.configStore??new b,n=r.stat??Qi,i=P(t,o),s=Hi(e.path),a=await es(s,n),c=e.fileType??wr(s);if(!c)throw new d(u.INVALID_ARGUMENT,`Cannot infer file type from path: ${e.path}. Use --type <ext>.`);let l=oe(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 R=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 vr(R.fileUri,"video"),{uri:R.fileUri,file_uri:R.fileUri,domain:"video",file_type:l,file_name:m,size:a,upload_mode:"vod",...R.taskId?{task_id:R.taskId}:{}}}let h=await(r.readFile??Yi)(s),N=await new kr({baseUrl:i.baseUrl,apiKey:i.apiKey,fetch:r.fetch}).uploadFile({buffer:h,fileType:l,fileName:m}),E=Xi(N.fileUri,N.fileType,m,p);if(N.domain!==p)throw new d(u.SERVER_ERROR,"Resource upload returned unexpected media domain");return vr(N.fileUri,p),{uri:N.fileUri,file_uri:N.fileUri,domain:p,file_type:N.fileType,file_name:E.fileName,size:a,upload_mode:"direct"}}function ts(e={}){let t=new Bu("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 Ju({path:r,fileType:o.type,fileName:o.name,afterAssetId:o.afterAssetId,attach:o.attach===!0,vod:o.vod===!0},s,e);C({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?_(I("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 Hu({path:r,fileType:o.type,fileName:o.name,vod:o.vod===!0},s,e);C({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?_(I("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 Yu}from"commander";function Do(e){let t=e;for(;t.parent;)t=t.parent;return t.opts().json===!0}function Qu(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 rs(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:Qu(e.limit,"--limit")}:{}}}function os(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 ns(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 is(e={}){let t=new Yu("logs").description("Local structured log management");return os(t.command("list").description("List locally stored log entries")).action((r,o)=>{let n=Do(o);try{let i=e.logStore??new je,s=rs(r),a=i.list(s);if(C({entry_count:a.length,has_filter:Object.values(s).some(c=>c!==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{
|
|
35
|
-
`)}`}function
|
|
36
|
-
More results available \u2014 rerun with --cursor ${l.nextCursor}`)}catch(s){Tr(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=v(o);try{let i=await al({...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)},Er(A(o),e));C({...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)):(U(`Estimated points: ${i.estimated_points}`),g(` Available: ${i.available_points} \xB7 ${i.sufficient?"sufficient":"insufficient"}`),K(i.caveat))}catch(i){Tr(i,n,"points_quote")}}),t}import{Command as pl}from"commander";import{createHash as cl,randomBytes as ls}from"crypto";import{createServer as dl}from"http";var ul=5e3;function ms(e){e.close(),e.closeAllConnections()}async function ps(e){let t=ls(32).toString("base64url"),r=ls(32).toString("base64url"),o=cl("sha256").update(t).digest("base64url"),n=new AbortController,i=!0,s=!1,a,c,l=()=>{},p=new Promise($=>{l=$}),m=new URL(e.authorizationPageUrl),f=()=>{if(!i||!a)return;let $=a;i=!1,clearTimeout(R),c&&clearTimeout(c),h.close(),l({outcome:"success",exchange:$})},h=dl(async($,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($.url??"/","http://127.0.0.1"),L=G.searchParams.get("code"),ee=G.searchParams.get("error")==="access_denied",se=h.address(),he=se&&typeof se=="object"?se.port:void 0,Ko=$.headers.host===`127.0.0.1:${he}`;if(G.pathname==="/auth/ready"){if(!(Ko&&G.searchParams.get("state")===r&&$.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"),$.method==="OPTIONS"){w.setHeader("Access-Control-Allow-Methods","POST"),w.setHeader("Access-Control-Allow-Private-Network","true"),w.writeHead(204).end();return}if($.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($.method!=="GET"||!Ko||G.pathname!=="/auth/callback"||G.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 Sr=async(We,jt=!0)=>await new Promise(Vs=>{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(),Vs())};w.once("finish",Ho),w.once("close",Ho),w.writeHead(303,{Location:zo.href}).end()});if(ee){await Sr("cancelled"),i=!1,clearTimeout(R),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 Sr("success",!1),s=!1,i&&(c=setTimeout(f,e.pageReadyTimeoutMs??ul),c.unref())}catch(We){i&&(await Sr("error"),i=!1,clearTimeout(R),l({outcome:"error",message:We instanceof Error?We.message:String(We)}))}});h.headersTimeout=5e3,h.requestTimeout=1e4,await new Promise(($,w)=>{h.once("error",w),h.listen(0,"127.0.0.1",$)});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`,E=new URL(m.href);E.search=new URLSearchParams({app:e.app,challenge:o,state:r,redirectUri:N}).toString();let T=()=>{i&&(i=!1,clearTimeout(R),c&&clearTimeout(c),n.abort(),ms(h),l({outcome:"cancelled"}))},R=setTimeout(()=>{i&&(i=!1,n.abort(),c&&clearTimeout(c),ms(h),l({outcome:"expired"}))},e.timeoutMs??3e5);return R.unref(),{cancel:T,result:p,url:E.href}}var ll={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)):C(a.message),process.exitCode=1;return}let u=a instanceof Error?a.message:String(a);n?_(S("generation_failed",c.GENERATION_FAILED,u)):C(u),process.exitCode=1}}),t}import{Command as Wu}from"commander";var Yi="generate_music_seed_audio",Xo="generate_music_suno",Ur=["wav","mp3","pcm","ogg_opus"];function qu(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(c.WORKSPACE_REQUIRED,"No workspace set. Run: oiioii workspace set <workspace_id>")}function Mr(e){return[...new Set((e??[]).map(t=>t.trim()).filter(Boolean))]}function Qi(e){let{audioUrl:t,referenceImages:r,...o}=e;delete o.workspace_id;let n=Mr(typeof t=="string"?[t]:Array.isArray(t)?t:[]),i=Mr(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 zi(e,t,r){let o=e.find(n=>!n.startsWith(t));if(o)throw new d(c.INVALID_ARGUMENT,`${r} must use ${t} URIs: ${o}`)}function Nr(e,t,r,o){if(e!==void 0&&(!Number.isFinite(e)||e<r||e>o))throw ie(`${t} must be between ${r} and ${o}.`,{field:t,received:e,minimum:r,maximum:o})}function Hi(e){return[...new Set((e??[]).map(t=>t.trim()).filter(Boolean))]}function Ji(e){return e.speakerId!==void 0||e.speakerLanguages!==void 0||e.speakerAccent!==void 0||e.stability!==void 0||e.emotions!==void 0}function ie(e,t={}){return new d(c.MODEL_CONSTRAINT_VIOLATION,e,{category:"validation",retryable:!1,...t})}function Ku(e,t,r,o,n=0){let i=t.prompt.trim();if(!i)throw new d(c.INVALID_ARGUMENT,"Audio prompt must not be empty.");let s=Mr(t.audioUrls),a=Mr(t.referenceImages);if(zi(s,"hogi://audio/","Audio references"),zi(a,"hogi://image/","Image references"),e===Yi){if(r&&r!=="seed-audio-1.0")throw ie(`Seed Audio only supports variant seed-audio-1.0, received ${r}.`,{field:"variant",received:r,supported:["seed-audio-1.0"]});let u=a.length+n;if(s.length>0&&u>0)throw ie("Seed Audio reference images and reference audio cannot be used together.",{field:"references"});if(s.length>3)throw ie("Seed Audio supports at most 3 audio references.",{field:"audio",received:s.length,supported_max:3});if(u>1)throw ie("Seed Audio supports at most 1 reference image.",{field:"image",received:u,supported_max:1});if(t.custom||t.tags||t.instrumental||t.autoGenerateVideo||Ji(t))throw ie("Suno and ElevenLabs options are not valid for Seed Audio.",{field:"unsupported_options"});if(Nr(t.loudnessRate,"--loudness-rate",-50,100),Nr(t.pitchRate,"--pitch-rate",-12,12),Nr(t.speechRate,"--speech-rate",-50,100),t.sampleRate!==void 0&&(!Number.isInteger(t.sampleRate)||t.sampleRate<=0))throw ie("--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":u?"image_reference":"text"}}if(e===Xo){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||Ji(t))throw ie("Seed Audio and ElevenLabs options are not valid for Suno.",{field:"unsupported_options"});let u=t.custom===!0,l=t.instrumental===!0;if(!u&&t.tags)throw ie("--tags requires Suno --custom mode.",{field:"tags",requires:"custom"});let p=t.tags?.trim()||(u&&l?i:void 0);return{args:{custom:u,prompt:i,...u&&p?{tags:p}:{},...u?{}:{gptDescriptionPrompt:i},instrumental:l,autoGenerateVideo:t.autoGenerateVideo===!0,...r?{version:r}:{},workspace_id:o},audioUrls:s,referenceImages:a,mode:u?"music_custom":"music_description"}}if(bo(e)){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||t.custom||t.tags||t.instrumental||t.autoGenerateVideo)throw ie("Seed Audio and Suno options are not valid for ElevenLabs.",{field:"unsupported_options"});Nr(t.stability,"--stability",0,1);let u=t.speakerId?.trim(),l=Hi(t.speakerLanguages),p=t.speakerAccent?.trim();if(t.speakerId!==void 0&&!u)throw ie("--speaker-id must not be empty.",{field:"speaker"});if(!u&&(l.length>0||p))throw ie("--speaker-language and --speaker-accent require --speaker-id.",{field:"speaker"});if(l.length>10)throw ie("ElevenLabs supports at most 10 speaker languages.",{field:"speaker.languages",received:l.length,supported_max:10});let m=Hi(t.emotions);return{args:{prompt:i,version:"v4",...u?{speaker:{id:u,...l.length?{languages:l}:{},...p?{accent:p}:{}}}:{},...t.stability!==void 0?{stability:t.stability}:{},...m.length?{emotions:m}:{},workspace_id:o},audioUrls:s,referenceImages:a,mode:"text"}}throw new d(c.MODEL_NOT_SUPPORTED,`Unsupported audio generation tool: ${e}`,{category:"validation",retryable:!1,tool:e})}function Bu(e,t){if(!t)return;let r=t==="seed-audio"?Yi:t==="suno"?Xo:Wt;if(!(e===r||t==="elevenlabs"&&bo(e)))throw new d(c.MODEL_NOT_SUPPORTED,`The audio ${t} command cannot use model tool ${e}.`,{category:"validation",retryable:!1,hint:`Use a ${t} model ID or choose the matching audio subcommand.`,expected_tool:r,received_tool:e})}async function Xi(e,t,r,o,n,i,s){let a=await $e({domain:"audio",model:e.model,modelId:e.modelId,variant:e.variant,requireActiveCatalog:i,baseUrl:o,apiKey:r,fetch:n.fetch});Bu(a.toolName,s);let u=ft({prompt:e.prompt,assets:e.assets,bindings:e.bindings}),l=Ku(a.toolName,{...e,prompt:u.prompt},a.variant,t,u.references.length),p=l.referenceImages.length+u.references.length;if(p===0&&l.audioUrls.length===0)wt(a);else if(Nt(a,p),l.audioUrls.length>0&&!Tr(a).audio)throw ie(`${a.name??a.key} does not support reference audio.`,{field:"audio",received:l.audioUrls.length,supported:!1});return{selection:a,prepared:l,prompt:u.prompt,assetReferences:u.references}}async function ju(e,t,r,o,n={},i){let s=n.taskStore??new Q,a=await Xi(e,t,r,o,n,!0,i),{assetReferences:u,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+u.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}" ${it(m)}`,x=Qi(l.args);x.references=ve(x.references,u);let O=n.configStore??new I,E=_e(O,x.references),A={transport:E,mediaType:"audio",prompt:p,model:m.variant,...x},w=s.create({workspaceId:t,command:h,toolName:m.toolName,inputArgs:{provider:`async_generation_${E}`,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:A,credentialFingerprint:Ae(r),backendBaseUrl:o,backendTransport:E,mediaType:"audio"});s.update(w.id,{status:"submitting"});let P=he({transport:E,baseUrl:o,apiKey:r,fetch:n.fetch,timeoutMs:n.audioGenerationTimeoutMs??Ve});try{let R=await We({client:P,taskStore:s,previewStore:n.previewStore,task:w,mediaType:"audio",prompt:p,model:m.variant,backendBaseUrl:o,backendTransport:E,input:A.input,references:A.references}),G=R.task.resourceUris.map(K=>({type:"audio",uri:K,mime_type:"audio/mpeg"})),L=R.previewWarning?[R.previewWarning]:[];return y("audio","generation.submitted",{local_task_id:w.id,backend_task_id:R.submission.taskId,status:R.task.status}),{task_id:R.submission.taskId,local_task_id:w.id,tool:m.toolName,model:Ee(m),workspace_id:t,status:R.task.status,artifacts:G,...L.length?{warnings:L}:{}}}catch(R){let G=R instanceof d?R.code:c.GENERATION_FAILED;throw y("audio","generation.command_failed",{task_id:w.id,backend_task_cached:s.get(w.id)?.backendTaskId!==void 0,error_code:G},"error"),Fe({taskStore:s,previewStore:n.previewStore,task:w,error:R})}}function Qt(e,t){if(e===void 0)return;let r=Number(e);if(!Number.isFinite(r))throw new d(c.INVALID_ARGUMENT,`${t} must be a number.`);return r}async function zu(e,t,r,o,n,i){let{assetReferences:s,prepared:a,selection:u}=await Xi(e,t,r,o,n,!0,i),l={...a.args};delete l.workspace_id;let p=Qi(a.args);p.references=ve(p.references,s);let m=_e(n.configStore??new I,p.references);return xt(u,"audio",l,{references:p.references,transport:m})}function Hu(e,t){let r=e.format;if(r!==void 0&&!Ur.includes(r))throw new d(c.INVALID_ARGUMENT,`Invalid audio format: ${r}. Expected ${Ur.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:Qt(e.loudnessRate,"--loudness-rate"),pitchRate:Qt(e.pitchRate,"--pitch-rate"),sampleRate:Qt(e.sampleRate,"--sample-rate"),speechRate:Qt(e.speechRate,"--speech-rate"),custom:e.custom===!0,tags:e.tags,instrumental:e.instrumental===!0,autoGenerateVideo:e.autoGenerateVideo===!0,speakerId:e.speakerId,speakerLanguages:e.speakerLanguage,speakerAccent:e.speakerAccent,stability:Qt(e.stability,"--stability"),emotions:e.emotion}}async function xr(e,t,r,o){let n=v(t),i=T(t),s=r.configStore??new I;try{let a=D(i,s),u=qu(i,s),l=Hu(e,o);if(e.dryRun===!0){Ke(await zu(l,u,a.apiKey,a.baseUrl,r,o),n);return}let p=await ju(l,u,a.apiKey,a.baseUrl,r,o),m=p.tool===Xo?l.custom?"music_custom":"music_description":l.audioUrls?.length?"audio_reference":l.referenceImages?.length?"image_reference":"text";if(N({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&&ke(),n)_(b(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??[])z(`Warning: ${f.message}`);p.artifacts.length===0&&g(`
|
|
30
|
+
Next: oiioii task wait ${p.task_id} --json`)}}catch(a){let u=a instanceof d?a.code:c.GENERATION_FAILED,l=a instanceof Error?a.message:String(a);n?_(S("generation_failed",u,l,a instanceof d?a.details:void 0)):C(l),process.exitCode=1}}function Ju(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 (${Ur.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 Yu(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 Qu(e){return e.option("--model-id <id>","Exact ElevenLabs model ID from inspect models").option("--variant <variant>","Exact ElevenLabs catalog variant from inspect models").option("--speaker-id <id>","Official ElevenLabs voice ID").option("--speaker-language <code...>","Languages supported by the selected voice (maximum 10)").option("--speaker-accent <accent>","Accent metadata for the selected voice").option("--stability <number>","Voice stability from 0 to 1").option("--emotion <tag...>","Emotion tags to prepend during ElevenLabs prompt enhancement").option("--dry-run","Validate and preview the resolved request without submitting")}function Zi(e={}){let t=new Wu("audio").description("Audio and music generation commands");return t.command("generate").description("Generate audio with Seed Audio, Suno, or ElevenLabs").requiredOption("--prompt <text>","Audio description; interpreted as lyrics in Suno custom mode").option("--model <model>","Model name (seed-audio, suno, or elevenlabs)",Sr).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 (${Ur.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("--speaker-id <id>","Official ElevenLabs voice ID").option("--speaker-language <code...>","ElevenLabs voice languages (maximum 10)").option("--speaker-accent <accent>","ElevenLabs voice accent metadata").option("--stability <number>","ElevenLabs voice stability from 0 to 1").option("--emotion <tag...>","ElevenLabs emotion tags").option("--dry-run","Validate and preview the resolved request without submitting").action(async(r,o)=>await xr(r,o,e)),Ju(t.command("seed-audio").description("Generate speech or audio with Seed Audio").requiredOption("--prompt <text>","Audio description")).action(async(r,o)=>await xr(r,o,e,"seed-audio")),Yu(t.command("suno").description("Generate music with Suno").requiredOption("--prompt <text>","Music description; interpreted as lyrics in custom mode")).action(async(r,o)=>await xr(r,o,e,"suno")),Qu(t.command("elevenlabs").description("Generate speech with ElevenLabs v4").requiredOption("--prompt <text>","Text to synthesize; supports ElevenLabs audio tags and IPA")).action(async(r,o)=>await xr(r,o,e,"elevenlabs")),t}import{Command as Xl}from"commander";import{basename as Pl,resolve as bs}from"path";import{mkdir as Ll,readFile as $l,stat as Vl}from"fs/promises";function Xt(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Xu(e,t){if(!e.trim())throw new d(c.SERVER_ERROR,"Agent media API returned an empty response",{status:t});try{let r=JSON.parse(e);if(Xt(r))return r}catch{}throw new d(c.SERVER_ERROR,"Agent media API returned invalid JSON",{status:t})}function Zu(e,t,r){let o=t.error?.code,n=o?.toLowerCase(),i=t.error?.message??`Agent media API request failed: HTTP ${e}`,s={status:e,...o?{backend_code:o}:{},...t.request_id?{request_id:t.request_id}:{}};return e===401?new d(c.API_KEY_INVALID,i,{...s,retryable:!1}):e===403&&n==="membership_required"?new d(c.MEMBERSHIP_REQUIRED,i,{...s,retryable:!1}):e===403?new d(c.WORKSPACE_FORBIDDEN,i,{...s,retryable:!1}):e===404?new d(r==="get_agent_media_task"?c.TASK_NOT_FOUND:c.WORKSPACE_NOT_FOUND,i,{...s,retryable:!1}):e===429?new d(c.QUOTA_EXCEEDED,i,{...s,retryable:!0}):e===400||e===409||e===422?new d(c.INVALID_ARGUMENT,i,{...s,retryable:!1}):new d(c.SERVER_ERROR,i,{...s,retryable:e>=500,...e>=500&&r==="create_agent_media"?{request_outcome:"unknown"}:{}})}function Be(e,t){if(typeof e!="string"||!e.trim())throw new d(c.SERVER_ERROR,`Agent media API response is missing ${t}`);return e}function Zo(e,t="media_type"){if(e!=="image"&&e!=="video"&&e!=="audio")throw new d(c.SERVER_ERROR,`Agent media API response has invalid ${t}`);return e}function es(e){if(e!=="pending"&&e!=="processing"&&e!=="completed"&&e!=="failed"&&e!=="cancelled")throw new d(c.SERVER_ERROR,`Agent media API response has invalid status: ${String(e)}`);return e}function el(e,t){if(!Xt(e))throw new d(c.SERVER_ERROR,"Invalid agent media submission response");let r=Zo(e.media_type),o=es(e.status);if(e.stage!=="queued"||o==="completed"||o==="cancelled")throw new d(c.SERVER_ERROR,"Invalid agent media submission state");let n=Be(e.workspace_id,"workspace_id");if(n!==t.workspace_id||r!==t.media_type)throw new d(c.SERVER_ERROR,"Agent media submission response does not match the request");return{mediaType:r,stage:"queued",status:o,taskId:Be(e.task_id,"task_id"),workspaceId:n}}function tl(e){if(e===null)return null;if(!Xt(e)||typeof e.retryable!="boolean")throw new d(c.SERVER_ERROR,"Agent media task returned an invalid error");return{code:Be(e.code,"error.code"),...typeof e.internal_code=="string"?{internalCode:e.internal_code}:{},message:Be(e.message,"error.message"),retryable:e.retryable}}function rl(e,t){if(!Xt(e))throw new d(c.SERVER_ERROR,"Invalid agent media task response");let r=Be(e.task_id,"task_id");if(r!==t)throw new d(c.SERVER_ERROR,"Agent media task response returned a different task_id");let o=es(e.status),n=Zo(e.media_type);if(typeof e.progress!="number"||!Number.isFinite(e.progress)||e.progress<0||e.progress>100)throw new d(c.SERVER_ERROR,"Agent media task returned invalid progress");let i=tl(e.error);if((o==="failed"||o==="cancelled")!=(i!==null))throw new d(c.SERVER_ERROR,"Agent media task response has inconsistent status and error");let s=null;if(o==="completed"){if(!Xt(e.result))throw new d(c.SERVER_ERROR,"Completed agent media task has no result");let a=Zo(e.result.media_type,"result.media_type"),u=`hogi://${a}/`;if(a!==n||!Array.isArray(e.result.output_uris)||e.result.output_uris.length===0||!e.result.output_uris.every(l=>typeof l=="string"&&l.startsWith(u)&&l.length>u.length))throw new d(c.SERVER_ERROR,"Agent media task returned invalid output URIs");s={mediaType:a,outputUris:e.result.output_uris}}else if(e.result!==null)throw new d(c.SERVER_ERROR,"Non-completed agent media task returned a result");return{createdAt:Be(e.created_at,"created_at"),error:i,mediaType:n,progress:e.progress,result:s,stage:Be(e.stage,"stage"),status:o,taskId:r,updatedAt:Be(e.updated_at,"updated_at"),workspaceId:Be(e.workspace_id,"workspace_id")}}function ol(e){let t=e.trim();if(!t||t.length>200||!/^[A-Za-z0-9_-]+$/.test(t))throw new d(c.INVALID_ARGUMENT,"task_id must contain only letters, digits, underscores, or hyphens and be at most 200 characters");return t}var Zt=class{apiKey;baseUrl;fetch;logger;timeoutMs;constructor(t){this.apiKey=t.apiKey,this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.fetch=t.fetch??globalThis.fetch,this.logger=t.logger,this.timeoutMs=t.timeoutMs??3e5}async create(t){return el(await this.request("POST","/v1/media/create","create_agent_media",t),t)}async getTask(t){let r=ol(t);return rl(await this.request("GET",`/v1/tasks/${encodeURIComponent(r)}`,"get_agent_media_task"),r)}async request(t,r,o,n){let i=V({source:"hogi_agent_media_client",operation:o,method:t,path:r},this.logger),s;try{return await q({operation:`Agent media API ${o}`,timeoutMs:this.timeoutMs,run:async a=>{s=await i.fetch(this.fetch,`${this.baseUrl}${r}`,{method:t,headers:F({accept:"application/json",authorization:`Bearer ${this.apiKey}`,...n?{"content-type":"application/json"}:{}}),...n?{body:JSON.stringify(n)}:{},signal:a});let u=Xu(await s.text(),s.status);if(!s.ok||u.ok!==!0)throw Zu(s.status,u,o);if(u.data===void 0)throw new d(c.SERVER_ERROR,"Agent media API response is missing data");return i.success(s.status),u.data}})}catch(a){if(a instanceof W){let l=new d(c.NETWORK_ERROR,a.message,{request_outcome:t==="POST"?"unknown":"not_completed",retryable:t==="GET",timeout_ms:a.timeoutMs});throw i.failure(l,s?.status),l}if(a instanceof d)throw i.failure(a,s?.status),a;let u=new d(c.NETWORK_ERROR,`Network error: ${a instanceof Error?a.message:String(a)}`,{request_outcome:t==="POST"?"unknown":"not_completed",retryable:t==="GET"});throw i.failure(u,s?.status),u}}};import{extname as nl}from"path";var il=new Set(["jpg","jpeg","png","gif","svg","webp","heic","heif","bmp","ico","tiff","jfif"]),sl=new Set(["mp4","webm","avi","mov","flv","mkv"]),al=new Set(["mp3","wav","ogg","m4a","aac","flac","wma","ape"]),dl=new Set(["txt","doc","docx","pdf","md","lrc","srt","vtt"]);function oe(e){return e.trim().toLowerCase().replace(/^\.+/,"")}function ye(e){let t=oe(e);if(il.has(t))return"image";if(sl.has(t))return"video";if(al.has(t))return"audio"}function je(e){let t=oe(e);return ye(t)??(dl.has(t)?"document":void 0)}function at(e){let t=oe(nl(e));return t.length>0?t:void 0}function ts(e){let t=oe(e),r=ye(t);if(!r)throw new d(c.INVALID_ARGUMENT,`Unsupported file type: ${t||"<empty>"}. Supported image/video/audio extensions only.`);return r}var cl=100*1024*1024,ul=50*1024*1024,ll=10*1024*1024,en=10*1024*1024;async function ml(e){let t=await e.text().catch(()=>"");if(!t.trim())return{};try{return JSON.parse(t)}catch{throw new d(c.SERVER_ERROR,"Invalid JSON response from resource upload API",{status:e.status})}}function rs(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(c.API_KEY_INVALID,o||"Invalid API key",n):e===413||r==="payload_too_large"?new d(c.PAYLOAD_TOO_LARGE,o,n):e===429||r==="rate_limited"?new d(c.QUOTA_EXCEEDED,o,n):tt(r,o)?rt(r,o,n):e===400||e===422||r==="invalid_request"||r==="video_requires_vod"?new d(c.INVALID_ARGUMENT,o,n):new d(c.SERVER_ERROR,o,n)}function pl(e){return e==="audio"?ul:e==="video"?ll:e==="document"?en:cl}function fl(e,t){if(e.ok===!1)throw rs(400,e);let r=e.data;if(!r)throw new d(c.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(c.SERVER_ERROR,"Resource upload returned unexpected domain");if(typeof n!="string"||je(n)!==t)throw new d(c.SERVER_ERROR,"Resource upload returned unexpected file_type");if(typeof i!="string"||!i.startsWith(`hogi://${t}/`))throw new d(c.SERVER_ERROR,`Resource upload file_uri must start with hogi://${t}/`);if(typeof s!="number"||!Number.isFinite(s))throw new d(c.SERVER_ERROR,"Resource upload returned invalid size");if(a!==void 0&&(typeof a!="number"||!Number.isFinite(a)))throw new d(c.SERVER_ERROR,"Resource upload returned invalid text_len");return{domain:t,fileType:n,fileUri:i,size:s,...a===void 0?{}:{textLen:a}}}var Mt=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=oe(t.fileType),o=je(r)??t.domainHint;if(!o)throw new d(c.INVALID_ARGUMENT,`Unsupported resource file type: ${r||"<empty>"}`);if(t.buffer.byteLength===0)throw new d(c.INVALID_ARGUMENT,"Resource file is empty");let n=pl(o);if(t.buffer.byteLength>n||o==="video"&&t.buffer.byteLength>=n)throw new d(c.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=V({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 q({operation:"Resource upload request",timeoutMs:this.timeoutMs,run:async u=>{a=await s.fetch(this.fetch,`${this.baseUrl}/v1/res/uploadFile?${i.toString()}`,{method:"POST",headers:F({"x-hogi-api-key":this.apiKey,"content-type":"application/octet-stream",accept:"application/json"}),body:t.buffer,signal:u});let l=await ml(a);if(!a.ok)throw rs(a.status,l);let p=fl(l,o);if(t.validateResponseSize!==!1&&p.size!==t.buffer.byteLength)throw new d(c.SERVER_ERROR,"Resource upload returned unexpected size");return s.success(a.status,{file_uri:p.fileUri}),p}})}catch(u){if(u instanceof W){let p=new d(c.NETWORK_ERROR,u.message,{retryable:!0,timeout_ms:u.timeoutMs});throw s.failure(p,a?.status),p}if(u instanceof d)throw s.failure(u,a?.status),u;let l=new d(c.NETWORK_ERROR,`Network error: ${u instanceof Error?u.message:String(u)}`);throw s.failure(l,a?.status),l}}};var er=en,Dt=class{resourceClient;constructor(t){this.resourceClient=new Mt(t)}async uploadFile(t){let r=await this.resourceClient.uploadFile({...t,domainHint:"document",validateResponseSize:!1});if(r.domain!=="document")throw new d(c.INVALID_ARGUMENT,"Document upload requires a supported document file type");return{fileType:r.fileType,fileUri:r.fileUri,size:r.size}}};import{Command as xl}from"commander";import{basename as ps,extname as Ul,resolve as fs}from"path";import{readFile as gs,stat as _s}from"fs/promises";var gl=50*1024*1024;function _l(e){return e&&typeof e=="object"?e:void 0}async function hl(e){let t=await e.text().catch(()=>"");if(!t.trim())return{};try{return JSON.parse(t)}catch{throw new d(c.SERVER_ERROR,"Invalid JSON response from upload API",{status:e.status})}}function os(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(c.API_KEY_INVALID,o||"Invalid API key",n):e===403||r==="workspace_forbidden"?new d(c.WORKSPACE_FORBIDDEN,o,n):e===404||r==="workspace_not_found"?new d(c.WORKSPACE_NOT_FOUND,o,n):e===413||r==="payload_too_large"?new d(c.PAYLOAD_TOO_LARGE,o,n):tt(r,o)?rt(r,o,n):["empty_file","invalid_file_name","invalid_file_type","missing_workspace_id","unsupported_asset_type"].includes(r??"")?new d(c.INVALID_ARGUMENT,o,n):new d(c.SERVER_ERROR,o,n)}function yl(e){if(e.ok===!1)throw os(400,e);let t=_l(e.data);if(!t)throw new d(c.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(c.SERVER_ERROR,"Invalid upload API response: missing asset_id");if(typeof o!="string"||o!==`hogi://asset/${r}`)throw new d(c.SERVER_ERROR,"Invalid upload API response: invalid asset_uri");if(i!=="image"&&i!=="video"&&i!=="audio")throw new d(c.SERVER_ERROR,"Invalid upload API response: unsupported type");if(typeof n!="string"||!n.startsWith(`hogi://${i}/`))throw new d(c.SERVER_ERROR,"Invalid upload API response: file_uri/type mismatch");if(typeof s!="string"||!s)throw new d(c.SERVER_ERROR,"Invalid upload API response: missing workspace_id");return{assetId:r,assetUri:o,fileUri:n,type:i,workspaceId:s}}var tr=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=oe(t.fileType),o=ye(r);if(!o)throw new d(c.INVALID_ARGUMENT,`Unsupported file type: ${r||"<empty>"}`);if(!t.workspaceId.trim())throw new d(c.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=V({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 q({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:F({"x-hogi-api-key":this.apiKey,"content-type":"application/octet-stream",accept:"application/json"}),body:t.buffer,signal:a});let u=await hl(s);if(!s.ok)throw os(s.status,u);let l=yl(u);if(l.workspaceId!==t.workspaceId)throw new d(c.SERVER_ERROR,"Upload API returned unexpected workspace_id");if(l.type!==o)throw new d(c.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 W){let l=new d(c.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 u=new d(c.NETWORK_ERROR,`Network error: ${a instanceof Error?a.message:String(a)}`);throw i.failure(u),u}}};import{createHash as Al}from"crypto";import{createReadStream as Cl}from"fs";import{File as ns}from"buffer";import*as is from"fs";import{open as wl}from"fs/promises";function ss(e){return e&&typeof e=="object"?e:void 0}function Rl(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 rr=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 wl(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 kl(e){let t=Rl(e.fileType),r=is.openAsBlob;if(r){let o=await r(e.filePath,{type:t});return new ns([o],e.fileName,{type:t})}return new rr(e.filePath,e.fileName,0,e.fileSize,t)}function bl(e,t){let r=ss(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]=as(s,t))}return Object.keys(n).length>0?JSON.stringify(n):"unknown SDK error"}function as(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 Il(){let e=globalThis,t=[],r=(o,n)=>{e[o]===void 0&&(e[o]=n,t.push({key:o,value:n}))};return r("File",ns),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",tn),()=>{for(let{key:o,value:n}of t.reverse())e[o]===n&&delete e[o]}}function vl(){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 Dr=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)}},tn=class extends Dr{readyState=0;status=0;statusText="";responseType="";response=null;responseText="";timeout=0;withCredentials=!1;upload=new Dr;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
|
|
31
|
+
`).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 rr?await t.arrayBuffer():t;this.method!=="GET"&&this.method!=="HEAD"&&n!==null&&(o.body=n);let i=t instanceof rr||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 El(e){let{default:t}=await import("tt-uploader"),r=await kl(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,u=e.timeoutMs??1800*1e3,l=setTimeout(()=>{try{o.cancel(n)}catch{}m(()=>s(new d(c.TASK_TIMEOUT,`VOD direct upload timed out after ${u}ms`)))},u),p=()=>{clearTimeout(l),o.removeListener("progress",h),o.removeListener("complete",x),o.removeListener("error",O);try{o.removeFile(n)}catch{}},m=E=>{a||(a=!0,p(),E())},f=E=>E.key===n,h=E=>{f(E)&&typeof E.percent=="number"&&e.onProgress?.(Math.max(0,Math.min(99,Math.round(E.percent))))},x=E=>{if(!f(E))return;let A=ss(E.uploadResult),w=A?.Vid??A?.vid;m(()=>{typeof w=="string"&&w?i(w):s(new d(c.SERVER_ERROR,"VOD upload completed without Vid"))})},O=E=>{f(E)&&m(()=>s(new d(c.SERVER_ERROR,`VOD direct upload failed: ${bl(E,e.token.stsToken)}`)))};o.on("progress",h),o.on("complete",x),o.on("error",O);try{o.start(n)}catch(E){let A=as(E instanceof Error?E.message:String(E),e.token.stsToken);m(()=>s(new d(c.SERVER_ERROR,`VOD direct upload could not start: ${A}`)))}})}var ds=async e=>{let t=Il(),r=vl();try{return await El(e)}finally{r(),t()}};function dt(e){return e&&typeof e=="object"?e:void 0}async function Sl(e,t){let r=await e.text().catch(()=>""),o;try{o=r?JSON.parse(r):{}}catch{throw new d(c.SERVER_ERROR,`Invalid JSON response from ${t}`,{status:e.status})}let n=dt(o)??{};if(!e.ok||n.success===!1){let i=n.error,s=typeof i=="string"?i:typeof dt(i)?.message=="string"?dt(i).message:`${t} failed: HTTP ${e.status}`,a={status:e.status,error:typeof i=="string"?i:void 0};throw e.status===401?new d(c.API_KEY_INVALID,s,a):e.status===403?new d(c.WORKSPACE_FORBIDDEN,s,a):e.status===404?new d(c.WORKSPACE_NOT_FOUND,s,a):e.status===413?new d(c.PAYLOAD_TOO_LARGE,s,a):e.status===400?new d(c.INVALID_ARGUMENT,s,a):new d(c.SERVER_ERROR,s,a)}return n}async function cs(e){let t=Al("md5");for await(let r of Cl(e))t.update(r);return t.digest("hex")}function Ol(e){return new Promise(t=>setTimeout(t,e))}function us(e){let t=dt(e),r=dt(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 or=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??ds,this.pollIntervalMs=t.pollIntervalMs??3e3,this.timeoutMs=t.timeoutMs??600*1e3,this.requestTimeoutMs=t.requestTimeoutMs??3e4}headers(t=!1){return F({"x-hogi-api-key":this.apiKey,accept:"application/json",...t?{"content-type":"application/json"}:{}})}async requestJson(t,r,o,n=this.requestTimeoutMs){let i=V({source:"hogi_vod_upload_client",operation:o,method:r.method??"GET",path:new URL(t).pathname},this.logger),s;try{let a=await q({operation:o,timeoutMs:n,run:async u=>(s=await i.fetch(this.fetch,t,{...r,signal:u}),Sl(s,o))});return i.success(s.status),a}catch(a){throw i.failure(a,s?.status),a instanceof W?new d(c.NETWORK_ERROR,a.message,{retryable:!0,request_timeout:!0,timeout_ms:a.timeoutMs}):a instanceof d?a:new d(c.NETWORK_ERROR,`${o} network error: ${a instanceof Error?a.message:String(a)}`)}}async uploadFile(t){if(!t.workspaceId.trim())throw new d(c.WORKSPACE_REQUIRED,"workspace_id is required");if(!t.fileName.trim())throw new d(c.INVALID_ARGUMENT,"file_name is required");let r=oe(t.fileType);if(ye(r)!=="video")throw new d(c.INVALID_ARGUMENT,`VOD upload requires a supported video type: ${r||"<empty>"}`);if(!Number.isSafeInteger(t.fileSize)||t.fileSize<=0)throw new d(c.INVALID_ARGUMENT,"file_size must be a positive integer");if(t.fileSize>524288e3)throw new d(c.PAYLOAD_TOO_LARGE,`VOD upload limit is ${524288e3} bytes (500 MB)`);let o=V({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(!us(s))throw new d(c.SERVER_ERROR,"Invalid VOD upload_token response");let[a,u]=await Promise.all([this.directUpload({filePath:t.filePath,fileName:t.fileName,fileSize:t.fileSize,fileType:r,token:s,userId:"oiioii-cli",onProgress:t.onProgress}),cs(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:u})},"VOD commit_upload"),p=dt(l.data);if(typeof p?.assetId!="string"||typeof p.taskId!="string")throw new d(c.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(c.INVALID_ARGUMENT,"file_name is required");let r=oe(t.fileType);if(!["mkv","mov","mp4","webm"].includes(r))throw new d(c.INVALID_ARGUMENT,`Standalone VOD upload requires mkv, mov, mp4, or webm: ${r||"<empty>"}`);if(!Number.isSafeInteger(t.fileSize)||t.fileSize<=0)throw new d(c.INVALID_ARGUMENT,"file_size must be a positive integer");if(t.fileSize>524288e3)throw new d(c.PAYLOAD_TOO_LARGE,`VOD upload limit is ${524288e3} bytes (500 MB)`);let o=V({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 cs(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=dt(i.data);if(!s)throw new d(c.SERVER_ERROR,"Invalid VOD media_upload prepare response");if(typeof s.dedupUri=="string"){if(!s.dedupUri.startsWith("hogi://video/"))throw new d(c.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(c.SERVER_ERROR,"Invalid VOD media_upload task_id");if(s.resume!==!0){if(!us(s))throw new d(c.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 u=await this.waitForStatus(a,`${this.baseUrl}/media/vod/media_uploads/${encodeURIComponent(a)}`,"VOD media_upload status");return o.success(200,{file_uri:u.outputUri,task_id:a}),{fileUri:u.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(u){if((u instanceof d&&u.details&&typeof u.details=="object"?u.details:void 0)?.request_timeout===!0){if(Date.now()>=n)break;continue}throw u}let a=dt(s.data);if(!a||typeof a.status!="string")throw new d(c.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(c.SERVER_ERROR,a.errorMessage||a.errorCode||`VOD transcode ${a.status}`);await Ol(Math.min(this.pollIntervalMs,Math.max(0,n-Date.now())))}throw new d(c.TASK_TIMEOUT,`VOD transcode timed out after ${this.timeoutMs}ms`,{task_id:t})}};var ls=v,ms=T;function Ml(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(c.WORKSPACE_REQUIRED,"No workspace set. Run: oiioii workspace set <workspace_id>")}function Lr(e,t){let r=`hogi://${t}/`;if(!e.startsWith(r))throw new d(c.SERVER_ERROR,`Upload API returned mismatched URI/domain: expected ${r}`)}function hs(e,t,r,o=!1){return e==="video"&&(o||t==="mov"||r>=10485760)}function ys(e,t,r,o){if(o!=="audio")return{fileType:t,fileName:r};let n=at(e)??t;if(ye(n)!=="audio")throw new d(c.SERVER_ERROR,"Upload API returned an unsupported audio extension");let i=Ul(r);return oe(i)===n?{fileType:n,fileName:r}:{fileType:n,fileName:`${i?r.slice(0,-i.length):r}.${n}`}}async function ws(e,t){let r;try{r=await t(e)}catch{throw new d(c.INVALID_ARGUMENT,`File not found: ${e}`)}if(!r.isFile())throw new d(c.INVALID_ARGUMENT,`Not a file: ${e}`);if(r.size<=0)throw new d(c.INVALID_ARGUMENT,`File is empty: ${e}`);return r.size}async function rn(e,t={},r={}){let o=r.configStore??new I,n=r.readFile??gs,i=r.stat??_s,s=D(t,o),a=s.baseUrl,u=fs(e.path),l=await ws(u,i),p=e.fileType??at(u);if(!p)throw new d(c.INVALID_ARGUMENT,`Cannot infer file type from path: ${e.path}. Use --type <ext>.`);let m=oe(p),f=ts(m);if(e.vod===!0&&f!=="video")throw new d(c.INVALID_ARGUMENT,"--vod is only valid for video files");y("upload","upload.file_validated",{file_type:m,domain:f,size:l});let h=Ml(t,o),x=e.fileName??ps(u);if(hs(f,m,l,e.vod===!0)){if(e.afterAssetId)throw new d(c.INVALID_ARGUMENT,"--after-asset-id is not supported by the VOD upload API");let G=await new or({baseUrl:a,apiKey:s.apiKey,fetch:r.fetch,directUpload:r.vodDirectUpload,pollIntervalMs:r.vodPollIntervalMs,timeoutMs:r.vodTimeoutMs}).uploadFile({filePath:u,fileSize:l,fileName:x,fileType:m,workspaceId:h});return Lr(G.fileUri,"video"),y("upload","upload.vod_completed",{asset_id:G.assetId,task_id:G.taskId,size:l,workspace_id:h}),{uri:G.fileUri,asset_id:G.assetId,asset_uri:G.assetUri,file_uri:G.fileUri,domain:"video",file_type:m,file_name:x,size:l,attached:!0,workspace_id:h,upload_mode:"vod",task_id:G.taskId}}let E=await n(u),w=await new tr({baseUrl:a,apiKey:s.apiKey,fetch:r.fetch}).uploadFile({buffer:E,workspaceId:h,fileType:m,fileName:x,afterAssetId:e.afterAssetId});if(y("upload","upload.completed",{asset_id:w.assetId,domain:w.type,size:l,workspace_id:h}),Lr(w.fileUri,w.type),w.type!==f)throw new d(c.SERVER_ERROR,`Upload API returned unexpected domain: ${w.type}`);y("upload","workspace.asset_attached",{asset_id:w.assetId,domain:w.type,workspace_id:h});let P=ys(w.fileUri,m,x,w.type);return{uri:w.fileUri,asset_id:w.assetId,asset_uri:w.assetUri,file_uri:w.fileUri,domain:w.type,file_type:P.fileType,file_name:P.fileName,size:l,attached:!0,workspace_id:h,upload_mode:"direct"}}async function Dl(e,t={},r={}){let o=r.configStore??new I,n=r.stat??_s,i=D(t,o),s=fs(e.path),a=await ws(s,n),u=e.fileType??at(s);if(!u)throw new d(c.INVALID_ARGUMENT,`Cannot infer file type from path: ${e.path}. Use --type <ext>.`);let l=oe(u),p=je(l);if(!p)throw new d(c.INVALID_ARGUMENT,`Unsupported resource file type: ${l||"<empty>"}`);if(e.vod===!0&&p!=="video")throw new d(c.INVALID_ARGUMENT,"--vod is only valid for video files");let m=e.fileName??ps(s),f=p==="video"&&hs(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 w=await new or({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 Lr(w.fileUri,"video"),{uri:w.fileUri,file_uri:w.fileUri,domain:"video",file_type:l,file_name:m,size:a,upload_mode:"vod",...w.taskId?{task_id:w.taskId}:{}}}let h=await(r.readFile??gs)(s),O=await new Mt({baseUrl:i.baseUrl,apiKey:i.apiKey,fetch:r.fetch}).uploadFile({buffer:h,fileType:l,fileName:m}),E=ys(O.fileUri,O.fileType,m,p);if(O.domain!==p)throw new d(c.SERVER_ERROR,"Resource upload returned unexpected domain");return Lr(O.fileUri,p),{uri:O.fileUri,file_uri:O.fileUri,domain:p,file_type:O.fileType,file_name:E.fileName,size:a,upload_mode:"direct"}}function Rs(e={}){let t=new xl("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=ls(n),s=ms(n);try{let a=await rn({path:r,fileType:o.type,fileName:o.name,afterAssetId:o.afterAssetId,attach:o.attach===!0,vod:o.vod===!0},s,e);N({media_type:a.domain,file_extension:a.file_type,size_bucket:ot(a.size),upload_mode:a.upload_mode??"direct",forced_vod:o.vod===!0,attached:a.attached}),i?_(b("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)):C(a.message),process.exitCode=1;return}let u=a instanceof Error?a.message:String(a);i?_(S("upload_file",c.SERVER_ERROR,u)):C(u),process.exitCode=1}}),t.command("resource").description("Upload an image, video, audio, or document resource without a workspace").argument("<path>","Local file path").option("--type <ext>","File extension override, e.g. png/mp4/mp3/txt/pdf/docx").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=ls(n),s=ms(n);try{let a=await Dl({path:r,fileType:o.type,fileName:o.name,vod:o.vod===!0},s,e);N({media_type:a.domain,file_extension:a.file_type,size_bucket:ot(a.size),upload_mode:a.upload_mode,forced_vod:o.vod===!0,attached:!1}),i?_(b("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)):C(a.message),process.exitCode=1;return}let u=a instanceof Error?a.message:String(a);i?_(S("upload_resource",c.SERVER_ERROR,u)):C(u),process.exitCode=1}}),t}var ks=new Set(["completed","failed","cancelled"]),Gl=/^hogi:\/\/(audio|document|image|video)\/[^\s]+$/,Fl=/^hogi:\/\/style\/[^\s]+$/,Wl=/^[^,,{}`\r\n]+$/,ql=/^\d{1,4}:\d{1,4}$/,Kl=/^generate_(image|video|music|audio)_[A-Za-z0-9_]{1,100}$/;function ze(e,t,r){let o=e.trim();if(!o)throw new d(c.INVALID_ARGUMENT,`${t} must not be empty`);if(o.length>r)throw new d(c.INVALID_ARGUMENT,`${t} must contain at most ${r} characters`);return o}function kt(e,t,r){if(e===void 0)return;let o=ze(e,t,r);if(!Wl.test(o))throw new d(c.INVALID_ARGUMENT,`${t} contains unsupported delimiters`);return o}function Bl(e){if(e.length>4096)throw new d(c.INVALID_ARGUMENT,"--hogi-uri must contain at most 4096 characters");let t=Gl.exec(e);if(!t)throw new d(c.INVALID_ARGUMENT,`Invalid --hogi-uri: ${e}; expected hogi://image|video|audio|document/<id>`);let r=e.split("/").at(-1);if(r&&r.length>200)throw new d(c.INVALID_ARGUMENT,`Reference name from --hogi-uri must contain at most 200 characters: ${e}`);return{media_type:t[1],...r?{name:r}:{},uri:e}}async function jl(e,t){let r=t.stat??Vl,o=t.readFile??$l;return await Promise.all(e.map(async n=>{let i=bs(n),s;try{s=await r(i)}catch{throw new d(c.INVALID_ARGUMENT,`File not found: ${n}`)}if(!s.isFile())throw new d(c.INVALID_ARGUMENT,`Not a file: ${n}`);if(s.size<=0)throw new d(c.INVALID_ARGUMENT,`File is empty: ${n}`);let a=at(i),u=a?je(a):void 0;if(!a||!u)throw new d(c.INVALID_ARGUMENT,`Unsupported reference file type: ${n}`);let l=Pl(i);if(l.length>200)throw new d(c.INVALID_ARGUMENT,`Reference filename must contain at most 200 characters: ${n}`);if(u==="document"&&s.size>er)throw new d(c.PAYLOAD_TOO_LARGE,`Document exceeds ${er} byte limit: ${n}`);return{...u==="document"?{buffer:await o(i)}:{},fileName:l,fileType:a,mediaType:u,path:i}}))}async function zl(e){let{prepared:t}=e,r;if(t.mediaType==="document")r=(await new Dt({apiKey:e.auth.apiKey,baseUrl:e.auth.baseUrl,...e.deps.fetch?{fetch:e.deps.fetch}:{}}).uploadFile({buffer:t.buffer,fileName:t.fileName,fileType:t.fileType})).fileUri;else if(r=(await rn({path:t.path},{...e.rootOptions,workspace:e.workspaceId},{configStore:e.deps.configStore,fetch:e.deps.fetch,...e.deps.readFile?{readFile:e.deps.readFile}:{},...e.deps.stat?{stat:e.deps.stat}:{}})).uri,ye(t.fileType)!==t.mediaType)throw new d(c.SERVER_ERROR,"Uploaded reference domain does not match the local file type");return{reference:{media_type:t.mediaType,name:t.fileName,uri:r},uploaded:{mediaType:t.mediaType,source:t.path,uri:r}}}async function Hl(e){let{params:t}=e,r=kt(t.ratio,"--ratio",32);if(r&&!ql.test(r))throw new d(c.INVALID_ARGUMENT,"--ratio must look like 16:9");let o=kt(t.duration,"--duration",32);if(o&&(!/^\d+(?:\.\d+)?$/.test(o)||Number(o)<=0))throw new d(c.INVALID_ARGUMENT,"--duration must be a positive number of seconds such as 10");let n=kt(t.resolution,"--resolution",32),i=kt(t.quality,"--quality",100),s=kt(t.modelVersion,"--model-version",100),a=kt(t.vocalGender,"--vocal-gender",100),u=r!==void 0||o!==void 0||n!==void 0||i!==void 0||s!==void 0||t.instrumental!==void 0||a!==void 0,l=+!!t.model+ +!!t.modelId;if(t.tool&&l>0)throw new d(c.INVALID_ARGUMENT,"Use --tool or a catalog selector, not both");if(l>1)throw new d(c.INVALID_ARGUMENT,"Use --model-id or --model [--variant], not both");if(t.variant&&!t.model)throw new d(c.INVALID_ARGUMENT,"--variant requires --model");if(!t.model&&!t.modelId&&!t.tool){if(u)throw new d(c.INVALID_ARGUMENT,"Model generation options require --model-id, --model, or --tool");return}let p,m;if(t.tool)p=ze(t.tool,"--tool",100);else{let h=t.model?ze(t.model,"--model",128):void 0,x=await $e({allowCatalogOnlyModel:!0,apiKey:e.auth.apiKey,baseUrl:e.auth.baseUrl,domain:t.mediaType,fetch:e.deps.fetch,...h?{model:h}:{},...t.modelId?{modelId:ze(t.modelId,"--model-id",32)}:{},...t.variant?{variant:ze(t.variant,"--variant",100)}:{},requireActiveCatalog:!0});p=ze(x.toolName,"catalog model tool",100),m=kt(x.variant,"catalog model version",100)}if(!Kl.test(p)||At(p)!==t.mediaType)throw new d(c.INVALID_ARGUMENT,`${t.tool?"--tool":"Catalog model tool"} must be a ${t.mediaType} generation MCP method`);let f=s??m;return{tool:p,...f?{version:f}:{},...r?{ratio:r}:{},...n?{resolution:n}:{},...o?{duration:o}:{},...i?{quality:i}:{},...t.instrumental!==void 0?{instrumental:t.instrumental}:{},...a?{vocal_gender:a}:{}}}function Is(e){return e.details&&typeof e.details=="object"&&!Array.isArray(e.details)?e.details:{}}function Jl(e){return Is(e).request_outcome==="unknown"}async function Yl(e){let t=n=>{if(n.workspaceId!==e.workspaceId||n.mediaType!==e.mediaType)throw new d(c.SERVER_ERROR,"Agent media task response does not match the submission");return n},r=Date.now()+e.timeoutMs,o=t(await e.client.getTask(e.taskId));for(;!ks.has(o.status)&&Date.now()<r;)await new Promise(n=>setTimeout(n,Math.min(e.pollIntervalMs,Math.max(0,r-Date.now())))),o=t(await e.client.getTask(e.taskId));if(!ks.has(o.status))throw new d(c.TASK_TIMEOUT,`Timed out waiting for agent media task ${o.taskId}`,{media_type:o.mediaType,progress:o.progress,stage:o.stage,task_id:o.taskId,workspace_id:o.workspaceId});if(o.status==="failed"||o.status==="cancelled")throw new d(c.GENERATION_FAILED,o.error?.message??`Agent media task ${o.taskId} ${o.status}`,{backend_error:o.error,media_type:o.mediaType,progress:o.progress,stage:o.stage,task_id:o.taskId,workspace_id:o.workspaceId});return o}async function Ql(e){await Ll(e.directory,{recursive:!0});let t=new nt({apiKey:e.auth.apiKey,baseUrl:e.auth.baseUrl,...e.deps.fetch?{fetch:e.deps.fetch}:{}}),r=[];for(let o of e.uris)try{let n=await t.download(o,{output:e.directory});r.push({bytes:n.bytes,downloaded:!0,mimeType:n.mimeType,path:n.path,uri:o})}catch(n){r.push({downloaded:!1,error:n instanceof Error?n.message:String(n),uri:o})}return r}async function vs(e,t,r={}){let o=D(t,r.configStore??new I),n=ze(e.workspaceId,"--workspace-id",200),i=ze(e.prompt,"--prompt",1e4);if(!Number.isInteger(e.timeoutMs)||e.timeoutMs<1e3||e.timeoutMs>72e5)throw new d(c.INVALID_ARGUMENT,"timeoutMs must be between 1000 and 7200000 milliseconds");if(e.downloadDir&&!e.wait)throw new d(c.INVALID_ARGUMENT,"--download-dir requires --wait");let s=e.styleUri===void 0?void 0:ze(e.styleUri,"--style",4096);if(s&&!Fl.test(s))throw new d(c.INVALID_ARGUMENT,`Invalid --style URI: ${s}; expected hogi://style/<id>`);let a=e.files??[],u=e.hogiUris??[];if(u.length+a.length>20)throw new d(c.INVALID_ARGUMENT,"At most 20 total --file and --hogi-uri references are supported");let l=u.map(Bl),p=await jl(a,r),m=await Hl({auth:o,deps:r,params:e}),f=[],h=[...l];for(let P of p){let R=await zl({auth:o,deps:r,prepared:P,rootOptions:t,workspaceId:n});h.push(R.reference),f.push(R.uploaded)}let x={media_type:e.mediaType,...m?{model:m}:{},prompt:i,...h.length>0?{references:h}:{},...s?{style_uri:s}:{},workspace_id:n},O=new Zt({apiKey:o.apiKey,baseUrl:o.baseUrl,...r.fetch?{fetch:r.fetch}:{}}),E;try{E=await O.create(x)}catch(P){throw!(P instanceof d)||!Jl(P)?P:new d(P.code,`${P.message} Submission may have succeeded; do not retry automatically because this endpoint has no idempotency key.`,{...Is(P),recovery:{media_type:e.mediaType,workspace_id:n,references:h.map(R=>R.uri)},...f.length>0?{uploaded_references:f}:{},retry_endpoint_available:!1})}let A=e.wait?await Yl({client:O,mediaType:e.mediaType,pollIntervalMs:r.pollIntervalMs??3e3,taskId:E.taskId,timeoutMs:e.timeoutMs,workspaceId:n}):void 0,w=e.downloadDir&&A?.result?await Ql({auth:o,deps:r,directory:bs(e.downloadDir),uris:A.result.outputUris}):void 0;return{...w?{downloads:w}:{},submission:E,...A?{task:A}:{},uploadedReferences:f}}async function Es(e){let t=e.deps??{},r=D(e.rootOptions,t.configStore??new I);return await new Zt({apiKey:r.apiKey,baseUrl:r.baseUrl,...t.fetch?{fetch:t.fetch}:{}}).getTask(e.taskId)}function Ts(e,t,r){let o=e instanceof d?e:new d(c.SERVER_ERROR,e instanceof Error?e.message:String(e));v(t)?_(S(r,o.code,o.message,o.details)):C(o.message),process.exitCode=1}function Zl(e){let t=Number(e);if(!Number.isInteger(t)||t<1||t>7200)throw new d(c.INVALID_ARGUMENT,"--timeout must be an integer between 1 and 7200 seconds");return t*1e3}function em(e){if(e!=="image"&&e!=="video"&&e!=="audio")throw new d(c.INVALID_ARGUMENT,"--type must be image, video, or audio");return e}function tm(e){if(e==="true")return!0;if(e==="false")return!1;throw new d(c.INVALID_ARGUMENT,"Expected true or false")}function As(e={}){let t=new Xl("media").description("Run headless quick-media generation workflows");return t.command("create").requiredOption("--workspace-id <id>","Existing editable workspace ID").requiredOption("--type <type>","Media type: image, video, or audio",em).requiredOption("--prompt <text>","Media generation prompt").option("--file <path...>","Local image/video/audio/document reference file(s); uploaded before submission").option("--hogi-uri <uri...>","Existing hogi://image|video|audio|document reference URI(s)").option("--style <uri>","Optional hogi://style/<id> reference").option("--model <model>","Media model name resolved through the active backend catalog").option("--model-id <id>","Exact media model ID from inspect models").option("--variant <variant>","Exact model variant from inspect models; requires --model").option("--tool <mcp_method_name>","Explicit media-generation MCP method (bypasses --model resolution)").option("--model-version <version>","Explicit model version (overrides the catalog variant)").option("--ratio <ratio>","Aspect ratio, e.g. 16:9").option("--resolution <resolution>","Resolution, e.g. 1080p or 2K").option("--duration <seconds>","Positive generation duration in seconds").option("--quality <quality>","Generation quality").option("--instrumental <boolean>","Audio instrumental mode: true or false",tm).option("--vocal-gender <gender>","Audio vocal gender").option("--wait","Wait for the root async task to reach a terminal state").option("--timeout <seconds>","Wait timeout in seconds (default 1800, max 7200)",Zl,18e5).option("--download-dir <dir>","Download completed output URI(s); requires --wait").description("Submit quick_generate_image, quick_generate_video, or quick_generate_audio").action(async(r,o)=>{try{let n={mediaType:r.type,prompt:r.prompt,timeoutMs:r.timeout,wait:r.wait===!0,workspaceId:r.workspaceId,...r.file?.length?{files:r.file}:{},...r.hogiUri?.length?{hogiUris:r.hogiUri}:{},...r.style?{styleUri:r.style}:{},...r.model?{model:r.model}:{},...r.modelId?{modelId:r.modelId}:{},...r.tool?{tool:r.tool}:{},...r.variant?{variant:r.variant}:{},...r.modelVersion?{modelVersion:r.modelVersion}:{},...r.ratio?{ratio:r.ratio}:{},...r.resolution?{resolution:r.resolution}:{},...r.duration?{duration:r.duration}:{},...r.quality?{quality:r.quality}:{},...r.instrumental!==void 0?{instrumental:r.instrumental}:{},...r.vocalGender?{vocalGender:r.vocalGender}:{},...r.downloadDir?{downloadDir:r.downloadDir}:{}},i=await vs(n,T(o),e),s=i.task?.status??i.submission.status,a=i.downloads?.filter(u=>!u.downloaded)??[];if(v(o))_(b("media_create",i));else{U(`Media ${s}: ${i.submission.taskId} (${i.submission.mediaType})`);for(let u of i.downloads??[])u.downloaded?g(`Downloaded ${u.uri} -> ${u.path} (${u.bytes} bytes)`):C(`Failed to download ${u.uri}: ${u.error}`);g(JSON.stringify(i,null,2))}a.length>0&&(process.exitCode=1)}catch(n){Ts(n,o,"media_create")}}),t.command("status").argument("<task_id>","Root agent_message_execution task ID returned by create").description("Query a quick-media root async task").action(async(r,o,n)=>{try{let i=await Es({deps:e,rootOptions:T(n),taskId:r});v(n)?_(b("media_status",i)):(U(`Media ${i.status}: ${i.taskId} (${i.progress}%, ${i.stage})`),g(JSON.stringify(i,null,2)))}catch(i){Ts(i,n,"media_status")}}),t}import{Command as rm}from"commander";function Cs(e,t){let r=Number(e);if(!Number.isInteger(r)||r<=0)throw new d(c.INVALID_ARGUMENT,`${t} must be a positive integer.`);return r}function $r(e){g(`${e.backendTaskId??e.id} ${e.status} ${e.toolName} ${e.updatedAt}`)}function Vr(e){let t={...e};return delete t.credentialFingerprint,t}function om(e){return new d(c.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 Gr(e,t,r){let o=e instanceof d?e:new d(c.SERVER_ERROR,e instanceof Error?e.message:String(e));et(o.code,o.message),t?_(S(r,o.code,o.message,o.details)):C(o.message),process.exitCode=1}function nm(e,t,r,o=3e4,n){let i=t.configStore??new I,s=D(T(e),i);return he({transport:n??i.loadResolved().generationTransport??"openapi",baseUrl:r??s.baseUrl,apiKey:s.apiKey,fetch:t.fetch,timeoutMs:o})}async function Ss(e,t,r,o){if(!e.backendTaskId||ht(e))return e;let n=r.taskStore??new Q;return(await Vo({client:nm(t,r,e.backendBaseUrl,o,e.backendTransport),taskStore:n,previewStore:r.previewStore,task:e})).task}function Os(e={}){let t=new rm("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=v(o);try{let i=Cs(r.limit,"limit"),s=(e.taskStore??new Q).list(i);if(N({task_count:s.length,limit:i}),y("task","task.listed",{count:s.length,limit:i}),n)_(b("task_list",{tasks:s.map(Vr),count:s.length}));else{J("Recent Tasks");for(let a of s)$r(a);s.length===0&&g("No local tasks found.")}}catch(i){Gr(i,n,"task_list")}}),t.command("status").description("Get task status").argument("<task_id>","Task ID").action(async(r,o,n)=>{let i=v(n);try{let s=e.taskStore??new Q,a=s.getByAnyId(r);if(!a)throw new d(c.TASK_NOT_FOUND,`Task not found: ${r}`);a=await Ss(a,n,{...e,taskStore:s}),N({task_status:a.status}),y("task","task.status_read",{task_id:r,status:a.status}),i?_(b("task_status",{task:Vr(a)})):$r(a)}catch(s){Gr(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=v(n);try{let s=e.taskStore??new Q,a=s.get(r);if(!a)throw new d(c.TASK_NOT_FOUND,`Task not found: ${r}`);let u=e.configStore??new I,l=D(T(n),u);if(!a.credentialFingerprint||a.credentialFingerprint!==Ae(l.apiKey))throw new d(c.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??u.loadResolved().generationTransport??"openapi",f=await Si({client:he({transport:m,baseUrl:p,apiKey:l.apiKey,fetch:e.fetch}),taskStore:s,previewStore:e.previewStore,task:a,backendBaseUrl:p,backendTransport:m});N({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?_(b("task_retry",{task:Vr(f.task),reused:f.submission.reused})):$r(f.task)}catch(s){Gr(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=v(n);try{let s=Cs(o.timeout,"timeout"),a=e.taskStore??new Q,u=Date.now()+s*1e3,l=a.getByAnyId(r);if(!l)throw new d(c.TASK_NOT_FOUND,`Task not found: ${r}`);if(!l.backendTaskId&&l.status==="submitting"&&l.pendingSubmission&&l.error)throw om(l);for(;!ht(l)&&Date.now()<u;){let p=Math.max(1,Math.min(3e4,u-Date.now()));try{l=await Ss(l,n,{...e,taskStore:a},p)}catch(m){throw Date.now()>=u&&m instanceof d&&m.code===c.GENERATION_TIMEOUT?new d(c.TASK_TIMEOUT,`Timed out waiting for task ${r} after ${s}s.`):m}if(!ht(l)){let m=Math.max(0,u-Date.now());await new Promise(f=>setTimeout(f,Math.min(e.pollIntervalMs??2e3,m)))}}if(!ht(l))throw new d(c.TASK_TIMEOUT,`Timed out waiting for task ${r} after ${s}s.`);if(l.status==="failed"||l.status==="cancelled")throw new d(c.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}:{}});N({task_status:l.status,timeout_seconds:s}),y("task","task.wait_completed",{task_id:r,status:l.status}),i?_(b("task_wait",{task:Vr(l)})):$r(l)}catch(s){Gr(s,i,"task_wait")}}),t}import{Command as im}from"commander";import{spawn as sm}from"child_process";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}async getByUri(t){if(!t||!t.startsWith("hogi://"))throw new d(c.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=V({source:"hogi_genai_record_client",operation:"record.get_by_uri",method:"GET",path:"/genai/image-record/by-uri"},this.logger),i;try{return await q({operation:"Generation record request",timeoutMs:this.timeoutMs,run:async s=>{if(i=await n.fetch(this._fetch,o,{method:"GET",headers:F({"x-hogi-api-key":this.apiKey}),signal:s}),i.status===400)throw new d(c.INVALID_ARGUMENT,"URI parameter is required");if(i.status===401)throw new d(c.API_KEY_INVALID,"Invalid API key",{status:401});if(i.status===404)throw new d(c.RECORD_NOT_FOUND,`No generation record found for URI: ${t}`);if(!i.ok){let u=await i.text().catch(()=>"");throw new d(c.SERVER_ERROR,`HTTP ${i.status}: ${u||i.statusText}`,{status:i.status})}let a;try{a=await i.json()}catch{throw new d(c.SERVER_ERROR,"Invalid JSON response from server")}if(!a.success||!a.data)throw new d(c.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 W){let l=new d(c.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),u=new d(c.NETWORK_ERROR,`Network error: ${a}`);throw n.failure(u),u}}};var Ns=v;function xs(e){let t=new I,r=D(T(e),t);return{apiKey:r.apiKey,baseUrl:r.baseUrl}}function am(e){let t=process.platform==="darwin"?"open":process.platform==="win32"?"cmd":"xdg-open",r=process.platform==="win32"?["/c","start","",e]:[e];try{return sm(t,r,{detached:!0,stdio:"ignore"}).unref(),!0}catch{return!1}}function Us(){let e=new im("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=Ns(o);try{let{apiKey:i,baseUrl:s}=xs(o),u=await new Fr({baseUrl:s,apiKey:i}).getByUri(t);if(N({resource_type:fr(t),record_success:u.success,output_count:u.output_uris.length}),n)_(b("record_get",{id:u.id,type:u.type,workspace_id:u.workspace_id,method:u.mcp_method_name,input_args:u.input_args,output_uris:u.output_uris,success:u.success,error_message:u.error_message,agent:u.agent,created_at:u.created_at,updated_at:u.updated_at}));else{J("Generation Record"),g(` ID: ${u.id}`),g(` Type: ${u.type}`),g(` Workspace: ${u.workspace_id}`),g(` Method: ${u.mcp_method_name}`),g(` Success: ${u.success}`),u.error_message&&g(` Error: ${u.error_message}`),g(" Output URIs:");for(let l of u.output_uris)g(` - ${l}`);g(` Created: ${u.created_at}`)}}catch(i){if(i instanceof d){n?_(S("record_get",i.code,i.message,i.details)):C(i.message),process.exitCode=1;return}let s=i instanceof Error?i.message:String(i);n?_(S("record_get",c.SERVER_ERROR,s)):C(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=Ns(o);try{let{apiKey:i,baseUrl:s}=xs(o),u=await new nt({baseUrl:s,apiKey:i}).download(t,{output:r.output,filename:r.filename,watermark:r.wm}),l=r.open!==!1,p=l?am(u.path):!1;N({resource_type:fr(t),size_bucket:ot(u.bytes),watermark:r.wm===!0,open_requested:l,opened:p}),n?_(b("record_open",{uri:u.uri,path:u.path,bytes:u.bytes,mime_type:u.mimeType,opened:p})):(U(`Downloaded: ${u.path}`),g(` URI: ${u.uri}`),g(` Bytes: ${u.bytes}`),u.mimeType&&g(` Type: ${u.mimeType}`),g(` Opened: ${p}`))}catch(i){if(i instanceof d){n?_(S("record_open",i.code,i.message,i.details)):C(i.message),process.exitCode=1;return}let s=i instanceof Error?i.message:String(i);n?_(S("record_open",c.SERVER_ERROR,s)):C(s),process.exitCode=1}}),e}import{Command as dm}from"commander";var cm={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"},um=[{name:"text-to-image",domain:"image",description:"Generate images from text prompts",default_model:Ut,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:Ut,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:Rt,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:Rt,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:Sr,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'},{name:"text-to-speech",domain:"audio",description:"Generate expressive multilingual speech with ElevenLabs v4",default_model:"elevenlabs",command_template:'oiioii audio elevenlabs --prompt "<text>" [--speaker-id <voice-id>] [--stability <0-1>] --json'}];function lm(){return[...um]}function mm(e,t){let r=[];for(let o of e){let n=Kt(o);if(!n||t&&n!==t)continue;let i=qt(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:Ht({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 Ms(e){let t=e;for(;t.parent;)t=t.parent;return t.opts().json===!0}function Ds(e={}){let t=new dm("inspect").description("Inspect backend capabilities");return t.command("capabilities").description("List available GenAI capabilities").action((r,o)=>{let n=Ms(o),i=lm();if(N({item_count:i.length}),y("inspect","capabilities.listed",{count:i.length}),n)_(b("inspect_capabilities",{capabilities:i},[{command:"oiioii inspect models --json",description:"List available models"}]));else{J("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=Ms(o),i=r.domain;if(i!==void 0&&i!=="image"&&i!=="video"&&i!=="audio")throw new d(c.INVALID_ARGUMENT,`Invalid model domain: "${i}". Expected image, video, or audio.`);let s=i,a=e.configStore??new I,u=D(T(o),a),p=await new ge({baseUrl:u.baseUrl,apiKey:u.apiKey,...e.fetch?{fetch:e.fetch}:{}}).listModels({includeDisplayNames:!0}),m=mm(p,s);if(N({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)_(b("inspect_models",{models:m,count:m.length,source:"backend_model_catalog",selection:cm,...s?{filter:{domain:s}}:{}},[{command:"oiioii inspect capabilities --json",description:"List capabilities"}]));else{let f=s?`Available ${s} models`:"Available models";J(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(`
|
|
32
|
+
Total: ${m.length} models`)}}),t}import{Command as pm}from"commander";function $s(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:_t(t,r)})),status:t.status,...t.error?{error:{code:t.error.code,message:t.error.message}}:{}})}function Vs(e,t){return t.taskStore??new Q({configDir:e.getConfigDir()})}function fm(e={}){let t=e.previewStore??new Ge,r=t.getLatest();if(!r){let o=Vs(t,e).list().find(n=>n.status==="succeeded"||n.status==="failed");if(o)try{let n=$s(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:c.RECORD_NOT_FOUND,message:"No preview bundles found. Generate an image or video first."}}}function gm(e,t={}){let r=t.previewStore??new Ge,o=r.getBundleByTaskId(e);if(!o){let n=Vs(r,t).getByAnyId(e);if(n)try{let i=$s(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:c.RECORD_NOT_FOUND,message:`No preview bundle found for task ${e}.`}}}function Ps(e){let t=e;for(;t.parent;)t=t.parent;return t.opts().json===!0}function Ls(e){if(J("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(`
|
|
33
|
+
Next steps:`);for(let t of e.summary.next)g(` ${t.command}`)}}function Gs(e={}){let t=new pm("preview").description("Preview bundles for generation results");return t.command("latest").description("Show the most recent preview bundle").action((r,o)=>{let n=Ps(o),i=fm(e);i.ok&&i.data?(N({found:!0,artifact_count:i.data.manifest.resources.length}),n?_(b("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)):Ls(i.data)):(n?_(S("preview_latest",i.error.code,i.error.message)):C(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=Ps(n),s=gm(r,e);s.ok&&s.data?(N({found:!0,artifact_count:s.data.manifest.resources.length}),i?_(b("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)):Ls(s.data)):(i?_(S("preview_bundle",s.error.code,s.error.message)):C(s.error.message),process.exitCode=1)}),t}import{Command as _m}from"commander";function on(e){let t=e;for(;t.parent;)t=t.parent;return t.opts().json===!0}function hm(e,t){if(e===void 0)return;let r=Number.parseInt(e,10);if(!Number.isInteger(r)||r<=0)throw new d(c.INVALID_ARGUMENT,`${t} must be a positive integer.`);return r}function Fs(e){let t=["debug","info","warn","error"],r=["application","api"];if(e.level&&!t.includes(e.level))throw new d(c.INVALID_ARGUMENT,`Unknown log level: ${e.level}.`);if(e.category&&!r.includes(e.category))throw new d(c.INVALID_ARGUMENT,`Unknown log category: ${e.category}.`);if(e.since&&Number.isNaN(Date.parse(e.since)))throw new d(c.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:hm(e.limit,"--limit")}:{}}}function Ws(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 qs(e,t,r){let o=e instanceof d?e:new d(c.CONFIG_ERROR,e instanceof Error?e.message:String(e));t?_(S(r,o.code,o.message,o.details)):C(o.message),process.exitCode=1}function Ks(e={}){let t=new _m("logs").description("Local structured log management");return Ws(t.command("list").description("List locally stored log entries")).action((r,o)=>{let n=on(o);try{let i=e.logStore??new Xe,s=Fs(r),a=i.list(s);if(N({entry_count:a.length,has_filter:Object.values(s).some(u=>u!==void 0)}),n)_(b("logs_list",{path:i.path,count:a.length,entries:a}));else if(a.length===0)g(`No logs found.
|
|
34
|
+
Path: ${i.path}`);else{J(`Logs (${a.length})`);for(let u of a){let l=u.http?.status?` status=${u.http.status}`:"",m=["logid","requestId","uid","workspaceId"].filter(f=>u[f]).map(f=>` ${f}=${u[f]}`).join("");g(`${u.timestamp} ${u.level.toUpperCase()} ${u.source} ${u.event}${l}${m}`)}}}catch(i){qs(i,n,"logs_list")}}),Ws(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=on(o);try{if(r.format!=="json"&&r.format!=="jsonl")throw new d(c.INVALID_ARGUMENT,`Unknown export format: ${r.format}.`);let s=(e.logStore??new Xe).export({output:r.output,format:r.format,filter:Fs(r),force:r.force===!0});N({format:s.format,entry_count:s.count,size_bucket:ot(s.bytes)}),n?_(b("logs_export",s)):U(`Exported ${s.count} log entries to ${s.path}`)}catch(i){qs(i,n,"logs_export")}}),t.command("path").description("Show the local log file path").action((r,o)=>{let n=on(o),i=e.logStore??new Xe;N({path_available:!0}),n?_(b("logs_path",{path:i.path})):g(i.path)}),t}import{Command as bm}from"commander";import{mkdirSync as ym,writeFileSync as wm}from"fs";import{dirname as Rm}from"path";function Bs(e){let t=String(e??"");return/[",\n]/.test(t)?`"${t.replace(/"/g,'""')}"`:t}function km(e,t){let r=[e.map(Bs).join(",")];for(let o of t)r.push(o.map(Bs).join(","));return`\uFEFF${r.join(`\r
|
|
35
|
+
`)}`}function js(e,t,r){ym(Rm(e),{recursive:!0}),wm(e,km(t,r),"utf-8")}function Wr(e,t){let r=t.configStore??new I,o=D(e,r);return{baseUrl:o.baseUrl,apiKey:o.apiKey,...t.fetch?{fetch:t.fetch}:{}}}async function Im(e){let t=await new be(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 vm(e,t){return await new be(t).getGenerationCosts(e)}async function Em(e,t){return await new be(t).getLogs(e)}async function Tm(e,t,r=5e3){let o=new be(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 zs=["Time","Type","Points","Status","Model","Reason","TaskId"];function Hs(e){return[e.createdAt,e.type,`${e.amount>=0?"+":""}${e.amount}`,e.status,e.model??"-",e.reason??"-",e.taskId??"-"]}async function Am(e,t){let[r,o]=await Promise.all([new ge(t).listModels(),new be(t).getBalance()]),n=Bt(r,{...e.modelId?{modelId:e.modelId}:{},...e.model?{model:e.model}:{},...e.variant?{variant:e.variant}:{}}),i=Ct(n);gt(i,{...e.duration!==void 0?{duration:e.duration}:{},...e.resolution?{resolution:e.resolution}:{}});let s=Cr({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:Ee(i),available_points:o.points,sufficient:o.points>=s.estimated_points}}function nr(e,t,r=!1){let o=Number(e);if(!Number.isFinite(o)||(r?o<0:o<=0))throw new d(c.INVALID_ARGUMENT,`${t} must be ${r?"zero or positive":"positive"}`);return o}function qr(e,t,r){let o=e instanceof d?e:new d(c.SERVER_ERROR,e instanceof Error?e.message:String(e));t?_(S(r,o.code,o.message,o.details)):C(o.message),process.exitCode=1}function Js(e={}){let t=new bm("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=v(o);try{let i=await Im(Wr(T(o),e));N({tier:i.tier}),n?_(b("points_balance",i)):(U(`Available points: ${i.points}`),g(` Tier: ${i.tier}`))}catch(i){qr(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=v(n);try{let s=await vm(r,Wr(T(n),e));if(N({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)_(b("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){qr(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=v(o),i=Wr(T(o),e);try{let s=r.days!==void 0?nr(r.days,"days"):void 0,a=r.limit!==void 0?nr(r.limit,"limit"):void 0;if(r.csv){let p=await Tm({...s!==void 0?{days:s}:{},...a!==void 0?{limit:a}:{},...r.type?{type:r.type}:{}},i);js(r.csv,zs,p.map(Hs)),N({entry_count:p.length,export_format:"csv"}),n?_(b("points_logs_csv",{path:r.csv,rowCount:p.length})):U(`Exported ${p.length} rows to ${r.csv}`);return}let u=r.cursor!==void 0?nr(r.cursor,"cursor"):void 0,l=await Em({...u!==void 0?{cursorId:u}:{},...s!==void 0?{days:s}:{},...a!==void 0?{limit:a}:{},...r.type?{type:r.type}:{}},i);if(N({entry_count:l.entries.length,has_more:l.hasMore}),n)_(b("points_logs",l));else if(r.table)Yn(zs,l.entries.map(Hs));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){qr(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=v(o);try{let i=await Am({...r.modelId?{modelId:r.modelId}:{},...r.model?{model:r.model}:{},...r.variant?{variant:r.variant}:{},...r.duration!==void 0?{duration:nr(r.duration,"duration")}:{},...r.resolution?{resolution:r.resolution}:{},...r.quality?{quality:r.quality}:{},referenceVideoDuration:nr(r.referenceVideoDuration,"reference video duration",!0)},Wr(T(o),e));N({...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?_(b("points_quote",i)):(U(`Estimated points: ${i.estimated_points}`),g(` Available: ${i.available_points} \xB7 ${i.sufficient?"sufficient":"insufficient"}`),z(i.caveat))}catch(i){qr(i,n,"points_quote")}}),t}import{Command as Xm}from"commander";import{randomUUID as Dm}from"crypto";import{readFile as Pm,stat as Lm}from"fs/promises";import{basename as $m,resolve as Vm}from"path";function Ce(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Cm(e,t){if(!e.trim())throw new d(c.SERVER_ERROR,"Workflow API returned an empty response",{status:t});try{let r=JSON.parse(e);if(Ce(r))return r}catch{}throw new d(c.SERVER_ERROR,"Workflow API returned invalid JSON",{status:t})}function Sm(e,t,r){let o=t.error?.code,n=o?.toLowerCase(),i=t.error?.message??`Workflow API request failed: HTTP ${e}`,s={status:e,...o?{backend_code:o}:{},...t.request_id?{request_id:t.request_id}:{}};return e===401?new d(c.API_KEY_INVALID,i,{...s,retryable:!1}):e===403&&n==="membership_required"?new d(c.MEMBERSHIP_REQUIRED,i,{...s,retryable:!1}):e===403?new d(c.WORKSPACE_FORBIDDEN,i,{...s,retryable:!1}):e===404?new d(r==="get_task"||r==="cancel_task"?c.TASK_NOT_FOUND:c.WORKSPACE_NOT_FOUND,i,{...s,retryable:!1}):e===429?new d(c.QUOTA_EXCEEDED,i,{...s,retryable:!0}):e===409&&n==="request_in_progress"?new d(c.SERVER_ERROR,i,{...s,retryable:!0}):e===409&&n==="idempotency_state_invalid"?new d(c.SERVER_ERROR,i,{...s,retryable:!0}):e===409&&n==="task_not_cancellable"?new d(c.TASK_NOT_CANCELLABLE,i,{...s,retryable:!1}):e===400||e===409||e===422?new d(c.INVALID_ARGUMENT,i,{...s,retryable:!1}):new d(c.SERVER_ERROR,i,{...s,retryable:e>=500,...e>=500?{request_outcome:"unknown"}:{}})}function He(e,t){if(typeof e!="string"||!e.trim())throw new d(c.SERVER_ERROR,`Workflow API response is missing ${t}`);return e}function Kr(e,t,r){let o=He(e,t);if(!o.startsWith(r)||o.length===r.length)throw new d(c.SERVER_ERROR,`Workflow API response has invalid ${t}`);return o}function Om(e,t){if(!Array.isArray(e)||!e.every(r=>typeof r=="string"))throw new d(c.SERVER_ERROR,`Workflow API response has invalid ${t}`);return e}function ir(e,t,r){let o=Om(e,t);if(o.some(n=>!n.startsWith(r)||n.length===r.length))throw new d(c.SERVER_ERROR,`Workflow API response has invalid ${t}`);return o}function Ys(e,t){if(!Ce(e))throw new d(c.SERVER_ERROR,`Invalid ${t} submission response`);if(e.stage!=="queued")throw new d(c.SERVER_ERROR,`Invalid ${t} submission stage`);if(e.status!=="pending"&&e.status!=="processing"&&e.status!=="failed")throw new d(c.SERVER_ERROR,`Invalid ${t} submission status`);let r=t==="story"?Nm(e.effective_options):void 0;return{...r?{effectiveOptions:r}:{},stage:"queued",status:e.status,taskId:He(e.task_id,"task_id"),workspaceId:He(e.workspace_id,"workspace_id")}}function Nm(e){if(!Ce(e)||e.need_grid_image!==!1)throw new d(c.SERVER_ERROR,"Story submission must confirm effective_options.need_grid_image=false");return{need_grid_image:!1}}function xm(e){if(e==null)return null;if(!Ce(e))throw new d(c.SERVER_ERROR,"Workflow task returned an invalid error");if(typeof e.retryable!="boolean")throw new d(c.SERVER_ERROR,"Workflow task returned an invalid error.retryable");return{code:He(e.code,"error.code"),...typeof e.internal_code=="string"?{internalCode:e.internal_code}:{},message:He(e.message,"error.message"),retryable:e.retryable}}function Um(e){if(!Ce(e))throw new d(c.SERVER_ERROR,"Completed MV task has no result");return{render_video_uri:Kr(e.render_video_uri,"result.render_video_uri","hogi://video/")}}function sn(e){if(!Ce(e))throw new d(c.SERVER_ERROR,"Completed Story task has no result");let t={background_music_uri:Kr(e.background_music_uri,"result.background_music_uri","hogi://audio/"),final_video_uri:Kr(e.final_video_uri,"result.final_video_uri","hogi://video/"),item_uris:ir(e.item_uris,"result.item_uris","hogi://item/"),role_uris:ir(e.role_uris,"result.role_uris","hogi://role/"),scene_uris:ir(e.scene_uris,"result.scene_uris","hogi://scene/"),script_uri:Kr(e.script_uri,"result.script_uri","hogi://script/"),storyboard_uris:ir(e.storyboard_uris,"result.storyboard_uris","hogi://storyboard/"),storyboard_video_uris:ir(e.storyboard_video_uris,"result.storyboard_video_uris","hogi://video/")};if(t.storyboard_uris.length!==t.storyboard_video_uris.length)throw new d(c.SERVER_ERROR,"Story result returned inconsistent storyboard videos");return t}function Br(e,t,r){if(!Ce(e))throw new d(c.SERVER_ERROR,"Invalid workflow task response");let o=e.status;if(o!=="pending"&&o!=="processing"&&o!=="completed"&&o!=="failed"&&o!=="cancelled")throw new d(c.SERVER_ERROR,`Invalid workflow task status: ${String(o)}`);if(typeof e.progress!="number"||!Number.isFinite(e.progress)||e.progress<0||e.progress>100)throw new d(c.SERVER_ERROR,"Workflow task returned invalid progress");let n=He(e.task_id,"task_id");if(n!==t)throw new d(c.SERVER_ERROR,"Workflow task response returned a different task_id");let i=xm(e.error);if((o==="failed"||o==="cancelled")!=(i!==null))throw new d(c.SERVER_ERROR,"Workflow task response has an inconsistent status and error");if(o!=="completed"&&e.result!==null)throw new d(c.SERVER_ERROR,"Non-completed workflow task returned a result");let s=o==="completed"?r(e.result):null;return{...typeof e.created_at=="string"?{createdAt:e.created_at}:{},error:i,progress:e.progress,result:s,stage:He(e.stage,"stage"),status:o,taskId:n,...typeof e.updated_at=="string"?{updatedAt:e.updated_at}:{},workspaceId:He(e.workspace_id,"workspace_id")}}function Mm(e){if(!Ce(e)||!Array.isArray(e.tasks)||typeof e.has_more!="boolean")throw new d(c.SERVER_ERROR,"Invalid Story task list response");let t=e.tasks.map(r=>{if(!Ce(r))throw new d(c.SERVER_ERROR,"Story task list contains an invalid task");return Br(r,He(r.task_id,"task_id"),sn)});if(e.next_cursor!==void 0&&typeof e.next_cursor!="string")throw new d(c.SERVER_ERROR,"Story task list returned an invalid next_cursor");if(e.has_more&&!e.next_cursor)throw new d(c.SERVER_ERROR,"Story task list omitted next_cursor for a partial page");return{hasMore:e.has_more,...typeof e.next_cursor=="string"?{nextCursor:e.next_cursor}:{},tasks:t}}function nn(e){let t=e.trim();if(!t||t.length>200||!/^[A-Za-z0-9_-]+$/.test(t))throw new d(c.INVALID_ARGUMENT,"task_id must contain only letters, digits, underscores, or hyphens and be at most 200 characters");return t}var jr=class{apiKey;baseUrl;fetch;logger;timeoutMs;constructor(t){this.apiKey=t.apiKey,this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.fetch=t.fetch??globalThis.fetch,this.logger=t.logger,this.timeoutMs=t.timeoutMs??3e5}async createStory(t,r){try{let o=await this.request("POST","/v1/story/create","create_story",t,{"idempotency-key":r});return Ys(o,"story")}catch(o){if(!(o instanceof d))throw o;let n=Ce(o.details)?o.details:{};throw new d(o.code,o.message,{...n,idempotency_key:r})}}async createMv(t){let r=await this.request("POST","/v1/mv/create","create_mv",t),o=Ys(r,"mv");if(o.workspaceId!==t.workspace_id)throw new d(c.SERVER_ERROR,"MV submission response returned a different workspace_id");return o}async getMvTask(t){let r=nn(t),o=await this.request("GET",`/v1/tasks/${encodeURIComponent(r)}`,"get_task");return Br(o,r,Um)}async getStoryTask(t){let r=nn(t),o=await this.request("GET",`/v1/tasks/${encodeURIComponent(r)}`,"get_task");return Br(o,r,sn)}async listStoryTasks(t={}){let r=new URLSearchParams({type:"story"});t.cursor&&r.set("cursor",t.cursor),t.limit!==void 0&&r.set("limit",String(t.limit)),t.status&&r.set("status",t.status);let o=await this.request("GET",`/v1/tasks?${r.toString()}`,"list_tasks");return Mm(o)}async cancelStoryTask(t){let r=nn(t),o=await this.request("POST",`/v1/tasks/${encodeURIComponent(r)}/cancel`,"cancel_task",{});return Br(o,r,sn)}async request(t,r,o,n,i={}){let s=V({source:"hogi_workflow_open_api_client",operation:o,method:t,path:r},this.logger),a;try{return await q({operation:`Workflow API ${o}`,timeoutMs:this.timeoutMs,run:async u=>{a=await s.fetch(this.fetch,`${this.baseUrl}${r}`,{method:t,headers:F({accept:"application/json",authorization:`Bearer ${this.apiKey}`,...n?{"content-type":"application/json"}:{},...i}),...n?{body:JSON.stringify(n)}:{},signal:u});let l=Cm(await a.text(),a.status);if(!a.ok||l.ok!==!0)throw Sm(a.status,l,o);if(l.data===void 0)throw new d(c.SERVER_ERROR,"Workflow API response is missing data");return s.success(a.status),l.data}})}catch(u){if(u instanceof W){let p=new d(c.NETWORK_ERROR,u.message,{request_outcome:t==="POST"?"unknown":"not_completed",retryable:t==="GET",timeout_ms:u.timeoutMs});throw s.failure(p,a?.status),p}if(u instanceof d)throw s.failure(u,a?.status),u;let l=new d(c.NETWORK_ERROR,`Network error: ${u instanceof Error?u.message:String(u)}`,{request_outcome:t==="POST"?"unknown":"not_completed",retryable:t==="GET"});throw s.failure(l,a?.status),l}}};var Gm=["9x16","16x9","21x9"];var Fm=["Chinese","English","Japanese","Korean","Spanish","Portuguese","Arabic"];var Qs=new Set(["completed","failed","cancelled"]);function Wm(e){return e.trim().replace(":","x").toLowerCase()}function Xs(e,t,r){let o=e.trim();if(!t.includes(o))throw new d(c.INVALID_ARGUMENT,r);return o}function an(e,t,r){let o=e.trim();if(!o)throw new d(c.INVALID_ARGUMENT,`${t} must not be empty`);if(o.length>r)throw new d(c.INVALID_ARGUMENT,`${t} must contain at most ${r} characters`);return o}function qm(e,t,r,o){let n=e?.trim(),i=t?.trim();if(!!n==!!i)throw new d(c.INVALID_ARGUMENT,`Specify exactly one of ${r} or ${o}`);return n?{file:n}:{uri:i}}function cn(e,t,r){let o=e.trim();if(!o.startsWith(t)||o.length===t.length)throw new d(c.INVALID_ARGUMENT,`${r} must use a ${t}<id> URI`);return o}function dn(e,t,r){let o=[...new Set((e??[]).map(n=>cn(n,t,r)))];if(o.length>100)throw new d(c.INVALID_ARGUMENT,`${r} accepts at most 100 unique asset URIs`);return o}async function Km(e,t,r){let o=Vm(e),n;try{n=await(t.stat??Lm)(o)}catch{throw new d(c.INVALID_ARGUMENT,`File not found: ${e}`)}if(!n.isFile())throw new d(c.INVALID_ARGUMENT,`Not a file: ${e}`);if(n.size<=0)throw new d(c.INVALID_ARGUMENT,`File is empty: ${e}`);if(r!==void 0&&n.size>r)throw new d(c.PAYLOAD_TOO_LARGE,`File exceeds the ${r} byte upload limit: ${e}`);let i=at(o);if(!i)throw new d(c.INVALID_ARGUMENT,`Cannot infer file type from path: ${e}`);return{buffer:await(t.readFile??Pm)(o),fileName:$m(o),fileType:i,path:o}}async function Bm(e,t){if(e.uri)return{kind:"uri",uri:cn(e.uri,"hogi://document/","document URI")};let r=await Km(e.file,t,er);if(je(r.fileType)!=="document")throw new d(c.INVALID_ARGUMENT,`Unsupported document file type: ${r.fileType}`);return{kind:"file",file:r}}async function jm(e,t,r){if(e.kind==="uri")return{uri:e.uri};let o=e.file,n=await new Dt({apiKey:t.apiKey,baseUrl:t.baseUrl,...r.fetch?{fetch:r.fetch}:{}}).uploadFile({buffer:o.buffer,fileName:o.fileName,fileType:o.fileType});return{uri:n.fileUri,uploaded:{kind:"document",source:o.path,uri:n.fileUri}}}function zr(e,t){return new jr({apiKey:e.apiKey,baseUrl:e.baseUrl,...t.fetch?{fetch:t.fetch}:{}})}function Zs(e){return e.details!==null&&typeof e.details=="object"&&!Array.isArray(e.details)?e.details:{}}function zm(e){let t=Zs(e);return t.request_outcome==="unknown"||t.backend_code==="request_in_progress"||t.backend_code==="idempotency_state_invalid"}function Hm(e,t){if(e.workspaceId!==t)throw new d(c.SERVER_ERROR,"Workflow task response returned a different workspace_id");return e}async function Jm(e){let t=Date.now()+e.timeoutMs,r=await e.getTask();for(;!Qs.has(r.status)&&Date.now()<t;)await new Promise(o=>setTimeout(o,Math.min(e.pollIntervalMs,Math.max(0,t-Date.now())))),r=await e.getTask();if(!Qs.has(r.status))throw new d(c.TASK_TIMEOUT,`Timed out waiting for workflow task ${r.taskId}`,{progress:r.progress,stage:r.stage,task_id:r.taskId,workspace_id:r.workspaceId});if(r.status==="failed"||r.status==="cancelled")throw new d(c.GENERATION_FAILED,r.error?.message??`Workflow task ${r.taskId} ${r.status}`,{backend_error:r.error,progress:r.progress,stage:r.stage,task_id:r.taskId,workspace_id:r.workspaceId});return r}async function Ym(e,t,r={}){let o=D(t,r.configStore??new I),n=Wm(e.aspectRatio),i=Xs(n,Gm,"Story --aspect-ratio must be 9:16, 16:9, or 21:9"),s=Xs(e.dialogueLanguage,Fm,`Unsupported Story dialogue language: ${e.dialogueLanguage}`),a=an(e.taskName,"--task-name",100),u=cn(e.styleUri,"hogi://style/","--style"),l=an(e.videoModel,"--video-model",100),p=an(e.resolution,"--resolution",32),m=dn(e.roleUris,"hogi://role_asset/","--role"),f=dn(e.sceneUris,"hogi://scene_asset/","--scene"),h=dn(e.itemUris,"hogi://item_asset/","--item"),x=qm(e.scriptFile,e.scriptUri,"--script-file","--script-uri"),O=e.idempotencyKey?.trim();if(e.idempotencyKey!==void 0&&!O)throw new d(c.INVALID_ARGUMENT,"--idempotency-key must not be empty");let E=O??`cli-story-${Dm()}`;if(E.length>200)throw new d(c.INVALID_ARGUMENT,"--idempotency-key must contain at most 200 characters");let A=await Bm(x,r),w=await jm(A,o,r),P={assets:{items:h,roles:m,scenes:f},aspect_ratio:i,dialogue_language:s,include_items:e.includeItems,script_document_uri:w.uri,style_uri:u,task_name:a,video:{model:l,resolution:p}},R=zr(o,r),G;try{G=await R.createStory(P,E)}catch(K){throw!(K instanceof d)||!zm(K)?K:new d(K.code,`${K.message} To recover, reuse --idempotency-key ${E} with --script-uri ${w.uri} and the identical Story options.`,{...Zs(K),idempotency_key:E,recovery:{script_document_uri:w.uri},...w.uploaded?{uploaded_resources:[w.uploaded]}:{}})}let L=e.wait?await Jm({getTask:async()=>Hm(await R.getStoryTask(G.taskId),G.workspaceId),pollIntervalMs:r.pollIntervalMs??3e3,timeoutMs:e.timeoutMs}):void 0;return{idempotencyKey:E,submission:G,...L?{task:L}:{},uploadedResources:w.uploaded?[w.uploaded]:[]}}async function Qm(e){let t=e.deps??{},r=D(e.rootOptions,t.configStore??new I),o=zr(r,t);return e.kind==="story"?await o.getStoryTask(e.taskId):await o.getMvTask(e.taskId)}var ea=Ym;function ta(e){return Qm({...e,kind:"story"})}function ra(e){let t=e.deps??{},r=D(e.rootOptions,t.configStore??new I);return zr(r,t).listStoryTasks({...e.cursor?{cursor:e.cursor}:{},...e.limit!==void 0?{limit:e.limit}:{},...e.status?{status:e.status}:{}})}function oa(e){let t=e.deps??{},r=D(e.rootOptions,t.configStore??new I);return zr(r,t).cancelStoryTask(e.taskId)}function Zm(e){let t=Number(e);if(!Number.isInteger(t)||t<1||t>7200)throw new d(c.INVALID_ARGUMENT,"--timeout must be an integer between 1 and 7200 seconds");return t*1e3}function ep(e){let t=Number(e);if(!Number.isInteger(t)||t<1||t>100)throw new d(c.INVALID_ARGUMENT,"--limit must be an integer between 1 and 100");return t}var tp=new Set(["pending","processing","completed","failed","cancelled"]);function rp(e){if(!tp.has(e))throw new d(c.INVALID_ARGUMENT,"--status must be pending, processing, completed, failed, or cancelled");return e}function Hr(e,t,r){let o=e instanceof d?e:new d(c.SERVER_ERROR,e instanceof Error?e.message:String(e));v(t)?_(S(r,o.code,o.message,o.details)):C(o.message),process.exitCode=1}function Jr(e,t,r,o){v(e)?_(b(t,r)):(U(o),g(JSON.stringify(r,null,2)))}function na(e={}){let t=new Xm("story").description("Create and inspect no-interaction Story workflows");return t.command("create").requiredOption("--task-name <name>","Task and generated workspace name").option("--script-file <path>","Local script document to upload").option("--script-uri <uri>","Existing hogi://document URI").requiredOption("--style <uri>","Shared role/scene/item style URI").option("--aspect-ratio <ratio>","Story aspect ratio: 9:16, 16:9, or 21:9","9:16").option("--language <language>","Dialogue language","Chinese").option("--video-model <model>","Storyboard video model","seedance2.0pro").option("--resolution <resolution>","Storyboard video resolution","720p").option("--role <uri...>","Existing role asset URI(s)").option("--scene <uri...>","Existing scene asset URI(s)").option("--item <uri...>","Existing item asset URI(s)").option("--no-items","Do not extract or generate item assets").option("--idempotency-key <key>","Explicit Story create idempotency key").option("--wait","Wait for final Story video generation").option("--timeout <seconds>","Wait timeout in seconds (default 3600, max 7200)",Zm,36e5).description("Create a no-interaction Story workflow; exactly one of --script-file/--script-uri is required").action(async(r,o)=>{try{let n=await ea({aspectRatio:r.aspectRatio,dialogueLanguage:r.language,...r.idempotencyKey?{idempotencyKey:r.idempotencyKey}:{},includeItems:r.items,...r.item?.length?{itemUris:r.item}:{},resolution:r.resolution,...r.role?.length?{roleUris:r.role}:{},...r.scene?.length?{sceneUris:r.scene}:{},...r.scriptFile?{scriptFile:r.scriptFile}:{},...r.scriptUri?{scriptUri:r.scriptUri}:{},styleUri:r.style,taskName:r.taskName,timeoutMs:r.timeout,videoModel:r.videoModel,wait:r.wait===!0},T(o),e),i=n.task?.status??n.submission.status;Jr(o,"story_create",n,`Story workflow ${i}: ${n.submission.taskId} (workspace ${n.submission.workspaceId})`)}catch(n){Hr(n,o,"story_create")}}),t.command("status").argument("<task_id>","Story workflow task ID returned by create").description("Query a Story workflow task").action(async(r,o,n)=>{try{let i=await ta({deps:e,rootOptions:T(n),taskId:r});Jr(n,"story_status",i,`Story workflow ${i.status}: ${i.taskId} (${i.progress}%, ${i.stage})`)}catch(i){Hr(i,n,"story_status")}}),t.command("list").option("--status <status>","Filter by task status",rp).option("--limit <count>","Tasks per page (1-100)",ep,20).option("--cursor <cursor>","Pagination cursor returned by a previous page").description("List Story OpenAPI tasks owned by the current API key principal").action(async(r,o)=>{try{let n=await ra({...r.cursor?{cursor:r.cursor}:{},deps:e,limit:r.limit,rootOptions:T(o),...r.status?{status:r.status}:{}});Jr(o,"story_list",n,`Found ${n.tasks.length} Story workflow task(s)`)}catch(n){Hr(n,o,"story_list")}}),t.command("cancel").argument("<task_id>","Story workflow task ID returned by create").description("Cancel a pending or processing Story workflow task").action(async(r,o,n)=>{try{let i=await oa({deps:e,rootOptions:T(n),taskId:r});Jr(n,"story_cancel",i,`Story workflow cancelled: ${i.taskId}`)}catch(i){Hr(i,n,"story_cancel")}}),t}import{Command as dp}from"commander";import{createHash as op,randomBytes as ia}from"crypto";import{createServer as np}from"http";var ip=5e3;function sa(e){e.close(),e.closeAllConnections()}async function aa(e){let t=ia(32).toString("base64url"),r=ia(32).toString("base64url"),o=op("sha256").update(t).digest("base64url"),n=new AbortController,i=!0,s=!1,a,u,l=()=>{},p=new Promise(P=>{l=P}),m=new URL(e.authorizationPageUrl),f=()=>{if(!i||!a)return;let P=a;i=!1,clearTimeout(w),u&&clearTimeout(u),h.close(),l({outcome:"success",exchange:P})},h=np(async(P,R)=>{R.setHeader("Cache-Control","no-store"),R.setHeader("Referrer-Policy","no-referrer"),R.setHeader("Content-Type","text/plain; charset=utf-8"),R.setHeader("Content-Security-Policy","default-src 'none'; frame-ancestors 'none'");let G=new URL(P.url??"/","http://127.0.0.1"),L=G.searchParams.get("code"),K=G.searchParams.get("error")==="access_denied",ae=h.address(),we=ae&&typeof ae=="object"?ae.port:void 0,kn=P.headers.host===`127.0.0.1:${we}`;if(G.pathname==="/auth/ready"){if(!(kn&&G.searchParams.get("state")===r&&P.headers.origin===m.origin)){R.writeHead(400).end("Invalid authorization readiness callback.");return}if(R.setHeader("Access-Control-Allow-Origin",m.origin),R.setHeader("Vary","Origin"),P.method==="OPTIONS"){R.setHeader("Access-Control-Allow-Methods","POST"),R.setHeader("Access-Control-Allow-Private-Network","true"),R.writeHead(204).end();return}if(P.method!=="POST"||!i||!a){R.writeHead(409).end("Authorization is not waiting for page readiness.");return}await new Promise(dr=>{R.once("finish",dr),R.once("close",dr),R.writeHead(204).end()}),f();return}if(P.method!=="GET"||!kn||G.pathname!=="/auth/callback"||G.searchParams.get("state")!==r||!K&&!/^[a-f0-9]{64}$/.test(L??"")){R.writeHead(400).end("Invalid authorization callback.");return}if(!i||s){R.writeHead(409).end("This authorization request is already being processed.");return}let Xr=async(Ye,dr=!0)=>await new Promise(Ua=>{let bn=new URL(m.pathname,m.origin);bn.search=new URLSearchParams({result:Ye,state:r}).toString();let In=!1,vn=()=>{In||(In=!0,dr&&h.close(),Ua())};R.once("finish",vn),R.once("close",vn),R.writeHead(303,{Location:bn.href}).end()});if(K){await Xr("cancelled"),i=!1,clearTimeout(w),l({outcome:"cancelled"});return}s=!0;try{let Ye=await e.exchange({code:L,verifier:t,signal:n.signal});if(!i)return;a=Ye,await Xr("success",!1),s=!1,i&&(u=setTimeout(f,e.pageReadyTimeoutMs??ip),u.unref())}catch(Ye){i&&(await Xr("error"),i=!1,clearTimeout(w),l({outcome:"error",message:Ye instanceof Error?Ye.message:String(Ye)}))}});h.headersTimeout=5e3,h.requestTimeout=1e4,await new Promise((P,R)=>{h.once("error",R),h.listen(0,"127.0.0.1",P)});let x=h.address();if(!x||typeof x=="string")throw new Error("Unable to create local authorization listener");let O=`http://127.0.0.1:${x.port}/auth/callback`,E=new URL(m.href);E.search=new URLSearchParams({app:e.app,challenge:o,state:r,redirectUri:O}).toString();let A=()=>{i&&(i=!1,clearTimeout(w),u&&clearTimeout(u),n.abort(),sa(h),l({outcome:"cancelled"}))},w=setTimeout(()=>{i&&(i=!1,n.abort(),u&&clearTimeout(u),sa(h),l({outcome:"expired"}))},e.timeoutMs??3e5);return w.unref(),{cancel:A,result:p,url:E.href}}var sp={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 ml(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 fs(e=process.env){return ll[ml(e)]}function fl(e){try{let t=new URL(e);return(t.protocol==="https:"||t.protocol==="http:")&&t.pathname==="/"&&!t.search&&!t.hash}catch{return!1}}function gl(){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 _l(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 hl(e,t,r,o){let n=V({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:F({"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 gs(e={}){let t=new pl("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=v(o),i=_l(r),s=r.apiKey?.trim(),a=r.apiKey!==void 0,c=i[0]??(a?void 0:"terminal"),l=(R,$,w)=>{n?_(S("auth_login",R,$,w)):O($),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=A(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&&!fl(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 R=fs(),$;try{let w=await(e.createBrowserAuthorization??ps)({app:c,authorizationPageUrl:gl(),exchange:async se=>{let he=await hl(N,c,se,e.fetch??globalThis.fetch);return f.update({apiKey:he.apiKey,baseUrl:N},{resetBaseUrl:r.resetBaseUrl===!0}),he}});$=w.cancel,n||g(R.opening);let G=r.browser===!1?!1:await(e.openBrowser??Bt)(w.url);r.browser===!1?K(R.manualUrl(w.url)):G?n||g(R.waiting):K(R.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?_(I("auth_login",{activated:ee.requested,activation_supported:ee.supported,app:c,authenticated:!0,base_url:f.load().baseUrl,config_file:f.getConfigPath()})):(U(R.saved),c==="terminal"?g(R.terminalFallback):ee.requested?g(R.activating(Or[c])):K(R.activationFallback(Or[c])))}catch(w){$?.(),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 E=f.load(),T=f.getConfigPath();n?_(I("auth_login",{authenticated:!0,base_url:E.baseUrl,config_file:T})):(U(`API key saved to ${T}`),g(` Base URL: ${E.baseUrl}`))}),t.command("status").description("Check whether authentication is configured without exposing the API key").action((r,o)=>{let n=v(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?_(I("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=v(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?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 El}from"commander";import{randomUUID as Rs}from"crypto";import{readFileSync as Tl,statSync as Al}from"fs";import{fetch as yl}from"undici";function X(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function et(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"]),hs=new Set(["asset_not_found","collection_asset_not_found","collection_not_found"]);function _s(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:hs.has(t)?u.RECORD_NOT_FOUND:e.code;return r===e.code?e:new d(r,e.message,e.details)}function wl(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,...et(e[`${o}Description`])?{description:String(e[`${o}Description`])}:{},...et(e[t==="role"?"roleMainImageUri":`${o}ImageUri`])?{image_uri:String(e[t==="role"?"roleMainImageUri":`${o}ImageUri`])}:{},...et(e.createdAt)?{created_at:String(e.createdAt)}:{}}}function Rl(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=et(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)=>wl(o,t,n)),has_more:e.data.hasMore,...r?{next_cursor:r}:{}}}function kl(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=et(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 Il(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=et(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 bl(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,...et(o.description)?{description:String(o.description)}:{},...et(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 vl(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 pt=class{baseUrl;apiKey;fetch;logger;timeoutMs;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this.fetch=t.fetch??yl,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=V({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:F({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"?kl(l):Rl(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?_s(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=V({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:F({authorization:`Bearer ${this.apiKey}`,accept:"application/json"}),signal:s.signal}),!c.ok)throw await Ne(c);let l=Il(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?_s(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=V({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:F({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=bl(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=V({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:F({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=vl(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:hs.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","POST",`/v1/library/assets/${r}/${encodeURIComponent(t)}/delete`,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 ks(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 ks(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 ys(e,t,r={}){let o=ks(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 pt({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 Cl=new Set(["name","description","idempotencyKey"]),Sl={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 Ol(e,t){let r=Object.entries(t).filter(([,i])=>i!==void 0).map(([i])=>i),o=t.input?new Set(["input","idempotencyKey"]):new Set([...Cl,...Sl[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 xl(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 ft(e){let t=Object.entries(e).filter(r=>!!r[1]);return t.length?Object.fromEntries(t):void 0}function Nl(e,t){if(Ol(e,t),t.input){let o;try{if(Al(t.input).size>1024*1024)throw new Error("file exceeds 1 MiB");o=JSON.parse(Tl(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}:{},...ft({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:ft({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})}:{},...ft({epithet:t.epithet,feature:t.feature,personality:t.personality,voice_style:t.voiceStyle})?{attributes:ft({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}:{},...ft({image_uri:t.image,multi_view_image_uri:t.multiViewImage})?{media:ft({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 Ul(e,t,r={}){let o=$o(e.type),n=Nl(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??Rs();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 pt({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 pt({baseUrl:r.baseUrl,apiKey:r.apiKey,...t.fetch?{fetch:t.fetch}:{}})}function Dl(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 Ml(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()}`)}.`);Dl(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:ft({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 _(I(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 ws(e,t,r){if(C({asset_type:e.type,asset_count:e.items.length,has_more:e.has_more}),t){_(I(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
|
|
48
|
-
Next cursor: ${e.next_cursor}`)}function Ll(e,t){if(C({asset_type:e.type,asset_id:e.asset_id,reused:e.reused}),t)return _(I("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 Is(e={}){let t=new El("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=v(n);try{ws(await ys({type:r,cursor:o.cursor,limit:Po(o.limit)},A(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=v(i);try{ws(await ys({type:r,keyword:o,cursor:n.cursor,limit:Po(n.limit)},A(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=v(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(A(n),c),p=await new pt({baseUrl:l.baseUrl,apiKey:l.apiKey,...e.fetch?{fetch:e.fetch}:{}}).listCollectionMembers(s,{...o.type?{type:xl(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}),Pl(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=v(n);try{Ll(await Ul({type:r,options:o},A(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=v(i);try{let a=$o(r),c=Ml(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(A(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=v(i);try{let a=$o(r);qt(await Wt(A(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=v(i);try{let a=Et("collection",r);qt(await Wt(A(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=v(i);try{let a=Et("collection",r);qt(await Wt(A(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=v(n);try{let s=o.idempotencyKey?.trim()||Rs();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(A(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 Wl from"cross-spawn";import le from"semver";import{existsSync as ql}from"fs";import{existsSync as $l,readFileSync as Vl}from"fs";import{homedir as bs}from"os";import{join as Ar}from"path";function Gl(){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 Ar(e||Ar(bs(),"AppData","Local"),"oiioii-cli")}return Ar(bs(),".local","share","oiioii-cli")}function Fl(){return process.env.OIIOII_INSTALL_RECORD?.trim()||Ar(Gl(),"install.json")}function tt(e){return typeof e=="string"&&e.trim().length>0}function vs(e=Fl()){if(!$l(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(Vl(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"||!tt(r.environment)||!tt(r.packageName)||!tt(r.distTag)||!tt(r.installRoot)||!tt(r.npmPrefix)||!tt(r.nodePath)||!tt(r.npmPath)||!tt(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=Wl(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 Cr(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 Ts(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 jl(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=vs();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 As(e,t,r){let o=await Cr(r,e.npmPath,Fo(e,["view",`${e.packageName}@${t}`,"version","--json"]),{operation:`resolving ${t}`}),n=Ts(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 Bl(e,t,r){if(!ql(e.entryPath))throw new d(u.CLI_UPDATE_FAILED,`Installed CLI entry was not found: ${e.entryPath}`);let o=await Cr(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 Es(e,t,r){await Cr(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 Bl(e,t,r)}async function Cs(e,t,r){try{await Es(e,t,r)}catch(o){let n="not_attempted",i;if(le.valid(H)!==null&&le.neq(H,t))try{await Es(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 Ss(e={},t=Go){let r=At();if(!r.managed||!r.distTag)throw Wo(H),new Error("unreachable");let o=qo(),n=await As(o,r.distTag,t),i=le.gt(n,H),s=!e.check&&(i||e.force===!0);return s&&await Cs(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 Os(e,t=Go){let r=qo(),o=jl(e);Wo(o);let n=await As(r,o,t);return await Cs(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 xs(e=Go){let t=At(),r=qo(),o=await Cr(e,r.npmPath,Fo(r,["view",r.packageName,"versions","--json"]),{operation:"listing CLI versions"}),n=Ts(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 Ns(e,t,r){if(v(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?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 Us(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)||Ns("cli_update",await Ss(t),r)})}function Ds(){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)=>{Ns("cli_install",await Os(e),r)})}function Ms(){return new jo("versions").description("List npm versions available to this build environment").action(async(e,t)=>{let r=await xs();if(v(t)){_(I("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 Ps(e={}){let t=new Kl;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(gs()),t.addCommand(jn()),t.addCommand(Kn()),t.addCommand(Is()),t.addCommand(fi()),t.addCommand(yi()),t.addCommand(bi()),t.addCommand(Ti()),t.addCommand(Si()),t.addCommand(xi()),t.addCommand(Pi()),t.addCommand(ts()),t.addCommand(is()),t.addCommand(us()),t.addCommand(e.updateCommand??Us()),t.addCommand(Ds()),t.addCommand(Ms()),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:$r(s);await Jr(o,s,a)}),t.hook("postAction",()=>{let r=typeof process.exitCode=="number"?process.exitCode:0;Xt(W()?.failure?.code),er(r),Vr(r)}),t}async function Ls(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()||$r("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),Vr(1),1}}async function $s(e){await Hr(),process.exit(e)}var Yl=Ps;var Ql=Jl(import.meta.url),Zl=process.argv[1]!==void 0?zl(Hl(process.argv[1])):void 0;Zl===Ql&&Ls(Yl(),process.argv).then($s);export{Yl as createProgram,Ls as runProgram};
|
|
46
|
+
${e}`}};function ap(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 da(e=process.env){return sp[ap(e)]}function cp(e){try{let t=new URL(e);return(t.protocol==="https:"||t.protocol==="http:")&&t.pathname==="/"&&!t.search&&!t.hash}catch{return!1}}function up(){let e=ur(),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 lp(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 mp(e,t,r,o){let n=V({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:F({"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 u=a.data;if(!u||u.app!==t||typeof u.apiKey!="string"||!/^oii_sk_[A-Za-z0-9_-]{40}$/.test(u.apiKey)||typeof u.keyId!="string"||typeof u.keyPrefix!="string")throw new Error("The authorization server returned an invalid API key response");return n.success(s.status),{apiKey:u.apiKey,app:t,keyId:u.keyId,keyPrefix:u.keyPrefix}}catch(s){throw n.failure(s,i),s}}function ca(e={}){let t=new dp("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=v(o),i=lp(r),s=r.apiKey?.trim(),a=r.apiKey!==void 0,u=i[0]??(a?void 0:"terminal"),l=(w,P,R)=>{n?_(S("auth_login",w,P,R)):C(P),process.exitCode=1};if(i.length>1){l(c.INVALID_ARGUMENT,"Choose only one target application for browser authorization.");return}if(i.length>0&&a){l(c.INVALID_ARGUMENT,"--api-key cannot be used with an application authorization option.");return}if(a&&!s){l(c.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(c.INVALID_ARGUMENT,"--base-url and --reset-base-url cannot be used together.");return}if(m&&!cp(m)){l(c.INVALID_ARGUMENT,"--base-url must be an HTTP(S) origin without a path, query, or fragment.");return}let f=e.configStore??new I,h=Lt().replace(/\/$/,""),x=process.env.OIIOII_BASE_URL?.trim().replace(/\/$/,""),O=m?.replace(/\/$/,"")||x||(r.resetBaseUrl?h:f.load().baseUrl.replace(/\/$/,""));if(u){if(O!==h){l(c.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 w=da(),P;try{let R=await(e.createBrowserAuthorization??aa)({app:u,authorizationPageUrl:up(),exchange:async ae=>{let we=await mp(O,u,ae,e.fetch??globalThis.fetch);return f.update({apiKey:we.apiKey,baseUrl:O},{resetBaseUrl:r.resetBaseUrl===!0}),we}});P=R.cancel,n||g(w.opening);let G=r.browser===!1?!1:await(e.openBrowser??cr)(R.url);r.browser===!1?z(w.manualUrl(R.url)):G?n||g(w.waiting):z(w.browserFallback(R.url));let L=await R.result;if(L.outcome!=="success"){let ae=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"?c.AUTH_TIMEOUT:c.AUTH_INVALID,ae);return}let K=u==="terminal"?{requested:!1,supported:!1}:await(e.activateApp??Tn)(u);n?_(b("auth_login",{activated:K.requested,activation_supported:K.supported,app:u,authenticated:!0,base_url:f.load().baseUrl,config_file:f.getConfigPath()})):(U(w.saved),u==="terminal"?g(w.terminalFallback):K.requested?g(w.activating(Zr[u])):z(w.activationFallback(Zr[u])))}catch(R){P?.(),l(c.NETWORK_ERROR,R instanceof Error?R.message:String(R))}return}f.update({apiKey:s,...m?{baseUrl:m.replace(/\/$/,"")}:{}},{resetBaseUrl:r.resetBaseUrl===!0});let E=f.load(),A=f.getConfigPath();n?_(b("auth_login",{authenticated:!0,base_url:E.baseUrl,config_file:A})):(U(`API key saved to ${A}`),g(` Base URL: ${E.baseUrl}`))}),t.command("status").description("Check whether authentication is configured without exposing the API key").action((r,o)=>{let n=v(o),i=e.configStore??new I,s=!!process.env.OIIOII_API_KEY?.trim(),a=!!i.load().apiKey,u=s?"environment":a?"config":null,l=u!==null;n?_(b("auth_status",{authenticated:l,credential_source:u,config_file:i.getConfigPath()})):u==="environment"?U("Authenticated through OIIOII_API_KEY."):u==="config"?U("Authenticated through local configuration."):z("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=v(o),i=e.configStore??new I,s=i.removeApiKey(),a=!!process.env.OIIOII_API_KEY?.trim();n?_(b("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&&z("OIIOII_API_KEY is still set for this process; unset it to disable effective authentication."))}),t}import{Command as Rp}from"commander";import{randomUUID as fa}from"crypto";import{readFileSync as kp,statSync as bp}from"fs";import{fetch as pp}from"undici";function ee(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function ct(e){return typeof e=="string"&&e.length>0?e:void 0}var un=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"]),la=new Set(["asset_not_found","collection_asset_not_found","collection_not_found"]);function ua(e){let t=ee(e.details)&&typeof e.details.backend_code=="string"?e.details.backend_code:void 0;if(!t)return e;let r=un.has(t)?c.INVALID_ARGUMENT:la.has(t)?c.RECORD_NOT_FOUND:e.code;return r===e.code?e:new d(r,e.message,e.details)}function fp(e,t,r){if(!ee(e))throw new d(c.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(c.SERVER_ERROR,`Invalid ${t} asset at index ${r}`);let a;try{a=Ie(i)}catch{throw new d(c.SERVER_ERROR,`Invalid ${t} asset URI at index ${r}`)}if(a.assetType!==t||a.assetId!==n)throw new d(c.SERVER_ERROR,`Mismatched ${t} asset identity at index ${r}`);return{asset_id:n,asset_uri:i,type:t,name:s,...ct(e[`${o}Description`])?{description:String(e[`${o}Description`])}:{},...ct(e[t==="role"?"roleMainImageUri":`${o}ImageUri`])?{image_uri:String(e[t==="role"?"roleMainImageUri":`${o}ImageUri`])}:{},...ct(e.createdAt)?{created_at:String(e.createdAt)}:{}}}function gp(e,t){if(!ee(e)||e.ok!==!0||!ee(e.data)||!Array.isArray(e.data.items)||typeof e.data.hasMore!="boolean")throw new d(c.SERVER_ERROR,`Invalid ${t} asset library response`);let r=ct(e.data.nextCursor);if(e.data.hasMore&&!r)throw new d(c.SERVER_ERROR,`Invalid ${t} asset library response: missing next cursor`);return{type:t,items:e.data.items.map((o,n)=>fp(o,t,n)),has_more:e.data.hasMore,...r?{next_cursor:r}:{}}}function _p(e){if(!ee(e)||e.ok!==!0||!ee(e.data)||e.data.type!=="collection"||!Array.isArray(e.data.items)||typeof e.data.has_more!="boolean")throw new d(c.SERVER_ERROR,"Invalid collection asset library response");let t=ct(e.data.next_cursor);if(e.data.has_more&&!t)throw new d(c.SERVER_ERROR,"Invalid collection asset library response: missing next cursor");return{type:"collection",items:e.data.items.map((o,n)=>{if(!ee(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(c.SERVER_ERROR,`Invalid collection asset at index ${n}`);return o}),has_more:e.data.has_more,...t?{next_cursor:t}:{}}}function hp(e,t){if(!ee(e)||e.ok!==!0||!ee(e.data)||e.data.collection_id!==t||!Array.isArray(e.data.items)||typeof e.data.has_more!="boolean")throw new d(c.SERVER_ERROR,"Invalid collection members response");let r=ct(e.data.next_cursor);if(e.data.has_more&&!r)throw new d(c.SERVER_ERROR,"Invalid collection members response: missing next cursor");let o=e.data.items.map((n,i)=>{if(!ee(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(c.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(c.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 yp(e,t,r){if(!ee(e)||e.ok!==!0||!ee(e.data))throw new d(c.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(c.SERVER_ERROR,"Invalid asset creation response");if(t!=="collection"){let i;try{i=Ie(o.asset_uri)}catch{throw new d(c.SERVER_ERROR,"Invalid created asset URI")}if(i.assetType!==t||i.assetId!==o.asset_id)throw new d(c.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,...ct(o.description)?{description:String(o.description)}:{},...ct(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 wp(e,t,r){if(!ee(e)||e.ok!==!0||!ee(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(c.SERVER_ERROR,"Invalid asset library mutation response");return e.data}var bt=class{baseUrl;apiKey;fetch;logger;timeoutMs;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this.fetch=t.fetch??pp,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=V({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 u;try{if(u=await i.fetch(this.fetch,`${this.baseUrl}${o}${n.size?`?${n}`:""}`,{method:"GET",headers:F({authorization:`Bearer ${this.apiKey}`,accept:"application/json"}),signal:s.signal}),!u.ok)throw await Me(u);let l=await u.json().catch(()=>{}),p=t==="collection"?_p(l):gp(l,t);return i.success(u.status,{asset_type:t,count:p.items.length,has_more:p.has_more}),p}catch(l){let p=De(l)?new d(c.NETWORK_ERROR,`Asset library request timed out after ${this.timeoutMs}ms`,{retryable:!0}):l instanceof d?ua(l):new d(c.NETWORK_ERROR,l instanceof Error?l.message:String(l),{retryable:!0});throw i.failure(p,u?.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=V({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 u;try{if(u=await i.fetch(this.fetch,`${this.baseUrl}${o}${n.size?`?${n}`:""}`,{method:"GET",headers:F({authorization:`Bearer ${this.apiKey}`,accept:"application/json"}),signal:s.signal}),!u.ok)throw await Me(u);let l=hp(await u.json().catch(()=>{}),t);return i.success(u.status,{count:l.items.length,has_more:l.has_more}),l}catch(l){let p=De(l)?new d(c.NETWORK_ERROR,`Collection members request timed out after ${this.timeoutMs}ms`,{retryable:!0}):l instanceof d?ua(l):new d(c.NETWORK_ERROR,l instanceof Error?l.message:String(l),{retryable:!0});throw i.failure(p,u?.status),p}finally{clearTimeout(a)}}async create(t,r){let o="/v1/library/assets",n=V({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:F({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 Me(a);let u=yp(await a.json().catch(()=>{}),t.type,r);return n.success(a.status,{asset_type:t.type,asset_id:u.asset_id,reused:u.reused}),u}catch(u){let l=De(u)?new d(c.NETWORK_ERROR,`Asset creation timed out after ${this.timeoutMs}ms`,{retryable:!0,idempotency_key:r}):u instanceof d?new d(ee(u.details)&&typeof u.details.backend_code=="string"&&un.has(u.details.backend_code)?c.INVALID_ARGUMENT:u.code,u.message,{...ee(u.details)?u.details:{},idempotency_key:r}):new d(c.NETWORK_ERROR,u instanceof Error?u.message:String(u),{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,u){let l=V({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:F({authorization:`Bearer ${this.apiKey}`,accept:"application/json",...s===void 0?{}:{"content-type":"application/json"},...u}),...s===void 0?{}:{body:JSON.stringify(s)},signal:p.signal}),!f.ok)throw await Me(f);let h=wp(await f.json().catch(()=>{}),n,i);return l.success(f.status,{asset_type:n,asset_id:i}),h}catch(h){let x=De(h)?new d(c.NETWORK_ERROR,`Asset library ${t} timed out after ${a}ms`,{retryable:!0}):h instanceof d?new d(ee(h.details)&&typeof h.details.backend_code=="string"?un.has(h.details.backend_code)?c.INVALID_ARGUMENT:la.has(h.details.backend_code)?c.RECORD_NOT_FOUND:h.code:h.code,h.message,h.details):new d(c.NETWORK_ERROR,h instanceof Error?h.message:String(h),{retryable:!0});throw l.failure(x,f?.status),x}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","POST",`/v1/library/assets/${r}/${encodeURIComponent(t)}/delete`,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 ga(e){if(e==="role"||e==="scene"||e==="item"||e==="collection")return e;throw new d(c.INVALID_ARGUMENT,`Invalid asset type: ${e}. Expected role, scene, item, or collection.`)}function pn(e){return ga(e)}function Pt(e,t){let r=t.trim();if(!r||r.length>200)throw new d(c.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(c.INVALID_ARGUMENT,`Invalid ${e} asset ID: ${t}`);return r}let o=Ie(r);if(o.assetType!==e)throw new d(c.INVALID_ARGUMENT,`Asset URI type does not match ${e}.`);return o.assetId}function ln(e){let t=Number(e);if(!Number.isInteger(t)||t<1||t>100)throw new d(c.INVALID_ARGUMENT,"--limit must be an integer between 1 and 100.");return t}async function ma(e,t,r={}){let o=ga(e.type),n=e.keyword?.trim();if(e.keyword!==void 0&&!n)throw new d(c.INVALID_ARGUMENT,"Search keyword must not be empty.");if(n&&o==="collection"&&n.length>100)throw new d(c.INVALID_ARGUMENT,"Collection search keyword must contain at most 100 characters.");if(n&&n.length>200)throw new d(c.INVALID_ARGUMENT,"Search keyword must contain at most 200 characters.");if(e.cursor&&e.cursor.length>1e3)throw new d(c.INVALID_ARGUMENT,"Pagination cursor is too long.");let i=r.configStore??new I,s=D(t,i),a=await new bt({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 Ip=new Set(["name","description","idempotencyKey"]),vp={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 Ep(e,t){let r=Object.entries(t).filter(([,i])=>i!==void 0).map(([i])=>i),o=t.input?new Set(["input","idempotencyKey"]):new Set([...Ip,...vp[e]]),n=r.filter(i=>!o.has(i));if(n.length)throw new d(c.INVALID_ARGUMENT,`Unsupported option for ${e}: --${n[0].replace(/[A-Z]/g,i=>`-${i.toLowerCase()}`)}.`)}function fn(e){if(e.startsWith("group:")){let r=e.slice(6).trim();if(!r||r.length>200)throw new d(c.INVALID_ARGUMENT,`Invalid collection member: ${e}`);return{type:"group",asset_id:r}}let t=Ie(e);return{type:t.assetType,asset_id:t.assetId}}function Tp(e){if(e==="role"||e==="scene"||e==="item"||e==="group")return e;throw new d(c.INVALID_ARGUMENT,`Invalid collection member type: ${e}. Expected role, scene, item, or group.`)}function It(e){let t=Object.entries(e).filter(r=>!!r[1]);return t.length?Object.fromEntries(t):void 0}function Ap(e,t){if(Ep(e,t),t.input){let o;try{if(bp(t.input).size>1024*1024)throw new Error("file exceeds 1 MiB");o=JSON.parse(kp(t.input,"utf8"))}catch(n){throw new d(c.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(c.INVALID_ARGUMENT,`--input must contain an object with type "${e}".`);return o}let r=t.name?.trim();if(!r)throw new d(c.INVALID_ARGUMENT,"--name is required unless --input is used.");return e==="role"?{type:e,name:r,...t.description!==void 0?{description:t.description}:{},...It({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:It({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})}:{},...It({epithet:t.epithet,feature:t.feature,personality:t.personality,voice_style:t.voiceStyle})?{attributes:It({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}:{},...It({image_uri:t.image,multi_view_image_uri:t.multiViewImage})?{media:It({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(fn),...t.subgroupId?{subgroup_id:t.subgroupId}:{}}}async function Cp(e,t,r={}){let o=pn(e.type),n=Ap(o,e.options),i=e.options.idempotencyKey?.trim();if(e.options.idempotencyKey!==void 0&&!i)throw new d(c.INVALID_ARGUMENT,"--idempotency-key must not be empty.");let s=i??fa();if(s.length>200)throw new d(c.INVALID_ARGUMENT,"--idempotency-key must contain at most 200 characters.");let a=r.configStore??new I,u=D(t,a),l=await new bt({baseUrl:u.baseUrl,apiKey:u.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 sr(e,t){let r=D(e,t.configStore??new I);return new bt({baseUrl:r.baseUrl,apiKey:r.apiKey,...t.fetch?{fetch:t.fetch}:{}})}function Sp(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(c.INVALID_ARGUMENT,`${i(o)} cannot be used with ${i(n)}.`)}function Op(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,u])=>u!==void 0&&!r.has(a)&&!o[e].has(a));if(n)throw new d(c.INVALID_ARGUMENT,`Unsupported option for ${e}: --${n[0].replace(/[A-Z]/g,a=>`-${a.toLowerCase()}`)}.`);Sp(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(c.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:It({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 ar(e,t,r){if(t)return _(b(r,e));J(`${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 pa(e,t,r){if(N({asset_type:e.type,asset_count:e.items.length,has_more:e.has_more}),t){_(b(r,e));return}J(`${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 Np(e,t){if(N({asset_type:"collection",asset_count:e.items.length,has_more:e.has_more}),t){_(b("asset_library_collection_members",e));return}J(`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 xp(e,t){if(N({asset_type:e.type,asset_id:e.asset_id,reused:e.reused}),t)return _(b("asset_library_create",e));J(`${e.type} asset created${e.reused?" (reused)":""}`),g(` ${e.name} ${e.asset_uri??e.asset_id}`),g(` Idempotency key: ${e.idempotency_key}`)}function Je(e,t,r){let o=e instanceof d?e:new d(c.SERVER_ERROR,e instanceof Error?e.message:String(e));t?_(S(r,o.code,o.message,o.details)):C(o.message),process.exitCode=1}function mn(e){return e.option("--cursor <cursor>","Pagination cursor returned by the previous page").option("--limit <count>","Page size (1-100)","20")}function _a(e={}){let t=new Rp("library").description("Create, query, update, and organize reusable assets");return mn(t.command("list").description("List assets by type").argument("<type>","Asset type: role, scene, item, or collection")).action(async(r,o,n)=>{let i=v(n);try{pa(await ma({type:r,cursor:o.cursor,limit:ln(o.limit)},T(n),e),i,"asset_library_list")}catch(s){Je(s,i,"asset_library_list")}}),mn(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=v(i);try{pa(await ma({type:r,keyword:o,cursor:n.cursor,limit:ln(n.limit)},T(i),e),s,"asset_library_search")}catch(a){Je(a,s,"asset_library_search")}}),mn(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=v(n);try{let s=Pt("collection",r),a=o.keyword?.trim();if(o.keyword!==void 0&&!a)throw new d(c.INVALID_ARGUMENT,"Collection member keyword must not be empty.");if(a&&a.length>100)throw new d(c.INVALID_ARGUMENT,"Collection member keyword must contain at most 100 characters.");if(o.cursor&&o.cursor.length>1e3)throw new d(c.INVALID_ARGUMENT,"Pagination cursor is too long.");let u=e.configStore??new I,l=D(T(n),u),p=await new bt({baseUrl:l.baseUrl,apiKey:l.apiKey,...e.fetch?{fetch:e.fetch}:{}}).listCollectionMembers(s,{...o.type?{type:Tp(o.type)}:{},...a?{keyword:a}:{},...o.cursor?{cursor:o.cursor}:{},limit:ln(o.limit)});y("library","collection.members.listed",{collection_id:s,count:p.items.length,has_more:p.has_more}),Np(p,i)}catch(s){Je(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=v(n);try{xp(await Cp({type:r,options:o},T(n),e),i)}catch(s){Je(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=v(i);try{let a=pn(r),u=Op(a,n),l={...u};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(c.INVALID_ARGUMENT,"At least one update option is required.");ar(await sr(T(i),e).update(Pt(a,o),u),s,"asset_library_update")}catch(a){Je(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=v(i);try{let a=pn(r);ar(await sr(T(i),e).delete(Pt(a,o),a),s,"asset_library_delete")}catch(a){Je(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=v(i);try{let a=Pt("collection",r);ar(await sr(T(i),e).addCollectionMembers(a,o.map(fn)),s,"asset_library_add_members")}catch(a){Je(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=v(i);try{let a=Pt("collection",r);ar(await sr(T(i),e).removeCollectionMembers(a,o.map(fn)),s,"asset_library_remove_members")}catch(a){Je(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=v(n);try{let s=o.idempotencyKey?.trim()||fa();if(o.idempotencyKey!==void 0&&!o.idempotencyKey.trim())throw new d(c.INVALID_ARGUMENT,"--idempotency-key must not be empty.");if(s.length>200)throw new d(c.INVALID_ARGUMENT,"--idempotency-key must contain at most 200 characters.");let a=o.referenceImage?.trim();if(o.referenceImage!==void 0&&!a)throw new d(c.INVALID_ARGUMENT,"--reference-image must not be empty.");ar(await sr(T(n),e).generateExpression(Pt("role",r),s,a),i,"asset_library_expression")}catch(s){Je(s,i,"asset_library_expression")}}),t}import{Command as wn}from"commander";import Lp from"cross-spawn";import me from"semver";import{existsSync as $p}from"fs";import{existsSync as Up,readFileSync as Mp}from"fs";import{homedir as ha}from"os";import{join as Yr}from"path";function Dp(){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 Yr(e||Yr(ha(),"AppData","Local"),"oiioii-cli")}return Yr(ha(),".local","share","oiioii-cli")}function Pp(){return process.env.OIIOII_INSTALL_RECORD?.trim()||Yr(Dp(),"install.json")}function ut(e){return typeof e=="string"&&e.trim().length>0}function ya(e=Pp()){if(!Up(e))throw new d(c.CLI_INSTALLATION_UNMANAGED,`This oiioii installation is not managed by the official installer. Update it with 'npm install -g ${Vt}@latest'.`,{path:e,retryable:!1});let t;try{t=JSON.parse(Mp(e,"utf8").replace(/^\uFEFF/,""))}catch(n){throw new d(c.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"||!ut(r.environment)||!ut(r.packageName)||!ut(r.distTag)||!ut(r.installRoot)||!ut(r.npmPrefix)||!ut(r.nodePath)||!ut(r.npmPath)||!ut(r.entryPath))throw new d(c.CONFIG_ERROR,`Invalid CLI install record: ${e}`,{path:e});let o=de();if(r.environment!==o)throw new d(c.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!==Vt)throw new d(c.CONFIG_ERROR,`Install record package '${r.packageName}' does not match this build package '${Vt}'.`,{path:e,installed_package:r.packageName,build_package:Vt});return r}var gn=(e,t,r)=>new Promise((o,n)=>{let i=Lp(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",u=>{s+=u}),i.stderr?.on("data",u=>{a+=u})),i.on("error",n),i.on("close",u=>o({exitCode:u??1,stdout:s,stderr:a}))});function _n(e,t){return e.registry?[...t,"--registry",e.registry]:t}async function Qr(e,t,r,o){let n;try{n=await e(t,r,{inherit:o.inherit===!0})}catch(i){throw new d(c.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(c.CLI_UPDATE_FAILED,`npm failed while ${o.operation}.`,{exit_code:n.exitCode,stderr:n.stderr.trim()||void 0,retryable:!0});return n}function Ra(e,t){try{return JSON.parse(e.trim())}catch{throw new d(c.CLI_UPDATE_FAILED,`npm returned invalid JSON while ${t}.`,{output:e.trim(),retryable:!0})}}function Vp(e){let t=e.trim().replace(/^v(?=\d)/,"");if(me.valid(t)===null)throw new d(c.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 hn(e){let t=de(),r=$t();if(!r.managed)throw new d(c.CLI_INSTALLATION_UNMANAGED,"Local builds cannot update or install CLI versions from npm. Rebuild the local checkout instead.");let o=me.prerelease(e);if(r.prerelease==="forbidden"&&o!==null)throw new d(c.INVALID_ARGUMENT,`The production build only installs stable versions; '${e}' is a prerelease.`);if(r.prerelease==="required"&&o===null)throw new d(c.INVALID_ARGUMENT,`The ${t} build only installs prerelease versions; '${e}' is stable.`)}function yn(){let e=$t();if(!e.managed||!e.distTag)throw new d(c.CLI_INSTALLATION_UNMANAGED,"Local builds cannot update or install CLI versions from npm. Rebuild the local checkout instead.");let t=ya();if(t.distTag!==e.distTag)throw new d(c.CONFIG_ERROR,`Install record dist-tag '${t.distTag}' does not match '${e.distTag}'.`);return t}async function ka(e,t,r){let o=await Qr(r,e.npmPath,_n(e,["view",`${e.packageName}@${t}`,"version","--json"]),{operation:`resolving ${t}`}),n=Ra(o.stdout,`resolving ${t}`);if(typeof n!="string"||me.valid(n)===null)throw new d(c.CLI_UPDATE_FAILED,`npm returned an invalid version for '${t}'.`,{value:n,retryable:!0});return hn(n),n}async function Gp(e,t,r){if(!$p(e.entryPath))throw new d(c.CLI_UPDATE_FAILED,`Installed CLI entry was not found: ${e.entryPath}`);let o=await Qr(r,e.nodePath,[e.entryPath,"--version"],{operation:"verifying the installed CLI"});if(o.stdout.trim()!==t)throw new d(c.CLI_UPDATE_FAILED,"Installed CLI version verification failed.",{expected:t,actual:o.stdout.trim(),retryable:!0})}async function wa(e,t,r){await Qr(r,e.npmPath,_n(e,["install","--global","--prefix",e.npmPrefix,"--no-audit","--no-fund",`${e.packageName}@${t}`]),{inherit:!0,operation:`installing ${e.packageName}@${t}`}),await Gp(e,t,r)}async function ba(e,t,r){try{await wa(e,t,r)}catch(o){let n="not_attempted",i;if(me.valid(Y)!==null&&me.neq(Y,t))try{await wa(e,Y,r),n="succeeded"}catch(s){n="failed",i=s instanceof Error?s.message:String(s)}throw new d(c.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 Ia(e={},t=gn){let r=$t();if(!r.managed||!r.distTag)throw hn(Y),new Error("unreachable");let o=yn(),n=await ka(o,r.distTag,t),i=me.gt(n,Y),s=!e.check&&(i||e.force===!0);return s&&await ba(o,n,t),{environment:de(),package:o.packageName,dist_tag:r.distTag,previous_version:Y,version:n,update_available:i,changed:s,checked_only:e.check===!0}}async function va(e,t=gn){let r=yn(),o=Vp(e);hn(o);let n=await ka(r,o,t);return await ba(r,n,t),{environment:de(),package:r.packageName,dist_tag:r.distTag,previous_version:Y,version:n,update_available:me.gt(n,Y),changed:me.neq(Y,n),checked_only:!1}}async function Ea(e=gn){let t=$t(),r=yn(),o=await Qr(e,r.npmPath,_n(r,["view",r.packageName,"versions","--json"]),{operation:"listing CLI versions"}),n=Ra(o.stdout,"listing CLI versions"),s=(Array.isArray(n)?n:[n]).filter(a=>typeof a=="string"&&me.valid(a)!==null).filter(a=>t.prerelease==="required"?me.prerelease(a)!==null:me.prerelease(a)===null).sort(me.rcompare);return{environment:de(),package:r.packageName,dist_tag:t.distTag,versions:s}}function Ta(e,t,r){if(v(r)){_(b(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 Aa(e={}){return new wn("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)||Ta("cli_update",await Ia(t),r)})}function Ca(){return new wn("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)=>{Ta("cli_install",await va(e),r)})}function Sa(){return new wn("versions").description("List npm versions available to this build environment").action(async(e,t)=>{let r=await Ea();if(v(t)){_(b("cli_versions",r));return}J(`Available oiioii versions (${r.environment})`),r.versions.length===0?g("No matching versions found."):r.versions.forEach(o=>g(o))})}function Oa(e={}){let t=new Fp;return t.name("oiioii").description("Agent-native CLI for Oiioii / Hogi GenAI capabilities").version(Y,"-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(ca()),t.addCommand(yi()),t.addCommand(Ri()),t.addCommand(_a()),t.addCommand(Wi()),t.addCommand(ji()),t.addCommand(Zi()),t.addCommand(As()),t.addCommand(Os()),t.addCommand(Us()),t.addCommand(Ds()),t.addCommand(Gs()),t.addCommand(Rs()),t.addCommand(Ks()),t.addCommand(Js()),t.addCommand(na()),t.addCommand(e.updateCommand??Aa()),t.addCommand(Ca()),t.addCommand(Sa()),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:ao(s);await yo(o,s,a)}),t.hook("postAction",()=>{let r=typeof process.exitCode=="number"?process.exitCode:0;hr(B()?.failure?.code),yr(r),co(r)}),t}async function Na(e,t){e.exitOverride();try{return await e.parseAsync(t),typeof process.exitCode=="number"?process.exitCode:0}catch(r){if(r instanceof Rn&&(r.code==="commander.helpDisplayed"||r.code==="commander.version"))return 0;B()||ao("cli.parse");let o=r instanceof d?r:r instanceof Rn?new d(c.INVALID_ARGUMENT,r.message):new d(c.SERVER_ERROR,r instanceof Error?r.message:String(r));return e.opts().json===!0?_(S("cli_error",o.code,o.message,o.details)):(et(o.code,o.message),r instanceof Rn||C(o.message)),process.exitCode=1,hr(o.code),yr(1),co(1),1}}async function xa(e){await wo(),process.exit(e)}var Bp=Oa;var jp=qp(import.meta.url),zp=process.argv[1]!==void 0?Wp(Kp(process.argv[1])):void 0;zp===jp&&Na(Bp(),process.argv).then(xa);export{Bp as createProgram,Na as runProgram};
|
|
49
49
|
//# sourceMappingURL=cli.js.map
|