@oiioii/cli 0.1.5 → 0.1.6
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 +19 -0
- package/dist/cli.js +26 -26
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -13,6 +13,8 @@ human-readable output and a stable JSON envelope for AI agents and automation.
|
|
|
13
13
|
| Command | Capability | Status |
|
|
14
14
|
|---|---|---|
|
|
15
15
|
| `auth login` | Browser authorization for terminal/Codex/WorkBuddy/Kimi/Claude Code/DeepSeek, or explicit API Key persistence | Implemented |
|
|
16
|
+
| `auth status` | Check configured authentication without exposing the API Key | Implemented |
|
|
17
|
+
| `auth logout` | Remove locally persisted authentication without exposing the API Key | Implemented |
|
|
16
18
|
| `workspace create/set/current/rename` | Create, configure, inspect, and rename workspaces | Implemented |
|
|
17
19
|
| `workspace assets list/download` | List workspace assets and download ready resources | Implemented |
|
|
18
20
|
| `image text` | Text-to-image generation | Implemented |
|
|
@@ -208,6 +210,23 @@ The CLI writes the API Key to `~/.oiioii/config.json` with file permissions
|
|
|
208
210
|
`OIIOII_API_KEY` remains available as a temporary process override. A legacy
|
|
209
211
|
`~/.oiioii/credentials.json` file, if present, is ignored.
|
|
210
212
|
|
|
213
|
+
Check whether the current process is authenticated, or remove the locally
|
|
214
|
+
persisted API Key:
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
oiioii auth status
|
|
218
|
+
oiioii auth logout
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Neither command prints the API Key. `auth status` exits with status `0` when an
|
|
222
|
+
API Key is configured for the current process and `1` when unauthenticated. It identifies only whether
|
|
223
|
+
the credential comes from local configuration or `OIIOII_API_KEY`. `auth logout`
|
|
224
|
+
is idempotent and preserves unrelated settings such as the Base URL and active
|
|
225
|
+
workspace. It cannot unset an inherited `OIIOII_API_KEY`; when that override is
|
|
226
|
+
present, the command reports that effective authentication remains active. If
|
|
227
|
+
the local config is unreadable, logout removes that unusable file so credential
|
|
228
|
+
fragments cannot remain on disk.
|
|
229
|
+
|
|
211
230
|
Remove an existing backend override and return to the default embedded in the
|
|
212
231
|
current CLI build:
|
|
213
232
|
|
package/dist/cli.js
CHANGED
|
@@ -1,37 +1,37 @@
|
|
|
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 rc}from"fs";import{fileURLToPath as nc}from"url";import{resolve as ic}from"path";import{Command as oc,CommanderError as Mo}from"commander";import{Command as Ls}from"commander";import{readFileSync as er,writeFileSync as Fi,mkdirSync as Gi,existsSync as Yt,chmodSync as tr,rmSync as Bi}from"fs";import{join as Wi}from"path";var Go={production:"OIIOII_PRODUCTION_BASE_URL",test:"OIIOII_TEST_BASE_URL",local:void 0},Bo={production:"https://api.oiioii.ai",test:void 0,local:"http://localhost:4000"},di={production:void 0,test:"OIIOII_TEST_AUTHORIZATION_PAGE_URL",local:void 0},ci={production:"https://oiioii.tv/auth/cli",test:void 0,local:"http://localhost:3000/auth/cli"},li={production:{managed:!0,distTag:"latest",prerelease:"forbidden"},test:{managed:!0,distTag:"test",prerelease:"required"},local:{managed:!1,prerelease:"required"}};function ui(e){return Object.prototype.hasOwnProperty.call(Bo,e)}function mi(){return"production"}function pi(){return"https://api.oiioii.ai"?.trim()||void 0}function fi(){return"https://oiioii.tv/auth/cli"?.trim()||void 0}function gi(e){let t=Go[e];return t&&process.env[t]?.trim()||void 0}function X(){let e=mi()??"local";return ui(e)?e:"local"}function _i(){let e=X(),t=pi()??gi(e)??Bo[e];if(!t){let o=Go[e]??"OIIOII_BUILD_BASE_URL";throw new Error(`${o} is required for ${e} builds.`)}return{environment:e,baseUrl:t}}function Ze(){return _i().baseUrl}function Wo(){let e=X(),t=di[e],o=fi()??(t&&process.env[t]?.trim()||void 0)??ci[e];if(!o)throw new Error(`${t??"OIIOII_BUILD_AUTHORIZATION_PAGE_URL"} is required for ${e} builds.`);return o}function et(){return li[X()]}import{randomBytes as $i}from"crypto";import{randomBytes as Mi}from"crypto";import{appendFileSync as bi,chmodSync as Gt,existsSync as Re,mkdirSync as Ko,readFileSync as Ei,renameSync as zo,statSync as Bt,unlinkSync as Ho,writeFileSync as Ti}from"fs";import{dirname as Ai,join as Jo,resolve as Ci}from"path";import{homedir as hi}from"os";import{join as yi}from"path";function de(){return process.env.OIIOII_CONFIG_DIR??yi(hi(),".oiioii")}import{closeSync as wi,fstatSync as ki,openSync as Ii,statSync as qo,unlinkSync as jo}from"fs";var vi=new Int32Array(new SharedArrayBuffer(4));function Ri(e){Atomics.wait(vi,0,0,e)}function ce(e,t,o={}){let r=o.timeoutMs??2e3,n=o.staleMs??3e4,i=o.retryMs??10,s=Date.now()+r,a;for(;a===void 0;)try{a=Ii(e,"wx",384)}catch(d){if(d.code!=="EEXIST")throw d;try{if(Date.now()-qo(e).mtimeMs>n){jo(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}`);Ri(Math.min(i,Math.max(1,s-Date.now())))}try{return t()}finally{let d=ki(a);wi(a);try{let m=qo(e);m.dev===d.dev&&m.ino===d.ino&&jo(e)}catch(m){if(m.code!=="ENOENT")throw m}}}function Si(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 o=Date.parse(t.since);if(Number.isNaN(o)||Date.parse(e.timestamp)<o)return!1}return!0}var be=class{logsDir;logsPath;maxBytes;maxFiles;constructor(t={}){let o=t.configDir??de();this.logsDir=Jo(o,"logs"),this.logsPath=Jo(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 o=JSON.stringify(t)+`
|
|
3
|
+
`;ce(`${this.logsPath}.lock`,()=>{Re(this.logsPath)&&Bt(this.logsPath).size>0&&Bt(this.logsPath).size+Buffer.byteLength(o)>this.maxBytes&&this.rotate(),bi(this.logsPath,o,{encoding:"utf-8",mode:384}),Gt(this.logsPath,384)})}list(t={}){let o=[];for(let r of this.logPathsOldestFirst()){if(!Re(r))continue;let n=Ei(r,"utf-8").split(`
|
|
4
|
+
`);for(let i of n)if(i.trim())try{let s=JSON.parse(i);s.schema_version===1&&Si(s,t)&&o.push(s)}catch{}}return o.reverse(),t.limit&&t.limit>0?o.slice(0,t.limit):o}export(t){let o=Ci(t.output);if(Re(o)&&!t.force)throw new Error(`Export file already exists: ${o}. Use --force to overwrite it.`);let r=t.format??"jsonl",n=this.list(t.filter).reverse(),i=r==="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 Ee(e){if(!e||typeof e!="object")return;let t=e;return L(t.workspaceId)??L(t.workspace_id)}function
|
|
9
|
-
`,{encoding:"utf-8",mode:384}),er(this.configPath,384)}update(t,o={}){this._ensureDir(),Re(`${this.configPath}.lock`,()=>{let n={...this.load(),...t};o.resetBaseUrl&&delete n.baseUrl,this._write(n)}),h("config_store","config.updated",{fields:Object.keys(t),reset_base_url:o.resetBaseUrl===!0})}_ensureDir(){Zo(this.dirPath)||Gi(this.dirPath,{recursive:!0,mode:448}),er(this.dirPath,448)}};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_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(o,r,n){super(r);this.code=o;this.details=n;this.name="CliError"}code;details};function tt(e,t){let o=`${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(o)}function ot(e,t,o={}){let r=`${e??""} ${t??""}`.toUpperCase(),n=/IP[_\s-]*INFRINGEMENT|IP[_\s-]*CHARACTER|COPYRIGHT|RESTRICTED[_\s-]*IP/.test(r),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,{...o,...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."})}import{randomBytes as Wi}from"crypto";function qi(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 Qt=class{constructor(t,o){this.logger=t;this.context=o;this.correlation={uid:void 0,workspaceId:Ee(o.metadata)??this.trace?.workspaceId}}logger;context;requestId="req_"+Wi(8).toString("hex");startedAt=Date.now();completed=!1;started=!1;correlation;trace=M();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,o,r){this.correlation.logid=void 0,this.correlation.requestId=void 0;let n=r,i;try{let l=new Headers(r?.headers??(o instanceof Request?o.headers:void 0)),m=o instanceof Request?o.url:String(o),p=l.get("x-hogi-api-key")??l.get("authorization")?.replace(/^Bearer\s+/i,"");i=p?gt(m,p):void 0,this.correlation.uid=i&&i===this.trace?.identityKey?this.trace.uid:void 0;let u=Yo(o,r)??Ee(this.context.metadata)??L(l.get("x-workspace-id"))??this.trace?.workspaceId;this.correlation.workspaceId=u,u&&l.set("x-workspace-id",u),n={...r,headers:Object.fromEntries(l.entries())}}catch{}this.start();let s=await t(o,n),a=jt(s,o instanceof Request?o.url:String(o));return this.correlation={...a,uid:a.uid??this.correlation.uid,workspaceId:a.workspaceId??this.correlation.workspaceId},Xo(i,a.uid),s}async fetchResource(t,o,r){let n=await this.fetch(t,o,{...r,redirect:"manual"}),i=new URL(o),s=new Headers(r.headers);for(let a=0;[301,302,303,307,308].includes(n.status);a++){let l=n.headers.get("location");if(!l)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 m=new URL(l,i);m.origin!==i.origin&&(s=new Headers(Object.fromEntries([...s.entries()].filter(([u])=>["accept","range"].includes(u)))));try{await n.body?.cancel()}catch{}n=await t(m.href,{...r,headers:Object.fromEntries(s.entries()),redirect:"manual"});let p=jt(n,o);p.logid&&(this.correlation={...this.correlation,...p}),i=m}return n}success(t,o){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,...o}}))}failure(t,o){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,...o!==void 0?{status:o}:{},duration_ms:Date.now()-this.startedAt},error:qi(t)}))}};function $(e,t=ce()){return new Qt(t,e)}var V="0.1.5",rt="@oiioii/cli";var ji={clientType:"x-hogi-client-type",clientVersion:"x-hogi-client-version",clientOS:"x-hogi-client-os"};function Ki(e){return e==="win32"?"windows":e==="darwin"?"mac":e}function zi(){return{clientType:"cli",clientVersion:V,clientOS:Ki(process.platform)}}function K(e){let t=zi();return{...e,...Object.fromEntries(Object.entries(ji).map(([o,r])=>[r,t[o]]))}}var F=class extends Error{constructor(o,r){super(`${o} timed out after ${r}ms`);this.operation=o;this.timeoutMs=r;this.name="HttpRequestTimeoutError"}operation;timeoutMs};async function Q(e){let t=e.timeoutMs??3e4,o=new AbortController,r,n=new Promise((i,s)=>{r=setTimeout(()=>{o.abort(),s(new F(e.operation,t))},t)});r?.unref();try{return await Promise.race([e.run(o.signal),n])}catch(i){throw i instanceof F?i:o.signal.aborted?new F(e.operation,t):i}finally{r&&clearTimeout(r)}}function Ue(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function Hi(e){let t=Ue(e);if(t)return t;if(typeof e!="string")return;let o=e.trim();try{return Ue(JSON.parse(o))}catch{}let r=o.lastIndexOf("{");for(;r>=0;){try{let n=Ue(JSON.parse(o.slice(r)));if(n)return n}catch{}r=o.lastIndexOf("{",r-1)}}async function Yt(e){let t=await e.text().catch(()=>"");if(!t.trim())return{};try{let o=JSON.parse(t);return Ue(o)??{}}catch{throw new d(c.SERVER_ERROR,"Invalid JSON response from workspace API",{status:e.status})}}function je(e,t){let o=t.error?.code,r=t.error?.message??`Workspace request failed: HTTP ${e}`,n={status:e,...o?{code:o}:{}};return e===401?new d(c.API_KEY_INVALID,r,n):e===403?new d(c.WORKSPACE_FORBIDDEN,r,n):e===404?new d(c.WORKSPACE_NOT_FOUND,r,n):e===400||e===422?new d(c.INVALID_ARGUMENT,r,n):e===429?new d(c.QUOTA_EXCEEDED,r,n):new d(c.SERVER_ERROR,r,n)}function Ji(e){if(e.ok===!1)throw je(400,e);let t=Hi(e.data),o=t?.workspaceId,r=t?.name;if(typeof o!="string"||!o.trim())throw new d(c.SERVER_ERROR,"Invalid workspace API response: missing workspaceId");if(typeof r!="string"||!r.trim())throw new d(c.SERVER_ERROR,"Invalid workspace API response: missing name");return{workspaceId:o,name:r}}function Qi(e){if(e.ok===!1)throw je(400,e);let t=Ue(e.data),o=t?.workspace_id,r=t?.name;if(typeof o!="string"||!o.trim())throw new d(c.SERVER_ERROR,"Invalid workspace rename response: missing workspace_id");if(typeof r!="string"||!r.trim())throw new d(c.SERVER_ERROR,"Invalid workspace rename response: missing name");return{workspaceId:o,name:r}}function Yi(e){if(e.ok===!1)throw je(400,e);let t=Ue(e.data);if(!Array.isArray(t?.asset))throw new d(c.SERVER_ERROR,"Invalid workspace detail response: missing asset list");return t.asset.map((o,r)=>{let n=Ue(o);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 ${r}`);return n})}var Pe=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 o=$({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),r;try{return await Q({operation:"Workspace creation request",timeoutMs:this.timeoutMs,run:async n=>{r=await o.fetch(this._fetch,`${this.baseUrl}/v1/workspace/create`,{method:"POST",headers:K({authorization:`Bearer ${this.apiKey}`,"content-type":"application/json",accept:"application/json"}),body:JSON.stringify({...t.name!==void 0?{name:t.name}:{},...t.language!==void 0?{language:t.language}:{}}),signal:n});let i=await Yt(r);if(!r.ok)throw je(r.status,i);let s=Ji(i);return o.success(r.status,{workspace_id:s.workspaceId}),s}})}catch(n){if(n instanceof F){let s=new d(c.NETWORK_ERROR,n.message,{retryable:!0,timeout_ms:n.timeoutMs});throw o.failure(s,r?.status),s}if(n instanceof d)throw o.failure(n,r?.status),n;let i=new d(c.NETWORK_ERROR,`Network error: ${n instanceof Error?n.message:String(n)}`);throw o.failure(i),i}}async renameWorkspace(t,o){let r="/v1/workspace/rename",n=$({source:"hogi_workspace_client",operation:"workspace.rename",method:"POST",path:r,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}${r}`,{method:"POST",headers:{authorization:`Bearer ${this.apiKey}`,"content-type":"application/json",accept:"application/json"},body:JSON.stringify({workspace_id:t,name:o}),signal:s});let a=await Yt(i);if(!i.ok)throw je(i.status,a);let l=Qi(a);return n.success(i.status,{workspace_id:l.workspaceId}),l}})}catch(s){throw this.mapRequestError(s,"Workspace rename request",n,i)}}async listAssets(t){let o="/v1/workspace/detail",r=$({source:"hogi_workspace_client",operation:"workspace.assets.list",method:"GET",path:o,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 r.fetch(this._fetch,`${this.baseUrl}${o}?${n.toString()}`,{method:"GET",headers:{authorization:`Bearer ${this.apiKey}`,accept:"application/json"},signal:s});let a=await Yt(i);if(!i.ok)throw je(i.status,a);let l=Yi(a);return r.success(i.status,{workspace_id:t,asset_count:l.length}),l}})}catch(s){throw this.mapRequestError(s,"Workspace asset list request",r,i)}}mapRequestError(t,o,r,n){if(t instanceof F){let s=new d(c.NETWORK_ERROR,t.message,{retryable:!0,timeout_ms:t.timeoutMs});return r.failure(s,n?.status),s}if(t instanceof d)return r.failure(t,n?.status),t;let i=new d(c.NETWORK_ERROR,`${o} failed: ${t instanceof Error?t.message:String(t)}`);return r.failure(i),i}};function U(e){let t=e;for(;t.parent;)t=t.parent;return t.opts()}function D(e){return U(e).json===!0}function P(e,t){let o=t.loadResolved(),r=o.apiKey?.trim();if(!r)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:o.baseUrl;return{apiKey:r,baseUrl:i}}function nt(e,t,o){let r=o?.trim();if(o!==void 0&&!r)throw new d(c.INVALID_ARGUMENT,"Workspace ID must not be empty");let n=typeof e.workspace=="string"?e.workspace.trim():"",i=r||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 or={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 O(e,t){return{domain:e,action:t,calledEvent:or[e].called,resultEvent:or[e].result}}var rr={"auth.login":O("auth","login"),"workspace.create":O("workspace","create"),"workspace.set":O("workspace","set"),"workspace.current":O("workspace","current"),"workspace.rename":O("workspace","rename"),"workspace.assets.list":O("workspace","assets_list"),"workspace.assets.download":O("workspace","asset_download"),"image.text":O("generation","image_text"),"image.edit":O("generation","image_edit"),"video.text":O("generation","video_text"),"video.image":O("generation","video_image"),"video.generate":O("generation","video_generate"),"audio.generate":O("generation","audio_generate"),"audio.seed-audio":O("generation","audio_seed_audio"),"audio.suno":O("generation","audio_suno"),"upload.file":O("upload","file"),"task.list":O("task","list"),"task.retry":O("task","retry"),"task.status":O("task","status"),"task.wait":O("task","wait"),"record.get":O("record","get"),"record.open":O("record","open"),"inspect.capabilities":O("inspect","capabilities"),"inspect.models":O("inspect","models"),"preview.latest":O("preview","latest"),"preview.bundle":O("preview","bundle"),"logs.list":O("logs","list"),"logs.export":O("logs","export"),"logs.path":O("logs","path"),"points.balance":O("points","balance"),"points.cost":O("points","cost"),"points.quote":O("points","quote"),update:O("cli","update"),install:O("cli","install"),versions:O("cli","versions")};function Xt(e){return rr[e]}import{randomBytes as is}from"crypto";import{AsyncLocalStorage as Xi}from"async_hooks";var Zt=new Xi;function nr(e){Zt.enterWith(e)}function le(){return Zt.getStore()}function ir(){Zt.enterWith(void 0)}var Zi=/(?:authorization|api[_-]?key|token|password|secret|credential|cookie|prompt|file[_-]?path|request[_-]?body|response[_-]?body)/i,es=256;function eo(e){let t={};for(let[o,r]of Object.entries(e))r===void 0||Zi.test(o)||(t[o]=typeof r=="string"?De(r).slice(0,es):r);return t}import{DataRangersSDK as ts}from"@datarangers/sdk-node";import{httpPlugin as os}from"@datarangers/node-plugin-http";var rs=20011588,ns="https://gator.volces.com",sr=1e3,_t=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??ce(),!this.disabled)try{let o=t.sdk??new ts({app_id:t.appId??rs,logLevel:"silent"}),r=t.httpController??os({channel_domain:t.channelDomain??ns,retry:0,timeout:{request:sr}});o.use(r),r.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=o,this.httpController=r}catch(o){this.recordFailure("telemetry.initialization.failed",o)}}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(o){this.pendingEvents=Math.max(0,this.pendingEvents-1),this.pendingEventNames.pop(),this.recordFailure("telemetry.delivery.failed",o,t.event)}}async flush(t=sr){if(!this.httpController||this.pendingEvents===0)return;let o=this.httpController;await new Promise(r=>{let n=!1,i=l=>{n||(n=!0,clearTimeout(a),o.removeListener("drain",s),l&&this.pendingEvents>0&&this.logger.record({level:"warn",category:"application",source:"telemetry",event:"telemetry.flush.timeout",metadata:{pending_count:this.pendingEvents}}),r())},s=()=>i(!1),a=setTimeout(()=>i(!0),Math.max(0,t));o.once("drain",s)})}recordFailure(t,o,r){let n=o&&typeof o=="object"&&"code"in o&&typeof o.code=="string"?o.code:void 0;this.logger.record({level:"warn",category:"application",source:"telemetry",event:t,...n?{error:{code:n,message:"Telemetry SDK failure"}}:{},...r?{metadata:{event_name:r}}:{}})}};function ss(){let e=X(),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:V,os:process.platform,arch:process.arch,node_major:Number.isFinite(t)?t:0}}function as(){return`op_${is(8).toString("hex")}`}function ds(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 to=class{transport;now;operationId;commonParams;constructor(t={}){this.transport=t.transport??new _t,this.now=t.now??Date.now,this.operationId=t.operationId??as,this.commonParams=t.commonParams??ss}startCommand(t){let o=t.command.trim();if(!o)return;let r=Xt(o),n={command:o,startedAt:this.now(),operationId:this.operationId(),calledSent:!1,businessParams:{},...r?{calledEvent:r.calledEvent,resultEvent:r.resultEvent,action:r.action}:{},...t.userId?.trim()?{userId:t.userId.trim()}:{},...t.workspaceId?.trim()?{workspaceId:t.workspaceId.trim()}:{},...t.traceId?.trim()?{traceId:t.traceId.trim()}:{}};nr(n),this.emitCalled()}identify(t){let o=le(),r=t.trim();!o||!r||(o.userId=r,this.emitCalled())}addBusinessInfo(t){let o=le();o&&Object.assign(o.businessParams,eo(t))}markPartialSuccess(){let t=le();t&&(t.resultOverride="partial_success")}setWorkspaceId(t){let o=le(),r=t.trim();o&&r&&(o.workspaceId=r)}reportCommandFailure(t){let o=le();o&&t&&(o.failureCode=t)}completeCommand(t=0){let o=le();if(!o)return;this.emitCalled();let r=ds(o,t);o.userId&&o.resultEvent&&o.action&&this.emit(o.resultEvent,{...o.businessParams,operation_id:o.operationId,action:o.action,result:r,duration_ms:Math.max(0,this.now()-o.startedAt),...o.failureCode?{error_code:o.failureCode}:{}}),ir()}async flush(t){await this.transport.flush(t)}emitCalled(){let t=le();!t?.userId||!t.calledEvent||!t.action||t.calledSent||(t.calledSent=!0,this.emit(t.calledEvent,{operation_id:t.operationId,action:t.action}))}emit(t,o){let r=le();if(!r?.userId)return;let n={...this.commonParams(),command:r.command,...r.traceId?{trace_id:r.traceId}:{},...r.workspaceId?{workspace_id:r.workspaceId}:{}};this.transport.send({userId:r.userId,event:t,params:eo({...o,...n})})}},ar;function ue(){return ar??=new to,ar}function S(e){ue().addBusinessInfo(e)}function te(){ue().markPartialSuccess()}function me(e){let t=M(),o=L(e);t&&o&&(t.workspaceId=o),ue().setWorkspaceId(e)}function Me(e){return e<10*1024*1024?"0_10mb":e<100*1024*1024?"10_100mb":e<500*1024*1024?"100_500mb":"500mb_plus"}function ht(e){return e.startsWith("hogi://audio/")?"audio":e.startsWith("hogi://image/")?"image":e.startsWith("hogi://video/")?"video":"other"}import{Agent as cs,fetch as ls}from"undici";function yt(e,t){let o=typeof e.errorCode=="string"?e.errorCode:void 0,n=(e.content??[]).filter(l=>l?.type==="text"&&typeof l.text=="string").map(l=>l.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={...o?{backend_code:o}:{},...i?{structured_content:i}:{}};return o&&(o.includes("POINTS_INSUFFICIENT")||o.includes("POINTS_LIMIT_EXCEEDED"))?new
|
|
11
|
-
`))}catch{throw Le("Invalid JSON in SSE response from server",t)}}async function
|
|
12
|
-
`)}function f(e){console.log(e)}function
|
|
13
|
-
${e}`),console.log("\u2500".repeat(e.length))}import{Command as xs}from"commander";import{mkdir as Is,writeFile as Rs}from"fs/promises";import{existsSync as vs,statSync as bs}from"fs";import{basename as Es,dirname as Ts,join as As,resolve as cr}from"path";function lr(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 Cs(e){try{let t=new URL(e),o=Es(t.pathname);if(o&&o!=="."&&o!=="/")return o}catch{}return"resource.bin"}function Ss(e,t){let o=Cs(e);if(!t)return cr(process.cwd(),o);let r=cr(t);return vs(r)&&bs(r).isDirectory()?As(r,o):r}function Os(e,t){if(e?.toLowerCase().includes("application/json"))return!0;let o=t.subarray(0,128).toString("utf8").trimStart();return o.startsWith("{")&&(o.includes('"error"')||o.includes('"code"'))}var He=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,o={}){lr(t);let r=new URLSearchParams;return r.set("uri",t),o.filename&&r.set("filename",o.filename),typeof o.watermark=="boolean"&&r.set("wm",o.watermark?"1":"0"),`${this.baseUrl}/v1/res/read_file?${r.toString()}`}async download(t,o={}){lr(t);let r=this.getReadUrl(t,o),n=Ss(t,o.output),i=$({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 l=>{if(s=await i.fetchResource(this._fetch,r,{method:"GET",headers:K({"x-hogi-api-key":this.apiKey,accept:"image/*,video/*,application/octet-stream,application/json;q=0.5,*/*;q=0.1"}),signal:l}),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 u=await s.text().catch(()=>"");throw new d(c.SERVER_ERROR,`HTTP ${s.status}: ${u||s.statusText}`,{status:s.status})}let m=s.headers.get("content-type"),p=Buffer.from(await s.arrayBuffer());if(Os(m,p)){let u="Resource read failed";try{let g=JSON.parse(p.toString("utf8"));u=g.message??g.error??g.code??u}catch{}throw new d(c.SERVER_ERROR,u)}return{contentType:m,buffer:p}}})}catch(l){if(l instanceof F){let u=new d(c.NETWORK_ERROR,l.message,{retryable:!0,timeout_ms:l.timeoutMs});throw i.failure(u,s?.status),u}if(l instanceof d)throw i.failure(l,s?.status),l;let m=l instanceof Error?l.message:String(l),p=new d(c.NETWORK_ERROR,`Network error: ${m}`);throw i.failure(p),p}return i.success(s.status,{bytes:a.buffer.byteLength,mime_type:a.contentType}),await Is(Ts(n),{recursive:!0}),await Rs(n,a.buffer),h("record","resource.saved",{bytes:a.buffer.byteLength,mime_type:a.contentType}),{path:n,bytes:a.buffer.byteLength,mimeType:a.contentType,uri:t}}};function mr(e,t){let o=t.configStore??new x,r=P(e,o);return{auth:r,configStore:o,workspaceClient:new Pe({baseUrl:r.baseUrl,apiKey:r.apiKey,...t.fetch?{fetch:t.fetch}:{}})}}async function Ns(e,t,o={}){let{configStore:r,workspaceClient:n}=mr(t,o),i=nt(t,r,e.workspaceId),s=await n.listAssets(i);return h("workspace_assets","assets.listed",{workspace_id:i,count:s.length}),{workspace_id:i,count:s.length,assets:s}}function Ds(e){return e.startsWith("hogi://asset/")?e.slice(13):e}function Us(e,t){let o=Ds(t.trim()),r=e.find(n=>n.assetId===o);if(!r)throw new d(c.RECORD_NOT_FOUND,`Workspace asset not found: ${t}`,{asset_reference:t});if(r.status)throw new d(c.INVALID_ARGUMENT,`Workspace asset ${r.assetId} is not ready for download (status: ${r.status}).`,{asset_id:r.assetId,status:r.status});if(!r.uri.startsWith("hogi://")||r.uri.startsWith("hogi://asset/"))throw new d(c.INVALID_ARGUMENT,`Workspace asset ${r.assetId} has no downloadable resource URI.`,{asset_id:r.assetId,uri:r.uri});return r}async function Ps(e,t,o={}){let r=e.asset.trim();if(!r)throw new d(c.INVALID_ARGUMENT,"Asset ID is required");let{auth:n,configStore:i,workspaceClient:s}=mr(t,o),a=nt(t,i,e.workspaceId),l=Us(await s.listAssets(a),r),m=await new He({baseUrl:n.baseUrl,apiKey:n.apiKey,...o.fetch?{fetch:o.fetch}:{}}).download(l.uri,{...e.output?{output:e.output}:{},...e.filename?{filename:e.filename}:{},...e.watermark!==void 0?{watermark:e.watermark}:{}});return h("workspace_assets","asset.downloaded",{workspace_id:a,asset_id:l.assetId,bytes:m.bytes}),{workspace_id:a,asset_id:l.assetId,uri:l.uri,path:m.path,bytes:m.bytes,mime_type:m.mimeType}}function ur(e,t,o){let r=e instanceof d?e:new d(c.SERVER_ERROR,e instanceof Error?e.message:String(e));t?_(A(o,r.code,r.message,r.details)):C(r.message),process.exitCode=1}function pr(e={}){let t=new xs("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(o,r,n)=>{let i=D(n);try{let s=await Ns({workspaceId:o},U(n),e);if(me(s.workspace_id),S({asset_count:s.count}),i)_(I("workspace_assets_list",s));else{J(`Workspace assets (${s.count})`);for(let a of s.assets)f(` ${a.assetId} ${a.type} ${a.status??"ready"} ${a.uri||"-"}`)}}catch(s){ur(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(o,r,n)=>{let i=D(n);try{let s=await Ps({asset:o,...r.output?{output:r.output}:{},...r.filename?{filename:r.filename}:{},...r.wm!==void 0?{watermark:r.wm}:{}},U(n),e);me(s.workspace_id),S({resource_type:new URL(s.uri).hostname,size_bytes:s.bytes}),i?_(I("workspace_asset_download",s)):N(`Downloaded workspace asset ${s.asset_id}: ${s.path}`)}catch(s){ur(s,i,"workspace_asset_download")}}),t}function Ls(e){let t=e;for(;t.parent;)t=t.parent;return t.opts().workspace}var fr=["en","zh","zh-Hant","ja"];async function $s(e,t,o={}){let r=e.name?.trim();if(e.name!==void 0&&!r)throw new d(c.INVALID_ARGUMENT,"--name must not be empty");if(e.language!==void 0&&!fr.includes(e.language))throw new d(c.INVALID_ARGUMENT,`--language must be one of: ${fr.join(", ")}`);let n=o.configStore??new x,i=P(t,n),s=e.language;h("workspace","workspace.create_requested",{has_name:r!==void 0,language:s??null,set_current:e.setCurrent===!0});let a=await new Pe({baseUrl:i.baseUrl,apiKey:i.apiKey,...o.fetch?{fetch:o.fetch}:{}}).createWorkspace({...r!==void 0?{name:r}:{},...s!==void 0?{language:s}:{}});return e.setCurrent===!0&&(n.update({defaultWorkspaceId:a.workspaceId}),h("workspace","workspace.current_updated",{workspace_id:a.workspaceId})),h("workspace","workspace.created",{workspace_id:a.workspaceId}),{workspace_id:a.workspaceId,name:a.name,...s!==void 0?{language:s}:{},set_current:e.setCurrent===!0}}async function Vs(e,t,o={}){let r=e.name.trim();if(!r)throw new d(c.INVALID_ARGUMENT,"--name must not be empty");if(r.length>100)throw new d(c.INVALID_ARGUMENT,"--name must not exceed 100 characters");let n=o.configStore??new x,i=P(t,n),s=nt(t,n,e.workspaceId),a=await new Pe({baseUrl:i.baseUrl,apiKey:i.apiKey,...o.fetch?{fetch:o.fetch}:{}}).renameWorkspace(s,r);return h("workspace","workspace.renamed",{workspace_id:a.workspaceId}),{workspace_id:a.workspaceId,name:a.name}}function gr(e,t,o){let r=e instanceof d?e:new d(c.SERVER_ERROR,e instanceof Error?e.message:String(e));t?_(A(o,r.code,r.message,r.details)):C(r.message),process.exitCode=1}function _r(e={}){let t=new Ms("workspace").description("Workspace management");return t.command("create").description("Create a new workspace").option("--name <name>","Workspace name").option("--language <language>","Workspace language: en, zh, zh-Hant, or ja").option("--set-current","Set the created workspace as the active workspace").action(async(o,r)=>{let n=D(r);try{let i=await $s(o,U(r),e);me(i.workspace_id),S({set_current:i.set_current,...i.language?{language:i.language}:{}}),n?_(I("workspace_created",i,[...i.set_current?[]:[{command:`oiioii workspace set ${i.workspace_id}`,description:"Set the new workspace as active"}],{command:`oiioii --workspace ${i.workspace_id} upload file <path> --json`,description:"Upload a resource"}])):(N(`Workspace created: ${i.workspace_id}`),f(` Name: ${i.name}`),i.language&&f(` Language: ${i.language}`),f(` Current: ${i.set_current?"yes":"no"}`))}catch(i){gr(i,n,"workspace_created")}}),t.command("set").description("Set active workspace").argument("<workspace_id>","Workspace ID").action((o,r,n)=>{let i=D(n);if(!o||o.trim()===""){i?_(A("workspace_set",c.INVALID_ARGUMENT,"Workspace ID is required.")):C("Workspace ID is required."),process.exitCode=1;return}(e.configStore??new x).update({defaultWorkspaceId:o.trim()}),me(o.trim()),i?_(I("workspace_set",{workspace_id:o.trim()},[{command:"oiioii workspace current --json"},{command:"oiioii image text --prompt '...' --json"}])):N(`Workspace set to: ${o.trim()}`)}),t.command("current").description("Show current workspace").action((o,r)=>{let n=D(r),s=(e.configStore??new x).loadResolved(),a=Ls(r),l=process.env.OIIOII_WORKSPACE_ID,m=a??l??s.defaultWorkspaceId,p=a?"flag":l?"env":s.defaultWorkspaceId?"config":"none";if(!m){n?_(A("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."),f(" Use: oiioii workspace set <workspace_id>"),f(" Or set: OIIOII_WORKSPACE_ID=<id>")),process.exitCode=1;return}me(m),S({has_workspace:!0}),n?_(I("workspace_current",{workspace_id:m,source:p})):(f(`Workspace: ${m}`),f(` 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(o,r,n)=>{let i=D(n);try{let s=await Vs({workspaceId:o,name:r.name},U(n),e);me(s.workspace_id),i?_(I("workspace_renamed",s)):N(`Workspace renamed to: ${s.name}`)}catch(s){gr(s,i,"workspace_renamed")}}),t.addCommand(pr(e)),t}import{Command as ha,Option as Gr}from"commander";var Ce=3e4;function ee(e){return new d(c.SERVER_ERROR,e,{category:"response_protocol",retryable:!0,response_protocol:!0})}function hr(e,t){if(e.isError)throw yt(e,t);let o=(e.content??[]).filter(r=>r?.type==="text"&&typeof r.text=="string").map(r=>r.text).join(`
|
|
14
|
-
`).trim();if(!o)throw ee(`${t}: empty response`);try{return JSON.parse(o)}catch{throw ee(`${t}: invalid JSON response`)}}function it(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function yr(e){if(e==="pending"||e==="processing"||e==="succeeded"||e==="failed"||e==="cancelled")return e;throw ee(`Invalid backend async task status: ${String(e)}`)}function wr(e){if(e==="image"||e==="video"||e==="audio")return e;throw ee(`Invalid backend async media type: ${String(e)}`)}var Y=class{constructor(t){this.mcp=t}mcp;async submit(t){h("async_generation","submission.started",{workspace_id:t.workspaceId,media_type:t.mediaType,tool:t.mcpMethodName,idempotency_key:t.idempotencyKey});let o=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:t.input,idempotencyKey:t.idempotencyKey}),r=hr(o,"Async generation submission failed");if(!it(r)||typeof r.taskId!="string"||r.taskId.length===0||typeof r.assetId!="string"||r.assetId.length===0||typeof r.workspaceId!="string"||r.workspaceId.length===0||typeof r.reused!="boolean")throw ee("Invalid async generation submission response");let n={assetId:r.assetId,...typeof r.createdAt=="string"?{createdAt:r.createdAt}:{},mediaType:wr(r.mediaType),reused:r.reused===!0,status:yr(r.status),taskId:r.taskId,workspaceId:r.workspaceId};if(n.workspaceId!==t.workspaceId||n.mediaType!==t.mediaType)throw ee("Async generation submission response does not match the request");return h("async_generation","submission.accepted",{task_id:n.taskId,asset_id:n.assetId,status:n.status,reused:n.reused}),n}async query(t,o){h("async_generation","query.started",{task_id:o,workspace_id:t});let r=await this.mcp.callTool("query_async_media_generation",{workspace_id:t,taskId:o}),n=hr(r,"Async generation query failed"),i=it(n)&&it(n.task)?n.task:void 0;if(!i||typeof i.taskId!="string"||typeof i.workspaceId!="string"||!Array.isArray(i.outputUris))throw ee("Invalid async generation query response");if(!i.outputUris.every(l=>typeof l=="string"))throw ee("Invalid async generation output URI list");if(typeof i.progress!="number"||!Number.isFinite(i.progress))throw ee("Invalid async generation progress");if(i.error!==null&&i.error!==void 0&&(!it(i.error)||typeof i.error.code!="string"||typeof i.error.message!="string"))throw ee("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:it(i.error)&&typeof i.error.code=="string"&&typeof i.error.message=="string"?{code:i.error.code,message:i.error.message}:null,mediaType:wr(i.mediaType),outputUris:s,progress:Math.max(0,Math.min(100,i.progress)),status:yr(i.status),taskId:i.taskId,...typeof i.updatedAt=="string"?{updatedAt:i.updatedAt}:{},workspaceId:i.workspaceId};if(a.taskId!==o||a.workspaceId!==t)throw ee("Async generation query response does not match the requested task");return h("async_generation","query.completed",{task_id:o,status:a.status,progress:a.progress,output_count:a.outputUris.length,has_error:a.error!==null}),a}};var pe=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(){let t=$({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 r=>{if(o=await t.fetch(this._fetch,`${this.baseUrl}/points/mcp_model_pricings`,{method:"POST",headers:K({"content-type":"application/json",accept:"application/json",connection:"close","x-hogi-api-key":this.apiKey}),body:"{}",signal:r}),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 n;try{n=await o.json()}catch{throw new d(c.SERVER_ERROR,"Invalid JSON response from model catalog")}let i=n.data?.pricings;if(n.code!=="SUCCESS"||!Array.isArray(i)||i.some(s=>!Fs(s)))throw new d(c.SERVER_ERROR,n.error??"Invalid model catalog response from server");return t.success(o.status,{model_count:i.length}),i}})}catch(r){if(r instanceof F){let s=new d(c.NETWORK_ERROR,r.message,{retryable:!0,timeout_ms:r.timeoutMs});throw t.failure(s,o?.status),s}if(r instanceof d)throw t.failure(r,o?.status),r;let n=r instanceof Error?r.message:String(r),i=new d(c.NETWORK_ERROR,`Network error: ${n}`);throw t.failure(i),i}}};function Fs(e){if(!e||typeof e!="object")return!1;let t=e,o=i=>Array.isArray(i)&&i.every(s=>typeof s=="string"),r=t.input_capabilities===void 0||o(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.model===null||typeof t.model=="string")&&typeof t.points_cost=="number"&&o(t.sizes)&&o(t.aspect_ratios)&&(t.durations===void 0||o(t.durations))&&r&&n(t.reference_image_count_min)&&n(t.reference_image_count_max)&&o(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"}var Gs={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"},Bs={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"},Ws={"seed-audio":"generate_music_seed_audio","seed-audio-1.0":"generate_music_seed_audio",suno:"generate_music_suno"};function kr(e){return e==="image"?Gs:e==="video"?Bs:Ws}function qs(e){return e==="audio"?"generate_music_":`generate_${e}_`}function Ir(e,t){let o=kr(t),r=o[e];if(!r){h("model_map","model.resolve_failed",{domain:t,model:e},"warn");let n=Object.keys(o).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 h("model_map","model.resolved",{domain:t,model:e,tool:r}),r}function js(e){let t=kr(e);return Object.entries(t).map(([o,r])=>({name:o,tool:r}))}function st(e,t){let o=qs(t);return!e.startsWith(o)||e.length===o.length?void 0:js(t).find(n=>n.tool===e)?.name??e.slice(o.length)}function Rr(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"")}function br(e,t){let o=io(e);if(!o)return!1;let r=Rr(t),n=st(e.mcp_method_name,o);return[e.name,n,n&&e.model?`${n}${e.model}`:void 0].filter(s=>typeof s=="string").some(s=>Rr(s)===r)}function io(e){if(e.mcp_method_name.startsWith("generate_image_"))return"image";if(e.mcp_method_name.startsWith("generate_video_"))return"video";if(e.mcp_method_name.startsWith("generate_music_"))return"audio"}function Er(e){return[...e].sort((t,o)=>t.sort_order-o.sort_order||t.id-o.id)[0]}function It(e,t){let o=io(e);if(!o||t&&o!==t)throw new d(c.MODEL_NOT_SUPPORTED,`Model ID ${e.id} belongs to ${o??"an unsupported"} domain${t?`, not ${t}`:""}.`,{category:"validation",retryable:!1,model_id:e.id,...t?{expected_domain:t}:{}});let r=st(e.mcp_method_name,o);if(!r)throw new d(c.MODEL_NOT_SUPPORTED,`Model ID ${e.id} is not supported by ${o} generation.`,{category:"validation",retryable:!1,model_id:e.id});return{key:r,toolName:e.mcp_method_name,modelId:e.id,name:e.name??e.model??r,...e.model?{variant:e.model}:{},catalog:e,catalogStatus:"exact"}}function so(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=Ks(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 o=e.filter(i=>br(i,t.model)),r=t.variant?o.filter(i=>i.model===t.variant):o,n=Er(r);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 Ks(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.variant){let n={key:e.model,toolName:Ir(e.model,e.domain)};if(!e.requireActiveCatalog)return n;let s=(await new pe({baseUrl:e.baseUrl,apiKey:e.apiKey,...e.fetch?{fetch:e.fetch}:{}}).listModels()).filter(l=>io(l)===e.domain&&(l.mcp_method_name===n.toolName||br(l,e.model)));if(s.length===0)throw new d(c.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(l=>l.mcp_method_name===n.toolName&&l.model===null)??Er(s);return a?{...It(a,e.domain),key:e.model}:{...n,catalogStatus:"ambiguous"}}let t=await new pe({baseUrl:e.baseUrl,apiKey:e.apiKey,...e.fetch?{fetch:e.fetch}:{}}).listModels(),o=so(t,e.modelId?{modelId:e.modelId}:{model:e.model,variant:e.variant}),r=It(o,e.domain);return e.modelId?r:{...r,key:e.model}}function Tr(e){return[...new Set(e.catalog?.input_capabilities??[])]}function at(e,t){let o=e.catalog?.durations?.[0]?.trim(),r=t.duration;if(o&&/^\d+(?:\.\d+)?$/.test(o))r=Number(o);else if(o){let n=/^(\d+(?:\.\d+)?)\s*-\s*(\d+(?:\.\d+)?)$/.exec(o);n&&(r=Number(n[1]))}return{aspectRatio:e.catalog?.aspect_ratios[0]??t.aspectRatio,resolution:e.catalog?.sizes[0]??t.resolution,...r!==void 0?{duration:r}:{}}}function vr(e){let t=e.trim().toLowerCase();return t==="adaptive"?"auto":t}function Ve(e,t){let o=e.catalog;if(o){if(t.aspectRatio&&o.aspect_ratios.length>0){let r=vr(t.aspectRatio);if(!o.aspect_ratios.map(vr).includes(r))throw new d(c.MODEL_CONSTRAINT_VIOLATION,`${e.name??e.key} does not support aspect ratio ${t.aspectRatio}. Supported: ${o.aspect_ratios.join(", ")}.`,{category:"validation",retryable:!1,field:"aspect_ratio",received:t.aspectRatio,supported:o.aspect_ratios})}if(t.resolution&&o.sizes.length>0){let r=t.resolution.trim().toLowerCase();if(!o.sizes.some(n=>n.trim().toLowerCase()===r))throw new d(c.MODEL_CONSTRAINT_VIOLATION,`${e.name??e.key} does not support resolution ${t.resolution}. Supported: ${o.sizes.join(", ")}.`,{category:"validation",retryable:!1,field:"resolution",received:t.resolution,supported:o.sizes})}if(t.duration!==void 0&&o.durations&&o.durations.length>0&&!o.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(o.durations)].join(", ")}.`,{category:"validation",retryable:!1,field:"duration",received:t.duration,supported:[...new Set(o.durations)]})}}function oe(e){return{key:e.key,...e.modelId!==void 0?{model_id:e.modelId}:{},...e.name?{name:e.name}:{},...e.variant?{variant:e.variant}:{}}}function Se(e){return e.modelId!==void 0?`--model-id ${e.modelId}`:e.variant?`--model ${e.key} --variant ${e.variant}`:`--model ${e.key}`}import{readFileSync as zs,writeFileSync as Hs,appendFileSync as Js,mkdirSync as Qs,existsSync as Ar,chmodSync as ao}from"fs";import{join as Ys,dirname as Xs}from"path";import{randomBytes as Zs}from"crypto";function ea(){return"task_"+Zs(8).toString("hex")}var G=class{configDir;tasksPath;constructor(t){this.configDir=t?.configDir??de(),this.tasksPath=Ys(this.configDir,"tasks.jsonl")}getConfigDir(){return this.configDir}create(t){let o=new Date().toISOString(),r={id:ea(),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.mediaType?{mediaType:t.mediaType}:{},status:"created",resourceUris:[],createdAt:o,updatedAt:o};return this._ensureDir(),Re(`${this.tasksPath}.lock`,()=>{Js(this.tasksPath,JSON.stringify(r)+`
|
|
15
|
-
`,{encoding:"utf-8",mode:384}),
|
|
7
|
+
`:"");return Ko(Ai(o),{recursive:!0}),Ti(o,i,{encoding:"utf-8",mode:384,flag:t.force?"w":"wx"}),Gt(o,384),{path:o,format:r,count:n.length,bytes:Bt(o).size}}ensureDir(){Re(this.logsDir)||Ko(this.logsDir,{recursive:!0,mode:448}),Gt(this.logsDir,448)}rotatedPath(t){return`${this.logsPath}.${t}`}logPathsOldestFirst(){let t=[];for(let o=this.maxFiles-1;o>=1;o--)t.push(this.rotatedPath(o));return t.push(this.logsPath),t}rotate(){let t=this.rotatedPath(this.maxFiles-1);this.maxFiles>1&&Re(t)&&Ho(t);for(let o=this.maxFiles-2;o>=1;o--){let r=this.rotatedPath(o);Re(r)&&zo(r,this.rotatedPath(o+1))}this.maxFiles>1&&Re(this.logsPath)?zo(this.logsPath,this.rotatedPath(1)):Re(this.logsPath)&&Ho(this.logsPath)}};var Oi=/(?:authorization|api[_-]?key|token|password|secret|credential|cookie)/i,xi=/([?&](?:api[_-]?key|token|password|secret)=)[^&\s]*/gi,Ni=/\boii_sk_[A-Za-z0-9._-]+\b/g,Di=/\bBearer\s+[^\s,;]+/gi;function De(e){return e.replace(xi,"$1[REDACTED]").replace(Ni,"[REDACTED]").replace(Di,"Bearer [REDACTED]")}function Wt(e,t,o){if(o>10)return"[MAX_DEPTH]";if(typeof e=="string")return De(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=>Wt(n,t,o+1));let r={};for(let[n,i]of Object.entries(e))r[n]=Oi.test(n)?"[REDACTED]":Wt(i,t,o+1);return r}function ft(e){return Wt(e,new WeakSet,0)}import{AsyncLocalStorage as Ui}from"async_hooks";var qt=new Ui;function Yo(e){qt.enterWith(e)}function M(){return qt.getStore()}function Qo(){qt.enterWith(void 0)}import{createHash as Pi}from"crypto";function L(e){if(typeof e!="string")return;let t=e.trim();return t&&t.length<=256&&!/[\x00-\x1f\x7f]/.test(t)&&De(t)===t?t:void 0}function gt(e,t){try{return Pi("sha256").update(`${new URL(e).origin}
|
|
8
|
+
${t}`).digest("hex")}catch{return}}function Ee(e){if(!e||typeof e!="object")return;let t=e;return L(t.workspaceId)??L(t.workspace_id)}function Xo(e,t){try{let o=new URL(e instanceof Request?e.url:String(e)),r;try{typeof t?.body=="string"&&t.body.length<=1048576&&(r=JSON.parse(t.body))}catch{}let n=r?.params;return Ee(r)??Ee(r?.data)??Ee(n?.arguments)??L(o.searchParams.get("workspaceId"))??L(o.searchParams.get("workspace_id"))??L(decodeURIComponent(/^\/v1\/debug\/workspaces\/([^/]+)$/.exec(o.pathname)?.[1]??""))}catch{return}}function jt(e,t){try{return t&&e.url&&new URL(t).origin!==new URL(e.url).origin?{}:{logid:L(e.headers.get("x-logid")),requestId:L(e.headers.get("x-request-id")),uid:L(e.headers.get("x-hogi-log-uid")),workspaceId:L(e.headers.get("x-hogi-log-workspace-id"))}}catch{return{}}}function Zo(e,t){let o=M();o&&t&&t!=="anonymous_user"&&e&&o.identityKey===e&&(o.uid=t)}function Li(){return"log_"+Mi(8).toString("hex")}var Kt=class{constructor(t=new be){this.store=t}store;record(t){try{let o={schema_version:1,id:Li(),timestamp:new Date().toISOString(),level:t.level,category:t.category??"application",source:t.source,event:t.event,...t.trace_id??M()?.traceId?{trace_id:t.trace_id??M().traceId}:{},...t.feature??M()?.feature?{feature:t.feature??M().feature}:{},...t.message?{message:De(t.message)}:{},...t.request_id?{request_id:t.request_id}:{},...t.clientRequestId?{clientRequestId:t.clientRequestId}:{},...Object.fromEntries(Object.entries({logid:L(t.logid),requestId:L(t.requestId),uid:L("uid"in t?t.uid:M()?.uid),workspaceId:L(t.workspaceId)??Ee(t.metadata)??M()?.workspaceId}).filter(([,r])=>r!==void 0)),...t.operation?{operation:t.operation}:{},...t.http?{http:ft(t.http)}:{},...t.error?{error:ft(t.error)}:{},...t.metadata?{metadata:ft(t.metadata)}:{}};return this.store.append(o),o}catch{return}}},zt=class{record(){}};function le(){return process.env.OIIOII_LOG_DISABLED==="1"?new zt:new Kt}function Vi(){return"trace_"+$i(8).toString("hex")}function Ht(e){let t=Vi();return Yo({traceId:t,feature:e,startedAt:Date.now()}),le().record({level:"info",category:"application",source:"cli",event:"feature.started",trace_id:t,operation:e,metadata:{feature:e}}),t}function h(e,t,o,r="info"){let n=M();n&&le().record({level:r,category:"application",source:e,event:"feature.step",trace_id:n.traceId,operation:n.feature,message:t,metadata:{step:t,...o}})}function Te(e,t){let o=M();o&&(o.failure={...e?{code:e}:{},message:t},le().record({level:"error",category:"application",source:"cli",event:"feature.diagnostic",trace_id:o.traceId,operation:o.feature,error:{...e?{code:e}:{},message:t}}))}function Jt(e=0){let t=M();if(!t)return;let o=t.failure!==void 0||e!==0;le().record({level:o?"error":"info",category:"application",source:"cli",event:o?"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}}),Qo()}function or(){return{baseUrl:Ze()}}var N=class{configPath;dirPath;constructor(t){this.dirPath=t??de(),this.configPath=Wi(this.dirPath,"config.json")}getConfigPath(){return this.configPath}load(){if(!Yt(this.configPath))return h("config_store","config.defaulted",{reason:"missing"}),or();try{let t=er(this.configPath,"utf-8"),o=JSON.parse(t),r={baseUrl:typeof o.baseUrl=="string"?o.baseUrl:Ze(),...typeof o.apiKey=="string"&&o.apiKey.trim()?{apiKey:o.apiKey.trim()}:{},...typeof o.defaultWorkspaceId=="string"?{defaultWorkspaceId:o.defaultWorkspaceId}:{}};return h("config_store","config.loaded"),r}catch{return h("config_store","config.defaulted",{reason:"invalid"},"warn"),or()}}loadResolved(){let t=this.load();return h("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"}),{...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}}save(t){this._ensureDir(),ce(`${this.configPath}.lock`,()=>this._write(t)),h("config_store","config.saved")}_write(t){Fi(this.configPath,JSON.stringify(t,null,2)+`
|
|
9
|
+
`,{encoding:"utf-8",mode:384}),tr(this.configPath,384)}update(t,o={}){this._ensureDir(),ce(`${this.configPath}.lock`,()=>{let n={...this.load(),...t};o.resetBaseUrl&&delete n.baseUrl,this._write(n)}),h("config_store","config.updated",{fields:Object.keys(t),reset_base_url:o.resetBaseUrl===!0})}removeApiKey(){if(!Yt(this.configPath))return!1;this._ensureDir();let t=ce(`${this.configPath}.lock`,()=>{let o;try{o=JSON.parse(er(this.configPath,"utf-8"))}catch{return Bi(this.configPath,{force:!0}),!0}if(typeof o!="object"||o===null||Array.isArray(o))return!1;let r=o;return Object.prototype.hasOwnProperty.call(r,"apiKey")?(delete r.apiKey,this._write(r),!0):!1});return h("config_store","config.api_key_removed",{removed:t}),t}_ensureDir(){Yt(this.dirPath)||Gi(this.dirPath,{recursive:!0,mode:448}),tr(this.dirPath,448)}};var l={AUTH_REQUIRED:"AUTH_REQUIRED",AUTH_INVALID:"AUTH_INVALID",AUTH_CAPTCHA_REQUIRED:"AUTH_CAPTCHA_REQUIRED",AUTH_EMAIL_NOT_CONFIRMED:"AUTH_EMAIL_NOT_CONFIRMED",AUTH_TIMEOUT:"AUTH_TIMEOUT",API_KEY_INVALID:"API_KEY_INVALID",MEMBERSHIP_REQUIRED:"MEMBERSHIP_REQUIRED",WORKSPACE_REQUIRED:"WORKSPACE_REQUIRED",WORKSPACE_NOT_FOUND:"WORKSPACE_NOT_FOUND",WORKSPACE_FORBIDDEN:"WORKSPACE_FORBIDDEN",CONVERSATION_NOT_FOUND:"CONVERSATION_NOT_FOUND",SNAPSHOT_NOT_FOUND:"SNAPSHOT_NOT_FOUND",INVALID_ARGUMENT:"INVALID_ARGUMENT",MODEL_NOT_SUPPORTED:"MODEL_NOT_SUPPORTED",MODEL_CONSTRAINT_VIOLATION:"MODEL_CONSTRAINT_VIOLATION",GENERATION_FAILED:"GENERATION_FAILED",GENERATION_TIMEOUT:"GENERATION_TIMEOUT",AGENT_EXECUTION_FAILED:"AGENT_EXECUTION_FAILED",PROVIDER_UNAVAILABLE:"PROVIDER_UNAVAILABLE",RECORD_NOT_FOUND:"RECORD_NOT_FOUND",TASK_NOT_FOUND:"TASK_NOT_FOUND",TASK_RETRY_REQUIRED:"TASK_RETRY_REQUIRED",TASK_TIMEOUT:"TASK_TIMEOUT",QUOTA_EXCEEDED:"QUOTA_EXCEEDED",PAYLOAD_TOO_LARGE:"PAYLOAD_TOO_LARGE",CONTENT_SAFETY_BLOCKED:"CONTENT_SAFETY_BLOCKED",IP_CHARACTER_RESTRICTED:"IP_CHARACTER_RESTRICTED",SERVER_ERROR:"SERVER_ERROR",NETWORK_ERROR:"NETWORK_ERROR",CLI_UPGRADE_REQUIRED:"CLI_UPGRADE_REQUIRED",CLI_INSTALLATION_UNMANAGED:"CLI_INSTALLATION_UNMANAGED",CLI_UPDATE_FAILED:"CLI_UPDATE_FAILED",NOT_IMPLEMENTED:"NOT_IMPLEMENTED",CONFIG_ERROR:"CONFIG_ERROR"},c=class extends Error{constructor(o,r,n){super(r);this.code=o;this.details=n;this.name="CliError"}code;details};function tt(e,t){let o=`${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(o)}function ot(e,t,o={}){let r=`${e??""} ${t??""}`.toUpperCase(),n=/IP[_\s-]*INFRINGEMENT|IP[_\s-]*CHARACTER|COPYRIGHT|RESTRICTED[_\s-]*IP/.test(r),i=n?"Request blocked because it may contain a restricted IP or character. Revise the character, references, or prompt and retry.":"Request blocked by the content safety policy. Revise the prompt or references and retry.";return new c(n?l.IP_CHARACTER_RESTRICTED:l.CONTENT_SAFETY_BLOCKED,i,{...o,...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."})}import{randomBytes as qi}from"crypto";function ji(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 Qt=class{constructor(t,o){this.logger=t;this.context=o;this.correlation={uid:void 0,workspaceId:Ee(o.metadata)??this.trace?.workspaceId}}logger;context;requestId="req_"+qi(8).toString("hex");startedAt=Date.now();completed=!1;started=!1;correlation;trace=M();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,o,r){this.correlation.logid=void 0,this.correlation.requestId=void 0;let n=r,i;try{let d=new Headers(r?.headers??(o instanceof Request?o.headers:void 0)),m=o instanceof Request?o.url:String(o),p=d.get("x-hogi-api-key")??d.get("authorization")?.replace(/^Bearer\s+/i,"");i=p?gt(m,p):void 0,this.correlation.uid=i&&i===this.trace?.identityKey?this.trace.uid:void 0;let u=Xo(o,r)??Ee(this.context.metadata)??L(d.get("x-workspace-id"))??this.trace?.workspaceId;this.correlation.workspaceId=u,u&&d.set("x-workspace-id",u),n={...r,headers:Object.fromEntries(d.entries())}}catch{}this.start();let s=await t(o,n),a=jt(s,o instanceof Request?o.url:String(o));return this.correlation={...a,uid:a.uid??this.correlation.uid,workspaceId:a.workspaceId??this.correlation.workspaceId},Zo(i,a.uid),s}async fetchResource(t,o,r){let n=await this.fetch(t,o,{...r,redirect:"manual"}),i=new URL(o),s=new Headers(r.headers);for(let a=0;[301,302,303,307,308].includes(n.status);a++){let d=n.headers.get("location");if(!d)break;if(a>=20)throw new TypeError("Too many resource redirects");this.record({level:"info",category:"api",source:this.context.source,event:"api.redirect",operation:this.context.operation,http:{method:"GET",path:this.context.path,status:n.status}});let m=new URL(d,i);m.origin!==i.origin&&(s=new Headers(Object.fromEntries([...s.entries()].filter(([u])=>["accept","range"].includes(u)))));try{await n.body?.cancel()}catch{}n=await t(m.href,{...r,headers:Object.fromEntries(s.entries()),redirect:"manual"});let p=jt(n,o);p.logid&&(this.correlation={...this.correlation,...p}),i=m}return n}success(t,o){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,...o}}))}failure(t,o){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,...o!==void 0?{status:o}:{},duration_ms:Date.now()-this.startedAt},error:ji(t)}))}};function $(e,t=le()){return new Qt(t,e)}var F="0.1.6",rt="@oiioii/cli";var Ki={clientType:"x-hogi-client-type",clientVersion:"x-hogi-client-version",clientOS:"x-hogi-client-os"};function zi(e){return e==="win32"?"windows":e==="darwin"?"mac":e}function Hi(){return{clientType:"cli",clientVersion:F,clientOS:zi(process.platform)}}function K(e){let t=Hi();return{...e,...Object.fromEntries(Object.entries(Ki).map(([o,r])=>[r,t[o]]))}}var G=class extends Error{constructor(o,r){super(`${o} timed out after ${r}ms`);this.operation=o;this.timeoutMs=r;this.name="HttpRequestTimeoutError"}operation;timeoutMs};async function Y(e){let t=e.timeoutMs??3e4,o=new AbortController,r,n=new Promise((i,s)=>{r=setTimeout(()=>{o.abort(),s(new G(e.operation,t))},t)});r?.unref();try{return await Promise.race([e.run(o.signal),n])}catch(i){throw i instanceof G?i:o.signal.aborted?new G(e.operation,t):i}finally{r&&clearTimeout(r)}}function Ue(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function Ji(e){let t=Ue(e);if(t)return t;if(typeof e!="string")return;let o=e.trim();try{return Ue(JSON.parse(o))}catch{}let r=o.lastIndexOf("{");for(;r>=0;){try{let n=Ue(JSON.parse(o.slice(r)));if(n)return n}catch{}r=o.lastIndexOf("{",r-1)}}async function Xt(e){let t=await e.text().catch(()=>"");if(!t.trim())return{};try{let o=JSON.parse(t);return Ue(o)??{}}catch{throw new c(l.SERVER_ERROR,"Invalid JSON response from workspace API",{status:e.status})}}function je(e,t){let o=t.error?.code,r=t.error?.message??`Workspace request failed: HTTP ${e}`,n={status:e,...o?{code:o}:{}};return e===401?new c(l.API_KEY_INVALID,r,n):e===403?new c(l.WORKSPACE_FORBIDDEN,r,n):e===404?new c(l.WORKSPACE_NOT_FOUND,r,n):e===400||e===422?new c(l.INVALID_ARGUMENT,r,n):e===429?new c(l.QUOTA_EXCEEDED,r,n):new c(l.SERVER_ERROR,r,n)}function Yi(e){if(e.ok===!1)throw je(400,e);let t=Ji(e.data),o=t?.workspaceId,r=t?.name;if(typeof o!="string"||!o.trim())throw new c(l.SERVER_ERROR,"Invalid workspace API response: missing workspaceId");if(typeof r!="string"||!r.trim())throw new c(l.SERVER_ERROR,"Invalid workspace API response: missing name");return{workspaceId:o,name:r}}function Qi(e){if(e.ok===!1)throw je(400,e);let t=Ue(e.data),o=t?.workspace_id,r=t?.name;if(typeof o!="string"||!o.trim())throw new c(l.SERVER_ERROR,"Invalid workspace rename response: missing workspace_id");if(typeof r!="string"||!r.trim())throw new c(l.SERVER_ERROR,"Invalid workspace rename response: missing name");return{workspaceId:o,name:r}}function Xi(e){if(e.ok===!1)throw je(400,e);let t=Ue(e.data);if(!Array.isArray(t?.asset))throw new c(l.SERVER_ERROR,"Invalid workspace detail response: missing asset list");return t.asset.map((o,r)=>{let n=Ue(o);if(!n||typeof n.assetId!="string"||typeof n.type!="string"||typeof n.uri!="string")throw new c(l.SERVER_ERROR,`Invalid workspace asset at index ${r}`);return n})}var Pe=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 o=$({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),r;try{return await Y({operation:"Workspace creation request",timeoutMs:this.timeoutMs,run:async n=>{r=await o.fetch(this._fetch,`${this.baseUrl}/v1/workspace/create`,{method:"POST",headers:K({authorization:`Bearer ${this.apiKey}`,"content-type":"application/json",accept:"application/json"}),body:JSON.stringify({...t.name!==void 0?{name:t.name}:{},...t.language!==void 0?{language:t.language}:{}}),signal:n});let i=await Xt(r);if(!r.ok)throw je(r.status,i);let s=Yi(i);return o.success(r.status,{workspace_id:s.workspaceId}),s}})}catch(n){if(n instanceof G){let s=new c(l.NETWORK_ERROR,n.message,{retryable:!0,timeout_ms:n.timeoutMs});throw o.failure(s,r?.status),s}if(n instanceof c)throw o.failure(n,r?.status),n;let i=new c(l.NETWORK_ERROR,`Network error: ${n instanceof Error?n.message:String(n)}`);throw o.failure(i),i}}async renameWorkspace(t,o){let r="/v1/workspace/rename",n=$({source:"hogi_workspace_client",operation:"workspace.rename",method:"POST",path:r,metadata:{workspace_id:t}},this.logger),i;try{return await Y({operation:"Workspace rename request",timeoutMs:this.timeoutMs,run:async s=>{i=await n.fetch(this._fetch,`${this.baseUrl}${r}`,{method:"POST",headers:{authorization:`Bearer ${this.apiKey}`,"content-type":"application/json",accept:"application/json"},body:JSON.stringify({workspace_id:t,name:o}),signal:s});let a=await Xt(i);if(!i.ok)throw je(i.status,a);let d=Qi(a);return n.success(i.status,{workspace_id:d.workspaceId}),d}})}catch(s){throw this.mapRequestError(s,"Workspace rename request",n,i)}}async listAssets(t){let o="/v1/workspace/detail",r=$({source:"hogi_workspace_client",operation:"workspace.assets.list",method:"GET",path:o,metadata:{workspace_id:t}},this.logger),n=new URLSearchParams({workspace_id:t,relateTypes:"asset"}),i;try{return await Y({operation:"Workspace asset list request",timeoutMs:this.timeoutMs,run:async s=>{i=await r.fetch(this._fetch,`${this.baseUrl}${o}?${n.toString()}`,{method:"GET",headers:{authorization:`Bearer ${this.apiKey}`,accept:"application/json"},signal:s});let a=await Xt(i);if(!i.ok)throw je(i.status,a);let d=Xi(a);return r.success(i.status,{workspace_id:t,asset_count:d.length}),d}})}catch(s){throw this.mapRequestError(s,"Workspace asset list request",r,i)}}mapRequestError(t,o,r,n){if(t instanceof G){let s=new c(l.NETWORK_ERROR,t.message,{retryable:!0,timeout_ms:t.timeoutMs});return r.failure(s,n?.status),s}if(t instanceof c)return r.failure(t,n?.status),t;let i=new c(l.NETWORK_ERROR,`${o} failed: ${t instanceof Error?t.message:String(t)}`);return r.failure(i),i}};function U(e){let t=e;for(;t.parent;)t=t.parent;return t.opts()}function D(e){return U(e).json===!0}function P(e,t){let o=t.loadResolved(),r=o.apiKey?.trim();if(!r)throw new c(l.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:o.baseUrl;return{apiKey:r,baseUrl:i}}function nt(e,t,o){let r=o?.trim();if(o!==void 0&&!r)throw new c(l.INVALID_ARGUMENT,"Workspace ID must not be empty");let n=typeof e.workspace=="string"?e.workspace.trim():"",i=r||n||t.loadResolved().defaultWorkspaceId?.trim();if(!i)throw new c(l.WORKSPACE_REQUIRED,"No workspace set. Pass a workspace ID, use --workspace <id>, set OIIOII_WORKSPACE_ID, or set an active workspace.");return i}var rr={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 O(e,t){return{domain:e,action:t,calledEvent:rr[e].called,resultEvent:rr[e].result}}var nr={"auth.login":O("auth","login"),"auth.status":O("auth","status"),"auth.logout":O("auth","logout"),"workspace.create":O("workspace","create"),"workspace.set":O("workspace","set"),"workspace.current":O("workspace","current"),"workspace.rename":O("workspace","rename"),"workspace.assets.list":O("workspace","assets_list"),"workspace.assets.download":O("workspace","asset_download"),"image.text":O("generation","image_text"),"image.edit":O("generation","image_edit"),"video.text":O("generation","video_text"),"video.image":O("generation","video_image"),"video.generate":O("generation","video_generate"),"audio.generate":O("generation","audio_generate"),"audio.seed-audio":O("generation","audio_seed_audio"),"audio.suno":O("generation","audio_suno"),"upload.file":O("upload","file"),"task.list":O("task","list"),"task.retry":O("task","retry"),"task.status":O("task","status"),"task.wait":O("task","wait"),"record.get":O("record","get"),"record.open":O("record","open"),"inspect.capabilities":O("inspect","capabilities"),"inspect.models":O("inspect","models"),"preview.latest":O("preview","latest"),"preview.bundle":O("preview","bundle"),"logs.list":O("logs","list"),"logs.export":O("logs","export"),"logs.path":O("logs","path"),"points.balance":O("points","balance"),"points.cost":O("points","cost"),"points.quote":O("points","quote"),update:O("cli","update"),install:O("cli","install"),versions:O("cli","versions")};function Zt(e){return nr[e]}import{randomBytes as ss}from"crypto";import{AsyncLocalStorage as Zi}from"async_hooks";var eo=new Zi;function ir(e){eo.enterWith(e)}function ue(){return eo.getStore()}function sr(){eo.enterWith(void 0)}var es=/(?:authorization|api[_-]?key|token|password|secret|credential|cookie|prompt|file[_-]?path|request[_-]?body|response[_-]?body)/i,ts=256;function to(e){let t={};for(let[o,r]of Object.entries(e))r===void 0||es.test(o)||(t[o]=typeof r=="string"?De(r).slice(0,ts):r);return t}import{DataRangersSDK as os}from"@datarangers/sdk-node";import{httpPlugin as rs}from"@datarangers/node-plugin-http";var ns=20011588,is="https://gator.volces.com",ar=1e3,_t=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??le(),!this.disabled)try{let o=t.sdk??new os({app_id:t.appId??ns,logLevel:"silent"}),r=t.httpController??rs({channel_domain:t.channelDomain??is,retry:0,timeout:{request:ar}});o.use(r),r.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=o,this.httpController=r}catch(o){this.recordFailure("telemetry.initialization.failed",o)}}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(o){this.pendingEvents=Math.max(0,this.pendingEvents-1),this.pendingEventNames.pop(),this.recordFailure("telemetry.delivery.failed",o,t.event)}}async flush(t=ar){if(!this.httpController||this.pendingEvents===0)return;let o=this.httpController;await new Promise(r=>{let n=!1,i=d=>{n||(n=!0,clearTimeout(a),o.removeListener("drain",s),d&&this.pendingEvents>0&&this.logger.record({level:"warn",category:"application",source:"telemetry",event:"telemetry.flush.timeout",metadata:{pending_count:this.pendingEvents}}),r())},s=()=>i(!1),a=setTimeout(()=>i(!0),Math.max(0,t));o.once("drain",s)})}recordFailure(t,o,r){let n=o&&typeof o=="object"&&"code"in o&&typeof o.code=="string"?o.code:void 0;this.logger.record({level:"warn",category:"application",source:"telemetry",event:t,...n?{error:{code:n,message:"Telemetry SDK failure"}}:{},...r?{metadata:{event_name:r}}:{}})}};function as(){let e=X(),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:F,os:process.platform,arch:process.arch,node_major:Number.isFinite(t)?t:0}}function ds(){return`op_${ss(8).toString("hex")}`}function cs(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 oo=class{transport;now;operationId;commonParams;constructor(t={}){this.transport=t.transport??new _t,this.now=t.now??Date.now,this.operationId=t.operationId??ds,this.commonParams=t.commonParams??as}startCommand(t){let o=t.command.trim();if(!o)return;let r=Zt(o),n={command:o,startedAt:this.now(),operationId:this.operationId(),calledSent:!1,businessParams:{},...r?{calledEvent:r.calledEvent,resultEvent:r.resultEvent,action:r.action}:{},...t.userId?.trim()?{userId:t.userId.trim()}:{},...t.workspaceId?.trim()?{workspaceId:t.workspaceId.trim()}:{},...t.traceId?.trim()?{traceId:t.traceId.trim()}:{}};ir(n),this.emitCalled()}identify(t){let o=ue(),r=t.trim();!o||!r||(o.userId=r,this.emitCalled())}addBusinessInfo(t){let o=ue();o&&Object.assign(o.businessParams,to(t))}markPartialSuccess(){let t=ue();t&&(t.resultOverride="partial_success")}setWorkspaceId(t){let o=ue(),r=t.trim();o&&r&&(o.workspaceId=r)}reportCommandFailure(t){let o=ue();o&&t&&(o.failureCode=t)}completeCommand(t=0){let o=ue();if(!o)return;this.emitCalled();let r=cs(o,t);o.userId&&o.resultEvent&&o.action&&this.emit(o.resultEvent,{...o.businessParams,operation_id:o.operationId,action:o.action,result:r,duration_ms:Math.max(0,this.now()-o.startedAt),...o.failureCode?{error_code:o.failureCode}:{}}),sr()}async flush(t){await this.transport.flush(t)}emitCalled(){let t=ue();!t?.userId||!t.calledEvent||!t.action||t.calledSent||(t.calledSent=!0,this.emit(t.calledEvent,{operation_id:t.operationId,action:t.action}))}emit(t,o){let r=ue();if(!r?.userId)return;let n={...this.commonParams(),command:r.command,...r.traceId?{trace_id:r.traceId}:{},...r.workspaceId?{workspace_id:r.workspaceId}:{}};this.transport.send({userId:r.userId,event:t,params:to({...o,...n})})}},dr;function me(){return dr??=new oo,dr}function S(e){me().addBusinessInfo(e)}function te(){me().markPartialSuccess()}function pe(e){let t=M(),o=L(e);t&&o&&(t.workspaceId=o),me().setWorkspaceId(e)}function Me(e){return e<10*1024*1024?"0_10mb":e<100*1024*1024?"10_100mb":e<500*1024*1024?"100_500mb":"500mb_plus"}function ht(e){return e.startsWith("hogi://audio/")?"audio":e.startsWith("hogi://image/")?"image":e.startsWith("hogi://video/")?"video":"other"}import{Agent as ls,fetch as us}from"undici";function yt(e,t){let o=typeof e.errorCode=="string"?e.errorCode:void 0,n=(e.content??[]).filter(d=>d?.type==="text"&&typeof d.text=="string").map(d=>d.text.trim()).filter(Boolean).join(`
|
|
10
|
+
`)||t,i=e.structuredContent&&typeof e.structuredContent=="object"?e.structuredContent:void 0,s=i?`${n} ${JSON.stringify(i)}`:n,a={...o?{backend_code:o}:{},...i?{structured_content:i}:{}};return o&&(o.includes("POINTS_INSUFFICIENT")||o.includes("POINTS_LIMIT_EXCEEDED"))?new c(l.QUOTA_EXCEEDED,n,{...a,category:"quota",retryable:!1}):tt(o,s)?ot(o,s,a):o?.includes("MEMBER_ONLY")?new c(l.MEMBERSHIP_REQUIRED,n,{...a,category:"auth",retryable:!1}):o?.includes("TASK_NOT_FOUND")?new c(l.TASK_NOT_FOUND,n,{...a,category:"task",retryable:!1}):o?.includes("TIMEOUT")?new c(l.GENERATION_TIMEOUT,n,{...a,category:"timeout",retryable:!0}):o&&(o.includes("INVALID_PARAMS")||o.includes("RESOLUTION_NOT_SUPPORTED"))?new c(l.MODEL_CONSTRAINT_VIOLATION,n,{...a,category:"validation",retryable:!1}):o&&(o.includes("MODEL_SERVICE_ERROR")||o.includes("CAPACITY_UNAVAILABLE"))?new c(l.PROVIDER_UNAVAILABLE,n,{...a,category:"provider",retryable:!0}):new c(l.GENERATION_FAILED,n,Object.keys(a).length?{...a,category:"provider",retryable:!1}:void 0)}function ms(e){let t=e.message??"MCP tool call failed";if(/\btool\b.*\bnot found\b/i.test(t))return new c(l.SERVER_ERROR,t,{...e,category:"server_capability",retryable:!1,hint:"Deploy a backend version that exposes the required MCP tool before retrying."});let o={...e,category:"validation",retryable:!1};return Number(e.code)===-32602?new c(l.MODEL_CONSTRAINT_VIOLATION,t,o):Number(e.code)===-32601?new c(l.MODEL_NOT_SUPPORTED,t,o):Number(e.code)===-32700||Number(e.code)===-32600?new c(l.SERVER_ERROR,t,{...e,category:"protocol",retryable:!1}):new c(l.SERVER_ERROR,t,{...e,category:"server",retryable:!0,request_outcome:"unknown"})}var ps=1;async function fs(e){let t=await e.text().catch(()=>""),o;try{let d=t?JSON.parse(t):void 0;d&&typeof d=="object"&&!Array.isArray(d)&&(o=d)}catch{}let r=o?.error&&typeof o.error=="object"?o.error:void 0,n=r?.data&&typeof r.data=="object"?r.data:void 0,i=[o?.code,o?.errorCode,r?.code,n?.code].find(d=>typeof d=="string"),s=[o?.message,r?.message,typeof o?.error=="string"?o.error:void 0].find(d=>typeof d=="string"&&d.trim().length>0)??(t.trim()?t.trim():void 0),a={status:e.status,...i?{backend_code:i}:{}};return tt(i,s)?ot(i,s,a):e.status===401?new c(l.API_KEY_INVALID,s??"Invalid API key",a):e.status===426||i==="CLI_UPGRADE_REQUIRED"?new c(l.CLI_UPGRADE_REQUIRED,s??"Upgrade oiioii CLI and retry.",{...a,category:"client_version",retryable:!1}):e.status===403&&i==="MEMBERSHIP_REQUIRED"?new c(l.MEMBERSHIP_REQUIRED,s??"An active membership is required.",{...a,category:"auth",retryable:!1}):e.status===429?new c(l.QUOTA_EXCEEDED,s??"Rate limit exceeded",a):i&&/INVALID_PARAMS|RESOLUTION_NOT_SUPPORTED|DURATION_NOT_SUPPORTED/.test(i)?new c(l.MODEL_CONSTRAINT_VIOLATION,s??"The generation request violates model constraints.",{...a,category:"validation",retryable:!1}):e.status>=500?new c(l.SERVER_ERROR,s??`Server error: ${e.statusText||e.status}`,{...a,category:"server",retryable:!0,request_outcome:"unknown"}):new c(l.GENERATION_FAILED,s??`Request failed: ${e.statusText||e.status}`,a)}function Le(e,t){return new c(l.SERVER_ERROR,e,{...t!==void 0?{status:t}:{},category:"response_protocol",retryable:!0,response_protocol:!0})}function gs(e,t){let o=[];for(let r of e.split(/\r?\n/))r.startsWith("data:")&&o.push(r.slice(5).trimStart());if(o.length===0)throw Le("Invalid SSE response from server",t);try{return JSON.parse(o.join(`
|
|
11
|
+
`))}catch{throw Le("Invalid JSON in SSE response from server",t)}}async function _s(e){let o=(await e.text()).trim();if(!o)throw Le("Empty response from server",e.status);if(o.startsWith("event:")||o.startsWith("data:"))return gs(o,e.status);try{return JSON.parse(o)}catch{throw Le("Invalid JSON response from server",e.status)}}function hs(e,t){if(!e||typeof e!="object")throw Le("Invalid MCP response from server",t);return e}function Ke(e){if(!(!e||typeof e!="object")){if("code"in e&&typeof e.code=="string")return e.code;if("cause"in e)return Ke(e.cause)}}function ys(e){return e instanceof Error&&e.name==="AbortError"?!0:["UND_ERR_HEADERS_TIMEOUT","UND_ERR_BODY_TIMEOUT","UND_ERR_CONNECT_TIMEOUT"].includes(Ke(e)??"")}function ws(e){return new ls({headersTimeout:e,bodyTimeout:e})}var H=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??us,this.logger=t.logger}async callTool(t,o,r={}){let n=r.serverName??"genai",i=await this.requestJsonRpc(n,"tools/call",{name:t,arguments:o},`mcp.${n}.${t}`,{tool_name:t});if(!i||typeof i!="object")throw Le("Invalid MCP tool result from server");return i}async requestJsonRpc(t,o,r,n,i){let s=$({source:"hogi_mcp_client",operation:n,method:"POST",path:`/mcp/${t}/sse`,...i?{metadata:i}:{}},this.logger),a=new AbortController,d=setTimeout(()=>a.abort(),this.timeoutMs);typeof d=="object"&&"unref"in d&&d.unref();let m;try{if(m=await s.fetch(this._fetch,`${this.baseUrl}/mcp/${t}/sse`,{method:"POST",headers:K({"content-type":"application/json",accept:"application/json, text/event-stream","x-hogi-api-key":this.apiKey,"x-oiioii-cli-version":F}),body:JSON.stringify({jsonrpc:"2.0",id:ps++,method:o,params:r}),...this.usesDefaultUndiciTransport?{dispatcher:ws(this.timeoutMs)}:{},signal:a.signal}),!m.ok)throw await fs(m);let p=hs(await _s(m),m.status);if(p.error)throw ms(p.error);if(p.result===void 0)throw Le("Missing MCP result from server",m.status);return s.success(m.status),p.result}catch(p){let u=p;if(a.signal.aborted||ys(p))u=new c(l.GENERATION_TIMEOUT,`Request timed out after ${this.timeoutMs}ms`,{retryable:!0,...Ke(p)?{cause_code:Ke(p)}:{}});else if(!(p instanceof c)){let g=p instanceof Error?p.message:String(p);u=new c(l.NETWORK_ERROR,`Network error: ${g}`,{retryable:!0,...Ke(p)?{cause_code:Ke(p)}:{}})}throw s.failure(u,m?.status),u}finally{clearTimeout(d)}}};function cr(e,t){if(e.isError)throw yt(e,`${t} failed`);let o=(e.content??[]).filter(r=>r?.type==="text").map(r=>r.text).find(r=>typeof r=="string"&&r.trim().length>0);if(!o)throw new c(l.SERVER_ERROR,`Invalid ${t} response: missing JSON text`);try{let r=JSON.parse(o);if(!r||typeof r!="object"||Array.isArray(r))throw new Error("not an object");return r}catch{throw new c(l.SERVER_ERROR,`Invalid ${t} response: malformed JSON`)}}var Ae=class{mcp;constructor(t){this.mcp=new H(t)}async getBalance(){let t=cr(await this.mcp.callTool("get_user_info",{},{serverName:"res"}),"points balance");if(typeof t.points!="number"||typeof t.tier!="string")throw new c(l.SERVER_ERROR,"Invalid points balance response");return t}async getGenerationCosts(t){if(t.length===0||t.length>20||t.some(n=>!n.startsWith("hogi://")))throw new c(l.INVALID_ARGUMENT,"Provide 1-20 hogi:// generation URIs");let o=cr(await this.mcp.callTool("query_generation_cost",{uris:t},{serverName:"res"}),"generation cost query");if(!Array.isArray(o.entries))throw new c(l.SERVER_ERROR,"Invalid generation cost response");return{entries:o.entries.map(n=>({...n,...n.status==="charged"&&typeof n.chargedAmount=="number"?{consumed_points:Math.abs(n.chargedAmount)}:{}})),...typeof o.note=="string"?{note:o.note}:{}}}};var ks=1e3,Is={record:()=>{}};function ze(e){return typeof e=="string"&&e.trim()?e.trim():void 0}async function ro(e,t,o,r=me(),n={}){try{let i=U(e),s=(n.configStore??new N).loadResolved(),a=e.registeredArguments.findIndex(w=>w.name()==="workspace_id"),d=L(e.processedArgs[a])??L(e.opts().workspaceId)??ze(i.workspace)??ze(process.env.OIIOII_WORKSPACE_ID)??ze(s.defaultWorkspaceId);r.startCommand({command:t,...d?{workspaceId:d}:{},...o?{traceId:o}:{}});let m=M(),p=ze(i.baseUrl)??s.baseUrl;if(m&&(m.workspaceId=d,m.identityKey=s.apiKey?gt(p,s.apiKey.trim()):void 0),process.env.OIIOII_TELEMETRY_DISABLED==="1")return;let u=ze(s.apiKey);if(!u)return;let g=await new Ae({baseUrl:p,apiKey:u,timeoutMs:n.identityTimeoutMs??ks,logger:Is,...n.fetch?{fetch:n.fetch}:{}}).getBalance(),y=ze(g.userId);y&&(r.identify(y),m&&(m.uid=y))}catch{}}function wt(e,t=me()){t.reportCommandFailure(e)}function kt(e=0,t=me()){t.completeCommand(e)}async function no(e,t=me()){await t.flush(e)}function I(e,t,o){return{ok:!0,type:e,data:t,...o?{next:o}:{}}}function A(e,t,o,r){Te(t,o);let n=r&&typeof r=="object"&&!Array.isArray(r)?r: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:o,...typeof n?.retryable=="boolean"?{retryable:n.retryable}:{},...typeof n?.trace_id=="string"?{trace_id:n.trace_id}:{},...r!==void 0?{details:r}:{}}}}function _(e){process.stdout.write(JSON.stringify(e,null,2)+`
|
|
12
|
+
`)}function f(e){console.log(e)}function x(e){console.log(`\u2713 ${e}`)}function V(e){console.error(`\u26A0 ${e}`)}function C(e){Te(void 0,e),console.error(`\u2717 ${e}`)}function J(e){console.log(`
|
|
13
|
+
${e}`),console.log("\u2500".repeat(e.length))}import{Command as Ns}from"commander";import{mkdir as vs,writeFile as Rs}from"fs/promises";import{existsSync as bs,statSync as Es}from"fs";import{basename as Ts,dirname as As,join as Cs,resolve as lr}from"path";function ur(e){if(!e||!e.startsWith("hogi://"))throw new c(l.INVALID_ARGUMENT,`Invalid hogi URI: "${e}". Expected format: hogi://image/<id> or hogi://video/<id>`)}function Ss(e){try{let t=new URL(e),o=Ts(t.pathname);if(o&&o!=="."&&o!=="/")return o}catch{}return"resource.bin"}function Os(e,t){let o=Ss(e);if(!t)return lr(process.cwd(),o);let r=lr(t);return bs(r)&&Es(r).isDirectory()?Cs(r,o):r}function xs(e,t){if(e?.toLowerCase().includes("application/json"))return!0;let o=t.subarray(0,128).toString("utf8").trimStart();return o.startsWith("{")&&(o.includes('"error"')||o.includes('"code"'))}var He=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,o={}){ur(t);let r=new URLSearchParams;return r.set("uri",t),o.filename&&r.set("filename",o.filename),typeof o.watermark=="boolean"&&r.set("wm",o.watermark?"1":"0"),`${this.baseUrl}/v1/res/read_file?${r.toString()}`}async download(t,o={}){ur(t);let r=this.getReadUrl(t,o),n=Os(t,o.output),i=$({source:"hogi_res_client",operation:"resource.read",method:"GET",path:"/v1/res/read_file"},this.logger),s,a;try{a=await Y({operation:"Resource download request",timeoutMs:this.timeoutMs,run:async d=>{if(s=await i.fetchResource(this._fetch,r,{method:"GET",headers:K({"x-hogi-api-key":this.apiKey,accept:"image/*,video/*,application/octet-stream,application/json;q=0.5,*/*;q=0.1"}),signal:d}),s.status===401)throw new c(l.API_KEY_INVALID,"Invalid API key",{status:401});if(s.status===404)throw new c(l.RECORD_NOT_FOUND,`Resource not found for URI: ${t}`,{status:404});if(!s.ok){let u=await s.text().catch(()=>"");throw new c(l.SERVER_ERROR,`HTTP ${s.status}: ${u||s.statusText}`,{status:s.status})}let m=s.headers.get("content-type"),p=Buffer.from(await s.arrayBuffer());if(xs(m,p)){let u="Resource read failed";try{let g=JSON.parse(p.toString("utf8"));u=g.message??g.error??g.code??u}catch{}throw new c(l.SERVER_ERROR,u)}return{contentType:m,buffer:p}}})}catch(d){if(d instanceof G){let u=new c(l.NETWORK_ERROR,d.message,{retryable:!0,timeout_ms:d.timeoutMs});throw i.failure(u,s?.status),u}if(d instanceof c)throw i.failure(d,s?.status),d;let m=d instanceof Error?d.message:String(d),p=new c(l.NETWORK_ERROR,`Network error: ${m}`);throw i.failure(p),p}return i.success(s.status,{bytes:a.buffer.byteLength,mime_type:a.contentType}),await vs(As(n),{recursive:!0}),await Rs(n,a.buffer),h("record","resource.saved",{bytes:a.buffer.byteLength,mime_type:a.contentType}),{path:n,bytes:a.buffer.byteLength,mimeType:a.contentType,uri:t}}};function pr(e,t){let o=t.configStore??new N,r=P(e,o);return{auth:r,configStore:o,workspaceClient:new Pe({baseUrl:r.baseUrl,apiKey:r.apiKey,...t.fetch?{fetch:t.fetch}:{}})}}async function Ds(e,t,o={}){let{configStore:r,workspaceClient:n}=pr(t,o),i=nt(t,r,e.workspaceId),s=await n.listAssets(i);return h("workspace_assets","assets.listed",{workspace_id:i,count:s.length}),{workspace_id:i,count:s.length,assets:s}}function Us(e){return e.startsWith("hogi://asset/")?e.slice(13):e}function Ps(e,t){let o=Us(t.trim()),r=e.find(n=>n.assetId===o);if(!r)throw new c(l.RECORD_NOT_FOUND,`Workspace asset not found: ${t}`,{asset_reference:t});if(r.status)throw new c(l.INVALID_ARGUMENT,`Workspace asset ${r.assetId} is not ready for download (status: ${r.status}).`,{asset_id:r.assetId,status:r.status});if(!r.uri.startsWith("hogi://")||r.uri.startsWith("hogi://asset/"))throw new c(l.INVALID_ARGUMENT,`Workspace asset ${r.assetId} has no downloadable resource URI.`,{asset_id:r.assetId,uri:r.uri});return r}async function Ms(e,t,o={}){let r=e.asset.trim();if(!r)throw new c(l.INVALID_ARGUMENT,"Asset ID is required");let{auth:n,configStore:i,workspaceClient:s}=pr(t,o),a=nt(t,i,e.workspaceId),d=Ps(await s.listAssets(a),r),m=await new He({baseUrl:n.baseUrl,apiKey:n.apiKey,...o.fetch?{fetch:o.fetch}:{}}).download(d.uri,{...e.output?{output:e.output}:{},...e.filename?{filename:e.filename}:{},...e.watermark!==void 0?{watermark:e.watermark}:{}});return h("workspace_assets","asset.downloaded",{workspace_id:a,asset_id:d.assetId,bytes:m.bytes}),{workspace_id:a,asset_id:d.assetId,uri:d.uri,path:m.path,bytes:m.bytes,mime_type:m.mimeType}}function mr(e,t,o){let r=e instanceof c?e:new c(l.SERVER_ERROR,e instanceof Error?e.message:String(e));t?_(A(o,r.code,r.message,r.details)):C(r.message),process.exitCode=1}function fr(e={}){let t=new Ns("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(o,r,n)=>{let i=D(n);try{let s=await Ds({workspaceId:o},U(n),e);if(pe(s.workspace_id),S({asset_count:s.count}),i)_(I("workspace_assets_list",s));else{J(`Workspace assets (${s.count})`);for(let a of s.assets)f(` ${a.assetId} ${a.type} ${a.status??"ready"} ${a.uri||"-"}`)}}catch(s){mr(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(o,r,n)=>{let i=D(n);try{let s=await Ms({asset:o,...r.output?{output:r.output}:{},...r.filename?{filename:r.filename}:{},...r.wm!==void 0?{watermark:r.wm}:{}},U(n),e);pe(s.workspace_id),S({resource_type:new URL(s.uri).hostname,size_bytes:s.bytes}),i?_(I("workspace_asset_download",s)):x(`Downloaded workspace asset ${s.asset_id}: ${s.path}`)}catch(s){mr(s,i,"workspace_asset_download")}}),t}function $s(e){let t=e;for(;t.parent;)t=t.parent;return t.opts().workspace}var gr=["en","zh","zh-Hant","ja"];async function Vs(e,t,o={}){let r=e.name?.trim();if(e.name!==void 0&&!r)throw new c(l.INVALID_ARGUMENT,"--name must not be empty");if(e.language!==void 0&&!gr.includes(e.language))throw new c(l.INVALID_ARGUMENT,`--language must be one of: ${gr.join(", ")}`);let n=o.configStore??new N,i=P(t,n),s=e.language;h("workspace","workspace.create_requested",{has_name:r!==void 0,language:s??null,set_current:e.setCurrent===!0});let a=await new Pe({baseUrl:i.baseUrl,apiKey:i.apiKey,...o.fetch?{fetch:o.fetch}:{}}).createWorkspace({...r!==void 0?{name:r}:{},...s!==void 0?{language:s}:{}});return e.setCurrent===!0&&(n.update({defaultWorkspaceId:a.workspaceId}),h("workspace","workspace.current_updated",{workspace_id:a.workspaceId})),h("workspace","workspace.created",{workspace_id:a.workspaceId}),{workspace_id:a.workspaceId,name:a.name,...s!==void 0?{language:s}:{},set_current:e.setCurrent===!0}}async function Fs(e,t,o={}){let r=e.name.trim();if(!r)throw new c(l.INVALID_ARGUMENT,"--name must not be empty");if(r.length>100)throw new c(l.INVALID_ARGUMENT,"--name must not exceed 100 characters");let n=o.configStore??new N,i=P(t,n),s=nt(t,n,e.workspaceId),a=await new Pe({baseUrl:i.baseUrl,apiKey:i.apiKey,...o.fetch?{fetch:o.fetch}:{}}).renameWorkspace(s,r);return h("workspace","workspace.renamed",{workspace_id:a.workspaceId}),{workspace_id:a.workspaceId,name:a.name}}function _r(e,t,o){let r=e instanceof c?e:new c(l.SERVER_ERROR,e instanceof Error?e.message:String(e));t?_(A(o,r.code,r.message,r.details)):C(r.message),process.exitCode=1}function hr(e={}){let t=new Ls("workspace").description("Workspace management");return t.command("create").description("Create a new workspace").option("--name <name>","Workspace name").option("--language <language>","Workspace language: en, zh, zh-Hant, or ja").option("--set-current","Set the created workspace as the active workspace").action(async(o,r)=>{let n=D(r);try{let i=await Vs(o,U(r),e);pe(i.workspace_id),S({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"}])):(x(`Workspace created: ${i.workspace_id}`),f(` Name: ${i.name}`),i.language&&f(` Language: ${i.language}`),f(` Current: ${i.set_current?"yes":"no"}`))}catch(i){_r(i,n,"workspace_created")}}),t.command("set").description("Set active workspace").argument("<workspace_id>","Workspace ID").action((o,r,n)=>{let i=D(n);if(!o||o.trim()===""){i?_(A("workspace_set",l.INVALID_ARGUMENT,"Workspace ID is required.")):C("Workspace ID is required."),process.exitCode=1;return}(e.configStore??new N).update({defaultWorkspaceId:o.trim()}),pe(o.trim()),i?_(I("workspace_set",{workspace_id:o.trim()},[{command:"oiioii workspace current --json"},{command:"oiioii image text --prompt '...' --json"}])):x(`Workspace set to: ${o.trim()}`)}),t.command("current").description("Show current workspace").action((o,r)=>{let n=D(r),s=(e.configStore??new N).loadResolved(),a=$s(r),d=process.env.OIIOII_WORKSPACE_ID,m=a??d??s.defaultWorkspaceId,p=a?"flag":d?"env":s.defaultWorkspaceId?"config":"none";if(!m){n?_(A("workspace_current",l.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."),f(" Use: oiioii workspace set <workspace_id>"),f(" Or set: OIIOII_WORKSPACE_ID=<id>")),process.exitCode=1;return}pe(m),S({has_workspace:!0}),n?_(I("workspace_current",{workspace_id:m,source:p})):(f(`Workspace: ${m}`),f(` 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(o,r,n)=>{let i=D(n);try{let s=await Fs({workspaceId:o,name:r.name},U(n),e);pe(s.workspace_id),i?_(I("workspace_renamed",s)):x(`Workspace renamed to: ${s.name}`)}catch(s){_r(s,i,"workspace_renamed")}}),t.addCommand(fr(e)),t}import{Command as ya,Option as Br}from"commander";var Ce=3e4;function ee(e){return new c(l.SERVER_ERROR,e,{category:"response_protocol",retryable:!0,response_protocol:!0})}function yr(e,t){if(e.isError)throw yt(e,t);let o=(e.content??[]).filter(r=>r?.type==="text"&&typeof r.text=="string").map(r=>r.text).join(`
|
|
14
|
+
`).trim();if(!o)throw ee(`${t}: empty response`);try{return JSON.parse(o)}catch{throw ee(`${t}: invalid JSON response`)}}function it(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function wr(e){if(e==="pending"||e==="processing"||e==="succeeded"||e==="failed"||e==="cancelled")return e;throw ee(`Invalid backend async task status: ${String(e)}`)}function kr(e){if(e==="image"||e==="video"||e==="audio")return e;throw ee(`Invalid backend async media type: ${String(e)}`)}var Q=class{constructor(t){this.mcp=t}mcp;async submit(t){h("async_generation","submission.started",{workspace_id:t.workspaceId,media_type:t.mediaType,tool:t.mcpMethodName,idempotency_key:t.idempotencyKey});let o=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:t.input,idempotencyKey:t.idempotencyKey}),r=yr(o,"Async generation submission failed");if(!it(r)||typeof r.taskId!="string"||r.taskId.length===0||typeof r.assetId!="string"||r.assetId.length===0||typeof r.workspaceId!="string"||r.workspaceId.length===0||typeof r.reused!="boolean")throw ee("Invalid async generation submission response");let n={assetId:r.assetId,...typeof r.createdAt=="string"?{createdAt:r.createdAt}:{},mediaType:kr(r.mediaType),reused:r.reused===!0,status:wr(r.status),taskId:r.taskId,workspaceId:r.workspaceId};if(n.workspaceId!==t.workspaceId||n.mediaType!==t.mediaType)throw ee("Async generation submission response does not match the request");return h("async_generation","submission.accepted",{task_id:n.taskId,asset_id:n.assetId,status:n.status,reused:n.reused}),n}async query(t,o){h("async_generation","query.started",{task_id:o,workspace_id:t});let r=await this.mcp.callTool("query_async_media_generation",{workspace_id:t,taskId:o}),n=yr(r,"Async generation query failed"),i=it(n)&&it(n.task)?n.task:void 0;if(!i||typeof i.taskId!="string"||typeof i.workspaceId!="string"||!Array.isArray(i.outputUris))throw ee("Invalid async generation query response");if(!i.outputUris.every(d=>typeof d=="string"))throw ee("Invalid async generation output URI list");if(typeof i.progress!="number"||!Number.isFinite(i.progress))throw ee("Invalid async generation progress");if(i.error!==null&&i.error!==void 0&&(!it(i.error)||typeof i.error.code!="string"||typeof i.error.message!="string"))throw ee("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:it(i.error)&&typeof i.error.code=="string"&&typeof i.error.message=="string"?{code:i.error.code,message:i.error.message}:null,mediaType:kr(i.mediaType),outputUris:s,progress:Math.max(0,Math.min(100,i.progress)),status:wr(i.status),taskId:i.taskId,...typeof i.updatedAt=="string"?{updatedAt:i.updatedAt}:{},workspaceId:i.workspaceId};if(a.taskId!==o||a.workspaceId!==t)throw ee("Async generation query response does not match the requested task");return h("async_generation","query.completed",{task_id:o,status:a.status,progress:a.progress,output_count:a.outputUris.length,has_error:a.error!==null}),a}};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(){let t=$({source:"hogi_model_catalog_client",operation:"models.list",method:"POST",path:"/points/mcp_model_pricings"},this.logger),o;try{return await Y({operation:"Model catalog request",timeoutMs:this.timeoutMs,run:async r=>{if(o=await t.fetch(this._fetch,`${this.baseUrl}/points/mcp_model_pricings`,{method:"POST",headers:K({"content-type":"application/json",accept:"application/json",connection:"close","x-hogi-api-key":this.apiKey}),body:"{}",signal:r}),o.status===401)throw new c(l.API_KEY_INVALID,"Invalid API key",{status:401});if(!o.ok)throw new c(l.SERVER_ERROR,`Model catalog request failed: HTTP ${o.status}`,{status:o.status});let n;try{n=await o.json()}catch{throw new c(l.SERVER_ERROR,"Invalid JSON response from model catalog")}let i=n.data?.pricings;if(n.code!=="SUCCESS"||!Array.isArray(i)||i.some(s=>!Gs(s)))throw new c(l.SERVER_ERROR,n.error??"Invalid model catalog response from server");return t.success(o.status,{model_count:i.length}),i}})}catch(r){if(r instanceof G){let s=new c(l.NETWORK_ERROR,r.message,{retryable:!0,timeout_ms:r.timeoutMs});throw t.failure(s,o?.status),s}if(r instanceof c)throw t.failure(r,o?.status),r;let n=r instanceof Error?r.message:String(r),i=new c(l.NETWORK_ERROR,`Network error: ${n}`);throw t.failure(i),i}}};function Gs(e){if(!e||typeof e!="object")return!1;let t=e,o=i=>Array.isArray(i)&&i.every(s=>typeof s=="string"),r=t.input_capabilities===void 0||o(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.model===null||typeof t.model=="string")&&typeof t.points_cost=="number"&&o(t.sizes)&&o(t.aspect_ratios)&&(t.durations===void 0||o(t.durations))&&r&&n(t.reference_image_count_min)&&n(t.reference_image_count_max)&&o(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"}var Bs={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"},Ws={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"},qs={"seed-audio":"generate_music_seed_audio","seed-audio-1.0":"generate_music_seed_audio",suno:"generate_music_suno"};function Ir(e){return e==="image"?Bs:e==="video"?Ws:qs}function js(e){return e==="audio"?"generate_music_":`generate_${e}_`}function vr(e,t){let o=Ir(t),r=o[e];if(!r){h("model_map","model.resolve_failed",{domain:t,model:e},"warn");let n=Object.keys(o).join(", ");throw new c(l.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 h("model_map","model.resolved",{domain:t,model:e,tool:r}),r}function Ks(e){let t=Ir(e);return Object.entries(t).map(([o,r])=>({name:o,tool:r}))}function st(e,t){let o=js(t);return!e.startsWith(o)||e.length===o.length?void 0:Ks(t).find(n=>n.tool===e)?.name??e.slice(o.length)}function Rr(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"")}function Er(e,t){let o=so(e);if(!o)return!1;let r=Rr(t),n=st(e.mcp_method_name,o);return[e.name,n,n&&e.model?`${n}${e.model}`:void 0].filter(s=>typeof s=="string").some(s=>Rr(s)===r)}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 Tr(e){return[...e].sort((t,o)=>t.sort_order-o.sort_order||t.id-o.id)[0]}function It(e,t){let o=so(e);if(!o||t&&o!==t)throw new c(l.MODEL_NOT_SUPPORTED,`Model ID ${e.id} belongs to ${o??"an unsupported"} domain${t?`, not ${t}`:""}.`,{category:"validation",retryable:!1,model_id:e.id,...t?{expected_domain:t}:{}});let r=st(e.mcp_method_name,o);if(!r)throw new c(l.MODEL_NOT_SUPPORTED,`Model ID ${e.id} is not supported by ${o} generation.`,{category:"validation",retryable:!1,model_id:e.id});return{key:r,toolName:e.mcp_method_name,modelId:e.id,name:e.name??e.model??r,...e.model?{variant:e.model}:{},catalog:e,catalogStatus:"exact"}}function ao(e,t){if(t.modelId&&(t.model||t.variant))throw new c(l.INVALID_ARGUMENT,"Use --model-id or --model [--variant], not both.");if(t.variant&&!t.model)throw new c(l.INVALID_ARGUMENT,"--variant requires --model.");if(!t.modelId&&!t.model)throw new c(l.INVALID_ARGUMENT,"Provide --model-id or --model [--variant].");if(t.modelId){let i=zs(t.modelId),s=e.find(a=>a.id===i);if(s)return s;throw new c(l.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 o=e.filter(i=>Er(i,t.model)),r=t.variant?o.filter(i=>i.model===t.variant):o,n=Tr(r);if(n)return n;throw new c(l.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 zs(e){if(!/^\d+$/.test(e))throw new c(l.INVALID_ARGUMENT,`Invalid model ID: "${e}". Expected a positive integer from inspect models.`);let t=Number(e);if(!Number.isSafeInteger(t)||t<=0)throw new c(l.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 c(l.INVALID_ARGUMENT,"Use either --model-id or --variant, not both.");if(!e.modelId&&!e.variant){let n={key:e.model,toolName:vr(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(d=>so(d)===e.domain&&(d.mcp_method_name===n.toolName||Er(d,e.model)));if(s.length===0)throw new c(l.MODEL_NOT_SUPPORTED,`Model ${e.model} is not present in the active backend model catalog.`,{category:"validation",retryable:!1,hint:"Run oiioii inspect models --json and select an active model.",model:e.model});let a=s.find(d=>d.mcp_method_name===n.toolName&&d.model===null)??Tr(s);return a?{...It(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(),o=ao(t,e.modelId?{modelId:e.modelId}:{model:e.model,variant:e.variant}),r=It(o,e.domain);return e.modelId?r:{...r,key:e.model}}function Ar(e){return[...new Set(e.catalog?.input_capabilities??[])]}function at(e,t){let o=e.catalog?.durations?.[0]?.trim(),r=t.duration;if(o&&/^\d+(?:\.\d+)?$/.test(o))r=Number(o);else if(o){let n=/^(\d+(?:\.\d+)?)\s*-\s*(\d+(?:\.\d+)?)$/.exec(o);n&&(r=Number(n[1]))}return{aspectRatio:e.catalog?.aspect_ratios[0]??t.aspectRatio,resolution:e.catalog?.sizes[0]??t.resolution,...r!==void 0?{duration:r}:{}}}function br(e){let t=e.trim().toLowerCase();return t==="adaptive"?"auto":t}function Ve(e,t){let o=e.catalog;if(o){if(t.aspectRatio&&o.aspect_ratios.length>0){let r=br(t.aspectRatio);if(!o.aspect_ratios.map(br).includes(r))throw new c(l.MODEL_CONSTRAINT_VIOLATION,`${e.name??e.key} does not support aspect ratio ${t.aspectRatio}. Supported: ${o.aspect_ratios.join(", ")}.`,{category:"validation",retryable:!1,field:"aspect_ratio",received:t.aspectRatio,supported:o.aspect_ratios})}if(t.resolution&&o.sizes.length>0){let r=t.resolution.trim().toLowerCase();if(!o.sizes.some(n=>n.trim().toLowerCase()===r))throw new c(l.MODEL_CONSTRAINT_VIOLATION,`${e.name??e.key} does not support resolution ${t.resolution}. Supported: ${o.sizes.join(", ")}.`,{category:"validation",retryable:!1,field:"resolution",received:t.resolution,supported:o.sizes})}if(t.duration!==void 0&&o.durations&&o.durations.length>0&&!o.durations.some(n=>{let i=n.trim();if(/^\d+(?:\.\d+)?$/.test(i))return Number(i)===t.duration;let s=/^(\d+(?:\.\d+)?)\s*-\s*(\d+(?:\.\d+)?)$/.exec(i);return s!==null&&t.duration>=Number(s[1])&&t.duration<=Number(s[2])}))throw new c(l.MODEL_CONSTRAINT_VIOLATION,`${e.name??e.key} does not support duration ${t.duration}s. Supported: ${[...new Set(o.durations)].join(", ")}.`,{category:"validation",retryable:!1,field:"duration",received:t.duration,supported:[...new Set(o.durations)]})}}function oe(e){return{key:e.key,...e.modelId!==void 0?{model_id:e.modelId}:{},...e.name?{name:e.name}:{},...e.variant?{variant:e.variant}:{}}}function Se(e){return e.modelId!==void 0?`--model-id ${e.modelId}`:e.variant?`--model ${e.key} --variant ${e.variant}`:`--model ${e.key}`}import{readFileSync as Hs,writeFileSync as Js,appendFileSync as Ys,mkdirSync as Qs,existsSync as Cr,chmodSync as co}from"fs";import{join as Xs,dirname as Zs}from"path";import{randomBytes as ea}from"crypto";function ta(){return"task_"+ea(8).toString("hex")}var B=class{configDir;tasksPath;constructor(t){this.configDir=t?.configDir??de(),this.tasksPath=Xs(this.configDir,"tasks.jsonl")}getConfigDir(){return this.configDir}create(t){let o=new Date().toISOString(),r={id:ta(),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.mediaType?{mediaType:t.mediaType}:{},status:"created",resourceUris:[],createdAt:o,updatedAt:o};return this._ensureDir(),ce(`${this.tasksPath}.lock`,()=>{Ys(this.tasksPath,JSON.stringify(r)+`
|
|
15
|
+
`,{encoding:"utf-8",mode:384}),co(this.tasksPath,384)}),h("task_store","task.created",{task_id:r.id,tool:r.toolName}),r}update(t,o){this._ensureDir();let r=ce(`${this.tasksPath}.lock`,()=>{let n=this._readAll(),i=n.findIndex(a=>a.id===t);if(i===-1)return;let s=n[i];return o.status!==void 0&&(s.status=o.status),o.resourceUris!==void 0&&(s.resourceUris=o.resourceUris),o.recordIds!==void 0&&(s.recordIds=o.recordIds),o.backendTaskId!==void 0&&(s.backendTaskId=o.backendTaskId),o.backendAssetId!==void 0&&(s.backendAssetId=o.backendAssetId),o.backendBaseUrl!==void 0&&(s.backendBaseUrl=o.backendBaseUrl),o.mediaType!==void 0&&(s.mediaType=o.mediaType),o.progress!==void 0&&(s.progress=o.progress),o.lastSyncedAt!==void 0&&(s.lastSyncedAt=o.lastSyncedAt),o.error===null?delete s.error:o.error!==void 0&&(s.error=o.error),s.updatedAt=new Date().toISOString(),this._writeAll(n),s});if(!r){h("task_store","task.update_skipped",{task_id:t,reason:"not_found"},"warn");return}return h("task_store","task.updated",{task_id:t,status:r.status}),r}get(t){let r=this._readAll().find(n=>n.id===t);return h("task_store","task.read",{task_id:t,found:r!==void 0}),r}getByAnyId(t){let r=this._readAll().find(n=>n.id===t||n.backendTaskId===t);return h("task_store","task.read_by_any_id",{task_id:t,found:r!==void 0,matched_by:r?.id===t?"local":r?"backend":"none"}),r}list(t){let o=this._readAll();if(o.reverse(),t!==void 0&&t>0){let r=o.slice(0,t);return h("task_store","task.listed",{count:r.length,limit:t}),r}return h("task_store","task.listed",{count:o.length}),o}_readAll(){if(!Cr(this.tasksPath))return[];try{return Hs(this.tasksPath,"utf-8").trim().split(`
|
|
16
16
|
`).filter(r=>r.trim()!=="").map(r=>JSON.parse(r))}catch{return[]}}_writeAll(t){this._ensureDir();let o=t.map(r=>JSON.stringify(r)).join(`
|
|
17
17
|
`)+`
|
|
18
|
-
`;
|
|
19
|
-
`,{encoding:"utf-8",mode:384}),
|
|
20
|
-
`,{encoding:"utf-8",mode:384}),Je(g,384),Je(y,384),h("preview_store","preview.created",{bundle_id:o,task_id:t.taskId,status:t.status,resource_count:t.resources.length}),{bundleId:o,bundleDir:r,manifest:i,summary:u}}getBundle(t){let o=re(this.previewsDir,t),r=re(o,"manifest.json"),n=re(o,"summary.json");if(!Rt(r)||!Rt(n)){h("preview_store","preview.read",{bundle_id:t,found:!1});return}try{let i=JSON.parse(co(r,"utf-8")),s=JSON.parse(co(n,"utf-8"));return h("preview_store","preview.read",{bundle_id:t,found:!0}),{manifest:i,summary:s,bundleDir:o}}catch{h("preview_store","preview.read",{bundle_id:t,found:!1,reason:"invalid"},"warn");return}}getBundleByTaskId(t){let o=this._scanBundles();for(let r of o)if(r.task_id===t)return this.getBundle(r.bundle_id)}getLatest(){let t=this._scanBundles();if(t.length!==0)return t.sort(Or),this.getBundle(t[0].bundle_id)}listBundles(t){let o=this._scanBundles();return o.sort(Or),t!==void 0&&t>0?o.slice(0,t):o}_scanBundles(){if(!Rt(this.previewsDir))return[];let t=ta(this.previewsDir,{withFileTypes:!0}),o=[];for(let r of t){if(!r.isDirectory())continue;let n=re(this.previewsDir,r.name,"manifest.json");if(Rt(n))try{let i=JSON.parse(co(n,"utf-8"));o.push(i)}catch{}}return o}};function lo(e){let t=e.previewStore??new fe({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(o){let r=o instanceof Error?o.message:String(o);return h("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: ${r}`}}}var aa={image:"hogi://image/",video:"hogi://video/",audio:"hogi://audio/"},da={image:"image/jpeg",video:"video/mp4",audio:"audio/mpeg"};function xr(e){return e==="pending"?"queued":e==="processing"?"running":e}function Fe(e){return e.status==="succeeded"||e.status==="failed"||e.status==="cancelled"}function ca(e){if(!(e instanceof d))return!1;if(e.code===c.NETWORK_ERROR||e.code===c.GENERATION_TIMEOUT)return!0;let t=Nr(e);return t.response_protocol===!0||t.request_outcome==="unknown"}function Nr(e){return e.details&&typeof e.details=="object"&&!Array.isArray(e.details)?e.details:{}}function ge(e){if(e.taskStore.get(e.task.id)?.backendTaskId)return e.error;let t=e.error instanceof d?e.error.code:c.GENERATION_FAILED,o=e.error instanceof Error?e.error.message:String(e.error);if(ca(e.error))return e.taskStore.update(e.task.id,{status:"submitting",error:{code:t,message:o}}),new d(t,o,{...Nr(e.error),submission_outcome:"unknown",local_task_id:e.task.id,task_status:"submitting",retry_command:`oiioii task retry ${e.task.id}`});let r=e.taskStore.update(e.task.id,{status:"failed",error:{code:t,message:o}})??e.task;return lo({taskStore:e.taskStore,previewStore:e.previewStore,task:r,resources:[],status:"failed",error:{code:t,message:o}}),e.error}function la(e){let t=aa[e.mediaType],o=e.outputUris.find(r=>!r.startsWith(t));if(o)throw new d(c.SERVER_ERROR,`Backend ${e.mediaType} task returned an incompatible resource URI`,{task_id:e.taskId,uri:o});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 ua(e){let t=e.previewStore??new fe({configDir:e.taskStore.getConfigDir()});if(t.getBundleByTaskId(e.task.id))return;let o=e.task.status==="failed"||e.task.status==="cancelled";return lo({taskStore:e.taskStore,previewStore:t,task:e.task,resources:e.task.resourceUris.map(r=>({uri:r,mime_type:e.task.mediaType?da[e.task.mediaType]:void 0})),status:o?"failed":"succeeded",...o?{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 _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,idempotencyKey:e.task.id}),o=e.taskStore.update(e.task.id,{backendTaskId:t.taskId,backendAssetId:t.assetId,backendBaseUrl:e.backendBaseUrl.replace(/\/+$/,""),mediaType:t.mediaType,status:t.status==="succeeded"||t.status==="failed"||t.status==="cancelled"?"running":xr(t.status),progress:0,lastSyncedAt:new Date().toISOString(),error:null});if(!o)throw new d(c.SERVER_ERROR,`Local task disappeared after submission: ${e.task.id}`);if(h("async_generation","submission.cached",{local_task_id:o.id,backend_task_id:t.taskId,status:o.status}),!(t.status==="succeeded"||t.status==="failed"||t.status==="cancelled"))return{submission:t,task:o};let n=await uo({client:e.client,taskStore:e.taskStore,previewStore:e.previewStore,task:o});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 Dr(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 _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,input:t.input})}catch(o){throw ge({taskStore:e.taskStore,previewStore:e.previewStore,task:e.task,error:o})}}async function uo(e){if(!e.task.backendTaskId){if(Fe(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 o=la(t),r=e.taskStore.update(e.task.id,{backendAssetId:t.assetId,mediaType:t.mediaType,status:xr(t.status),progress:t.progress,resourceUris:o,lastSyncedAt:new Date().toISOString(),error:t.error});if(!r)throw new d(c.SERVER_ERROR,`Local task disappeared during synchronization: ${e.task.id}`);if(h("async_generation","task.cache_synchronized",{local_task_id:r.id,backend_task_id:r.backendTaskId,status:r.status,progress:r.progress,output_count:r.resourceUris.length}),!Fe(r))return{task:r};let n=ua({taskStore:e.taskStore,previewStore:e.previewStore,task:r});return h("async_generation","task.terminal_projected",{local_task_id:r.id,backend_task_id:r.backendTaskId,status:r.status,preview_warning:n!==void 0}),{task:r,...n?{previewWarning:n}:{}}}import{createHash as ma}from"crypto";function ne(e){return`sha256:${ma("sha256").update("oiioii-cli-task-credential-v1\0").update(e).digest("hex")}`}var bt=["text2Video","firstframe2Video","endframe2Video","frame2Video","image2Video","omni2Video"],W=(e,t=!1)=>({name:"imageUrl",max:e,single:t}),Ge=e=>({name:"images",max:e}),he=(e,t=!1)=>({name:"videoUrl",max:e,single:t}),vt=e=>({name:"audioUrl",max:e}),Pr=["text2Video","firstframe2Video"],Ur=["text2Video","image2Video","omni2Video"],Oe=["text2Video","firstframe2Video","frame2Video","image2Video","omni2Video"];function pa(e){return e==="2.7"?{fields:{image:W(5),video:he(1,!0)},modes:Oe,totalMax:5}:{fields:{image:W(10),video:he(5),audio:vt(5)},modes:Oe}}function fa(e){return e?.toLowerCase()==="kling-v3-omni"?{fields:{image:Ge(),video:he()},modes:Oe}:{fields:{image:Ge()},modes:e==="2.6"?Pr:["text2Video","firstframe2Video","frame2Video"]}}function ga(e){return e==="viduQ3Ref"||e==="viduQ3MixRef"||e==="viduQ3Ad"?{fields:{image:W(7)},modes:["image2Video","omni2Video"]}:e==="viduQ3"?{fields:{image:W(7)},modes:["text2Video","firstframe2Video","image2Video","omni2Video"]}:{fields:{image:W(7)},modes:Oe}}function go(e,t){return e==="generate_video_wan"?pa(t):e==="generate_video_kling"?fa(t):e==="generate_video_vidu"?ga(t):{generate_video_seedance20:{fields:{image:W(9),video:he(3),audio:vt(3)},modes:Oe},generate_video_seedance25:{fields:{image:W(30),video:he(10),audio:vt(10)},modes:Oe,totalMax:50},generate_video_minimax_h3:{fields:{image:W(9),video:he(3),audio:vt(3)},modes:[...Oe,"endframe2Video"],audioRequiresVisual:!0},generate_video_wan27:{fields:{image:W(5),video:he(1,!0)},modes:Oe,totalMax:5},generate_video_wan26:{fields:{image:W(5),video:he(1,!0)},modes:["text2Video","firstframe2Video","image2Video","omni2Video"]},generate_video_gemini_omni:{fields:{image:Ge(5),video:he(1,!0)},modes:Ur,totalMax:5},generate_video_grok_imagine:{fields:{image:W(1,!0)},modes:Pr},generate_video_grok_imagine_15:{fields:{image:W(1,!0)},modes:["firstframe2Video"]},generate_video_grok_imagine_15_fast:{fields:{image:W(7)},modes:Ur},generate_video_happyhorse:{fields:{image:W(9)},modes:["text2Video","firstframe2Video","image2Video","omni2Video"]},generate_video_happyhorse11:{fields:{image:W(9)},modes:["text2Video","firstframe2Video","image2Video","omni2Video"]},generate_video_sora2:{fields:{image:Ge()}},generate_video_sora2_pro:{fields:{image:Ge()}},generate_video_kling_o1:{fields:{image:Ge()}},generate_video_midjourney:{fields:{image:Ge()}},generate_video_veo3:{fields:{image:W(1,!0)}},generate_video_hailuo02:{fields:{image:W(2)}}}[e]}function Mr(e,t){let o=go(e,t);if(o)return{image:o.fields.image!==void 0,video:o.fields.video!==void 0,audio:o.fields.audio!==void 0}}function Lr(e,t){let o=go(e,t);return!o||!o.modes?!0:o.modes.includes("text2Video")}function mo(e){return[...new Set((e??[]).map(t=>t.trim()).filter(Boolean))]}function po(e,t,o){let r=e.find(n=>!n.startsWith(o));if(r)throw new d(c.INVALID_ARGUMENT,`Video ${t} references must use ${o} URIs: ${r}`)}function ie(e,t={}){return new d(c.MODEL_CONSTRAINT_VIOLATION,e,{category:"validation",retryable:!1,...t})}function fo(e,t,o,r,n){if(r.length!==0){if(!n)throw ie(`${t} does not support ${o} references.`,{field:o});if(n.max!==void 0&&r.length>n.max)throw ie(`${t} supports at most ${n.max} ${o} references; received ${r.length}.`,{field:o,received:r.length,supported_max:n.max});if(n.single&&r.length>1)throw ie(`${t} supports only one ${o} reference.`,{field:o,received:r.length,supported_max:1});e[n.name]=n.single?r[0]:r}}function _a(e,t){return t.images.length+t.videos.length+t.audios.length===0?"text2Video":e.modes?.includes("omni2Video")||t.videos.length||t.audios.length?"omni2Video":e.modes?.includes("image2Video")?"image2Video":t.images.length===1&&e.modes?.includes("firstframe2Video")?"firstframe2Video":t.images.length===2&&e.modes?.includes("frame2Video")?"frame2Video":"image2Video"}function $r(e){let t={images:mo(e.images),videos:mo(e.videos),audios:mo(e.audios)};po(t.images,"images","hogi://image/"),po(t.videos,"videos","hogi://video/"),po(t.audios,"audios","hogi://audio/");let o=t.images.length+t.videos.length+t.audios.length,r=go(e.toolName,e.version);if(!r){if(o===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(r.totalMax!==void 0&&o>r.totalMax)throw ie(`${e.toolName} supports at most ${r.totalMax} total references; received ${o}.`,{field:"references",received:o,supported_max:r.totalMax});if(r.audioRequiresVisual&&t.audios.length>0&&t.images.length===0&&t.videos.length===0)throw ie(`${e.toolName} audio references require at least one image or video reference.`,{field:"audio"});let n=e.mode&&e.mode!=="auto"?e.mode:_a(r,t);if(e.mode&&e.mode!=="auto"&&!r.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(r.modes&&!r.modes.includes(n))throw new d(c.MODEL_CONSTRAINT_VIOLATION,`${e.toolName} does not support ${n}. Supported modes: ${r.modes.join(", ")}.`,{category:"validation",retryable:!1,field:"mode",received:n,supported:r.modes});if(n==="text2Video"&&o>0)throw ie("text2Video does not accept image, video, or audio references.",{field:"references"});if((n==="firstframe2Video"||n==="endframe2Video")&&(t.images.length!==1||t.videos.length>0||t.audios.length>0))throw ie(`${n} requires exactly one image and no video or audio references.`,{field:"references",mode:n});if(n==="frame2Video"&&(t.images.length!==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:n});if(n==="image2Video"&&(t.images.length===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:n});if(n==="omni2Video"&&o===0)throw ie("omni2Video requires at least one reference; use text2Video for prompt-only generation.",{field:"references",mode:n});let i={};return fo(i,e.toolName,"image",t.images,r.fields.image),fo(i,e.toolName,"video",t.videos,r.fields.video),fo(i,e.toolName,"audio",t.audios,r.fields.audio),r.modes&&(i.generateMode=n),{args:i,mode:n,references:t}}var Vr={image:!1,video:!1,audio:!1};function Et(e){let t=Vr;if(e.toolName.startsWith("generate_image_"))t={image:!0,video:!1,audio:!1};else if(e.toolName.startsWith("generate_video_"))t=Mr(e.toolName,e.variant)??Vr;else if(e.toolName==="generate_music_seed_audio"){let o=new Set(e.catalog?.input_capabilities??["text"]);t={image:o.has("image"),video:!1,audio:o.has("audio")}}return{text:!0,image:t.image&&e.catalog?.reference_image_count_max!==0,video:t.video,audio:t.audio,file:!1}}function dt(e){let t=typeof e.catalog?.reference_image_count_min=="number"&&e.catalog.reference_image_count_min>0;return{media:Et(e),prompt_only_supported:!t&&(!e.toolName.startsWith("generate_video_")||Lr(e.toolName,e.variant))}}function Be(e){if(dt(e).prompt_only_supported)return;let t=e.catalog?.reference_image_count_min,o=typeof t=="number"&&t>0;throw new d(c.MODEL_CONSTRAINT_VIOLATION,o?`${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,...o?{field:"reference_image_count_min",received:0,supported_min:t}:{field:"generateMode",received:"text2Video"}})}function Qe(e,t){let o=e.catalog?.reference_image_count_min,r=e.catalog?.reference_image_count_max;if(typeof o=="number"&&t<o)throw new d(c.MODEL_CONSTRAINT_VIOLATION,`${e.name??e.key??e.toolName} requires at least ${o} reference images; received ${t}.`,{category:"validation",retryable:!1,field:"reference_image_count_min",received:t,supported_min:o});if(t!==0){if(!Et(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,...r===0?{supported_max:0}:{}});if(typeof r=="number"&&t>r)throw new d(c.MODEL_CONSTRAINT_VIOLATION,`${e.name??e.key??e.toolName} supports at most ${r} reference images; received ${t}.`,{category:"validation",retryable:!1,field:"reference_image_count_max",received:t,supported_max:r})}}function Tt(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=Object.entries(e).filter(o=>typeof o[1]=="number");return Object.fromEntries(t)}function ct(e,t){if(!e||!t)return;let o=e[t];if(o!==void 0)return o;let r=Object.keys(e).find(n=>n.toLowerCase()===t.toLowerCase());return r?e[r]:void 0}function Fr(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function _o(e){let t=Number.EPSILON*Math.max(1,Math.abs(e))*8;return e<=0?0:Math.max(1,Math.ceil(e-t))}function At(e){let{pricing:t}=e,o=e.tier==="free"?"free":"member",r=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=Fr(t.free_user_points_cost)??s,l=o==="free"?a:s,m=Tt(t.resolution_pricing),p=Tt(t.free_user_resolution_pricing)??m,u=Tt(t.resolution_pricing_with_video),g=Tt(t.free_user_resolution_pricing_with_video)??u,y=o==="free"?p:m,w=o==="free"?g:u,E=i>0?w:y,v=e.resolution;if(t.mcp_method_name==="generate_image_gpt_image2"&&e.resolution&&ct(E,e.resolution)===void 0&&/^[124]k$/i.test(e.resolution)){let ae=e.quality?.trim().toLowerCase()??(e.resolution.toLowerCase()==="1k"?"low":"medium"),ke=`${e.resolution}-${ae}`;(ct(E,ke)!==void 0||ct(y,ke)!==void 0)&&(v=ke)}let T=(i>0?ct(w,v):void 0)??ct(y,v)??l,R=t.promo_active===!0&&Fr(t.promo_discount_percent)!==void 0,b=R?t.promo_discount_percent/100:1,k=T*b,q=e.duration??(r?10:void 0),j=q!==void 0?q+(r?i:0):void 0;return{estimate:!0,estimated_points:r&&j!==void 0?_o(k*j):n&&q!==void 0?_o(k*q):R?_o(k):T,unit_points:T,tier:o,billing_unit:r||n?"second":"request",...j!==void 0&&(r||n)?{billed_duration:j}:{},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 Ye(e,t,o){let r=e.catalog,n=r?At({pricing:r,tier:"member",...typeof o.duration=="number"?{duration:o.duration}:{},...typeof o.resolution=="string"?{resolution:o.resolution}:{},...typeof o.quality=="string"?{quality:o.quality}:{},...typeof o.referenceVideoDuration=="number"?{referenceVideoDuration:o.referenceVideoDuration}:{}}):void 0;return{valid:!0,resolved:{arguments:o,contract:{source:"cli_model_catalog_and_command_schema",input_capabilities:Tr(e),input_capabilities_scope:"model_input_modalities",generation_input_contract:dt(e),...t==="image"?{reference_images:{capability_field:"reference_image_count_max",count_min:r?.reference_image_count_min??null,count_max:r?.reference_image_count_max??null,source:typeof r?.reference_image_count_max=="number"?"catalog":"frontend_fallback",supported:r?.reference_image_count_max!==0}}:{},constraints:{aspect_ratios:r?.aspect_ratios??[],durations:r?.durations??[],sizes:r?.sizes??[]}},media_type:t,mcp_method_name:e.toolName,model_id:e.modelId??null,variant:e.variant??null},estimate:{caveat:r?`${n?.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:n?.estimated_points??null},warnings:r?[]: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 ye(e,t){if(t){_(I("generation_dry_run",e));return}N("Generation request is valid (dry-run; nothing was submitted)"),e.resolved.model_id!==null&&f(` Model ID: ${e.resolved.model_id}`),f(` Tool: ${e.resolved.mcp_method_name}`),e.resolved.variant&&f(` Variant: ${e.resolved.variant}`),f(` Points: ${e.estimate.points??"unknown"}${e.estimate.points!==null?" (estimated)":""}`),f(` Arguments: ${JSON.stringify(e.resolved.arguments)}`);for(let o of e.warnings)B(`${o.code}: ${o.message}`)}var Xe="seedream45",We="seedance20",Ct="seed-audio";var Br=D,Wr=U;function qr(e,t){let o=e.workspace;if(o)return{workspaceId:o,source:"flag"};let r=process.env.OIIOII_WORKSPACE_ID;if(r)return{workspaceId:r,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 ya(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 o=Number(t[1]),r=Number(t[2]);if(o<=0||r<=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(o,r);return`${o/i}:${r/i}`}function wa(e,t){let o=at(e,{aspectRatio:"1:1",resolution:"2K"}),r=t.aspectRatio??(t.size?ya(t.size):o.aspectRatio),n=t.resolution??o.resolution,i;if(e.toolName==="generate_image_gpt4o"){let[s=1,a=1]=r.split(":").map(Number);i={size:s===a?"1024x1024":s>a?"1536x1024":"1024x1536"}}else i={aspectRatio:r,resolution:n};return Ve(e,{aspectRatio:r,resolution:n}),{args:i,aspectRatio:r,resolution:n}}function Kr(e){let{images:t,...o}=e;return{...o,...Array.isArray(t)?{referenceImages:t}:{}}}async function ho(e,t,o,r,n,i){let s=await $e({domain:"image",model:e.model,modelId:e.modelId,variant:e.variant,requireActiveCatalog:i,baseUrl:r,apiKey:o,fetch:n.fetch});t==="text"?Be(s):Qe(s,1);let a=wa(s,e);return{selection:s,resolved:{aspectRatio:a.aspectRatio,resolution:a.resolution},args:{prompt:e.prompt,...t==="edit"?{images:[e.image]}:{},...a.args,...s.variant?{version:s.variant}:{}}}}async function jr(e,t,o,r,n){let{selection:i,args:s}=await ho(e,t,o,r,n,!0);return Ye(i,"image",s)}async function ka(e,t,o,r,n={}){let i=n.taskStore??new G,s=await ho(e,"text",o,r,n,!0),{selection:a}=s,l=a.toolName;h("image","generation.prepared",{mode:"text",model:a.key,model_id:a.modelId,variant:a.variant,workspace_id:t});let m={...s.args,workspace_id:t},p={mediaType:"image",prompt:e.prompt,model:a.variant,input:Kr(s.args)},u=`oiioii image text --prompt "${e.prompt}" ${Se(a)}${e.aspectRatio?` --aspect-ratio ${e.aspectRatio}`:""}${e.size?` --size ${e.size}`:""}${e.resolution?` --resolution ${e.resolution}`:""}`,g=i.create({workspaceId:t,command:u,toolName:l,inputArgs:{provider:"mcp_genai",prompt:e.prompt,model:a.key,modelId:a.modelId,variant:a.variant,mcpMethodName:l,workspaceId:t,toolArgs:{aspectRatio:m.aspectRatio,size:m.size,resolution:m.resolution}},pendingSubmission:p,credentialFingerprint:ne(o),backendBaseUrl:r,mediaType:"image"});i.update(g.id,{status:"submitting"});let y=new H({baseUrl:r,apiKey:o,fetch:n.fetch,timeoutMs:n.imageTextTimeoutMs??Ce});try{let w=await _e({client:new Y(y),taskStore:i,previewStore:n.previewStore,task:g,mediaType:"image",prompt:e.prompt,model:a.variant,backendBaseUrl:r,input:p.input}),E=w.task.resourceUris.map(T=>({type:"image",uri:T,mime_type:"image/jpeg"})),v=w.previewWarning?[w.previewWarning]:[];return h("image","generation.submitted",{local_task_id:g.id,backend_task_id:w.submission.taskId,status:w.task.status}),{task_id:w.submission.taskId,local_task_id:g.id,tool:l,model:oe(a),workspace_id:t,status:w.task.status,artifacts:E,request:{aspect_ratio:s.resolved.aspectRatio,resolution:s.resolved.resolution},...v.length>0?{warnings:v}:{}}}catch(w){let E=w instanceof d?w.code:c.GENERATION_FAILED;throw h("image","generation.command_failed",{task_id:g.id,backend_task_cached:i.get(g.id)?.backendTaskId!==void 0,error_code:E},"error"),ge({taskStore:i,previewStore:n.previewStore,task:g,error:w})}}async function Ia(e,t,o,r,n={}){let i=n.taskStore??new G,s=await ho(e,"edit",o,r,n,!0),{selection:a}=s,l=a.toolName;h("image","generation.prepared",{mode:"edit",model:a.key,model_id:a.modelId,variant:a.variant,workspace_id:t});let m={...s.args,workspace_id:t},p={mediaType:"image",prompt:e.prompt,model:a.variant,input:Kr(s.args)},u=`oiioii image edit --image ${e.image} --prompt "${e.prompt}" ${Se(a)}${e.aspectRatio?` --aspect-ratio ${e.aspectRatio}`:""}${e.size?` --size ${e.size}`:""}${e.resolution?` --resolution ${e.resolution}`:""}`,g=i.create({workspaceId:t,command:u,toolName:l,inputArgs:{provider:"mcp_genai",prompt:e.prompt,model:a.key,modelId:a.modelId,variant:a.variant,sourceImage:e.image,mcpMethodName:l,workspaceId:t,toolArgs:{images:m.images,aspectRatio:m.aspectRatio,size:m.size,resolution:m.resolution}},pendingSubmission:p,credentialFingerprint:ne(o),backendBaseUrl:r,mediaType:"image"});i.update(g.id,{status:"submitting"});let y=new H({baseUrl:r,apiKey:o,fetch:n.fetch,timeoutMs:n.imageTextTimeoutMs??Ce});try{let w=await _e({client:new Y(y),taskStore:i,previewStore:n.previewStore,task:g,mediaType:"image",prompt:e.prompt,model:a.variant,backendBaseUrl:r,input:p.input}),E=w.task.resourceUris.map(T=>({type:"image",uri:T,mime_type:"image/jpeg"})),v=w.previewWarning?[w.previewWarning]:[];return h("image","generation.submitted",{local_task_id:g.id,backend_task_id:w.submission.taskId,status:w.task.status}),{task_id:w.submission.taskId,local_task_id:g.id,tool:l,model:oe(a),workspace_id:t,status:w.task.status,artifacts:E,request:{aspect_ratio:s.resolved.aspectRatio,resolution:s.resolved.resolution},...v.length>0?{warnings:v}:{}}}catch(w){let E=w instanceof d?w.code:c.GENERATION_FAILED;throw h("image","generation.command_failed",{task_id:g.id,backend_task_cached:i.get(g.id)?.backendTaskId!==void 0,error_code:E},"error"),ge({taskStore:i,previewStore:n.previewStore,task:g,error:w})}}function zr(e={}){let t=new ha("image").description("Image generation commands");return t.command("text").description("Generate image from text prompt").requiredOption("--prompt <text>","Image description").option("--model <model>","Model name",Xe).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 Gr("--size <size>","Deprecated <width>x<height> compatibility option").hideHelp()).option("--resolution <resolution>","Image resolution (defaults to the selected model catalog)").option("--dry-run","Validate and preview the resolved request without submitting").action(async(o,r)=>{let n=Br(r),i=Wr(r),s=e.configStore??new x;try{let a=P(i,s),l=a.baseUrl,{workspaceId:m}=qr(i,s),p={prompt:o.prompt,model:o.model,modelId:o.modelId,variant:o.variant,size:o.size,aspectRatio:o.aspectRatio,resolution:o.resolution};if(o.dryRun===!0){ye(await jr(p,"text",a.apiKey,l,e),n);return}let u=await ka(p,m,a.apiKey,l,e);if(S({media_type:"image",generation_mode:"text",model_key:u.model.key,...u.model.model_id!==void 0?{model_id:u.model.model_id}:{},...u.model.variant?{variant:u.model.variant}:{},resolution:u.request.resolution,aspect_ratio:u.request.aspect_ratio,artifact_count:u.artifacts.length,warning_count:u.warnings?.length??0}),u.warnings?.length&&te(),n)_(I(u.status==="succeeded"?"generation_completed":"generation_submitted",{task_id:u.task_id,local_task_id:u.local_task_id,tool:u.tool,model:u.model,workspace_id:u.workspace_id,status:u.status,artifacts:u.artifacts,request:u.request,...u.warnings?{warnings:u.warnings}:{}},[...u.artifacts.length>0?[{command:`oiioii record get ${u.artifacts[0].uri} --json`,description:"Get generation record details"}]:[],{command:`oiioii task status ${u.task_id} --json`,description:"Check task status"}]));else{N(u.status==="succeeded"?"Image generated successfully":"Image generation submitted"),f(` Task ID: ${u.task_id}`),f(` Model: ${u.model.name??u.model.key}${u.model.variant?` (${u.model.variant})`:""}`);for(let g of u.artifacts)f(` URI: ${g.uri}`);for(let g of u.warnings??[])B(`Warning: ${g.message}`);u.artifacts.length>0?f(`
|
|
18
|
+
`;Js(this.tasksPath,o,{encoding:"utf-8",mode:384}),co(this.tasksPath,384)}_ensureDir(){let t=Zs(this.tasksPath);Cr(t)||Qs(t,{recursive:!0,mode:448}),co(t,448)}};import{readFileSync as lo,writeFileSync as Sr,mkdirSync as Or,existsSync as vt,readdirSync as oa,chmodSync as Je}from"fs";import{join as re}from"path";import{randomBytes as ra}from"crypto";function na(){return"preview_"+ra(8).toString("hex")}function ia(e){let t=e.replace(/^generate_/,"").split("_"),o=t[0]??"generation",r=t.slice(1).join("_");return`${r.charAt(0).toUpperCase()+r.slice(1)} ${o} generation`}function sa(e){let t=[];for(let o of e)t.push({command:`oiioii record get ${o.uri} --json`,description:"Get generation record details"}),o.uri.startsWith("hogi://image/")&&t.push({command:`oiioii video image --image ${o.uri} --prompt '<motion>' --json`,description:"Create video from this image"});return t}var aa=0;function xr(e,t){let o=t.created_at.localeCompare(e.created_at);if(o!==0)return o;let r=typeof e.created_sequence=="number"?e.created_sequence:0,i=(typeof t.created_sequence=="number"?t.created_sequence:0)-r;return i!==0?i:t.bundle_id.localeCompare(e.bundle_id)}var ge=class{configDir;previewsDir;constructor(t){this.configDir=t?.configDir??de(),this.previewsDir=re(this.configDir,"previews")}getConfigDir(){return this.configDir}createBundle(t){let o=na(),r=re(this.previewsDir,o);Or(r,{recursive:!0,mode:448}),Or(re(r,"artifacts"),{recursive:!0,mode:448}),Je(this.configDir,448),Je(this.previewsDir,448),Je(r,448),Je(re(r,"artifacts"),448);let n=new Date().toISOString(),i={schema_version:1,bundle_id:o,created_at:n,created_sequence:++aa,...t.projectId?{project_id:t.projectId}:{},workspace_id:t.workspaceId,task_id:t.taskId,command:t.command,tool:t.tool,input_args:t.inputArgs,resources:t.resources},s=t.resources.length,a=t.tool.includes("video")?"video":t.tool.includes("music")||t.tool.includes("audio")?"audio":"image",d,m,p=[];if(t.status==="succeeded"){let w=t.inputArgs.size?` ${t.inputArgs.size}`:"";d=`Generated ${s}${w} ${a}${s!==1?"s":""}.`,m=t.resources.length>0?`Use \`oiioii record get ${t.resources[0].uri} --json\` for details.`:"No resources returned.",p.push(...sa(t.resources))}else d=`Generation failed: ${t.error?.message??"unknown error"}`,m=`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 u={title:ia(t.tool),status:t.status,human_summary:d,agent_summary:m,next:p},g=re(r,"manifest.json"),y=re(r,"summary.json");return Sr(g,JSON.stringify(i,null,2)+`
|
|
19
|
+
`,{encoding:"utf-8",mode:384}),Sr(y,JSON.stringify(u,null,2)+`
|
|
20
|
+
`,{encoding:"utf-8",mode:384}),Je(g,384),Je(y,384),h("preview_store","preview.created",{bundle_id:o,task_id:t.taskId,status:t.status,resource_count:t.resources.length}),{bundleId:o,bundleDir:r,manifest:i,summary:u}}getBundle(t){let o=re(this.previewsDir,t),r=re(o,"manifest.json"),n=re(o,"summary.json");if(!vt(r)||!vt(n)){h("preview_store","preview.read",{bundle_id:t,found:!1});return}try{let i=JSON.parse(lo(r,"utf-8")),s=JSON.parse(lo(n,"utf-8"));return h("preview_store","preview.read",{bundle_id:t,found:!0}),{manifest:i,summary:s,bundleDir:o}}catch{h("preview_store","preview.read",{bundle_id:t,found:!1,reason:"invalid"},"warn");return}}getBundleByTaskId(t){let o=this._scanBundles();for(let r of o)if(r.task_id===t)return this.getBundle(r.bundle_id)}getLatest(){let t=this._scanBundles();if(t.length!==0)return t.sort(xr),this.getBundle(t[0].bundle_id)}listBundles(t){let o=this._scanBundles();return o.sort(xr),t!==void 0&&t>0?o.slice(0,t):o}_scanBundles(){if(!vt(this.previewsDir))return[];let t=oa(this.previewsDir,{withFileTypes:!0}),o=[];for(let r of t){if(!r.isDirectory())continue;let n=re(this.previewsDir,r.name,"manifest.json");if(vt(n))try{let i=JSON.parse(lo(n,"utf-8"));o.push(i)}catch{}}return o}};function uo(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(o){let r=o instanceof Error?o.message:String(o);return h("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: ${r}`}}}var da={image:"hogi://image/",video:"hogi://video/",audio:"hogi://audio/"},ca={image:"image/jpeg",video:"video/mp4",audio:"audio/mpeg"};function Nr(e){return e==="pending"?"queued":e==="processing"?"running":e}function Fe(e){return e.status==="succeeded"||e.status==="failed"||e.status==="cancelled"}function la(e){if(!(e instanceof c))return!1;if(e.code===l.NETWORK_ERROR||e.code===l.GENERATION_TIMEOUT)return!0;let t=Dr(e);return t.response_protocol===!0||t.request_outcome==="unknown"}function Dr(e){return e.details&&typeof e.details=="object"&&!Array.isArray(e.details)?e.details:{}}function _e(e){if(e.taskStore.get(e.task.id)?.backendTaskId)return e.error;let t=e.error instanceof c?e.error.code:l.GENERATION_FAILED,o=e.error instanceof Error?e.error.message:String(e.error);if(la(e.error))return e.taskStore.update(e.task.id,{status:"submitting",error:{code:t,message:o}}),new c(t,o,{...Dr(e.error),submission_outcome:"unknown",local_task_id:e.task.id,task_status:"submitting",retry_command:`oiioii task retry ${e.task.id}`});let r=e.taskStore.update(e.task.id,{status:"failed",error:{code:t,message:o}})??e.task;return uo({taskStore:e.taskStore,previewStore:e.previewStore,task:r,resources:[],status:"failed",error:{code:t,message:o}}),e.error}function ua(e){let t=da[e.mediaType],o=e.outputUris.find(r=>!r.startsWith(t));if(o)throw new c(l.SERVER_ERROR,`Backend ${e.mediaType} task returned an incompatible resource URI`,{task_id:e.taskId,uri:o});if(e.status==="succeeded"&&e.outputUris.length===0)throw new c(l.SERVER_ERROR,`Backend task ${e.taskId} succeeded without an output URI`);return e.outputUris}function ma(e){let t=e.previewStore??new ge({configDir:e.taskStore.getConfigDir()});if(t.getBundleByTaskId(e.task.id))return;let o=e.task.status==="failed"||e.task.status==="cancelled";return uo({taskStore:e.taskStore,previewStore:t,task:e.task,resources:e.task.resourceUris.map(r=>({uri:r,mime_type:e.task.mediaType?ca[e.task.mediaType]:void 0})),status:o?"failed":"succeeded",...o?{error:e.task.error??{code:e.task.status==="cancelled"?"GENERATION_CANCELLED":l.GENERATION_FAILED,message:e.task.status==="cancelled"?"Generation was cancelled":"Generation failed"}}:{}})}async function he(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,idempotencyKey:e.task.id}),o=e.taskStore.update(e.task.id,{backendTaskId:t.taskId,backendAssetId:t.assetId,backendBaseUrl:e.backendBaseUrl.replace(/\/+$/,""),mediaType:t.mediaType,status:t.status==="succeeded"||t.status==="failed"||t.status==="cancelled"?"running":Nr(t.status),progress:0,lastSyncedAt:new Date().toISOString(),error:null});if(!o)throw new c(l.SERVER_ERROR,`Local task disappeared after submission: ${e.task.id}`);if(h("async_generation","submission.cached",{local_task_id:o.id,backend_task_id:t.taskId,status:o.status}),!(t.status==="succeeded"||t.status==="failed"||t.status==="cancelled"))return{submission:t,task:o};let n=await mo({client:e.client,taskStore:e.taskStore,previewStore:e.previewStore,task:o});if(n.task.status==="failed"||n.task.status==="cancelled")throw new c(l.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 Ur(e){if(e.task.backendTaskId)throw new c(l.INVALID_ARGUMENT,`Task ${e.task.id} has already been accepted by the backend.`);if(e.task.status!=="submitting"||!e.task.pendingSubmission||!e.task.error)throw new c(l.INVALID_ARGUMENT,`Task ${e.task.id} is not an ambiguous submission that can be retried.`);let t=e.task.pendingSubmission;try{return await he({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,input:t.input})}catch(o){throw _e({taskStore:e.taskStore,previewStore:e.previewStore,task:e.task,error:o})}}async function mo(e){if(!e.task.backendTaskId){if(Fe(e.task))return{task:e.task};throw new c(l.TASK_NOT_FOUND,`Task ${e.task.id} has no cached backend async-task ID.`)}let t=await e.client.query(e.task.workspaceId,e.task.backendTaskId);if(e.task.mediaType&&e.task.mediaType!==t.mediaType)throw new c(l.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 o=ua(t),r=e.taskStore.update(e.task.id,{backendAssetId:t.assetId,mediaType:t.mediaType,status:Nr(t.status),progress:t.progress,resourceUris:o,lastSyncedAt:new Date().toISOString(),error:t.error});if(!r)throw new c(l.SERVER_ERROR,`Local task disappeared during synchronization: ${e.task.id}`);if(h("async_generation","task.cache_synchronized",{local_task_id:r.id,backend_task_id:r.backendTaskId,status:r.status,progress:r.progress,output_count:r.resourceUris.length}),!Fe(r))return{task:r};let n=ma({taskStore:e.taskStore,previewStore:e.previewStore,task:r});return h("async_generation","task.terminal_projected",{local_task_id:r.id,backend_task_id:r.backendTaskId,status:r.status,preview_warning:n!==void 0}),{task:r,...n?{previewWarning:n}:{}}}import{createHash as pa}from"crypto";function ne(e){return`sha256:${pa("sha256").update("oiioii-cli-task-credential-v1\0").update(e).digest("hex")}`}var bt=["text2Video","firstframe2Video","endframe2Video","frame2Video","image2Video","omni2Video"],W=(e,t=!1)=>({name:"imageUrl",max:e,single:t}),Ge=e=>({name:"images",max:e}),ye=(e,t=!1)=>({name:"videoUrl",max:e,single:t}),Rt=e=>({name:"audioUrl",max:e}),Mr=["text2Video","firstframe2Video"],Pr=["text2Video","image2Video","omni2Video"],Oe=["text2Video","firstframe2Video","frame2Video","image2Video","omni2Video"];function fa(e){return e==="2.7"?{fields:{image:W(5),video:ye(1,!0)},modes:Oe,totalMax:5}:{fields:{image:W(10),video:ye(5),audio:Rt(5)},modes:Oe}}function ga(e){return e?.toLowerCase()==="kling-v3-omni"?{fields:{image:Ge(),video:ye()},modes:Oe}:{fields:{image:Ge()},modes:e==="2.6"?Mr:["text2Video","firstframe2Video","frame2Video"]}}function _a(e){return e==="viduQ3Ref"||e==="viduQ3MixRef"||e==="viduQ3Ad"?{fields:{image:W(7)},modes:["image2Video","omni2Video"]}:e==="viduQ3"?{fields:{image:W(7)},modes:["text2Video","firstframe2Video","image2Video","omni2Video"]}:{fields:{image:W(7)},modes:Oe}}function _o(e,t){return e==="generate_video_wan"?fa(t):e==="generate_video_kling"?ga(t):e==="generate_video_vidu"?_a(t):{generate_video_seedance20:{fields:{image:W(9),video:ye(3),audio:Rt(3)},modes:Oe},generate_video_seedance25:{fields:{image:W(30),video:ye(10),audio:Rt(10)},modes:Oe,totalMax:50},generate_video_minimax_h3:{fields:{image:W(9),video:ye(3),audio:Rt(3)},modes:[...Oe,"endframe2Video"],audioRequiresVisual:!0},generate_video_wan27:{fields:{image:W(5),video:ye(1,!0)},modes:Oe,totalMax:5},generate_video_wan26:{fields:{image:W(5),video:ye(1,!0)},modes:["text2Video","firstframe2Video","image2Video","omni2Video"]},generate_video_gemini_omni:{fields:{image:Ge(5),video:ye(1,!0)},modes:Pr,totalMax:5},generate_video_grok_imagine:{fields:{image:W(1,!0)},modes:Mr},generate_video_grok_imagine_15:{fields:{image:W(1,!0)},modes:["firstframe2Video"]},generate_video_grok_imagine_15_fast:{fields:{image:W(7)},modes:Pr},generate_video_happyhorse:{fields:{image:W(9)},modes:["text2Video","firstframe2Video","image2Video","omni2Video"]},generate_video_happyhorse11:{fields:{image:W(9)},modes:["text2Video","firstframe2Video","image2Video","omni2Video"]},generate_video_sora2:{fields:{image:Ge()}},generate_video_sora2_pro:{fields:{image:Ge()}},generate_video_kling_o1:{fields:{image:Ge()}},generate_video_midjourney:{fields:{image:Ge()}},generate_video_veo3:{fields:{image:W(1,!0)}},generate_video_hailuo02:{fields:{image:W(2)}}}[e]}function Lr(e,t){let o=_o(e,t);if(o)return{image:o.fields.image!==void 0,video:o.fields.video!==void 0,audio:o.fields.audio!==void 0}}function $r(e,t){let o=_o(e,t);return!o||!o.modes?!0:o.modes.includes("text2Video")}function po(e){return[...new Set((e??[]).map(t=>t.trim()).filter(Boolean))]}function fo(e,t,o){let r=e.find(n=>!n.startsWith(o));if(r)throw new c(l.INVALID_ARGUMENT,`Video ${t} references must use ${o} URIs: ${r}`)}function ie(e,t={}){return new c(l.MODEL_CONSTRAINT_VIOLATION,e,{category:"validation",retryable:!1,...t})}function go(e,t,o,r,n){if(r.length!==0){if(!n)throw ie(`${t} does not support ${o} references.`,{field:o});if(n.max!==void 0&&r.length>n.max)throw ie(`${t} supports at most ${n.max} ${o} references; received ${r.length}.`,{field:o,received:r.length,supported_max:n.max});if(n.single&&r.length>1)throw ie(`${t} supports only one ${o} reference.`,{field:o,received:r.length,supported_max:1});e[n.name]=n.single?r[0]:r}}function ha(e,t){return t.images.length+t.videos.length+t.audios.length===0?"text2Video":e.modes?.includes("omni2Video")||t.videos.length||t.audios.length?"omni2Video":e.modes?.includes("image2Video")?"image2Video":t.images.length===1&&e.modes?.includes("firstframe2Video")?"firstframe2Video":t.images.length===2&&e.modes?.includes("frame2Video")?"frame2Video":"image2Video"}function Vr(e){let t={images:po(e.images),videos:po(e.videos),audios:po(e.audios)};fo(t.images,"images","hogi://image/"),fo(t.videos,"videos","hogi://video/"),fo(t.audios,"audios","hogi://audio/");let o=t.images.length+t.videos.length+t.audios.length,r=_o(e.toolName,e.version);if(!r){if(o===0)return{args:{},mode:"text2Video",references:t};throw new c(l.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(r.totalMax!==void 0&&o>r.totalMax)throw ie(`${e.toolName} supports at most ${r.totalMax} total references; received ${o}.`,{field:"references",received:o,supported_max:r.totalMax});if(r.audioRequiresVisual&&t.audios.length>0&&t.images.length===0&&t.videos.length===0)throw ie(`${e.toolName} audio references require at least one image or video reference.`,{field:"audio"});let n=e.mode&&e.mode!=="auto"?e.mode:ha(r,t);if(e.mode&&e.mode!=="auto"&&!r.modes)throw new c(l.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(r.modes&&!r.modes.includes(n))throw new c(l.MODEL_CONSTRAINT_VIOLATION,`${e.toolName} does not support ${n}. Supported modes: ${r.modes.join(", ")}.`,{category:"validation",retryable:!1,field:"mode",received:n,supported:r.modes});if(n==="text2Video"&&o>0)throw ie("text2Video does not accept image, video, or audio references.",{field:"references"});if((n==="firstframe2Video"||n==="endframe2Video")&&(t.images.length!==1||t.videos.length>0||t.audios.length>0))throw ie(`${n} requires exactly one image and no video or audio references.`,{field:"references",mode:n});if(n==="frame2Video"&&(t.images.length!==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:n});if(n==="image2Video"&&(t.images.length===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:n});if(n==="omni2Video"&&o===0)throw ie("omni2Video requires at least one reference; use text2Video for prompt-only generation.",{field:"references",mode:n});let i={};return go(i,e.toolName,"image",t.images,r.fields.image),go(i,e.toolName,"video",t.videos,r.fields.video),go(i,e.toolName,"audio",t.audios,r.fields.audio),r.modes&&(i.generateMode=n),{args:i,mode:n,references:t}}var Fr={image:!1,video:!1,audio:!1};function Et(e){let t=Fr;if(e.toolName.startsWith("generate_image_"))t={image:!0,video:!1,audio:!1};else if(e.toolName.startsWith("generate_video_"))t=Lr(e.toolName,e.variant)??Fr;else if(e.toolName==="generate_music_seed_audio"){let o=new Set(e.catalog?.input_capabilities??["text"]);t={image:o.has("image"),video:!1,audio:o.has("audio")}}return{text:!0,image:t.image&&e.catalog?.reference_image_count_max!==0,video:t.video,audio:t.audio,file:!1}}function dt(e){let t=typeof e.catalog?.reference_image_count_min=="number"&&e.catalog.reference_image_count_min>0;return{media:Et(e),prompt_only_supported:!t&&(!e.toolName.startsWith("generate_video_")||$r(e.toolName,e.variant))}}function Be(e){if(dt(e).prompt_only_supported)return;let t=e.catalog?.reference_image_count_min,o=typeof t=="number"&&t>0;throw new c(l.MODEL_CONSTRAINT_VIOLATION,o?`${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,...o?{field:"reference_image_count_min",received:0,supported_min:t}:{field:"generateMode",received:"text2Video"}})}function Ye(e,t){let o=e.catalog?.reference_image_count_min,r=e.catalog?.reference_image_count_max;if(typeof o=="number"&&t<o)throw new c(l.MODEL_CONSTRAINT_VIOLATION,`${e.name??e.key??e.toolName} requires at least ${o} reference images; received ${t}.`,{category:"validation",retryable:!1,field:"reference_image_count_min",received:t,supported_min:o});if(t!==0){if(!Et(e).image)throw new c(l.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,...r===0?{supported_max:0}:{}});if(typeof r=="number"&&t>r)throw new c(l.MODEL_CONSTRAINT_VIOLATION,`${e.name??e.key??e.toolName} supports at most ${r} reference images; received ${t}.`,{category:"validation",retryable:!1,field:"reference_image_count_max",received:t,supported_max:r})}}function Tt(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=Object.entries(e).filter(o=>typeof o[1]=="number");return Object.fromEntries(t)}function ct(e,t){if(!e||!t)return;let o=e[t];if(o!==void 0)return o;let r=Object.keys(e).find(n=>n.toLowerCase()===t.toLowerCase());return r?e[r]:void 0}function Gr(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function ho(e){let t=Number.EPSILON*Math.max(1,Math.abs(e))*8;return e<=0?0:Math.max(1,Math.ceil(e-t))}function At(e){let{pricing:t}=e,o=e.tier==="free"?"free":"member",r=t.mcp_method_name.startsWith("generate_video_"),n=t.audio_pricing_mode==="per_second",i=e.referenceVideoDuration??0;if(e.duration!==void 0&&(!Number.isFinite(e.duration)||e.duration<=0))throw new c(l.INVALID_ARGUMENT,"Duration must be a positive number");if(!Number.isFinite(i)||i<0)throw new c(l.INVALID_ARGUMENT,"Reference video duration must be zero or positive");let s=t.points_cost,a=Gr(t.free_user_points_cost)??s,d=o==="free"?a:s,m=Tt(t.resolution_pricing),p=Tt(t.free_user_resolution_pricing)??m,u=Tt(t.resolution_pricing_with_video),g=Tt(t.free_user_resolution_pricing_with_video)??u,y=o==="free"?p:m,w=o==="free"?g:u,E=i>0?w:y,R=e.resolution;if(t.mcp_method_name==="generate_image_gpt_image2"&&e.resolution&&ct(E,e.resolution)===void 0&&/^[124]k$/i.test(e.resolution)){let ae=e.quality?.trim().toLowerCase()??(e.resolution.toLowerCase()==="1k"?"low":"medium"),Ie=`${e.resolution}-${ae}`;(ct(E,Ie)!==void 0||ct(y,Ie)!==void 0)&&(R=Ie)}let T=(i>0?ct(w,R):void 0)??ct(y,R)??d,v=t.promo_active===!0&&Gr(t.promo_discount_percent)!==void 0,b=v?t.promo_discount_percent/100:1,k=T*b,q=e.duration??(r?10:void 0),j=q!==void 0?q+(r?i:0):void 0;return{estimate:!0,estimated_points:r&&j!==void 0?ho(k*j):n&&q!==void 0?ho(k*q):v?ho(k):T,unit_points:T,tier:o,billing_unit:r||n?"second":"request",...j!==void 0&&(r||n)?{billed_duration:j}:{},promo_applied:v,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 Qe(e,t,o){let r=e.catalog,n=r?At({pricing:r,tier:"member",...typeof o.duration=="number"?{duration:o.duration}:{},...typeof o.resolution=="string"?{resolution:o.resolution}:{},...typeof o.quality=="string"?{quality:o.quality}:{},...typeof o.referenceVideoDuration=="number"?{referenceVideoDuration:o.referenceVideoDuration}:{}}):void 0;return{valid:!0,resolved:{arguments:o,contract:{source:"cli_model_catalog_and_command_schema",input_capabilities:Ar(e),input_capabilities_scope:"model_input_modalities",generation_input_contract:dt(e),...t==="image"?{reference_images:{capability_field:"reference_image_count_max",count_min:r?.reference_image_count_min??null,count_max:r?.reference_image_count_max??null,source:typeof r?.reference_image_count_max=="number"?"catalog":"frontend_fallback",supported:r?.reference_image_count_max!==0}}:{},constraints:{aspect_ratios:r?.aspect_ratios??[],durations:r?.durations??[],sizes:r?.sizes??[]}},media_type:t,mcp_method_name:e.toolName,model_id:e.modelId??null,variant:e.variant??null},estimate:{caveat:r?`${n?.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:n?.estimated_points??null},warnings:r?[]: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 we(e,t){if(t){_(I("generation_dry_run",e));return}x("Generation request is valid (dry-run; nothing was submitted)"),e.resolved.model_id!==null&&f(` Model ID: ${e.resolved.model_id}`),f(` Tool: ${e.resolved.mcp_method_name}`),e.resolved.variant&&f(` Variant: ${e.resolved.variant}`),f(` Points: ${e.estimate.points??"unknown"}${e.estimate.points!==null?" (estimated)":""}`),f(` Arguments: ${JSON.stringify(e.resolved.arguments)}`);for(let o of e.warnings)V(`${o.code}: ${o.message}`)}var Xe="seedream45",We="seedance20",Ct="seed-audio";var Wr=D,qr=U;function jr(e,t){let o=e.workspace;if(o)return{workspaceId:o,source:"flag"};let r=process.env.OIIOII_WORKSPACE_ID;if(r)return{workspaceId:r,source:"env"};let n=t.loadResolved();if(n.defaultWorkspaceId)return{workspaceId:n.defaultWorkspaceId,source:"config"};throw new c(l.WORKSPACE_REQUIRED,"No workspace set. Run: oiioii workspace set <workspace_id>")}function wa(e){let t=/^(\d+)x(\d+)$/.exec(e.trim());if(!t)throw new c(l.INVALID_ARGUMENT,`Invalid image size: ${e}. Expected <width>x<height>.`);let o=Number(t[1]),r=Number(t[2]);if(o<=0||r<=0)throw new c(l.INVALID_ARGUMENT,`Invalid image size: ${e}. Dimensions must be positive.`);let n=(s,a)=>a===0?s:n(a,s%a),i=n(o,r);return`${o/i}:${r/i}`}function ka(e,t){let o=at(e,{aspectRatio:"1:1",resolution:"2K"}),r=t.aspectRatio??(t.size?wa(t.size):o.aspectRatio),n=t.resolution??o.resolution,i;if(e.toolName==="generate_image_gpt4o"){let[s=1,a=1]=r.split(":").map(Number);i={size:s===a?"1024x1024":s>a?"1536x1024":"1024x1536"}}else i={aspectRatio:r,resolution:n};return Ve(e,{aspectRatio:r,resolution:n}),{args:i,aspectRatio:r,resolution:n}}function zr(e){let{images:t,...o}=e;return{...o,...Array.isArray(t)?{referenceImages:t}:{}}}async function yo(e,t,o,r,n,i){let s=await $e({domain:"image",model:e.model,modelId:e.modelId,variant:e.variant,requireActiveCatalog:i,baseUrl:r,apiKey:o,fetch:n.fetch});t==="text"?Be(s):Ye(s,1);let a=ka(s,e);return{selection:s,resolved:{aspectRatio:a.aspectRatio,resolution:a.resolution},args:{prompt:e.prompt,...t==="edit"?{images:[e.image]}:{},...a.args,...s.variant?{version:s.variant}:{}}}}async function Kr(e,t,o,r,n){let{selection:i,args:s}=await yo(e,t,o,r,n,!0);return Qe(i,"image",s)}async function Ia(e,t,o,r,n={}){let i=n.taskStore??new B,s=await yo(e,"text",o,r,n,!0),{selection:a}=s,d=a.toolName;h("image","generation.prepared",{mode:"text",model:a.key,model_id:a.modelId,variant:a.variant,workspace_id:t});let m={...s.args,workspace_id:t},p={mediaType:"image",prompt:e.prompt,model:a.variant,input:zr(s.args)},u=`oiioii image text --prompt "${e.prompt}" ${Se(a)}${e.aspectRatio?` --aspect-ratio ${e.aspectRatio}`:""}${e.size?` --size ${e.size}`:""}${e.resolution?` --resolution ${e.resolution}`:""}`,g=i.create({workspaceId:t,command:u,toolName:d,inputArgs:{provider:"mcp_genai",prompt:e.prompt,model:a.key,modelId:a.modelId,variant:a.variant,mcpMethodName:d,workspaceId:t,toolArgs:{aspectRatio:m.aspectRatio,size:m.size,resolution:m.resolution}},pendingSubmission:p,credentialFingerprint:ne(o),backendBaseUrl:r,mediaType:"image"});i.update(g.id,{status:"submitting"});let y=new H({baseUrl:r,apiKey:o,fetch:n.fetch,timeoutMs:n.imageTextTimeoutMs??Ce});try{let w=await he({client:new Q(y),taskStore:i,previewStore:n.previewStore,task:g,mediaType:"image",prompt:e.prompt,model:a.variant,backendBaseUrl:r,input:p.input}),E=w.task.resourceUris.map(T=>({type:"image",uri:T,mime_type:"image/jpeg"})),R=w.previewWarning?[w.previewWarning]:[];return h("image","generation.submitted",{local_task_id:g.id,backend_task_id:w.submission.taskId,status:w.task.status}),{task_id:w.submission.taskId,local_task_id:g.id,tool:d,model:oe(a),workspace_id:t,status:w.task.status,artifacts:E,request:{aspect_ratio:s.resolved.aspectRatio,resolution:s.resolved.resolution},...R.length>0?{warnings:R}:{}}}catch(w){let E=w instanceof c?w.code:l.GENERATION_FAILED;throw h("image","generation.command_failed",{task_id:g.id,backend_task_cached:i.get(g.id)?.backendTaskId!==void 0,error_code:E},"error"),_e({taskStore:i,previewStore:n.previewStore,task:g,error:w})}}async function va(e,t,o,r,n={}){let i=n.taskStore??new B,s=await yo(e,"edit",o,r,n,!0),{selection:a}=s,d=a.toolName;h("image","generation.prepared",{mode:"edit",model:a.key,model_id:a.modelId,variant:a.variant,workspace_id:t});let m={...s.args,workspace_id:t},p={mediaType:"image",prompt:e.prompt,model:a.variant,input:zr(s.args)},u=`oiioii image edit --image ${e.image} --prompt "${e.prompt}" ${Se(a)}${e.aspectRatio?` --aspect-ratio ${e.aspectRatio}`:""}${e.size?` --size ${e.size}`:""}${e.resolution?` --resolution ${e.resolution}`:""}`,g=i.create({workspaceId:t,command:u,toolName:d,inputArgs:{provider:"mcp_genai",prompt:e.prompt,model:a.key,modelId:a.modelId,variant:a.variant,sourceImage:e.image,mcpMethodName:d,workspaceId:t,toolArgs:{images:m.images,aspectRatio:m.aspectRatio,size:m.size,resolution:m.resolution}},pendingSubmission:p,credentialFingerprint:ne(o),backendBaseUrl:r,mediaType:"image"});i.update(g.id,{status:"submitting"});let y=new H({baseUrl:r,apiKey:o,fetch:n.fetch,timeoutMs:n.imageTextTimeoutMs??Ce});try{let w=await he({client:new Q(y),taskStore:i,previewStore:n.previewStore,task:g,mediaType:"image",prompt:e.prompt,model:a.variant,backendBaseUrl:r,input:p.input}),E=w.task.resourceUris.map(T=>({type:"image",uri:T,mime_type:"image/jpeg"})),R=w.previewWarning?[w.previewWarning]:[];return h("image","generation.submitted",{local_task_id:g.id,backend_task_id:w.submission.taskId,status:w.task.status}),{task_id:w.submission.taskId,local_task_id:g.id,tool:d,model:oe(a),workspace_id:t,status:w.task.status,artifacts:E,request:{aspect_ratio:s.resolved.aspectRatio,resolution:s.resolved.resolution},...R.length>0?{warnings:R}:{}}}catch(w){let E=w instanceof c?w.code:l.GENERATION_FAILED;throw h("image","generation.command_failed",{task_id:g.id,backend_task_cached:i.get(g.id)?.backendTaskId!==void 0,error_code:E},"error"),_e({taskStore:i,previewStore:n.previewStore,task:g,error:w})}}function Hr(e={}){let t=new ya("image").description("Image generation commands");return t.command("text").description("Generate image from text prompt").requiredOption("--prompt <text>","Image description").option("--model <model>","Model name",Xe).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 Br("--size <size>","Deprecated <width>x<height> compatibility option").hideHelp()).option("--resolution <resolution>","Image resolution (defaults to the selected model catalog)").option("--dry-run","Validate and preview the resolved request without submitting").action(async(o,r)=>{let n=Wr(r),i=qr(r),s=e.configStore??new N;try{let a=P(i,s),d=a.baseUrl,{workspaceId:m}=jr(i,s),p={prompt:o.prompt,model:o.model,modelId:o.modelId,variant:o.variant,size:o.size,aspectRatio:o.aspectRatio,resolution:o.resolution};if(o.dryRun===!0){we(await Kr(p,"text",a.apiKey,d,e),n);return}let u=await Ia(p,m,a.apiKey,d,e);if(S({media_type:"image",generation_mode:"text",model_key:u.model.key,...u.model.model_id!==void 0?{model_id:u.model.model_id}:{},...u.model.variant?{variant:u.model.variant}:{},resolution:u.request.resolution,aspect_ratio:u.request.aspect_ratio,artifact_count:u.artifacts.length,warning_count:u.warnings?.length??0}),u.warnings?.length&&te(),n)_(I(u.status==="succeeded"?"generation_completed":"generation_submitted",{task_id:u.task_id,local_task_id:u.local_task_id,tool:u.tool,model:u.model,workspace_id:u.workspace_id,status:u.status,artifacts:u.artifacts,request:u.request,...u.warnings?{warnings:u.warnings}:{}},[...u.artifacts.length>0?[{command:`oiioii record get ${u.artifacts[0].uri} --json`,description:"Get generation record details"}]:[],{command:`oiioii task status ${u.task_id} --json`,description:"Check task status"}]));else{x(u.status==="succeeded"?"Image generated successfully":"Image generation submitted"),f(` Task ID: ${u.task_id}`),f(` Model: ${u.model.name??u.model.key}${u.model.variant?` (${u.model.variant})`:""}`);for(let g of u.artifacts)f(` URI: ${g.uri}`);for(let g of u.warnings??[])V(`Warning: ${g.message}`);u.artifacts.length>0?f(`
|
|
21
21
|
Next: oiioii record get ${u.artifacts[0].uri}`):f(`
|
|
22
|
-
Next: oiioii task wait ${u.task_id} --json`)}}catch(a){if(a instanceof
|
|
22
|
+
Next: oiioii task wait ${u.task_id} --json`)}}catch(a){if(a instanceof c){n?_(A("generation_failed",a.code,a.message,a.details)):C(a.message),process.exitCode=1;return}let d=a instanceof Error?a.message:String(a);n?_(A("generation_failed",l.GENERATION_FAILED,d)):C(d),process.exitCode=1}}),t.command("edit").description("Edit an existing image (image-to-image)").requiredOption("--image <uri>","Source image (hogi:// URI)").requiredOption("--prompt <text>","Edit instruction").option("--model <model>","Model name",Xe).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 Br("--size <size>","Deprecated <width>x<height> compatibility option").hideHelp()).option("--resolution <resolution>","Image resolution (defaults to the selected model catalog)").option("--dry-run","Validate and preview the resolved request without submitting").action(async(o,r)=>{let n=Wr(r),i=qr(r),s=e.configStore??new N;try{let a=P(i,s),d=a.baseUrl,{workspaceId:m}=jr(i,s),p={image:o.image,prompt:o.prompt,model:o.model,modelId:o.modelId,variant:o.variant,size:o.size,aspectRatio:o.aspectRatio,resolution:o.resolution};if(o.dryRun===!0){we(await Kr(p,"edit",a.apiKey,d,e),n);return}let u=await va(p,m,a.apiKey,d,e);if(S({media_type:"image",generation_mode:"image",model_key:u.model.key,...u.model.model_id!==void 0?{model_id:u.model.model_id}:{},...u.model.variant?{variant:u.model.variant}:{},resolution:u.request.resolution,aspect_ratio:u.request.aspect_ratio,artifact_count:u.artifacts.length,warning_count:u.warnings?.length??0}),u.warnings?.length&&te(),n)_(I(u.status==="succeeded"?"generation_completed":"generation_submitted",{task_id:u.task_id,local_task_id:u.local_task_id,tool:u.tool,model:u.model,workspace_id:u.workspace_id,status:u.status,artifacts:u.artifacts,request:u.request,...u.warnings?{warnings:u.warnings}:{}},[...u.artifacts.length>0?[{command:`oiioii record get ${u.artifacts[0].uri} --json`,description:"Get generation record details"}]:[],{command:`oiioii task status ${u.task_id} --json`,description:"Check task status"}]));else{x(u.status==="succeeded"?"Image edited successfully":"Image edit submitted"),f(` Task ID: ${u.task_id}`),f(` Model: ${u.model.name??u.model.key}${u.model.variant?` (${u.model.variant})`:""}`),f(` Source: ${o.image}`);for(let g of u.artifacts)f(` URI: ${g.uri}`);for(let g of u.warnings??[])V(`Warning: ${g.message}`);u.artifacts.length>0?f(`
|
|
23
23
|
Next: oiioii record get ${u.artifacts[0].uri}`):f(`
|
|
24
|
-
Next: oiioii task wait ${u.task_id} --json`)}}catch(a){if(a instanceof
|
|
24
|
+
Next: oiioii task wait ${u.task_id} --json`)}}catch(a){if(a instanceof c){n?_(A("generation_failed",a.code,a.message,a.details)):C(a.message),process.exitCode=1;return}let d=a instanceof Error?a.message:String(a);n?_(A("generation_failed",l.GENERATION_FAILED,d)):C(d),process.exitCode=1}}),t}import{Command as Ra}from"commander";var ba="generate_video_grok_imagine",wo=D,ko=U;function Jr(e){return typeof e=="string"&&e?[e]:Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.length>0):[]}function Qr(e){let{imageUrl:t,images:o,...r}=e,n=[...new Set([...Jr(t),...Jr(o)])];return{...r,...n.length>0?{referenceImages:n}:{}}}function Io(e,t){let o=e.workspace;if(o)return{workspaceId:o,source:"flag"};let r=process.env.OIIOII_WORKSPACE_ID;if(r)return{workspaceId:r,source:"env"};let n=t.loadResolved();if(n.defaultWorkspaceId)return{workspaceId:n.defaultWorkspaceId,source:"config"};throw new c(l.WORKSPACE_REQUIRED,"No workspace set. Run: oiioii workspace set <workspace_id>")}function lt(e){let t=typeof e=="number"?e:Number.parseInt(String(e),10);if(!Number.isInteger(t)||t<=0)throw new c(l.INVALID_ARGUMENT,`Invalid duration: ${String(e)}. Duration must be a positive integer number of seconds.`);return t}async function Xr(e,t,o,r,n){let i=await $e({domain:"video",model:e.model,modelId:e.modelId,variant:e.variant,requireActiveCatalog:n,baseUrl:o,apiKey:t,fetch:r.fetch}),s=at(i,{aspectRatio:"16:9",resolution:"720p",duration:5}),a=e.duration===void 0?s.duration:lt(e.duration),d=e.aspectRatio??s.aspectRatio,m=e.resolution??s.resolution;return Be(i),Ve(i,{aspectRatio:d,resolution:m,duration:a}),{duration:a,aspectRatio:d,resolution:m,selection:i,args:{prompt:e.prompt,resolution:m,duration:a,aspectRatio:d,...i.toolName===ba?{generateMode:"text2Video"}:{},...i.variant?{version:i.variant}:{}}}}async function Zr(e,t,o,r,n){let i=await $e({domain:"video",model:e.model,modelId:e.modelId,variant:e.variant,requireActiveCatalog:n,baseUrl:o,apiKey:t,fetch:r.fetch}),s=at(i,{aspectRatio:"16:9",resolution:"720p",duration:5}),a=e.duration===void 0?s.duration:lt(e.duration),d=e.aspectRatio??s.aspectRatio,m=e.resolution??s.resolution,p=Vr({toolName:i.toolName,version:i.variant,images:[...e.image?[e.image]:[],...e.images??[]],videos:e.videos,audios:e.audios,mode:e.mode});return p.references.images.length+p.references.videos.length+p.references.audios.length===0?Be(i):Ye(i,p.references.images.length),Ve(i,{aspectRatio:d,resolution:m,duration:a}),{duration:a,aspectRatio:d,resolution:m,references:p,selection:i,args:{prompt:e.prompt,...p.args,resolution:m,duration:a,aspectRatio:d,...i.variant?{version:i.variant}:{}}}}async function vo(e,t,o,r,n){let i=t==="text"?await Xr(e,o,r,n,!0):await Zr(e,o,r,n,!0);return Qe(i.selection,"video",i.args)}async function Ea(e,t,o,r,n={}){let i=n.taskStore??new B,s=await Xr(e,o,r,n,!0),{duration:a,aspectRatio:d,resolution:m,selection:p}=s,u=p.toolName;h("video","generation.prepared",{mode:"text",model:p.key,model_id:p.modelId,variant:p.variant,workspace_id:t});let g={...s.args,workspace_id:t},y={mediaType:"video",prompt:e.prompt,model:p.variant,input:Qr(s.args)},w=`oiioii video text --prompt "${e.prompt}" ${Se(p)} --duration ${a} --aspect-ratio ${d} --resolution ${m}`,E=i.create({workspaceId:t,command:w,toolName:u,inputArgs:{provider:"mcp_genai",prompt:e.prompt,model:p.key,modelId:p.modelId,variant:p.variant,mcpMethodName:u,workspaceId:t,aspectRatio:d,duration:a,toolArgs:g},pendingSubmission:y,credentialFingerprint:ne(o),backendBaseUrl:r,mediaType:"video"});i.update(E.id,{status:"submitting"});let R=new H({baseUrl:r,apiKey:o,fetch:n.fetch,timeoutMs:n.videoTextTimeoutMs??Ce});try{let T=await he({client:new Q(R),taskStore:i,previewStore:n.previewStore,task:E,mediaType:"video",prompt:e.prompt,model:p.variant,backendBaseUrl:r,input:y.input}),v=T.task.resourceUris.map(k=>({type:"video",uri:k,mime_type:"video/mp4"})),b=T.previewWarning?[T.previewWarning]:[];return h("video","generation.submitted",{local_task_id:E.id,backend_task_id:T.submission.taskId,status:T.task.status}),{task_id:T.submission.taskId,local_task_id:E.id,tool:u,model:oe(p),workspace_id:t,status:T.task.status,generation_mode:"text2Video",artifacts:v,request:{duration_seconds:a,aspect_ratio:d,resolution:m},...b.length>0?{warnings:b}:{}}}catch(T){let v=T instanceof c?T.code:l.GENERATION_FAILED;throw h("video","generation.command_failed",{task_id:E.id,backend_task_cached:i.get(E.id)?.backendTaskId!==void 0,error_code:v},"error"),_e({taskStore:i,previewStore:n.previewStore,task:E,error:T})}}async function Yr(e,t,o,r,n={}){let i=n.taskStore??new B,s=await Zr(e,o,r,n,!0),{duration:a,aspectRatio:d,resolution:m,selection:p}=s,u=p.toolName,g=s.references;h("video","generation.prepared",{mode:g.mode,model:p.key,model_id:p.modelId,variant:p.variant,workspace_id:t,reference_image_count:g.references.images.length,reference_video_count:g.references.videos.length,reference_audio_count:g.references.audios.length});let y={...s.args,workspace_id:t},w={mediaType:"video",prompt:e.prompt,model:p.variant,input:Qr(s.args)},R=`oiioii video generate ${[...g.references.images.map(b=>`--image ${b}`),...g.references.videos.map(b=>`--video ${b}`),...g.references.audios.map(b=>`--audio ${b}`)].join(" ")} --prompt "${e.prompt}" ${Se(p)} --duration ${a} --aspect-ratio ${d} --resolution ${m} --mode ${g.mode}`,T=i.create({workspaceId:t,command:R,toolName:u,inputArgs:{provider:"mcp_genai",prompt:e.prompt,model:p.key,modelId:p.modelId,variant:p.variant,sourceImage:g.references.images[0],sourceImages:g.references.images,sourceVideos:g.references.videos,sourceAudios:g.references.audios,generateMode:g.mode,mcpMethodName:u,workspaceId:t,duration:a,toolArgs:y},pendingSubmission:w,credentialFingerprint:ne(o),backendBaseUrl:r,mediaType:"video"});i.update(T.id,{status:"submitting"});let v=new H({baseUrl:r,apiKey:o,fetch:n.fetch,timeoutMs:n.videoTextTimeoutMs??Ce});try{let b=await he({client:new Q(v),taskStore:i,previewStore:n.previewStore,task:T,mediaType:"video",prompt:e.prompt,model:p.variant,backendBaseUrl:r,input:w.input}),k=b.task.resourceUris.map(j=>({type:"video",uri:j,mime_type:"video/mp4"})),q=b.previewWarning?[b.previewWarning]:[];return h("video","generation.submitted",{local_task_id:T.id,backend_task_id:b.submission.taskId,status:b.task.status}),{task_id:b.submission.taskId,local_task_id:T.id,tool:u,model:oe(p),workspace_id:t,status:b.task.status,generation_mode:g.mode,artifacts:k,request:{duration_seconds:a,aspect_ratio:d,resolution:m},...q.length>0?{warnings:q}:{}}}catch(b){let k=b instanceof c?b.code:l.GENERATION_FAILED;throw h("video","generation.command_failed",{task_id:T.id,backend_task_cached:i.get(T.id)?.backendTaskId!==void 0,error_code:k},"error"),_e({taskStore:i,previewStore:n.previewStore,task:T,error:b})}}function en(e={}){let t=new Ra("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",We).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(o,r)=>{let n=wo(r),i=ko(r),s=e.configStore??new N;try{let a=P(i,s),d=a.baseUrl,{workspaceId:m}=Io(i,s),p={prompt:o.prompt,model:o.model,modelId:o.modelId,variant:o.variant,...o.duration!==void 0?{duration:lt(o.duration)}:{},aspectRatio:o.aspectRatio,resolution:o.resolution};if(o.dryRun===!0){we(await vo(p,"text",a.apiKey,d,e),n);return}let u=await Ea(p,m,a.apiKey,d,e);if(S({media_type:"video",generation_mode:"text",model_key:u.model.key,...u.model.model_id!==void 0?{model_id:u.model.model_id}:{},...u.model.variant?{variant:u.model.variant}:{},duration_seconds:u.request.duration_seconds,resolution:u.request.resolution,aspect_ratio:u.request.aspect_ratio,artifact_count:u.artifacts.length,warning_count:u.warnings?.length??0}),u.warnings?.length&&te(),n)_(I(u.status==="succeeded"?"generation_completed":"generation_submitted",{task_id:u.task_id,local_task_id:u.local_task_id,tool:u.tool,model:u.model,workspace_id:u.workspace_id,status:u.status,artifacts:u.artifacts,request:u.request,...u.warnings?{warnings:u.warnings}:{}},[...u.artifacts.length>0?[{command:`oiioii record get ${u.artifacts[0].uri} --json`,description:"Get generation record details"}]:[],{command:`oiioii task status ${u.task_id} --json`,description:"Check task status"}]));else{x(u.status==="succeeded"?"Video generated successfully":"Video generation submitted"),f(` Task ID: ${u.task_id}`),f(` Model: ${u.model.name??u.model.key}${u.model.variant?` (${u.model.variant})`:""}`),f(` Duration: ${u.request.duration_seconds}s`);for(let g of u.artifacts)f(` URI: ${g.uri}`);for(let g of u.warnings??[])V(`Warning: ${g.message}`);u.artifacts.length>0?f(`
|
|
25
25
|
Next: oiioii record get ${u.artifacts[0].uri}`):f(`
|
|
26
|
-
Next: oiioii task wait ${u.task_id} --json`)}}catch(a){if(a instanceof
|
|
27
|
-
Next: oiioii task wait ${u.task_id} --json`)}}catch(a){if(a instanceof
|
|
26
|
+
Next: oiioii task wait ${u.task_id} --json`)}}catch(a){if(a instanceof c){n?_(A("generation_failed",a.code,a.message,a.details)):C(a.message),process.exitCode=1;return}let d=a instanceof Error?a.message:String(a);n?_(A("generation_failed",l.GENERATION_FAILED,d)):C(d),process.exitCode=1}}),t.command("generate").description("Generate video from text and model-supported mixed image/video/audio references").requiredOption("--prompt <text>","Video description").option("--image <uri...>","Reference image URIs; may be combined with --video/--audio when supported").option("--video <uri...>","Reference video URIs; may be combined with --image/--audio when supported").option("--audio <uri...>","Reference audio URIs; may be combined with --image/--video when supported").option("--mode <mode>",`Generation mode (auto, ${bt.join(", ")})`,"auto").option("--model <model>","Model name",We).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(o,r)=>{let n=wo(r),i=ko(r),s=e.configStore??new N;try{let a=String(o.mode);if(a!=="auto"&&!bt.includes(a))throw new c(l.INVALID_ARGUMENT,`Invalid video mode: ${a}. Expected auto, ${bt.join(", ")}.`);let d=P(i,s),{workspaceId:m}=Io(i,s),p={prompt:o.prompt,images:o.image,videos:o.video,audios:o.audio,mode:a,model:o.model,modelId:o.modelId,variant:o.variant,...o.duration!==void 0?{duration:lt(o.duration)}:{},aspectRatio:o.aspectRatio,resolution:o.resolution};if(o.dryRun===!0){we(await vo(p,"references",d.apiKey,d.baseUrl,e),n);return}let u=await Yr(p,m,d.apiKey,d.baseUrl,e);if(S({media_type:"video",generation_mode:u.generation_mode??a,model_key:u.model.key,...u.model.model_id!==void 0?{model_id:u.model.model_id}:{},...u.model.variant?{variant:u.model.variant}:{},duration_seconds:u.request.duration_seconds,resolution:u.request.resolution,aspect_ratio:u.request.aspect_ratio,reference_image_count:o.image?.length??0,reference_video_count:o.video?.length??0,reference_audio_count:o.audio?.length??0,artifact_count:u.artifacts.length,warning_count:u.warnings?.length??0}),u.warnings?.length&&te(),n)_(I(u.status==="succeeded"?"generation_completed":"generation_submitted",{task_id:u.task_id,local_task_id:u.local_task_id,tool:u.tool,model:u.model,generation_mode:u.generation_mode,workspace_id:u.workspace_id,status:u.status,references:{images:o.image??[],videos:o.video??[],audios:o.audio??[]},artifacts:u.artifacts,request:u.request,...u.warnings?{warnings:u.warnings}:{}},[...u.artifacts.length>0?[{command:`oiioii record get ${u.artifacts[0].uri} --json`,description:"Get generation record details"}]:[],{command:`oiioii task status ${u.task_id} --json`,description:"Check task status"}]));else{x(u.status==="succeeded"?"Video generated successfully":"Video generation submitted"),f(` Task ID: ${u.task_id}`),f(` Model: ${u.model.name??u.model.key}${u.model.variant?` (${u.model.variant})`:""}`),f(` Mode: ${u.generation_mode}`),f(` Refs: ${o.image?.length??0} image, ${o.video?.length??0} video, ${o.audio?.length??0} audio`);for(let g of u.artifacts)f(` URI: ${g.uri}`);for(let g of u.warnings??[])V(`Warning: ${g.message}`);u.artifacts.length===0&&f(`
|
|
27
|
+
Next: oiioii task wait ${u.task_id} --json`)}}catch(a){if(a instanceof c)n?_(A("generation_failed",a.code,a.message,a.details)):C(a.message);else{let d=a instanceof Error?a.message:String(a);n?_(A("generation_failed",l.GENERATION_FAILED,d)):C(d)}process.exitCode=1}}),t.command("image").description("Generate video from image + prompt").requiredOption("--image <uri>","Source image (hogi:// URI)").requiredOption("--prompt <text>","Video description").option("--model <model>","Model name",We).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(o,r)=>{let n=wo(r),i=ko(r),s=e.configStore??new N;try{let a=P(i,s),d=a.baseUrl,{workspaceId:m}=Io(i,s),p={image:o.image,prompt:o.prompt,model:o.model,modelId:o.modelId,variant:o.variant,...o.duration!==void 0?{duration:lt(o.duration)}:{},aspectRatio:o.aspectRatio,resolution:o.resolution};if(o.dryRun===!0){we(await vo(p,"references",a.apiKey,d,e),n);return}let u=await Yr(p,m,a.apiKey,d,e);if(S({media_type:"video",generation_mode:"image",model_key:u.model.key,...u.model.model_id!==void 0?{model_id:u.model.model_id}:{},...u.model.variant?{variant:u.model.variant}:{},duration_seconds:u.request.duration_seconds,resolution:u.request.resolution,aspect_ratio:u.request.aspect_ratio,artifact_count:u.artifacts.length,warning_count:u.warnings?.length??0}),u.warnings?.length&&te(),n)_(I(u.status==="succeeded"?"generation_completed":"generation_submitted",{task_id:u.task_id,local_task_id:u.local_task_id,tool:u.tool,model:u.model,workspace_id:u.workspace_id,status:u.status,artifacts:u.artifacts,request:u.request,...u.warnings?{warnings:u.warnings}:{}},[...u.artifacts.length>0?[{command:`oiioii record get ${u.artifacts[0].uri} --json`,description:"Get generation record details"}]:[],{command:`oiioii task status ${u.task_id} --json`,description:"Check task status"}]));else{x(u.status==="succeeded"?"Video generated from image successfully":"Image-to-video generation submitted"),f(` Task ID: ${u.task_id}`),f(` Model: ${u.model.name??u.model.key}${u.model.variant?` (${u.model.variant})`:""}`),f(` Source: ${o.image}`),f(` Duration: ${u.request.duration_seconds}s`);for(let g of u.artifacts)f(` URI: ${g.uri}`);for(let g of u.warnings??[])V(`Warning: ${g.message}`);u.artifacts.length>0?f(`
|
|
28
28
|
Next: oiioii record get ${u.artifacts[0].uri}`):f(`
|
|
29
|
-
Next: oiioii task wait ${u.task_id} --json`)}}catch(a){if(a instanceof
|
|
30
|
-
Next: oiioii task wait ${p.task_id} --json`)}}catch(a){let l=a instanceof d?a.code:c.GENERATION_FAILED,m=a instanceof Error?a.message:String(a);n?_(A("generation_failed",l,m,a instanceof d?a.details:void 0)):C(m),process.exitCode=1}}function Na(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("--format <format>",`Output format (${Ot.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 Da(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 nn(e={}){let t=new Ea("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)",Ct).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("--format <format>",`Seed Audio output format (${Ot.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(o,r)=>await vo(o,r,e)),Na(t.command("seed-audio").description("Generate speech or audio with Seed Audio").requiredOption("--prompt <text>","Audio description")).action(async(o,r)=>await vo(o,r,e,"seed-audio")),Da(t.command("suno").description("Generate music with Suno").requiredOption("--prompt <text>","Music description; interpreted as lyrics in custom mode")).action(async(o,r)=>await vo(o,r,e,"suno")),t}import{Command as Ua}from"commander";function sn(e,t){let o=Number(e);if(!Number.isInteger(o)||o<=0)throw new d(c.INVALID_ARGUMENT,`${t} must be a positive integer.`);return o}function xt(e){f(`${e.backendTaskId??e.id} ${e.status} ${e.toolName} ${e.updatedAt}`)}function Nt(e){let t={...e};return delete t.credentialFingerprint,t}function Pa(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 Dt(e,t,o){let r=e instanceof d?e:new d(c.SERVER_ERROR,e instanceof Error?e.message:String(e));Te(r.code,r.message),t?_(A(o,r.code,r.message,r.details)):C(r.message),process.exitCode=1}function Ma(e,t,o,r=3e4){let n=t.configStore??new x,i=P(U(e),n);return new Y(new H({baseUrl:o??i.baseUrl,apiKey:i.apiKey,fetch:t.fetch,timeoutMs:r}))}async function an(e,t,o,r){if(!e.backendTaskId||Fe(e))return e;let n=o.taskStore??new G;return(await uo({client:Ma(t,o,e.backendBaseUrl,r),taskStore:n,previewStore:o.previewStore,task:e})).task}function dn(e={}){let t=new Ua("task").description("Generation task management");return t.command("list").description("List recent tasks").option("--limit <count>","Maximum tasks to return","20").action((o,r)=>{let n=D(r);try{let i=sn(o.limit,"limit"),s=(e.taskStore??new G).list(i);if(S({task_count:s.length,limit:i}),h("task","task.listed",{count:s.length,limit:i}),n)_(I("task_list",{tasks:s.map(Nt),count:s.length}));else{J("Recent Tasks");for(let a of s)xt(a);s.length===0&&f("No local tasks found.")}}catch(i){Dt(i,n,"task_list")}}),t.command("status").description("Get task status").argument("<task_id>","Task ID").action(async(o,r,n)=>{let i=D(n);try{let s=e.taskStore??new G,a=s.getByAnyId(o);if(!a)throw new d(c.TASK_NOT_FOUND,`Task not found: ${o}`);a=await an(a,n,{...e,taskStore:s}),S({task_status:a.status}),h("task","task.status_read",{task_id:o,status:a.status}),i?_(I("task_status",{task:Nt(a)})):xt(a)}catch(s){Dt(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(o,r,n)=>{let i=D(n);try{let s=e.taskStore??new G,a=s.get(o);if(!a)throw new d(c.TASK_NOT_FOUND,`Task not found: ${o}`);let l=e.configStore??new x,m=P(U(n),l);if(!a.credentialFingerprint||a.credentialFingerprint!==ne(m.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??m.baseUrl,u=await Dr({client:new Y(new H({baseUrl:p,apiKey:m.apiKey,fetch:e.fetch})),taskStore:s,previewStore:e.previewStore,task:a,backendBaseUrl:p});S({task_status:u.task.status}),h("task","task.submission_retried",{local_task_id:u.task.id,backend_task_id:u.task.backendTaskId,status:u.task.status,reused:u.submission.reused}),i?_(I("task_retry",{task:Nt(u.task),reused:u.submission.reused})):xt(u.task)}catch(s){Dt(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(o,r,n)=>{let i=D(n);try{let s=sn(r.timeout,"timeout"),a=e.taskStore??new G,l=Date.now()+s*1e3,m=a.getByAnyId(o);if(!m)throw new d(c.TASK_NOT_FOUND,`Task not found: ${o}`);if(!m.backendTaskId&&m.status==="submitting"&&m.pendingSubmission&&m.error)throw Pa(m);for(;!Fe(m)&&Date.now()<l;){let p=Math.max(1,Math.min(3e4,l-Date.now()));try{m=await an(m,n,{...e,taskStore:a},p)}catch(u){throw Date.now()>=l&&u instanceof d&&u.code===c.GENERATION_TIMEOUT?new d(c.TASK_TIMEOUT,`Timed out waiting for task ${o} after ${s}s.`):u}if(!Fe(m)){let u=Math.max(0,l-Date.now());await new Promise(g=>setTimeout(g,Math.min(e.pollIntervalMs??2e3,u)))}}if(!Fe(m))throw new d(c.TASK_TIMEOUT,`Timed out waiting for task ${o} after ${s}s.`);if(m.status==="failed"||m.status==="cancelled")throw new d(c.GENERATION_FAILED,m.error?.message??`Generation task ${m.backendTaskId??m.id} ${m.status}.`,{task_id:m.backendTaskId??m.id,local_task_id:m.id,backend_status:m.status,...m.error?{backend_error:m.error}:{}});S({task_status:m.status,timeout_seconds:s}),h("task","task.wait_completed",{task_id:o,status:m.status}),i?_(I("task_wait",{task:Nt(m)})):xt(m)}catch(s){Dt(s,i,"task_wait")}}),t}import{Command as La}from"commander";import{spawn as $a}from"child_process";var Ut=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 o=encodeURIComponent(t),r=`${this.baseUrl}/genai/image-record/by-uri?uri=${o}`,n=$({source:"hogi_genai_record_client",operation:"record.get_by_uri",method:"GET",path:"/genai/image-record/by-uri"},this.logger),i;try{return await Q({operation:"Generation record request",timeoutMs:this.timeoutMs,run:async s=>{if(i=await n.fetch(this._fetch,r,{method:"GET",headers:K({"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 l=await i.text().catch(()=>"");throw new d(c.SERVER_ERROR,`HTTP ${i.status}: ${l||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 F){let m=new d(c.NETWORK_ERROR,s.message,{retryable:!0,timeout_ms:s.timeoutMs});throw n.failure(m,i?.status),m}if(s instanceof d)throw n.failure(s,i?.status),s;let a=s instanceof Error?s.message:String(s),l=new d(c.NETWORK_ERROR,`Network error: ${a}`);throw n.failure(l),l}}};var cn=D;function ln(e){let t=new x,o=P(U(e),t);return{apiKey:o.apiKey,baseUrl:o.baseUrl}}function Va(e){let t=process.platform==="darwin"?"open":process.platform==="win32"?"cmd":"xdg-open",o=process.platform==="win32"?["/c","start","",e]:[e];try{return $a(t,o,{detached:!0,stdio:"ignore"}).unref(),!0}catch{return!1}}function un(){let e=new La("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,o,r)=>{let n=cn(r);try{let{apiKey:i,baseUrl:s}=ln(r),l=await new Ut({baseUrl:s,apiKey:i}).getByUri(t);if(S({resource_type:ht(t),record_success:l.success,output_count:l.output_uris.length}),n)_(I("record_get",{id:l.id,type:l.type,workspace_id:l.workspace_id,method:l.mcp_method_name,input_args:l.input_args,output_uris:l.output_uris,success:l.success,error_message:l.error_message,agent:l.agent,created_at:l.created_at,updated_at:l.updated_at}));else{J("Generation Record"),f(` ID: ${l.id}`),f(` Type: ${l.type}`),f(` Workspace: ${l.workspace_id}`),f(` Method: ${l.mcp_method_name}`),f(` Success: ${l.success}`),l.error_message&&f(` Error: ${l.error_message}`),f(" Output URIs:");for(let m of l.output_uris)f(` - ${m}`);f(` Created: ${l.created_at}`)}}catch(i){if(i instanceof d){n?_(A("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?_(A("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,o,r)=>{let n=cn(r);try{let{apiKey:i,baseUrl:s}=ln(r),l=await new He({baseUrl:s,apiKey:i}).download(t,{output:o.output,filename:o.filename,watermark:o.wm}),m=o.open!==!1,p=m?Va(l.path):!1;S({resource_type:ht(t),size_bucket:Me(l.bytes),watermark:o.wm===!0,open_requested:m,opened:p}),n?_(I("record_open",{uri:l.uri,path:l.path,bytes:l.bytes,mime_type:l.mimeType,opened:p})):(N(`Downloaded: ${l.path}`),f(` URI: ${l.uri}`),f(` Bytes: ${l.bytes}`),l.mimeType&&f(` Type: ${l.mimeType}`),f(` Opened: ${p}`))}catch(i){if(i instanceof d){n?_(A("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?_(A("record_open",c.SERVER_ERROR,s)):C(s),process.exitCode=1}}),e}import{Command as Fa}from"commander";var Ga={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"},Ba=[{name:"text-to-image",domain:"image",description:"Generate images from text prompts",default_model:Xe,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:Xe,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:We,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:We,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:Ct,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 Wa(){return[...Ba]}function qa(e,t){let o=[];for(let r of e){let n=r.mcp_method_name.startsWith("generate_image_")?"image":r.mcp_method_name.startsWith("generate_video_")?"video":r.mcp_method_name.startsWith("generate_music_")?"audio":void 0;if(!n||t&&n!==t)continue;let i=st(r.mcp_method_name,n);i&&o.push({id:r.id,name:r.name??r.model??i,key:i,domain:n,variant:r.model,selector:{model_id:r.id,cli_args:["--model-id",String(r.id)]},input_capabilities:r.input_capabilities??[],input_capabilities_known:Array.isArray(r.input_capabilities),reference_image_count_min:r.reference_image_count_min??null,reference_image_count_max:r.reference_image_count_max??null,generation_input_contract:dt({toolName:r.mcp_method_name,...r.model?{variant:r.model}:{},catalog:r}),points_cost:r.points_cost,sizes:r.sizes,aspect_ratios:r.aspect_ratios,durations:r.durations??[],description:r.description_i18n??{},tags:r.tags,members_only:r.members_only===!0})}return o}function mn(e){let t=e;for(;t.parent;)t=t.parent;return t.opts().json===!0}function pn(e={}){let t=new Fa("inspect").description("Inspect backend capabilities");return t.command("capabilities").description("List available GenAI capabilities").action((o,r)=>{let n=mn(r),i=Wa();if(S({item_count:i.length}),h("inspect","capabilities.listed",{count:i.length}),n)_(I("inspect_capabilities",{capabilities:i},[{command:"oiioii inspect models --json",description:"List available models"}]));else{J("Available Capabilities");for(let s of i)f(` ${s.name} (${s.domain})`),f(` ${s.description}`),f(` Default model: ${s.default_model}`),f(` Example: ${s.command_template}`),f("")}}),t.command("models").description("List available models").option("--domain <domain>","Filter by domain (image, video, or audio)").action(async(o,r)=>{let n=mn(r),i=o.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 x,l=P(U(r),a),p=await new pe({baseUrl:l.baseUrl,apiKey:l.apiKey,...e.fetch?{fetch:e.fetch}:{}}).listModels(),u=qa(p,s);if(S({item_count:u.length,backend_model_count:p.length,...s?{domain:s}:{}}),h("inspect","models.listed",{count:u.length,backend_model_count:p.length,source:"backend_model_catalog",...s?{domain:s}:{}}),n)_(I("inspect_models",{models:u,count:u.length,source:"backend_model_catalog",selection:Ga,...s?{filter:{domain:s}}:{}},[{command:"oiioii inspect capabilities --json",description:"List capabilities"}]));else{let g=s?`Available ${s} models`:"Available models";J(g);for(let y of u)f(` ${y.name} [${y.key}] (${y.domain})`),f(` Points: ${y.points_cost}${y.members_only?" \xB7 members only":""}`),y.variant&&f(` Variant: ${y.variant}`),f(` Select: --model-id ${y.id}`);f(`
|
|
31
|
-
Total: ${u.length} models`)}}),t}import{Command as
|
|
32
|
-
Next steps:`);for(let t of e.summary.next)f(` ${t.command}`)}}function
|
|
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,o){let r=this[`on${t}`];r?.(o),this.dispatch(t,o)}async sendAsync(t){this.controller=new AbortController;let o=this.timeout>0?setTimeout(()=>this.controller?.abort("timeout"),this.timeout):void 0;try{let r={method:this.method,headers:this.headers,signal:this.controller.signal},n=t instanceof mt?await t.arrayBuffer():t;this.method!=="GET"&&this.method!=="HEAD"&&n!==null&&(r.body=n);let i=t instanceof mt||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,r);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(r){this.controller.signal.aborted?this.emit(this.aborted?"abort":"timeout",{error:r}):this.emit("error",{error:r})}finally{o&&clearTimeout(o)}}};async function ad(e){let{default:t}=await import("tt-uploader"),o=await rd(e),r=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=r.addFile({file:o,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,l=e.timeoutMs??1800*1e3,m=setTimeout(()=>{try{r.cancel(n)}catch{}u(()=>s(new d(c.TASK_TIMEOUT,`VOD direct upload timed out after ${l}ms`)))},l),p=()=>{clearTimeout(m),r.removeListener("progress",y),r.removeListener("complete",w),r.removeListener("error",E);try{r.removeFile(n)}catch{}},u=v=>{a||(a=!0,p(),v())},g=v=>v.key===n,y=v=>{g(v)&&typeof v.percent=="number"&&e.onProgress?.(Math.max(0,Math.min(99,Math.round(v.percent))))},w=v=>{if(!g(v))return;let T=bn(v.uploadResult),R=T?.Vid??T?.vid;u(()=>{typeof R=="string"&&R?i(R):s(new d(c.SERVER_ERROR,"VOD upload completed without Vid"))})},E=v=>{g(v)&&u(()=>s(new d(c.SERVER_ERROR,`VOD direct upload failed: ${nd(v,e.token.stsToken)}`)))};r.on("progress",y),r.on("complete",w),r.on("error",E);try{r.start(n)}catch(v){let T=En(v instanceof Error?v.message:String(v),e.token.stsToken);u(()=>s(new d(c.SERVER_ERROR,`VOD direct upload could not start: ${T}`)))}})}var Tn=async e=>{let t=id(),o=sd();try{return await ad(e)}finally{o(),t()}};function qe(e){return e&&typeof e=="object"?e:void 0}async function ud(e,t){let o=await e.text().catch(()=>""),r;try{r=o?JSON.parse(o):{}}catch{throw new d(c.SERVER_ERROR,`Invalid JSON response from ${t}`,{status:e.status})}let n=qe(r)??{};if(!e.ok||n.success===!1){let i=n.error,s=typeof i=="string"?i:typeof qe(i)?.message=="string"?qe(i).message:`${t} failed: HTTP ${e.status}`,a={status:e.status,error:typeof i=="string"?i:void 0};throw e.status===401?new 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 md(e){let t=cd("md5");for await(let o of ld(e))t.update(o);return t.digest("hex")}function pd(e){return new Promise(t=>setTimeout(t,e))}function fd(e){let t=qe(e),o=qe(t?.stsToken);return typeof t?.appId=="number"&&Number.isFinite(t.appId)&&typeof t.spaceName=="string"&&t.spaceName.length>0&&typeof t.region=="string"&&t.region.length>0&&typeof o?.AccessKeyId=="string"&&o.AccessKeyId.length>0&&typeof o.SecretAccessKey=="string"&&o.SecretAccessKey.length>0&&typeof o.SessionToken=="string"&&o.SessionToken.length>0&&typeof o.ExpiredTime=="string"&&o.ExpiredTime.length>0}var Lt=class{baseUrl;apiKey;fetch;logger;directUpload;pollIntervalMs;timeoutMs;requestTimeoutMs;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this.fetch=t.fetch??globalThis.fetch,this.logger=t.logger,this.directUpload=t.directUpload??Tn,this.pollIntervalMs=t.pollIntervalMs??3e3,this.timeoutMs=t.timeoutMs??600*1e3,this.requestTimeoutMs=t.requestTimeoutMs??3e4}headers(t=!1){return K({"x-hogi-api-key":this.apiKey,accept:"application/json",...t?{"content-type":"application/json"}:{}})}async requestJson(t,o,r,n=this.requestTimeoutMs){let i=$({source:"hogi_vod_upload_client",operation:r,method:o.method??"GET",path:new URL(t).pathname},this.logger),s;try{let a=await Q({operation:r,timeoutMs:n,run:async l=>(s=await i.fetch(this.fetch,t,{...o,signal:l}),ud(s,r))});return i.success(s.status),a}catch(a){throw i.failure(a,s?.status),a instanceof F?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,`${r} 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 o=we(t.fileType);if(ut(o)!=="video")throw new d(c.INVALID_ARGUMENT,`VOD upload requires a supported video type: ${o||"<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 r=$({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(!fd(s))throw new d(c.SERVER_ERROR,"Invalid VOD upload_token response");let[a,l]=await Promise.all([this.directUpload({filePath:t.filePath,fileName:t.fileName,fileSize:t.fileSize,fileType:o,token:s,userId:"oiioii-cli",onProgress:t.onProgress}),md(t.filePath)]),m=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:l})},"VOD commit_upload"),p=qe(m.data);if(typeof p?.assetId!="string"||typeof p.taskId!="string")throw new d(c.SERVER_ERROR,"Invalid VOD commit_upload response");let u=await this.waitForTranscode(p.taskId,t.workspaceId);return r.success(200,{asset_id:p.assetId,task_id:p.taskId}),{assetId:p.assetId,assetUri:`hogi://asset/${p.assetId}`,fileUri:u.outputUri,taskId:p.taskId,workspaceId:t.workspaceId}}catch(n){throw r.failure(n),n}}async waitForTranscode(t,o){let r=Date.now()+this.timeoutMs;for(;Date.now()<r;){let n=new URLSearchParams({taskId:t,workspaceId:o}),i=Math.max(1,r-Date.now()),s;try{s=await this.requestJson(`${this.baseUrl}/media/vod/transcode_status?${n}`,{method:"GET",headers:this.headers()},"VOD transcode_status",Math.min(this.requestTimeoutMs,i))}catch(l){if((l instanceof d&&l.details&&typeof l.details=="object"?l.details:void 0)?.request_timeout===!0){if(Date.now()>=r)break;continue}throw l}let a=qe(s.data);if(!a||typeof a.status!="string")throw new d(c.SERVER_ERROR,"Invalid VOD transcode_status 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 pd(Math.min(this.pollIntervalMs,Math.max(0,r-Date.now())))}throw new d(c.TASK_TIMEOUT,`VOD transcode timed out after ${this.timeoutMs}ms`,{task_id:t})}};var Id=D,Rd=U;function vd(e,t){let o=e.workspace;if(typeof o=="string"&&o)return o;let r=process.env.OIIOII_WORKSPACE_ID;if(r)return r;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 Cn(e,t){let o=`hogi://${t}/`;if(!e.startsWith(o))throw new d(c.SERVER_ERROR,`Upload API returned mismatched URI/domain: expected ${o}`)}function bd(e,t,o,r=!1){return e==="video"&&(r||t==="mov"||o>=10485760)}async function Ed(e,t){let o;try{o=await t(e)}catch{throw new d(c.INVALID_ARGUMENT,`File not found: ${e}`)}if(!o.isFile())throw new d(c.INVALID_ARGUMENT,`Not a file: ${e}`);if(o.size<=0)throw new d(c.INVALID_ARGUMENT,`File is empty: ${e}`);return o.size}async function Td(e,t={},o={}){let r=o.configStore??new x,n=o.readFile??wd,i=o.stat??kd,s=P(t,r),a=s.baseUrl,l=yd(e.path),m=await Ed(l,i),p=e.fileType??wn(l);if(!p)throw new d(c.INVALID_ARGUMENT,`Cannot infer file type from path: ${e.path}. Use --type <ext>.`);let u=we(p),g=kn(u);if(e.vod===!0&&g!=="video")throw new d(c.INVALID_ARGUMENT,"--vod is only valid for video files");h("upload","upload.file_validated",{file_type:u,domain:g,size:m});let y=vd(t,r),w=e.fileName??hd(l);if(bd(g,u,m,e.vod===!0)){if(e.afterAssetId)throw new d(c.INVALID_ARGUMENT,"--after-asset-id is not supported by the VOD upload API");let k=await new Lt({baseUrl:a,apiKey:s.apiKey,fetch:o.fetch,directUpload:o.vodDirectUpload,pollIntervalMs:o.vodPollIntervalMs,timeoutMs:o.vodTimeoutMs}).uploadFile({filePath:l,fileSize:m,fileName:w,fileType:u,workspaceId:y});return Cn(k.fileUri,"video"),h("upload","upload.vod_completed",{asset_id:k.assetId,task_id:k.taskId,size:m,workspace_id:y}),{uri:k.fileUri,asset_id:k.assetId,asset_uri:k.assetUri,file_uri:k.fileUri,domain:"video",file_type:u,file_name:w,size:m,attached:!0,workspace_id:y,upload_mode:"vod",task_id:k.taskId}}let v=await n(l),R=await new Pt({baseUrl:a,apiKey:s.apiKey,fetch:o.fetch}).uploadFile({buffer:v,workspaceId:y,fileType:u,fileName:w,afterAssetId:e.afterAssetId});if(h("upload","upload.completed",{asset_id:R.assetId,domain:R.type,size:m,workspace_id:y}),Cn(R.fileUri,R.type),R.type!==g)throw new d(c.SERVER_ERROR,`Upload API returned unexpected domain: ${R.type}`);return h("upload","workspace.asset_attached",{asset_id:R.assetId,domain:R.type,workspace_id:y}),{uri:R.fileUri,asset_id:R.assetId,asset_uri:R.assetUri,file_uri:R.fileUri,domain:R.type,file_type:u,file_name:w,size:m,attached:!0,workspace_id:y,upload_mode:"direct"}}function Sn(e={}){let t=new _d("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(o,r,n)=>{let i=Id(n),s=Rd(n);try{let a=await Td({path:o,fileType:r.type,fileName:r.name,afterAssetId:r.afterAssetId,attach:r.attach===!0,vod:r.vod===!0},s,e);S({media_type:a.domain,file_extension:a.file_type,size_bucket:Me(a.size),upload_mode:a.upload_mode??"direct",forced_vod:r.vod===!0,attached:a.attached}),i?_(I("upload_file",a,[{command:`oiioii record open ${a.uri} --json`,description:"Download uploaded resource"}])):(N(`Uploaded: ${a.uri}`),f(` Domain: ${a.domain}`),f(` Type: ${a.file_type}`),f(` Size: ${a.size} bytes`),f(` Mode: ${a.upload_mode??"direct"}`),a.task_id&&f(` Task: ${a.task_id}`),a.file_name&&f(` Name: ${a.file_name}`),f(` Attach: ${a.attached?`yes (${a.workspace_id})`:"no"}`))}catch(a){if(a instanceof d){i?_(A("upload_file",a.code,a.message,a.details)):C(a.message),process.exitCode=1;return}let l=a instanceof Error?a.message:String(a);i?_(A("upload_file",c.SERVER_ERROR,l)):C(l),process.exitCode=1}}),t}import{Command as Ad}from"commander";function To(e){let t=e;for(;t.parent;)t=t.parent;return t.opts().json===!0}function Cd(e,t){if(e===void 0)return;let o=Number.parseInt(e,10);if(!Number.isInteger(o)||o<=0)throw new d(c.INVALID_ARGUMENT,`${t} must be a positive integer.`);return o}function On(e){let t=["debug","info","warn","error"],o=["application","api"];if(e.level&&!t.includes(e.level))throw new d(c.INVALID_ARGUMENT,`Unknown log level: ${e.level}.`);if(e.category&&!o.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:Cd(e.limit,"--limit")}:{}}}function xn(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 Nn(e,t,o){let r=e instanceof d?e:new d(c.CONFIG_ERROR,e instanceof Error?e.message:String(e));t?_(A(o,r.code,r.message,r.details)):C(r.message),process.exitCode=1}function Dn(e={}){let t=new Ad("logs").description("Local structured log management");return xn(t.command("list").description("List locally stored log entries")).action((o,r)=>{let n=To(r);try{let i=e.logStore??new be,s=On(o),a=i.list(s);if(S({entry_count:a.length,has_filter:Object.values(s).some(l=>l!==void 0)}),n)_(I("logs_list",{path:i.path,count:a.length,entries:a}));else if(a.length===0)f(`No logs found.
|
|
34
|
-
Path: ${i.path}`);else{J(`Logs (${a.length})`);for(let
|
|
29
|
+
Next: oiioii task wait ${u.task_id} --json`)}}catch(a){if(a instanceof c){n?_(A("generation_failed",a.code,a.message,a.details)):C(a.message),process.exitCode=1;return}let d=a instanceof Error?a.message:String(a);n?_(A("generation_failed",l.GENERATION_FAILED,d)):C(d),process.exitCode=1}}),t}import{Command as Ta}from"commander";var rn="generate_music_seed_audio",Eo="generate_music_suno",Ot=["wav","mp3","pcm","ogg_opus"];function Aa(e,t){let o=e.workspace;if(typeof o=="string"&&o)return o;let r=process.env.OIIOII_WORKSPACE_ID?.trim();if(r)return r;let n=t.loadResolved().defaultWorkspaceId;if(n)return n;throw new c(l.WORKSPACE_REQUIRED,"No workspace set. Run: oiioii workspace set <workspace_id>")}function tn(e){return[...new Set((e??[]).map(t=>t.trim()).filter(Boolean))]}function on(e,t,o){let r=e.find(n=>!n.startsWith(t));if(r)throw new c(l.INVALID_ARGUMENT,`${o} must use ${t} URIs: ${r}`)}function Ro(e,t,o,r){if(e!==void 0&&(!Number.isFinite(e)||e<o||e>r))throw se(`${t} must be between ${o} and ${r}.`,{field:t,received:e,minimum:o,maximum:r})}function se(e,t={}){return new c(l.MODEL_CONSTRAINT_VIOLATION,e,{category:"validation",retryable:!1,...t})}function Ca(e,t,o,r){let n=t.prompt.trim();if(!n)throw new c(l.INVALID_ARGUMENT,"Audio prompt must not be empty.");let i=tn(t.audioUrls),s=tn(t.referenceImages);if(on(i,"hogi://audio/","Audio references"),on(s,"hogi://image/","Image references"),e===rn){if(o&&o!=="seed-audio-1.0")throw se(`Seed Audio only supports variant seed-audio-1.0, received ${o}.`,{field:"variant",received:o,supported:["seed-audio-1.0"]});if(i.length>0&&s.length>0)throw se("Seed Audio reference images and reference audio cannot be used together.",{field:"references"});if(i.length>3)throw se("Seed Audio supports at most 3 audio references.",{field:"audio",received:i.length,supported_max:3});if(s.length>1)throw se("Seed Audio supports at most 1 reference image.",{field:"image",received:s.length,supported_max:1});if(t.custom||t.tags||t.instrumental||t.autoGenerateVideo)throw se("--custom, --tags, --instrumental, and --auto-generate-video are only valid for Suno.",{field:"suno_options"});if(Ro(t.loudnessRate,"--loudness-rate",-50,100),Ro(t.pitchRate,"--pitch-rate",-12,12),Ro(t.speechRate,"--speech-rate",-50,100),t.sampleRate!==void 0&&(!Number.isInteger(t.sampleRate)||t.sampleRate<=0))throw se("--sample-rate must be a positive integer.",{field:"sample_rate",received:t.sampleRate});let a={...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:n,...i.length?{audioUrl:i}:{},...s.length?{referenceImages:s}:{},...Object.keys(a).length?{audioConfig:a}:{},workspace_id:r},audioUrls:i,referenceImages:s,mode:i.length?"audio_reference":s.length?"image_reference":"text"}}if(e===Eo){if(i.length||s.length||t.format||t.enableSubtitle!==void 0||t.loudnessRate!==void 0||t.pitchRate!==void 0||t.sampleRate!==void 0||t.speechRate!==void 0)throw se("Reference and audio configuration options are only valid for Seed Audio.",{field:"seed_audio_options"});let a=t.custom===!0,d=t.instrumental===!0;if(!a&&t.tags)throw se("--tags requires Suno --custom mode.",{field:"tags",requires:"custom"});let m=t.tags?.trim()||(a&&d?n:void 0);return{args:{custom:a,prompt:n,...a&&m?{tags:m}:{},...a?{}:{gptDescriptionPrompt:n},instrumental:d,autoGenerateVideo:t.autoGenerateVideo===!0,...o?{version:o}:{},workspace_id:r},audioUrls:i,referenceImages:s,mode:a?"music_custom":"music_description"}}throw new c(l.MODEL_NOT_SUPPORTED,`Unsupported audio generation tool: ${e}`,{category:"validation",retryable:!1,tool:e})}function Sa(e,t){if(!t)return;let o=t==="seed-audio"?rn:Eo;if(e!==o)throw new c(l.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:o,received_tool:e})}async function nn(e,t,o,r,n,i,s){let a=await $e({domain:"audio",model:e.model,modelId:e.modelId,variant:e.variant,requireActiveCatalog:i,baseUrl:r,apiKey:o,fetch:n.fetch});Sa(a.toolName,s);let d=Ca(a.toolName,e,a.variant,t);if(d.referenceImages.length===0&&d.audioUrls.length===0)Be(a);else if(Ye(a,d.referenceImages.length),d.audioUrls.length>0&&!Et(a).audio)throw se(`${a.name??a.key} does not support reference audio.`,{field:"audio",received:d.audioUrls.length,supported:!1});return{selection:a,prepared:d}}async function Oa(e,t,o,r,n={},i){let s=n.taskStore??new B,a=await nn(e,t,o,r,n,!0,i),{prepared:d,selection:m}=a;h("audio","generation.prepared",{mode:d.mode,model:m.key,model_id:m.modelId,variant:m.variant,reference_audio_count:d.audioUrls.length,reference_image_count:d.referenceImages.length,output_format:e.format,subtitle_enabled:e.enableSubtitle===!0,custom_mode:e.custom===!0,instrumental:e.instrumental===!0,workspace_id:t});let u=`oiioii audio ${i??"generate"} --prompt "${e.prompt}" ${Se(m)}`,g={mediaType:"audio",prompt:e.prompt,model:m.variant,input:d.args},y=s.create({workspaceId:t,command:u,toolName:m.toolName,inputArgs:{provider:"mcp_genai",prompt:e.prompt,model:m.key,modelId:m.modelId,variant:m.variant,mcpMethodName:m.toolName,workspaceId:t,mode:d.mode,referenceAudioCount:d.audioUrls.length,referenceImageCount:d.referenceImages.length,toolArgs:{format:e.format,enableSubtitle:e.enableSubtitle,custom:e.custom,instrumental:e.instrumental}},pendingSubmission:g,credentialFingerprint:ne(o),backendBaseUrl:r,mediaType:"audio"});s.update(y.id,{status:"submitting"});let w=new H({baseUrl:r,apiKey:o,fetch:n.fetch,timeoutMs:n.audioGenerationTimeoutMs??Ce});try{let E=await he({client:new Q(w),taskStore:s,previewStore:n.previewStore,task:y,mediaType:"audio",prompt:e.prompt,model:m.variant,backendBaseUrl:r,input:g.input}),R=E.task.resourceUris.map(v=>({type:"audio",uri:v,mime_type:"audio/mpeg"})),T=E.previewWarning?[E.previewWarning]:[];return h("audio","generation.submitted",{local_task_id:y.id,backend_task_id:E.submission.taskId,status:E.task.status}),{task_id:E.submission.taskId,local_task_id:y.id,tool:m.toolName,model:oe(m),workspace_id:t,status:E.task.status,artifacts:R,...T.length?{warnings:T}:{}}}catch(E){let R=E instanceof c?E.code:l.GENERATION_FAILED;throw h("audio","generation.command_failed",{task_id:y.id,backend_task_cached:s.get(y.id)?.backendTaskId!==void 0,error_code:R},"error"),_e({taskStore:s,previewStore:n.previewStore,task:y,error:E})}}function St(e,t){if(e===void 0)return;let o=Number(e);if(!Number.isFinite(o))throw new c(l.INVALID_ARGUMENT,`${t} must be a number.`);return o}async function xa(e,t,o,r,n,i){let{prepared:s,selection:a}=await nn(e,t,o,r,n,!0,i),d={...s.args};return delete d.workspace_id,Qe(a,"audio",d)}function Na(e,t){let o=e.format;if(o!==void 0&&!Ot.includes(o))throw new c(l.INVALID_ARGUMENT,`Invalid audio format: ${o}. Expected ${Ot.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,format:o,enableSubtitle:e.subtitle===!0?!0:void 0,loudnessRate:St(e.loudnessRate,"--loudness-rate"),pitchRate:St(e.pitchRate,"--pitch-rate"),sampleRate:St(e.sampleRate,"--sample-rate"),speechRate:St(e.speechRate,"--speech-rate"),custom:e.custom===!0,tags:e.tags,instrumental:e.instrumental===!0,autoGenerateVideo:e.autoGenerateVideo===!0}}async function bo(e,t,o,r){let n=D(t),i=U(t),s=o.configStore??new N;try{let a=P(i,s),d=Aa(i,s),m=Na(e,r);if(e.dryRun===!0){we(await xa(m,d,a.apiKey,a.baseUrl,o,r),n);return}let p=await Oa(m,d,a.apiKey,a.baseUrl,o,r),u=p.tool===Eo?m.custom?"music_custom":"music_description":m.audioUrls?.length?"audio_reference":m.referenceImages?.length?"image_reference":"text";if(S({media_type:"audio",generation_mode:u,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:m.audioUrls?.length??0,reference_image_count:m.referenceImages?.length??0,...m.format?{output_format:m.format}:{},subtitle_enabled:m.enableSubtitle===!0,custom_mode:m.custom===!0,instrumental:m.instrumental===!0,artifact_count:p.artifacts.length,warning_count:p.warnings?.length??0}),p.warnings?.length&&te(),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{x(p.status==="succeeded"?"Audio generated successfully":"Audio generation submitted"),f(` Task ID: ${p.task_id}`),f(` Model: ${p.model.name??p.model.key}${p.model.variant?` (${p.model.variant})`:""}`);for(let g of p.artifacts)f(` URI: ${g.uri}`);for(let g of p.warnings??[])V(`Warning: ${g.message}`);p.artifacts.length===0&&f(`
|
|
30
|
+
Next: oiioii task wait ${p.task_id} --json`)}}catch(a){let d=a instanceof c?a.code:l.GENERATION_FAILED,m=a instanceof Error?a.message:String(a);n?_(A("generation_failed",d,m,a instanceof c?a.details:void 0)):C(m),process.exitCode=1}}function Da(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("--format <format>",`Output format (${Ot.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 Ua(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 sn(e={}){let t=new Ta("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)",Ct).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("--format <format>",`Seed Audio output format (${Ot.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(o,r)=>await bo(o,r,e)),Da(t.command("seed-audio").description("Generate speech or audio with Seed Audio").requiredOption("--prompt <text>","Audio description")).action(async(o,r)=>await bo(o,r,e,"seed-audio")),Ua(t.command("suno").description("Generate music with Suno").requiredOption("--prompt <text>","Music description; interpreted as lyrics in custom mode")).action(async(o,r)=>await bo(o,r,e,"suno")),t}import{Command as Pa}from"commander";function an(e,t){let o=Number(e);if(!Number.isInteger(o)||o<=0)throw new c(l.INVALID_ARGUMENT,`${t} must be a positive integer.`);return o}function xt(e){f(`${e.backendTaskId??e.id} ${e.status} ${e.toolName} ${e.updatedAt}`)}function Nt(e){let t={...e};return delete t.credentialFingerprint,t}function Ma(e){return new c(l.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 Dt(e,t,o){let r=e instanceof c?e:new c(l.SERVER_ERROR,e instanceof Error?e.message:String(e));Te(r.code,r.message),t?_(A(o,r.code,r.message,r.details)):C(r.message),process.exitCode=1}function La(e,t,o,r=3e4){let n=t.configStore??new N,i=P(U(e),n);return new Q(new H({baseUrl:o??i.baseUrl,apiKey:i.apiKey,fetch:t.fetch,timeoutMs:r}))}async function dn(e,t,o,r){if(!e.backendTaskId||Fe(e))return e;let n=o.taskStore??new B;return(await mo({client:La(t,o,e.backendBaseUrl,r),taskStore:n,previewStore:o.previewStore,task:e})).task}function cn(e={}){let t=new Pa("task").description("Generation task management");return t.command("list").description("List recent tasks").option("--limit <count>","Maximum tasks to return","20").action((o,r)=>{let n=D(r);try{let i=an(o.limit,"limit"),s=(e.taskStore??new B).list(i);if(S({task_count:s.length,limit:i}),h("task","task.listed",{count:s.length,limit:i}),n)_(I("task_list",{tasks:s.map(Nt),count:s.length}));else{J("Recent Tasks");for(let a of s)xt(a);s.length===0&&f("No local tasks found.")}}catch(i){Dt(i,n,"task_list")}}),t.command("status").description("Get task status").argument("<task_id>","Task ID").action(async(o,r,n)=>{let i=D(n);try{let s=e.taskStore??new B,a=s.getByAnyId(o);if(!a)throw new c(l.TASK_NOT_FOUND,`Task not found: ${o}`);a=await dn(a,n,{...e,taskStore:s}),S({task_status:a.status}),h("task","task.status_read",{task_id:o,status:a.status}),i?_(I("task_status",{task:Nt(a)})):xt(a)}catch(s){Dt(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(o,r,n)=>{let i=D(n);try{let s=e.taskStore??new B,a=s.get(o);if(!a)throw new c(l.TASK_NOT_FOUND,`Task not found: ${o}`);let d=e.configStore??new N,m=P(U(n),d);if(!a.credentialFingerprint||a.credentialFingerprint!==ne(m.apiKey))throw new c(l.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??m.baseUrl,u=await Ur({client:new Q(new H({baseUrl:p,apiKey:m.apiKey,fetch:e.fetch})),taskStore:s,previewStore:e.previewStore,task:a,backendBaseUrl:p});S({task_status:u.task.status}),h("task","task.submission_retried",{local_task_id:u.task.id,backend_task_id:u.task.backendTaskId,status:u.task.status,reused:u.submission.reused}),i?_(I("task_retry",{task:Nt(u.task),reused:u.submission.reused})):xt(u.task)}catch(s){Dt(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(o,r,n)=>{let i=D(n);try{let s=an(r.timeout,"timeout"),a=e.taskStore??new B,d=Date.now()+s*1e3,m=a.getByAnyId(o);if(!m)throw new c(l.TASK_NOT_FOUND,`Task not found: ${o}`);if(!m.backendTaskId&&m.status==="submitting"&&m.pendingSubmission&&m.error)throw Ma(m);for(;!Fe(m)&&Date.now()<d;){let p=Math.max(1,Math.min(3e4,d-Date.now()));try{m=await dn(m,n,{...e,taskStore:a},p)}catch(u){throw Date.now()>=d&&u instanceof c&&u.code===l.GENERATION_TIMEOUT?new c(l.TASK_TIMEOUT,`Timed out waiting for task ${o} after ${s}s.`):u}if(!Fe(m)){let u=Math.max(0,d-Date.now());await new Promise(g=>setTimeout(g,Math.min(e.pollIntervalMs??2e3,u)))}}if(!Fe(m))throw new c(l.TASK_TIMEOUT,`Timed out waiting for task ${o} after ${s}s.`);if(m.status==="failed"||m.status==="cancelled")throw new c(l.GENERATION_FAILED,m.error?.message??`Generation task ${m.backendTaskId??m.id} ${m.status}.`,{task_id:m.backendTaskId??m.id,local_task_id:m.id,backend_status:m.status,...m.error?{backend_error:m.error}:{}});S({task_status:m.status,timeout_seconds:s}),h("task","task.wait_completed",{task_id:o,status:m.status}),i?_(I("task_wait",{task:Nt(m)})):xt(m)}catch(s){Dt(s,i,"task_wait")}}),t}import{Command as $a}from"commander";import{spawn as Va}from"child_process";var Ut=class{baseUrl;apiKey;_fetch;logger;timeoutMs;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this._fetch=t.fetch??globalThis.fetch,this.logger=t.logger,this.timeoutMs=t.timeoutMs}async getByUri(t){if(!t||!t.startsWith("hogi://"))throw new c(l.INVALID_ARGUMENT,`Invalid hogi URI: "${t}". Expected format: hogi://image/<id> or hogi://video/<id>`);let o=encodeURIComponent(t),r=`${this.baseUrl}/genai/image-record/by-uri?uri=${o}`,n=$({source:"hogi_genai_record_client",operation:"record.get_by_uri",method:"GET",path:"/genai/image-record/by-uri"},this.logger),i;try{return await Y({operation:"Generation record request",timeoutMs:this.timeoutMs,run:async s=>{if(i=await n.fetch(this._fetch,r,{method:"GET",headers:K({"x-hogi-api-key":this.apiKey}),signal:s}),i.status===400)throw new c(l.INVALID_ARGUMENT,"URI parameter is required");if(i.status===401)throw new c(l.API_KEY_INVALID,"Invalid API key",{status:401});if(i.status===404)throw new c(l.RECORD_NOT_FOUND,`No generation record found for URI: ${t}`);if(!i.ok){let d=await i.text().catch(()=>"");throw new c(l.SERVER_ERROR,`HTTP ${i.status}: ${d||i.statusText}`,{status:i.status})}let a;try{a=await i.json()}catch{throw new c(l.SERVER_ERROR,"Invalid JSON response from server")}if(!a.success||!a.data)throw new c(l.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 G){let m=new c(l.NETWORK_ERROR,s.message,{retryable:!0,timeout_ms:s.timeoutMs});throw n.failure(m,i?.status),m}if(s instanceof c)throw n.failure(s,i?.status),s;let a=s instanceof Error?s.message:String(s),d=new c(l.NETWORK_ERROR,`Network error: ${a}`);throw n.failure(d),d}}};var ln=D;function un(e){let t=new N,o=P(U(e),t);return{apiKey:o.apiKey,baseUrl:o.baseUrl}}function Fa(e){let t=process.platform==="darwin"?"open":process.platform==="win32"?"cmd":"xdg-open",o=process.platform==="win32"?["/c","start","",e]:[e];try{return Va(t,o,{detached:!0,stdio:"ignore"}).unref(),!0}catch{return!1}}function mn(){let e=new $a("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,o,r)=>{let n=ln(r);try{let{apiKey:i,baseUrl:s}=un(r),d=await new Ut({baseUrl:s,apiKey:i}).getByUri(t);if(S({resource_type:ht(t),record_success:d.success,output_count:d.output_uris.length}),n)_(I("record_get",{id:d.id,type:d.type,workspace_id:d.workspace_id,method:d.mcp_method_name,input_args:d.input_args,output_uris:d.output_uris,success:d.success,error_message:d.error_message,agent:d.agent,created_at:d.created_at,updated_at:d.updated_at}));else{J("Generation Record"),f(` ID: ${d.id}`),f(` Type: ${d.type}`),f(` Workspace: ${d.workspace_id}`),f(` Method: ${d.mcp_method_name}`),f(` Success: ${d.success}`),d.error_message&&f(` Error: ${d.error_message}`),f(" Output URIs:");for(let m of d.output_uris)f(` - ${m}`);f(` Created: ${d.created_at}`)}}catch(i){if(i instanceof c){n?_(A("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?_(A("record_get",l.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,o,r)=>{let n=ln(r);try{let{apiKey:i,baseUrl:s}=un(r),d=await new He({baseUrl:s,apiKey:i}).download(t,{output:o.output,filename:o.filename,watermark:o.wm}),m=o.open!==!1,p=m?Fa(d.path):!1;S({resource_type:ht(t),size_bucket:Me(d.bytes),watermark:o.wm===!0,open_requested:m,opened:p}),n?_(I("record_open",{uri:d.uri,path:d.path,bytes:d.bytes,mime_type:d.mimeType,opened:p})):(x(`Downloaded: ${d.path}`),f(` URI: ${d.uri}`),f(` Bytes: ${d.bytes}`),d.mimeType&&f(` Type: ${d.mimeType}`),f(` Opened: ${p}`))}catch(i){if(i instanceof c){n?_(A("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?_(A("record_open",l.SERVER_ERROR,s)):C(s),process.exitCode=1}}),e}import{Command as Ga}from"commander";var Ba={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"},Wa=[{name:"text-to-image",domain:"image",description:"Generate images from text prompts",default_model:Xe,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:Xe,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:We,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:We,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:Ct,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 qa(){return[...Wa]}function ja(e,t){let o=[];for(let r of e){let n=r.mcp_method_name.startsWith("generate_image_")?"image":r.mcp_method_name.startsWith("generate_video_")?"video":r.mcp_method_name.startsWith("generate_music_")?"audio":void 0;if(!n||t&&n!==t)continue;let i=st(r.mcp_method_name,n);i&&o.push({id:r.id,name:r.name??r.model??i,key:i,domain:n,variant:r.model,selector:{model_id:r.id,cli_args:["--model-id",String(r.id)]},input_capabilities:r.input_capabilities??[],input_capabilities_known:Array.isArray(r.input_capabilities),reference_image_count_min:r.reference_image_count_min??null,reference_image_count_max:r.reference_image_count_max??null,generation_input_contract:dt({toolName:r.mcp_method_name,...r.model?{variant:r.model}:{},catalog:r}),points_cost:r.points_cost,sizes:r.sizes,aspect_ratios:r.aspect_ratios,durations:r.durations??[],description:r.description_i18n??{},tags:r.tags,members_only:r.members_only===!0})}return o}function pn(e){let t=e;for(;t.parent;)t=t.parent;return t.opts().json===!0}function fn(e={}){let t=new Ga("inspect").description("Inspect backend capabilities");return t.command("capabilities").description("List available GenAI capabilities").action((o,r)=>{let n=pn(r),i=qa();if(S({item_count:i.length}),h("inspect","capabilities.listed",{count:i.length}),n)_(I("inspect_capabilities",{capabilities:i},[{command:"oiioii inspect models --json",description:"List available models"}]));else{J("Available Capabilities");for(let s of i)f(` ${s.name} (${s.domain})`),f(` ${s.description}`),f(` Default model: ${s.default_model}`),f(` Example: ${s.command_template}`),f("")}}),t.command("models").description("List available models").option("--domain <domain>","Filter by domain (image, video, or audio)").action(async(o,r)=>{let n=pn(r),i=o.domain;if(i!==void 0&&i!=="image"&&i!=="video"&&i!=="audio")throw new c(l.INVALID_ARGUMENT,`Invalid model domain: "${i}". Expected image, video, or audio.`);let s=i,a=e.configStore??new N,d=P(U(r),a),p=await new fe({baseUrl:d.baseUrl,apiKey:d.apiKey,...e.fetch?{fetch:e.fetch}:{}}).listModels(),u=ja(p,s);if(S({item_count:u.length,backend_model_count:p.length,...s?{domain:s}:{}}),h("inspect","models.listed",{count:u.length,backend_model_count:p.length,source:"backend_model_catalog",...s?{domain:s}:{}}),n)_(I("inspect_models",{models:u,count:u.length,source:"backend_model_catalog",selection:Ba,...s?{filter:{domain:s}}:{}},[{command:"oiioii inspect capabilities --json",description:"List capabilities"}]));else{let g=s?`Available ${s} models`:"Available models";J(g);for(let y of u)f(` ${y.name} [${y.key}] (${y.domain})`),f(` Points: ${y.points_cost}${y.members_only?" \xB7 members only":""}`),y.variant&&f(` Variant: ${y.variant}`),f(` Select: --model-id ${y.id}`);f(`
|
|
31
|
+
Total: ${u.length} models`)}}),t}import{Command as Ka}from"commander";function hn(e,t){if(t.status!=="succeeded"&&t.status!=="failed")return;let o=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(r=>({uri:r,mime_type:o==="video"?"video/mp4":o==="audio"?"audio/mpeg":"image/jpeg"})),status:t.status,...t.error?{error:{code:t.error.code,message:t.error.message}}:{}})}function yn(e,t){return t.taskStore??new B({configDir:e.getConfigDir()})}function za(e={}){let t=e.previewStore??new ge,o=t.getLatest();if(!o){let r=yn(t,e).list().find(n=>n.status==="succeeded"||n.status==="failed");if(r)try{let n=hn(t,r);n&&(o={manifest:n.manifest,summary:n.summary,bundleDir:n.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:l.RECORD_NOT_FOUND,message:"No preview bundles found. Generate an image or video first."}}}function Ha(e,t={}){let o=t.previewStore??new ge,r=o.getBundleByTaskId(e);if(!r){let n=yn(o,t).getByAnyId(e);if(n)try{let i=hn(o,n);i&&(r={manifest:i.manifest,summary:i.summary,bundleDir:i.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:l.RECORD_NOT_FOUND,message:`No preview bundle found for task ${e}.`}}}function gn(e){let t=e;for(;t.parent;)t=t.parent;return t.opts().json===!0}function _n(e){if(J("Preview Bundle"),f(` Bundle ID: ${e.bundle_id}`),f(` Task ID: ${e.task_id}`),f(` Status: ${e.summary.status}`),f(` Title: ${e.summary.title}`),f(` Summary: ${e.summary.human_summary}`),f(` Bundle dir: ${e.bundle_dir}`),e.manifest.resources.length>0){f(" Resources:");for(let t of e.manifest.resources)f(` - ${t.uri} (${t.mime_type??"unknown"})`)}if(e.summary.next.length>0){f(`
|
|
32
|
+
Next steps:`);for(let t of e.summary.next)f(` ${t.command}`)}}function wn(e={}){let t=new Ka("preview").description("Preview bundles for generation results");return t.command("latest").description("Show the most recent preview bundle").action((o,r)=>{let n=gn(r),i=za(e);i.ok&&i.data?(S({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)):_n(i.data)):(n?_(A("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((o,r,n)=>{let i=gn(n),s=Ha(o,e);s.ok&&s.data?(S({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)):_n(s.data)):(i?_(A("preview_bundle",s.error.code,s.error.message)):C(s.error.message),process.exitCode=1)}),t}import{Command as hd}from"commander";import{basename as yd,resolve as wd}from"path";import{readFile as kd,stat as Id}from"fs/promises";import{extname as Ja}from"path";var Ya=new Set(["jpg","jpeg","png","gif","svg","webp","heic","heif","bmp","ico","tiff","jfif"]),Qa=new Set(["mp4","webm","avi","mov","flv","mkv"]),Xa=new Set(["mp3","wav","ogg","m4a","aac","flac","wma","ape"]);function ke(e){return e.trim().toLowerCase().replace(/^\.+/,"")}function ut(e){let t=ke(e);if(Ya.has(t))return"image";if(Qa.has(t))return"video";if(Xa.has(t))return"audio"}function kn(e){let t=ke(Ja(e));return t.length>0?t:void 0}function In(e){let t=ke(e),o=ut(t);if(!o)throw new c(l.INVALID_ARGUMENT,`Unsupported file type: ${t||"<empty>"}. Supported image/video/audio extensions only.`);return o}function Za(e){return e&&typeof e=="object"?e:void 0}async function ed(e){let t=await e.text().catch(()=>"");if(!t.trim())return{};try{return JSON.parse(t)}catch{throw new c(l.SERVER_ERROR,"Invalid JSON response from upload API",{status:e.status})}}function vn(e,t){let o=t.error?.code,r=t.error?.message??`Upload failed: HTTP ${e}`,n={status:e,code:o};return e===401?new c(l.API_KEY_INVALID,r||"Invalid API key",n):e===403||o==="workspace_forbidden"?new c(l.WORKSPACE_FORBIDDEN,r,n):e===404||o==="workspace_not_found"?new c(l.WORKSPACE_NOT_FOUND,r,n):e===413||o==="payload_too_large"?new c(l.PAYLOAD_TOO_LARGE,r,n):tt(o,r)?ot(o,r,n):["empty_file","invalid_file_name","invalid_file_type","missing_workspace_id","unsupported_asset_type"].includes(o??"")?new c(l.INVALID_ARGUMENT,r,n):new c(l.SERVER_ERROR,r,n)}function td(e){if(e.ok===!1)throw vn(400,e);let t=Za(e.data);if(!t)throw new c(l.SERVER_ERROR,"Invalid upload API response: missing data");let o=t.asset_id,r=t.asset_uri,n=t.file_uri,i=t.type,s=t.workspace_id;if(typeof o!="string"||!o)throw new c(l.SERVER_ERROR,"Invalid upload API response: missing asset_id");if(typeof r!="string"||r!==`hogi://asset/${o}`)throw new c(l.SERVER_ERROR,"Invalid upload API response: invalid asset_uri");if(i!=="image"&&i!=="video"&&i!=="audio")throw new c(l.SERVER_ERROR,"Invalid upload API response: unsupported type");if(typeof n!="string"||!n.startsWith(`hogi://${i}/`))throw new c(l.SERVER_ERROR,"Invalid upload API response: file_uri/type mismatch");if(typeof s!="string"||!s)throw new c(l.SERVER_ERROR,"Invalid upload API response: missing workspace_id");return{assetId:o,assetUri:r,fileUri:n,type:i,workspaceId:s}}var Pt=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 o=ke(t.fileType),r=ut(o);if(!r)throw new c(l.INVALID_ARGUMENT,`Unsupported file type: ${o||"<empty>"}`);if(!t.workspaceId.trim())throw new c(l.WORKSPACE_REQUIRED,"workspace_id is required");let n=new URLSearchParams({workspace_id:t.workspaceId,file_type:o});t.fileName&&n.set("file_name",t.fileName),t.afterAssetId&&n.set("after_asset_id",t.afterAssetId);let i=$({source:"hogi_res_upload_client",operation:"workspace.upload_asset",method:"POST",path:"/v1/workspace/uploadAsset",metadata:{workspace_id:t.workspaceId,file_type:o,type:r,bytes:t.buffer.byteLength}},this.logger),s;try{return await Y({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:K({"x-hogi-api-key":this.apiKey,"content-type":"application/octet-stream",accept:"application/json"}),body:t.buffer,signal:a});let d=await ed(s);if(!s.ok)throw vn(s.status,d);let m=td(d);if(m.workspaceId!==t.workspaceId)throw new c(l.SERVER_ERROR,"Upload API returned unexpected workspace_id");if(m.type!==r)throw new c(l.SERVER_ERROR,"Upload API returned unexpected asset type");return i.success(s.status,{asset_id:m.assetId,type:m.type}),m}})}catch(a){if(a instanceof G){let m=new c(l.NETWORK_ERROR,a.message,{retryable:!0,timeout_ms:a.timeoutMs});throw i.failure(m,s?.status),m}if(a instanceof c)throw i.failure(a,s?.status),a;let d=new c(l.NETWORK_ERROR,`Network error: ${a instanceof Error?a.message:String(a)}`);throw i.failure(d),d}}};import{createHash as ld}from"crypto";import{createReadStream as ud}from"fs";import{File as Rn}from"buffer";import*as bn from"fs";import{open as od}from"fs/promises";function En(e){return e&&typeof e=="object"?e:void 0}function rd(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 mt=class e{constructor(t,o,r,n,i){this.filePath=t;this.startOffset=r;this.name=o,this.type=i,this.size=Math.max(0,n-r)}filePath;startOffset;size;type;name;slice(t=0,o=this.size,r=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,o<0?this.size+o:o));return new e(this.filePath,this.name,this.startOffset+n,this.startOffset+i,r)}async arrayBuffer(){let t=await od(this.filePath,"r");try{let o=Buffer.allocUnsafe(this.size),r=0;for(;r<o.byteLength;){let{bytesRead:n}=await t.read(o,r,o.byteLength-r,this.startOffset+r);if(n===0)throw new Error("Unexpected end of file while reading VOD upload slice");r+=n}return o.buffer.slice(o.byteOffset,o.byteOffset+o.byteLength)}finally{await t.close()}}};async function nd(e){let t=rd(e.fileType),o=bn.openAsBlob;if(o){let r=await o(e.filePath,{type:t});return new Rn([r],e.fileName,{type:t})}return new mt(e.filePath,e.fileName,0,e.fileSize,t)}function id(e,t){let o=En(e.extra),r=["errorCode","message","requestId"],n={};for(let i of r){let s=o?.[i];typeof s=="number"&&(n[i]=s),typeof s=="string"&&(n[i]=Tn(s,t))}return Object.keys(n).length>0?JSON.stringify(n):"unknown SDK error"}function Tn(e,t){let o=e;for(let r of[t.AccessKeyId,t.SecretAccessKey,t.SessionToken])r&&(o=o.split(r).join("[redacted]"));return o.slice(0,500)}function sd(){let e=globalThis,t=[],o=(r,n)=>{e[r]===void 0&&(e[r]=n,t.push({key:r,value:n}))};return o("File",Rn),o("navigator",{userAgent:`oiioii-cli/${process.version}`}),o("window",globalThis),e.FileReader||o("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})})}}),o("XMLHttpRequest",To),()=>{for(let{key:r,value:n}of t.reverse())e[r]===n&&delete e[r]}}function ad(){let e=console.warn,t=(...o)=>{o[0]!=="[TTUploader]:worker not supported!"&&e(...o)};return console.warn=t,()=>{console.warn===t&&(console.warn=e)}}var Mt=class{onprogress=null;listeners=new Map;addEventListener(t,o){let r=this.listeners.get(t)??new Set;r.add(o),this.listeners.set(t,r)}removeEventListener(t,o){this.listeners.get(t)?.delete(o)}dispatch(t,o){t==="progress"&&this.onprogress?.(o);for(let r of this.listeners.get(t)??[])r(o)}},To=class extends Mt{readyState=0;status=0;statusText="";responseType="";response=null;responseText="";timeout=0;withCredentials=!1;upload=new Mt;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,o){this.method=t.toUpperCase(),this.url=o,this.changeReadyState(1)}setRequestHeader(t,o){this.headers.set(t,o)}getResponseHeader(t){return this.responseHeaders.get(t)}getAllResponseHeaders(){return[...this.responseHeaders.entries()].map(([t,o])=>`${t}: ${o}\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,o){let r=this[`on${t}`];r?.(o),this.dispatch(t,o)}async sendAsync(t){this.controller=new AbortController;let o=this.timeout>0?setTimeout(()=>this.controller?.abort("timeout"),this.timeout):void 0;try{let r={method:this.method,headers:this.headers,signal:this.controller.signal},n=t instanceof mt?await t.arrayBuffer():t;this.method!=="GET"&&this.method!=="HEAD"&&n!==null&&(r.body=n);let i=t instanceof mt||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,r);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(r){this.controller.signal.aborted?this.emit(this.aborted?"abort":"timeout",{error:r}):this.emit("error",{error:r})}finally{o&&clearTimeout(o)}}};async function dd(e){let{default:t}=await import("tt-uploader"),o=await nd(e),r=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=r.addFile({file:o,fileName:e.fileName,fileExtension:`.${e.fileType.replace(/^\./u,"")}`,stsToken:{...e.token.stsToken,CurrentTime:e.token.stsToken.CurrentTime??new Date().toISOString()},type:"video"});return await new Promise((i,s)=>{let a=!1,d=e.timeoutMs??1800*1e3,m=setTimeout(()=>{try{r.cancel(n)}catch{}u(()=>s(new c(l.TASK_TIMEOUT,`VOD direct upload timed out after ${d}ms`)))},d),p=()=>{clearTimeout(m),r.removeListener("progress",y),r.removeListener("complete",w),r.removeListener("error",E);try{r.removeFile(n)}catch{}},u=R=>{a||(a=!0,p(),R())},g=R=>R.key===n,y=R=>{g(R)&&typeof R.percent=="number"&&e.onProgress?.(Math.max(0,Math.min(99,Math.round(R.percent))))},w=R=>{if(!g(R))return;let T=En(R.uploadResult),v=T?.Vid??T?.vid;u(()=>{typeof v=="string"&&v?i(v):s(new c(l.SERVER_ERROR,"VOD upload completed without Vid"))})},E=R=>{g(R)&&u(()=>s(new c(l.SERVER_ERROR,`VOD direct upload failed: ${id(R,e.token.stsToken)}`)))};r.on("progress",y),r.on("complete",w),r.on("error",E);try{r.start(n)}catch(R){let T=Tn(R instanceof Error?R.message:String(R),e.token.stsToken);u(()=>s(new c(l.SERVER_ERROR,`VOD direct upload could not start: ${T}`)))}})}var An=async e=>{let t=sd(),o=ad();try{return await dd(e)}finally{o(),t()}};function qe(e){return e&&typeof e=="object"?e:void 0}async function md(e,t){let o=await e.text().catch(()=>""),r;try{r=o?JSON.parse(o):{}}catch{throw new c(l.SERVER_ERROR,`Invalid JSON response from ${t}`,{status:e.status})}let n=qe(r)??{};if(!e.ok||n.success===!1){let i=n.error,s=typeof i=="string"?i:typeof qe(i)?.message=="string"?qe(i).message:`${t} failed: HTTP ${e.status}`,a={status:e.status,error:typeof i=="string"?i:void 0};throw e.status===401?new c(l.API_KEY_INVALID,s,a):e.status===403?new c(l.WORKSPACE_FORBIDDEN,s,a):e.status===404?new c(l.WORKSPACE_NOT_FOUND,s,a):e.status===413?new c(l.PAYLOAD_TOO_LARGE,s,a):e.status===400?new c(l.INVALID_ARGUMENT,s,a):new c(l.SERVER_ERROR,s,a)}return n}async function pd(e){let t=ld("md5");for await(let o of ud(e))t.update(o);return t.digest("hex")}function fd(e){return new Promise(t=>setTimeout(t,e))}function gd(e){let t=qe(e),o=qe(t?.stsToken);return typeof t?.appId=="number"&&Number.isFinite(t.appId)&&typeof t.spaceName=="string"&&t.spaceName.length>0&&typeof t.region=="string"&&t.region.length>0&&typeof o?.AccessKeyId=="string"&&o.AccessKeyId.length>0&&typeof o.SecretAccessKey=="string"&&o.SecretAccessKey.length>0&&typeof o.SessionToken=="string"&&o.SessionToken.length>0&&typeof o.ExpiredTime=="string"&&o.ExpiredTime.length>0}var Lt=class{baseUrl;apiKey;fetch;logger;directUpload;pollIntervalMs;timeoutMs;requestTimeoutMs;constructor(t){this.baseUrl=t.baseUrl.replace(/\/+$/,""),this.apiKey=t.apiKey,this.fetch=t.fetch??globalThis.fetch,this.logger=t.logger,this.directUpload=t.directUpload??An,this.pollIntervalMs=t.pollIntervalMs??3e3,this.timeoutMs=t.timeoutMs??600*1e3,this.requestTimeoutMs=t.requestTimeoutMs??3e4}headers(t=!1){return K({"x-hogi-api-key":this.apiKey,accept:"application/json",...t?{"content-type":"application/json"}:{}})}async requestJson(t,o,r,n=this.requestTimeoutMs){let i=$({source:"hogi_vod_upload_client",operation:r,method:o.method??"GET",path:new URL(t).pathname},this.logger),s;try{let a=await Y({operation:r,timeoutMs:n,run:async d=>(s=await i.fetch(this.fetch,t,{...o,signal:d}),md(s,r))});return i.success(s.status),a}catch(a){throw i.failure(a,s?.status),a instanceof G?new c(l.NETWORK_ERROR,a.message,{retryable:!0,request_timeout:!0,timeout_ms:a.timeoutMs}):a instanceof c?a:new c(l.NETWORK_ERROR,`${r} network error: ${a instanceof Error?a.message:String(a)}`)}}async uploadFile(t){if(!t.workspaceId.trim())throw new c(l.WORKSPACE_REQUIRED,"workspace_id is required");if(!t.fileName.trim())throw new c(l.INVALID_ARGUMENT,"file_name is required");let o=ke(t.fileType);if(ut(o)!=="video")throw new c(l.INVALID_ARGUMENT,`VOD upload requires a supported video type: ${o||"<empty>"}`);if(!Number.isSafeInteger(t.fileSize)||t.fileSize<=0)throw new c(l.INVALID_ARGUMENT,"file_size must be a positive integer");if(t.fileSize>524288e3)throw new c(l.PAYLOAD_TOO_LARGE,`VOD upload limit is ${524288e3} bytes (500 MB)`);let r=$({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(!gd(s))throw new c(l.SERVER_ERROR,"Invalid VOD upload_token response");let[a,d]=await Promise.all([this.directUpload({filePath:t.filePath,fileName:t.fileName,fileSize:t.fileSize,fileType:o,token:s,userId:"oiioii-cli",onProgress:t.onProgress}),pd(t.filePath)]),m=await this.requestJson(`${this.baseUrl}/media/vod/commit_upload`,{method:"POST",headers:this.headers(!0),body:JSON.stringify({vid:a,workspaceId:t.workspaceId,originalFileName:t.fileName,fileSizeBytes:t.fileSize,contentMd5:d})},"VOD commit_upload"),p=qe(m.data);if(typeof p?.assetId!="string"||typeof p.taskId!="string")throw new c(l.SERVER_ERROR,"Invalid VOD commit_upload response");let u=await this.waitForTranscode(p.taskId,t.workspaceId);return r.success(200,{asset_id:p.assetId,task_id:p.taskId}),{assetId:p.assetId,assetUri:`hogi://asset/${p.assetId}`,fileUri:u.outputUri,taskId:p.taskId,workspaceId:t.workspaceId}}catch(n){throw r.failure(n),n}}async waitForTranscode(t,o){let r=Date.now()+this.timeoutMs;for(;Date.now()<r;){let n=new URLSearchParams({taskId:t,workspaceId:o}),i=Math.max(1,r-Date.now()),s;try{s=await this.requestJson(`${this.baseUrl}/media/vod/transcode_status?${n}`,{method:"GET",headers:this.headers()},"VOD transcode_status",Math.min(this.requestTimeoutMs,i))}catch(d){if((d instanceof c&&d.details&&typeof d.details=="object"?d.details:void 0)?.request_timeout===!0){if(Date.now()>=r)break;continue}throw d}let a=qe(s.data);if(!a||typeof a.status!="string")throw new c(l.SERVER_ERROR,"Invalid VOD transcode_status response");if((a.status==="completed"||a.status==="finished")&&typeof a.outputUri=="string"&&a.outputUri.startsWith("hogi://video/"))return a;if(a.status==="failed"||a.status==="cancelled")throw new c(l.SERVER_ERROR,a.errorMessage||a.errorCode||`VOD transcode ${a.status}`);await fd(Math.min(this.pollIntervalMs,Math.max(0,r-Date.now())))}throw new c(l.TASK_TIMEOUT,`VOD transcode timed out after ${this.timeoutMs}ms`,{task_id:t})}};var vd=D,Rd=U;function bd(e,t){let o=e.workspace;if(typeof o=="string"&&o)return o;let r=process.env.OIIOII_WORKSPACE_ID;if(r)return r;let n=t.loadResolved();if(n.defaultWorkspaceId)return n.defaultWorkspaceId;throw new c(l.WORKSPACE_REQUIRED,"No workspace set. Run: oiioii workspace set <workspace_id>")}function Sn(e,t){let o=`hogi://${t}/`;if(!e.startsWith(o))throw new c(l.SERVER_ERROR,`Upload API returned mismatched URI/domain: expected ${o}`)}function Ed(e,t,o,r=!1){return e==="video"&&(r||t==="mov"||o>=10485760)}async function Td(e,t){let o;try{o=await t(e)}catch{throw new c(l.INVALID_ARGUMENT,`File not found: ${e}`)}if(!o.isFile())throw new c(l.INVALID_ARGUMENT,`Not a file: ${e}`);if(o.size<=0)throw new c(l.INVALID_ARGUMENT,`File is empty: ${e}`);return o.size}async function Ad(e,t={},o={}){let r=o.configStore??new N,n=o.readFile??kd,i=o.stat??Id,s=P(t,r),a=s.baseUrl,d=wd(e.path),m=await Td(d,i),p=e.fileType??kn(d);if(!p)throw new c(l.INVALID_ARGUMENT,`Cannot infer file type from path: ${e.path}. Use --type <ext>.`);let u=ke(p),g=In(u);if(e.vod===!0&&g!=="video")throw new c(l.INVALID_ARGUMENT,"--vod is only valid for video files");h("upload","upload.file_validated",{file_type:u,domain:g,size:m});let y=bd(t,r),w=e.fileName??yd(d);if(Ed(g,u,m,e.vod===!0)){if(e.afterAssetId)throw new c(l.INVALID_ARGUMENT,"--after-asset-id is not supported by the VOD upload API");let k=await new Lt({baseUrl:a,apiKey:s.apiKey,fetch:o.fetch,directUpload:o.vodDirectUpload,pollIntervalMs:o.vodPollIntervalMs,timeoutMs:o.vodTimeoutMs}).uploadFile({filePath:d,fileSize:m,fileName:w,fileType:u,workspaceId:y});return Sn(k.fileUri,"video"),h("upload","upload.vod_completed",{asset_id:k.assetId,task_id:k.taskId,size:m,workspace_id:y}),{uri:k.fileUri,asset_id:k.assetId,asset_uri:k.assetUri,file_uri:k.fileUri,domain:"video",file_type:u,file_name:w,size:m,attached:!0,workspace_id:y,upload_mode:"vod",task_id:k.taskId}}let R=await n(d),v=await new Pt({baseUrl:a,apiKey:s.apiKey,fetch:o.fetch}).uploadFile({buffer:R,workspaceId:y,fileType:u,fileName:w,afterAssetId:e.afterAssetId});if(h("upload","upload.completed",{asset_id:v.assetId,domain:v.type,size:m,workspace_id:y}),Sn(v.fileUri,v.type),v.type!==g)throw new c(l.SERVER_ERROR,`Upload API returned unexpected domain: ${v.type}`);return h("upload","workspace.asset_attached",{asset_id:v.assetId,domain:v.type,workspace_id:y}),{uri:v.fileUri,asset_id:v.assetId,asset_uri:v.assetUri,file_uri:v.fileUri,domain:v.type,file_type:u,file_name:w,size:m,attached:!0,workspace_id:y,upload_mode:"direct"}}function On(e={}){let t=new hd("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(o,r,n)=>{let i=vd(n),s=Rd(n);try{let a=await Ad({path:o,fileType:r.type,fileName:r.name,afterAssetId:r.afterAssetId,attach:r.attach===!0,vod:r.vod===!0},s,e);S({media_type:a.domain,file_extension:a.file_type,size_bucket:Me(a.size),upload_mode:a.upload_mode??"direct",forced_vod:r.vod===!0,attached:a.attached}),i?_(I("upload_file",a,[{command:`oiioii record open ${a.uri} --json`,description:"Download uploaded resource"}])):(x(`Uploaded: ${a.uri}`),f(` Domain: ${a.domain}`),f(` Type: ${a.file_type}`),f(` Size: ${a.size} bytes`),f(` Mode: ${a.upload_mode??"direct"}`),a.task_id&&f(` Task: ${a.task_id}`),a.file_name&&f(` Name: ${a.file_name}`),f(` Attach: ${a.attached?`yes (${a.workspace_id})`:"no"}`))}catch(a){if(a instanceof c){i?_(A("upload_file",a.code,a.message,a.details)):C(a.message),process.exitCode=1;return}let d=a instanceof Error?a.message:String(a);i?_(A("upload_file",l.SERVER_ERROR,d)):C(d),process.exitCode=1}}),t}import{Command as Cd}from"commander";function Ao(e){let t=e;for(;t.parent;)t=t.parent;return t.opts().json===!0}function Sd(e,t){if(e===void 0)return;let o=Number.parseInt(e,10);if(!Number.isInteger(o)||o<=0)throw new c(l.INVALID_ARGUMENT,`${t} must be a positive integer.`);return o}function xn(e){let t=["debug","info","warn","error"],o=["application","api"];if(e.level&&!t.includes(e.level))throw new c(l.INVALID_ARGUMENT,`Unknown log level: ${e.level}.`);if(e.category&&!o.includes(e.category))throw new c(l.INVALID_ARGUMENT,`Unknown log category: ${e.category}.`);if(e.since&&Number.isNaN(Date.parse(e.since)))throw new c(l.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:Sd(e.limit,"--limit")}:{}}}function Nn(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 Dn(e,t,o){let r=e instanceof c?e:new c(l.CONFIG_ERROR,e instanceof Error?e.message:String(e));t?_(A(o,r.code,r.message,r.details)):C(r.message),process.exitCode=1}function Un(e={}){let t=new Cd("logs").description("Local structured log management");return Nn(t.command("list").description("List locally stored log entries")).action((o,r)=>{let n=Ao(r);try{let i=e.logStore??new be,s=xn(o),a=i.list(s);if(S({entry_count:a.length,has_filter:Object.values(s).some(d=>d!==void 0)}),n)_(I("logs_list",{path:i.path,count:a.length,entries:a}));else if(a.length===0)f(`No logs found.
|
|
34
|
+
Path: ${i.path}`);else{J(`Logs (${a.length})`);for(let d of a){let m=d.http?.status?` status=${d.http.status}`:"",u=["logid","requestId","uid","workspaceId"].filter(g=>d[g]).map(g=>` ${g}=${d[g]}`).join("");f(`${d.timestamp} ${d.level.toUpperCase()} ${d.source} ${d.event}${m}${u}`)}}}catch(i){Dn(i,n,"logs_list")}}),Nn(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((o,r)=>{let n=Ao(r);try{if(o.format!=="json"&&o.format!=="jsonl")throw new c(l.INVALID_ARGUMENT,`Unknown export format: ${o.format}.`);let s=(e.logStore??new be).export({output:o.output,format:o.format,filter:xn(o),force:o.force===!0});S({format:s.format,entry_count:s.count,size_bucket:Me(s.bytes)}),n?_(I("logs_export",s)):x(`Exported ${s.count} log entries to ${s.path}`)}catch(i){Dn(i,n,"logs_export")}}),t.command("path").description("Show the local log file path").action((o,r)=>{let n=Ao(r),i=e.logStore??new be;S({path_available:!0}),n?_(I("logs_path",{path:i.path})):f(i.path)}),t}import{Command as Od}from"commander";function Co(e,t){let o=t.configStore??new N,r=P(e,o);return{baseUrl:r.baseUrl,apiKey:r.apiKey,...t.fetch?{fetch:t.fetch}:{}}}async function xd(e){let t=await new Ae(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 Nd(e,t){return await new Ae(t).getGenerationCosts(e)}async function Dd(e,t){let[o,r]=await Promise.all([new fe(t).listModels(),new Ae(t).getBalance()]),n=ao(o,{...e.modelId?{modelId:e.modelId}:{},...e.model?{model:e.model}:{},...e.variant?{variant:e.variant}:{}}),i=It(n);Ve(i,{...e.duration!==void 0?{duration:e.duration}:{},...e.resolution?{resolution:e.resolution}:{}});let s=At({pricing:n,tier:r.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:oe(i),available_points:r.points,sufficient:r.points>=s.estimated_points}}function Pn(e,t,o=!1){let r=Number(e);if(!Number.isFinite(r)||(o?r<0:r<=0))throw new c(l.INVALID_ARGUMENT,`${t} must be ${o?"zero or positive":"positive"}`);return r}function So(e,t,o){let r=e instanceof c?e:new c(l.SERVER_ERROR,e instanceof Error?e.message:String(e));t?_(A(o,r.code,r.message,r.details)):C(r.message),process.exitCode=1}function Mn(e={}){let t=new Od("points").description("Inspect points balance, estimates, and actual generation charges");return t.command("balance").description("Show current points balance and membership tier").action(async(o,r)=>{let n=D(r);try{let i=await xd(Co(U(r),e));S({tier:i.tier}),n?_(I("points_balance",i)):(x(`Available points: ${i.points}`),f(` Tier: ${i.tier}`))}catch(i){So(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(o,r,n)=>{let i=D(n);try{let s=await Nd(o,Co(U(n),e));if(S({uri_count:o.length,charged_count:s.entries.filter(a=>a.status==="charged").length,no_charge_count:s.entries.filter(a=>a.status==="no_charge").length,not_found_count:s.entries.filter(a=>a.status==="not_found").length}),i)_(I("points_cost",s));else for(let a of s.entries)f(`${a.uri}: ${a.status}${a.consumed_points!==void 0?` \xB7 consumed ${a.consumed_points} points`:""}`),a.pricingExplanation&&f(` ${a.pricingExplanation}`)}catch(s){So(s,i,"points_cost")}}),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(o,r)=>{let n=D(r);try{let i=await Dd({...o.modelId?{modelId:o.modelId}:{},...o.model?{model:o.model}:{},...o.variant?{variant:o.variant}:{},...o.duration!==void 0?{duration:Pn(o.duration,"duration")}:{},...o.resolution?{resolution:o.resolution}:{},...o.quality?{quality:o.quality}:{},referenceVideoDuration:Pn(o.referenceVideoDuration,"reference video duration",!0)},Co(U(r),e));S({...i.model.model_id!==void 0?{model_id:i.model.model_id}:{},model_key:i.model.key,...i.model.variant?{variant:i.model.variant}:{},...o.duration?{duration_seconds:Number(o.duration)}:{},...o.resolution?{resolution:o.resolution}:{},...o.quality?{quality:o.quality}:{},estimated_points:i.estimated_points,sufficient:i.sufficient}),n?_(I("points_quote",i)):(x(`Estimated points: ${i.estimated_points}`),f(` Available: ${i.available_points} \xB7 ${i.sufficient?"sufficient":"insufficient"}`),V(i.caveat))}catch(i){So(i,n,"points_quote")}}),t}import{Command as Wd}from"commander";import{createHash as Ud,randomBytes as Ln}from"crypto";import{createServer as Pd}from"http";var Md=5e3;function $n(e){e.close(),e.closeAllConnections()}async function Vn(e){let t=Ln(32).toString("base64url"),o=Ln(32).toString("base64url"),r=Ud("sha256").update(t).digest("base64url"),n=new AbortController,i=!0,s=!1,a,d,m=()=>{},p=new Promise(b=>{m=b}),u=new URL(e.authorizationPageUrl),g=()=>{if(!i||!a)return;let b=a;i=!1,clearTimeout(v),d&&clearTimeout(d),y.close(),m({outcome:"success",exchange:b})},y=Pd(async(b,k)=>{k.setHeader("Cache-Control","no-store"),k.setHeader("Referrer-Policy","no-referrer"),k.setHeader("Content-Type","text/plain; charset=utf-8"),k.setHeader("Content-Security-Policy","default-src 'none'; frame-ancestors 'none'");let q=new URL(b.url??"/","http://127.0.0.1"),j=q.searchParams.get("code"),Ne=q.searchParams.get("error")==="access_denied",ae=y.address(),Ie=ae&&typeof ae=="object"?ae.port:void 0,Lo=b.headers.host===`127.0.0.1:${Ie}`;if(q.pathname==="/auth/ready"){if(!(Lo&&q.searchParams.get("state")===o&&b.headers.origin===u.origin)){k.writeHead(400).end("Invalid authorization readiness callback.");return}if(k.setHeader("Access-Control-Allow-Origin",u.origin),k.setHeader("Vary","Origin"),b.method==="OPTIONS"){k.setHeader("Access-Control-Allow-Methods","POST"),k.setHeader("Access-Control-Allow-Private-Network","true"),k.writeHead(204).end();return}if(b.method!=="POST"||!i||!a){k.writeHead(409).end("Authorization is not waiting for page readiness.");return}await new Promise(pt=>{k.once("finish",pt),k.once("close",pt),k.writeHead(204).end()}),g();return}if(b.method!=="GET"||!Lo||q.pathname!=="/auth/callback"||q.searchParams.get("state")!==o||!Ne&&!/^[a-f0-9]{64}$/.test(j??"")){k.writeHead(400).end("Invalid authorization callback.");return}if(!i||s){k.writeHead(409).end("This authorization request is already being processed.");return}let Ft=async(ve,pt=!0)=>await new Promise(ai=>{let $o=new URL(u.pathname,u.origin);$o.search=new URLSearchParams({result:ve,state:o}).toString();let Vo=!1,Fo=()=>{Vo||(Vo=!0,pt&&y.close(),ai())};k.once("finish",Fo),k.once("close",Fo),k.writeHead(303,{Location:$o.href}).end()});if(Ne){await Ft("cancelled"),i=!1,clearTimeout(v),m({outcome:"cancelled"});return}s=!0;try{let ve=await e.exchange({code:j,verifier:t,signal:n.signal});if(!i)return;a=ve,await Ft("success",!1),s=!1,i&&(d=setTimeout(g,e.pageReadyTimeoutMs??Md),d.unref())}catch(ve){i&&(await Ft("error"),i=!1,clearTimeout(v),m({outcome:"error",message:ve instanceof Error?ve.message:String(ve)}))}});y.headersTimeout=5e3,y.requestTimeout=1e4,await new Promise((b,k)=>{y.once("error",k),y.listen(0,"127.0.0.1",b)});let w=y.address();if(!w||typeof w=="string")throw new Error("Unable to create local authorization listener");let E=`http://127.0.0.1:${w.port}/auth/callback`,R=new URL(u.href);R.search=new URLSearchParams({app:e.app,challenge:r,state:o,redirectUri:E}).toString();let T=()=>{i&&(i=!1,clearTimeout(v),d&&clearTimeout(d),n.abort(),$n(y),m({outcome:"cancelled"}))},v=setTimeout(()=>{i&&(i=!1,n.abort(),d&&clearTimeout(d),$n(y),m({outcome:"expired"}))},e.timeoutMs??3e5);return v.unref(),{cancel:T,result:p,url:R.href}}import{execFile as Ld}from"child_process";var Oo={terminal:"terminal",codex:"Codex",workbuddy:"WorkBuddy",kimi:"Kimi","claude-code":"Claude Code",deepseek:"DeepSeek"},$d={codex:"com.openai.codex",workbuddy:"com.workbuddy.workbuddy-ai"},Vd={codex:"codex",workbuddy:"workbuddy-ai"},Fd=1e4,Fn=async(e,t)=>await new Promise(o=>{Ld(e,t,{timeout:Fd,windowsHide:!0},r=>o(!r))});async function Gn(e,t=process.platform,o=Fn){return t==="darwin"?await o("/usr/bin/open",[e]):t==="win32"?await o("rundll32.exe",["url.dll,FileProtocolHandler",e]):await o("xdg-open",[e])}async function Bn(e,t=process.platform,o=Fn){if(t==="darwin"){let r=$d[e];return r?{requested:await o("/usr/bin/open",["-b",r]),supported:!0}:{requested:!1,supported:!1}}if(t==="win32"){let r=Vd[e];return r?await o("reg.exe",["query",`HKCR\\${r}\\shell\\open\\command`,"/ve"])?{requested:await o("rundll32.exe",["url.dll,FileProtocolHandler",`${r}://`]),supported:!0}:{requested:!1,supported:!1}:{requested:!1,supported:!1}}return{requested:!1,supported:!1}}var Gd={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:
|
|
35
35
|
${e}`,manualUrl:e=>`Open this URL to authorize OiiOii CLI:
|
|
36
36
|
${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:
|
|
37
37
|
${e}`,manualUrl:e=>`Abre esta URL para autorizar OiiOii CLI:
|
|
@@ -41,5 +41,5 @@ ${e}`},zh:{opening:"\u6B63\u5728\u6253\u5F00 OiiOii \u6388\u6743\u9875\u9762\u20
|
|
|
41
41
|
${e}`,manualUrl:e=>`\u8BF7\u6253\u5F00\u4EE5\u4E0B\u5730\u5740\u6388\u6743 OiiOii CLI\uFF1A
|
|
42
42
|
${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
|
|
43
43
|
${e}`,manualUrl:e=>`\u8ACB\u958B\u555F\u4EE5\u4E0B\u7DB2\u5740\u6388\u6B0A OiiOii CLI\uFF1A
|
|
44
|
-
${e}`}};function Gd(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 Bn(e=process.env){return Fd[Gd(e)]}function Wd(e){try{let t=new URL(e);return(t.protocol==="https:"||t.protocol==="http:")&&t.pathname==="/"&&!t.search&&!t.hash}catch{return!1}}function qd(){let e=Bo(),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 o=t.protocol==="http:"&&(t.hostname==="127.0.0.1"||t.hostname==="localhost");if(t.protocol==="http:"&&!o||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 jd(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 Kd(e,t,o,r){let n=$({source:"cli_auth",operation:"auth.exchange",method:"POST",path:"/auth/cli/exchange"}),i;try{let s=await n.fetch(r,`${e.replace(/\/$/,"")}/auth/cli/exchange`,{method:"POST",headers:K({"content-type":"application/json",accept:"application/json"}),body:JSON.stringify({code:o.code,verifier:o.verifier}),signal:o.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 l=a.data;if(!l||l.app!==t||typeof l.apiKey!="string"||!/^oii_sk_[A-Za-z0-9_-]{40}$/.test(l.apiKey)||typeof l.keyId!="string"||typeof l.keyPrefix!="string")throw new Error("The authorization server returned an invalid API key response");return n.success(s.status),{apiKey:l.apiKey,app:t,keyId:l.keyId,keyPrefix:l.keyPrefix}}catch(s){throw n.failure(s,i),s}}function Wn(e={}){let t=new Bd("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(o,r)=>{let n=D(r),i=jd(o),s=o.apiKey?.trim(),a=o.apiKey!==void 0,l=i[0]??(a?void 0:"terminal"),m=(R,b,k)=>{n?_(A("auth_login",R,b,k)):C(b),process.exitCode=1};if(i.length>1){m(c.INVALID_ARGUMENT,"Choose only one target application for browser authorization.");return}if(i.length>0&&a){m(c.INVALID_ARGUMENT,"--api-key cannot be used with an application authorization option.");return}if(a&&!s){m(c.INVALID_ARGUMENT,"--api-key must not be empty.");return}let p=U(r).baseUrl,u=(o.baseUrl??(typeof p=="string"?p:void 0))?.trim();if(u&&o.resetBaseUrl){m(c.INVALID_ARGUMENT,"--base-url and --reset-base-url cannot be used together.");return}if(u&&!Wd(u)){m(c.INVALID_ARGUMENT,"--base-url must be an HTTP(S) origin without a path, query, or fragment.");return}let g=e.configStore??new x,y=Ze().replace(/\/$/,""),w=process.env.OIIOII_BASE_URL?.trim().replace(/\/$/,""),E=u?.replace(/\/$/,"")||w||(o.resetBaseUrl?y:g.load().baseUrl.replace(/\/$/,""));if(l){if(E!==y){m(c.CONFIG_ERROR,`Browser authorization must use this build's backend (${y}). Run 'oiioii auth login --reset-base-url' after removing OIIOII_BASE_URL, or use '--api-key' with a custom backend.`);return}let R=Bn(),b;try{let k=await(e.createBrowserAuthorization??$n)({app:l,authorizationPageUrl:qd(),exchange:async ae=>{let ke=await Kd(E,l,ae,e.fetch??globalThis.fetch);return g.update({apiKey:ke.apiKey,baseUrl:E},{resetBaseUrl:o.resetBaseUrl===!0}),ke}});b=k.cancel,n||f(R.opening);let q=o.browser===!1?!1:await(e.openBrowser??Fn)(k.url);o.browser===!1?B(R.manualUrl(k.url)):q?n||f(R.waiting):B(R.browserFallback(k.url));let j=await k.result;if(j.outcome!=="success"){let ae=j.outcome==="cancelled"?"Authorization was cancelled.":j.outcome==="expired"?"Authorization expired. Run the login command again.":j.outcome==="error"?j.message:"Authorization failed.";m(j.outcome==="expired"?c.AUTH_TIMEOUT:c.AUTH_INVALID,ae);return}let Ne=l==="terminal"?{requested:!1,supported:!1}:await(e.activateApp??Gn)(l);n?_(I("auth_login",{activated:Ne.requested,activation_supported:Ne.supported,app:l,authenticated:!0,base_url:g.load().baseUrl,config_file:g.getConfigPath()})):(N(R.saved),l==="terminal"?f(R.terminalFallback):Ne.requested?f(R.activating(So[l])):B(R.activationFallback(So[l])))}catch(k){b?.(),m(c.NETWORK_ERROR,k instanceof Error?k.message:String(k))}return}g.update({apiKey:s,...u?{baseUrl:u.replace(/\/$/,"")}:{}},{resetBaseUrl:o.resetBaseUrl===!0});let v=g.load(),T=g.getConfigPath();n?_(I("auth_login",{authenticated:!0,base_url:v.baseUrl,config_file:T})):(N(`API key saved to ${T}`),f(` Base URL: ${v.baseUrl}`))}),t}import{Command as Uo}from"commander";import Yd from"cross-spawn";import Z from"semver";import{existsSync as Xd}from"fs";import{existsSync as zd,readFileSync as Hd}from"fs";import{homedir as qn}from"os";import{join as $t}from"path";function Jd(){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 $t(e||$t(qn(),"AppData","Local"),"oiioii-cli")}return $t(qn(),".local","share","oiioii-cli")}function Qd(){return process.env.OIIOII_INSTALL_RECORD?.trim()||$t(Jd(),"install.json")}function xe(e){return typeof e=="string"&&e.trim().length>0}function jn(e=Qd()){if(!zd(e))throw new d(c.CLI_INSTALLATION_UNMANAGED,`This oiioii installation is not managed by the official installer. Update it with 'npm install -g ${rt}@latest'.`,{path:e,retryable:!1});let t;try{t=JSON.parse(Hd(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 o=t;if(o.schemaVersion!==1||o.manager!=="npm"||!xe(o.environment)||!xe(o.packageName)||!xe(o.distTag)||!xe(o.installRoot)||!xe(o.npmPrefix)||!xe(o.nodePath)||!xe(o.npmPath)||!xe(o.entryPath))throw new d(c.CONFIG_ERROR,`Invalid CLI install record: ${e}`,{path:e});let r=X();if(o.environment!==r)throw new d(c.CONFIG_ERROR,`Install record environment '${o.environment}' does not match this '${r}' build.`,{path:e,installed_environment:o.environment,build_environment:r});if(o.packageName!==rt)throw new d(c.CONFIG_ERROR,`Install record package '${o.packageName}' does not match this build package '${rt}'.`,{path:e,installed_package:o.packageName,build_package:rt});return o}var Oo=(e,t,o)=>new Promise((r,n)=>{let i=Yd(e,t,{stdio:o.inherit?"inherit":["ignore","pipe","pipe"],env:process.env}),s="",a="";o.inherit||(i.stdout?.setEncoding("utf8"),i.stderr?.setEncoding("utf8"),i.stdout?.on("data",l=>{s+=l}),i.stderr?.on("data",l=>{a+=l})),i.on("error",n),i.on("close",l=>r({exitCode:l??1,stdout:s,stderr:a}))});function xo(e,t){return e.registry?[...t,"--registry",e.registry]:t}async function Vt(e,t,o,r){let n;try{n=await e(t,o,{inherit:r.inherit===!0})}catch(i){throw new d(c.CLI_UPDATE_FAILED,`Failed to start npm while ${r.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 ${r.operation}.`,{exit_code:n.exitCode,stderr:n.stderr.trim()||void 0,retryable:!0});return n}function zn(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 Zd(e){let t=e.trim().replace(/^v(?=\d)/,"");if(Z.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 No(e){let t=X(),o=et();if(!o.managed)throw new d(c.CLI_INSTALLATION_UNMANAGED,"Local builds cannot update or install CLI versions from npm. Rebuild the local checkout instead.");let r=Z.prerelease(e);if(o.prerelease==="forbidden"&&r!==null)throw new d(c.INVALID_ARGUMENT,`The production build only installs stable versions; '${e}' is a prerelease.`);if(o.prerelease==="required"&&r===null)throw new d(c.INVALID_ARGUMENT,`The ${t} build only installs prerelease versions; '${e}' is stable.`)}function Do(){let e=et();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=jn();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 Hn(e,t,o){let r=await Vt(o,e.npmPath,xo(e,["view",`${e.packageName}@${t}`,"version","--json"]),{operation:`resolving ${t}`}),n=zn(r.stdout,`resolving ${t}`);if(typeof n!="string"||Z.valid(n)===null)throw new d(c.CLI_UPDATE_FAILED,`npm returned an invalid version for '${t}'.`,{value:n,retryable:!0});return No(n),n}async function ec(e,t,o){if(!Xd(e.entryPath))throw new d(c.CLI_UPDATE_FAILED,`Installed CLI entry was not found: ${e.entryPath}`);let r=await Vt(o,e.nodePath,[e.entryPath,"--version"],{operation:"verifying the installed CLI"});if(r.stdout.trim()!==t)throw new d(c.CLI_UPDATE_FAILED,"Installed CLI version verification failed.",{expected:t,actual:r.stdout.trim(),retryable:!0})}async function Kn(e,t,o){await Vt(o,e.npmPath,xo(e,["install","--global","--prefix",e.npmPrefix,"--no-audit","--no-fund",`${e.packageName}@${t}`]),{inherit:!0,operation:`installing ${e.packageName}@${t}`}),await ec(e,t,o)}async function Jn(e,t,o){try{await Kn(e,t,o)}catch(r){let n="not_attempted",i;if(Z.valid(V)!==null&&Z.neq(V,t))try{await Kn(e,V,o),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:r instanceof Error?r.message:String(r),rollback:n,...i?{rollback_error:i}:{},retryable:!0})}}async function Qn(e={},t=Oo){let o=et();if(!o.managed||!o.distTag)throw No(V),new Error("unreachable");let r=Do(),n=await Hn(r,o.distTag,t),i=Z.gt(n,V),s=!e.check&&(i||e.force===!0);return s&&await Jn(r,n,t),{environment:X(),package:r.packageName,dist_tag:o.distTag,previous_version:V,version:n,update_available:i,changed:s,checked_only:e.check===!0}}async function Yn(e,t=Oo){let o=Do(),r=Zd(e);No(r);let n=await Hn(o,r,t);return await Jn(o,n,t),{environment:X(),package:o.packageName,dist_tag:o.distTag,previous_version:V,version:n,update_available:Z.gt(n,V),changed:Z.neq(V,n),checked_only:!1}}async function Xn(e=Oo){let t=et(),o=Do(),r=await Vt(e,o.npmPath,xo(o,["view",o.packageName,"versions","--json"]),{operation:"listing CLI versions"}),n=zn(r.stdout,"listing CLI versions"),s=(Array.isArray(n)?n:[n]).filter(a=>typeof a=="string"&&Z.valid(a)!==null).filter(a=>t.prerelease==="required"?Z.prerelease(a)!==null:Z.prerelease(a)===null).sort(Z.rcompare);return{environment:X(),package:o.packageName,dist_tag:t.distTag,versions:s}}function Zn(e,t,o){if(D(o)){_(I(e,t));return}if(t.checked_only){t.update_available?f(`Update available: ${t.previous_version} -> ${t.version} (${t.dist_tag})`):t.previous_version===t.version?N(`oiioii ${t.previous_version} is up to date (${t.dist_tag}).`):f(`Current version ${t.previous_version} is newer than channel version ${t.version}; no downgrade will be performed.`);return}t.changed?N(`oiioii ${t.previous_version} -> ${t.version}`):N(`oiioii ${t.version} is already installed.`)}function ei(){return new Uo("update").description("Update oiioii from the npm channel for this build environment").option("--check","Check for an update without installing it").option("--force","Reinstall the channel version even when already current").action(async(e,t)=>{Zn("cli_update",await Qn(e),t)})}function ti(){return new Uo("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,o)=>{Zn("cli_install",await Yn(e),o)})}function oi(){return new Uo("versions").description("List npm versions available to this build environment").action(async(e,t)=>{let o=await Xn();if(D(t)){_(I("cli_versions",o));return}J(`Available oiioii versions (${o.environment})`),o.versions.length===0?f("No matching versions found."):o.versions.forEach(r=>f(r))})}function ri(){let e=new tc;return e.name("oiioii").description("Agent-native CLI for Oiioii / Hogi GenAI capabilities").version(V,"-V, --version","Output the current version").option("--json","Output machine-readable JSON").option("--base-url <url>","Hogi backend base URL").option("--workspace <id>","Workspace ID override").option("--verbose","Enable verbose/debug output").option("--no-color","Disable colored output"),e.addCommand(Wn()),e.addCommand(_r()),e.addCommand(zr()),e.addCommand(Zr()),e.addCommand(nn()),e.addCommand(dn()),e.addCommand(un()),e.addCommand(pn()),e.addCommand(yn()),e.addCommand(Sn()),e.addCommand(Dn()),e.addCommand(Pn()),e.addCommand(ei()),e.addCommand(ti()),e.addCommand(oi()),e.hook("preAction",async(t,o)=>{let r=[],n=o;for(;n?.parent;)r.push(n.name()),n=n.parent;let i=r.reverse().join("."),s=i.startsWith("logs.")?void 0:Ht(i);await oo(o,i,s)}),e.hook("postAction",()=>{let t=typeof process.exitCode=="number"?process.exitCode:0;wt(M()?.failure?.code),kt(t),Jt(t)}),e}async function ni(e,t){e.exitOverride();try{return await e.parseAsync(t),typeof process.exitCode=="number"?process.exitCode:0}catch(o){if(o instanceof Po&&(o.code==="commander.helpDisplayed"||o.code==="commander.version"))return 0;M()||Ht("cli.parse");let r=o instanceof d?o:o instanceof Po?new d(c.INVALID_ARGUMENT,o.message):new d(c.SERVER_ERROR,o instanceof Error?o.message:String(o));return e.opts().json===!0?_(A("cli_error",r.code,r.message,r.details)):(Te(r.code,r.message),o instanceof Po||C(r.message)),process.exitCode=1,wt(r.code),kt(1),Jt(1),1}}async function ii(e){await ro(),process.exit(e)}var ic=ri;var sc=rc(import.meta.url),ac=process.argv[1]!==void 0?oc(nc(process.argv[1])):void 0;ac===sc&&ni(ic(),process.argv).then(ii);export{ic as createProgram,ni as runProgram};
|
|
44
|
+
${e}`}};function Bd(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 Wn(e=process.env){return Gd[Bd(e)]}function qd(e){try{let t=new URL(e);return(t.protocol==="https:"||t.protocol==="http:")&&t.pathname==="/"&&!t.search&&!t.hash}catch{return!1}}function jd(){let e=Wo(),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 o=t.protocol==="http:"&&(t.hostname==="127.0.0.1"||t.hostname==="localhost");if(t.protocol==="http:"&&!o||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 Kd(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 zd(e,t,o,r){let n=$({source:"cli_auth",operation:"auth.exchange",method:"POST",path:"/auth/cli/exchange"}),i;try{let s=await n.fetch(r,`${e.replace(/\/$/,"")}/auth/cli/exchange`,{method:"POST",headers:K({"content-type":"application/json",accept:"application/json"}),body:JSON.stringify({code:o.code,verifier:o.verifier}),signal:o.signal});i=s.status;let a=await s.json();if(!s.ok||a.code!=="SUCCESS")throw new Error(a.error||"Unable to exchange CLI authorization");let d=a.data;if(!d||d.app!==t||typeof d.apiKey!="string"||!/^oii_sk_[A-Za-z0-9_-]{40}$/.test(d.apiKey)||typeof d.keyId!="string"||typeof d.keyPrefix!="string")throw new Error("The authorization server returned an invalid API key response");return n.success(s.status),{apiKey:d.apiKey,app:t,keyId:d.keyId,keyPrefix:d.keyPrefix}}catch(s){throw n.failure(s,i),s}}function qn(e={}){let t=new Wd("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(o,r)=>{let n=D(r),i=Kd(o),s=o.apiKey?.trim(),a=o.apiKey!==void 0,d=i[0]??(a?void 0:"terminal"),m=(v,b,k)=>{n?_(A("auth_login",v,b,k)):C(b),process.exitCode=1};if(i.length>1){m(l.INVALID_ARGUMENT,"Choose only one target application for browser authorization.");return}if(i.length>0&&a){m(l.INVALID_ARGUMENT,"--api-key cannot be used with an application authorization option.");return}if(a&&!s){m(l.INVALID_ARGUMENT,"--api-key must not be empty.");return}let p=U(r).baseUrl,u=(o.baseUrl??(typeof p=="string"?p:void 0))?.trim();if(u&&o.resetBaseUrl){m(l.INVALID_ARGUMENT,"--base-url and --reset-base-url cannot be used together.");return}if(u&&!qd(u)){m(l.INVALID_ARGUMENT,"--base-url must be an HTTP(S) origin without a path, query, or fragment.");return}let g=e.configStore??new N,y=Ze().replace(/\/$/,""),w=process.env.OIIOII_BASE_URL?.trim().replace(/\/$/,""),E=u?.replace(/\/$/,"")||w||(o.resetBaseUrl?y:g.load().baseUrl.replace(/\/$/,""));if(d){if(E!==y){m(l.CONFIG_ERROR,`Browser authorization must use this build's backend (${y}). Run 'oiioii auth login --reset-base-url' after removing OIIOII_BASE_URL, or use '--api-key' with a custom backend.`);return}let v=Wn(),b;try{let k=await(e.createBrowserAuthorization??Vn)({app:d,authorizationPageUrl:jd(),exchange:async ae=>{let Ie=await zd(E,d,ae,e.fetch??globalThis.fetch);return g.update({apiKey:Ie.apiKey,baseUrl:E},{resetBaseUrl:o.resetBaseUrl===!0}),Ie}});b=k.cancel,n||f(v.opening);let q=o.browser===!1?!1:await(e.openBrowser??Gn)(k.url);o.browser===!1?V(v.manualUrl(k.url)):q?n||f(v.waiting):V(v.browserFallback(k.url));let j=await k.result;if(j.outcome!=="success"){let ae=j.outcome==="cancelled"?"Authorization was cancelled.":j.outcome==="expired"?"Authorization expired. Run the login command again.":j.outcome==="error"?j.message:"Authorization failed.";m(j.outcome==="expired"?l.AUTH_TIMEOUT:l.AUTH_INVALID,ae);return}let Ne=d==="terminal"?{requested:!1,supported:!1}:await(e.activateApp??Bn)(d);n?_(I("auth_login",{activated:Ne.requested,activation_supported:Ne.supported,app:d,authenticated:!0,base_url:g.load().baseUrl,config_file:g.getConfigPath()})):(x(v.saved),d==="terminal"?f(v.terminalFallback):Ne.requested?f(v.activating(Oo[d])):V(v.activationFallback(Oo[d])))}catch(k){b?.(),m(l.NETWORK_ERROR,k instanceof Error?k.message:String(k))}return}g.update({apiKey:s,...u?{baseUrl:u.replace(/\/$/,"")}:{}},{resetBaseUrl:o.resetBaseUrl===!0});let R=g.load(),T=g.getConfigPath();n?_(I("auth_login",{authenticated:!0,base_url:R.baseUrl,config_file:T})):(x(`API key saved to ${T}`),f(` Base URL: ${R.baseUrl}`))}),t.command("status").description("Check whether authentication is configured without exposing the API key").action((o,r)=>{let n=D(r),i=e.configStore??new N,s=!!process.env.OIIOII_API_KEY?.trim(),a=!!i.load().apiKey,d=s?"environment":a?"config":null,m=d!==null;n?_(I("auth_status",{authenticated:m,credential_source:d,config_file:i.getConfigPath()})):d==="environment"?x("Authenticated through OIIOII_API_KEY."):d==="config"?x("Authenticated through local configuration."):V("Not authenticated. Run 'oiioii auth login'."),m||(process.exitCode=1)}),t.command("logout").description("Remove locally persisted authentication without exposing the API key").action((o,r)=>{let n=D(r),i=e.configStore??new N,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?x("Local authentication removed."):f("No local authentication was configured."),a&&V("OIIOII_API_KEY is still set for this process; unset it to disable effective authentication."))}),t}import{Command as Po}from"commander";import Xd from"cross-spawn";import Z from"semver";import{existsSync as Zd}from"fs";import{existsSync as Hd,readFileSync as Jd}from"fs";import{homedir as jn}from"os";import{join as $t}from"path";function Yd(){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 $t(e||$t(jn(),"AppData","Local"),"oiioii-cli")}return $t(jn(),".local","share","oiioii-cli")}function Qd(){return process.env.OIIOII_INSTALL_RECORD?.trim()||$t(Yd(),"install.json")}function xe(e){return typeof e=="string"&&e.trim().length>0}function Kn(e=Qd()){if(!Hd(e))throw new c(l.CLI_INSTALLATION_UNMANAGED,`This oiioii installation is not managed by the official installer. Update it with 'npm install -g ${rt}@latest'.`,{path:e,retryable:!1});let t;try{t=JSON.parse(Jd(e,"utf8").replace(/^\uFEFF/,""))}catch(n){throw new c(l.CONFIG_ERROR,`Cannot read CLI install record: ${e}`,{path:e,cause:n instanceof Error?n.message:String(n)})}let o=t;if(o.schemaVersion!==1||o.manager!=="npm"||!xe(o.environment)||!xe(o.packageName)||!xe(o.distTag)||!xe(o.installRoot)||!xe(o.npmPrefix)||!xe(o.nodePath)||!xe(o.npmPath)||!xe(o.entryPath))throw new c(l.CONFIG_ERROR,`Invalid CLI install record: ${e}`,{path:e});let r=X();if(o.environment!==r)throw new c(l.CONFIG_ERROR,`Install record environment '${o.environment}' does not match this '${r}' build.`,{path:e,installed_environment:o.environment,build_environment:r});if(o.packageName!==rt)throw new c(l.CONFIG_ERROR,`Install record package '${o.packageName}' does not match this build package '${rt}'.`,{path:e,installed_package:o.packageName,build_package:rt});return o}var xo=(e,t,o)=>new Promise((r,n)=>{let i=Xd(e,t,{stdio:o.inherit?"inherit":["ignore","pipe","pipe"],env:process.env}),s="",a="";o.inherit||(i.stdout?.setEncoding("utf8"),i.stderr?.setEncoding("utf8"),i.stdout?.on("data",d=>{s+=d}),i.stderr?.on("data",d=>{a+=d})),i.on("error",n),i.on("close",d=>r({exitCode:d??1,stdout:s,stderr:a}))});function No(e,t){return e.registry?[...t,"--registry",e.registry]:t}async function Vt(e,t,o,r){let n;try{n=await e(t,o,{inherit:r.inherit===!0})}catch(i){throw new c(l.CLI_UPDATE_FAILED,`Failed to start npm while ${r.operation}.`,{cause:i instanceof Error?i.message:String(i),retryable:!0})}if(n.exitCode!==0)throw new c(l.CLI_UPDATE_FAILED,`npm failed while ${r.operation}.`,{exit_code:n.exitCode,stderr:n.stderr.trim()||void 0,retryable:!0});return n}function Hn(e,t){try{return JSON.parse(e.trim())}catch{throw new c(l.CLI_UPDATE_FAILED,`npm returned invalid JSON while ${t}.`,{output:e.trim(),retryable:!0})}}function ec(e){let t=e.trim().replace(/^v(?=\d)/,"");if(Z.valid(t)===null)throw new c(l.INVALID_ARGUMENT,`Invalid CLI version '${e}'. Use one exact version such as 0.3.0; ranges, tags, and URLs are not supported.`);return t}function Do(e){let t=X(),o=et();if(!o.managed)throw new c(l.CLI_INSTALLATION_UNMANAGED,"Local builds cannot update or install CLI versions from npm. Rebuild the local checkout instead.");let r=Z.prerelease(e);if(o.prerelease==="forbidden"&&r!==null)throw new c(l.INVALID_ARGUMENT,`The production build only installs stable versions; '${e}' is a prerelease.`);if(o.prerelease==="required"&&r===null)throw new c(l.INVALID_ARGUMENT,`The ${t} build only installs prerelease versions; '${e}' is stable.`)}function Uo(){let e=et();if(!e.managed||!e.distTag)throw new c(l.CLI_INSTALLATION_UNMANAGED,"Local builds cannot update or install CLI versions from npm. Rebuild the local checkout instead.");let t=Kn();if(t.distTag!==e.distTag)throw new c(l.CONFIG_ERROR,`Install record dist-tag '${t.distTag}' does not match '${e.distTag}'.`);return t}async function Jn(e,t,o){let r=await Vt(o,e.npmPath,No(e,["view",`${e.packageName}@${t}`,"version","--json"]),{operation:`resolving ${t}`}),n=Hn(r.stdout,`resolving ${t}`);if(typeof n!="string"||Z.valid(n)===null)throw new c(l.CLI_UPDATE_FAILED,`npm returned an invalid version for '${t}'.`,{value:n,retryable:!0});return Do(n),n}async function tc(e,t,o){if(!Zd(e.entryPath))throw new c(l.CLI_UPDATE_FAILED,`Installed CLI entry was not found: ${e.entryPath}`);let r=await Vt(o,e.nodePath,[e.entryPath,"--version"],{operation:"verifying the installed CLI"});if(r.stdout.trim()!==t)throw new c(l.CLI_UPDATE_FAILED,"Installed CLI version verification failed.",{expected:t,actual:r.stdout.trim(),retryable:!0})}async function zn(e,t,o){await Vt(o,e.npmPath,No(e,["install","--global","--prefix",e.npmPrefix,"--no-audit","--no-fund",`${e.packageName}@${t}`]),{inherit:!0,operation:`installing ${e.packageName}@${t}`}),await tc(e,t,o)}async function Yn(e,t,o){try{await zn(e,t,o)}catch(r){let n="not_attempted",i;if(Z.valid(F)!==null&&Z.neq(F,t))try{await zn(e,F,o),n="succeeded"}catch(s){n="failed",i=s instanceof Error?s.message:String(s)}throw new c(l.CLI_UPDATE_FAILED,`Failed to install ${e.packageName}@${t}.`,{cause:r instanceof Error?r.message:String(r),rollback:n,...i?{rollback_error:i}:{},retryable:!0})}}async function Qn(e={},t=xo){let o=et();if(!o.managed||!o.distTag)throw Do(F),new Error("unreachable");let r=Uo(),n=await Jn(r,o.distTag,t),i=Z.gt(n,F),s=!e.check&&(i||e.force===!0);return s&&await Yn(r,n,t),{environment:X(),package:r.packageName,dist_tag:o.distTag,previous_version:F,version:n,update_available:i,changed:s,checked_only:e.check===!0}}async function Xn(e,t=xo){let o=Uo(),r=ec(e);Do(r);let n=await Jn(o,r,t);return await Yn(o,n,t),{environment:X(),package:o.packageName,dist_tag:o.distTag,previous_version:F,version:n,update_available:Z.gt(n,F),changed:Z.neq(F,n),checked_only:!1}}async function Zn(e=xo){let t=et(),o=Uo(),r=await Vt(e,o.npmPath,No(o,["view",o.packageName,"versions","--json"]),{operation:"listing CLI versions"}),n=Hn(r.stdout,"listing CLI versions"),s=(Array.isArray(n)?n:[n]).filter(a=>typeof a=="string"&&Z.valid(a)!==null).filter(a=>t.prerelease==="required"?Z.prerelease(a)!==null:Z.prerelease(a)===null).sort(Z.rcompare);return{environment:X(),package:o.packageName,dist_tag:t.distTag,versions:s}}function ei(e,t,o){if(D(o)){_(I(e,t));return}if(t.checked_only){t.update_available?f(`Update available: ${t.previous_version} -> ${t.version} (${t.dist_tag})`):t.previous_version===t.version?x(`oiioii ${t.previous_version} is up to date (${t.dist_tag}).`):f(`Current version ${t.previous_version} is newer than channel version ${t.version}; no downgrade will be performed.`);return}t.changed?x(`oiioii ${t.previous_version} -> ${t.version}`):x(`oiioii ${t.version} is already installed.`)}function ti(){return new Po("update").description("Update oiioii from the npm channel for this build environment").option("--check","Check for an update without installing it").option("--force","Reinstall the channel version even when already current").action(async(e,t)=>{ei("cli_update",await Qn(e),t)})}function oi(){return new Po("install").description("Install one exact oiioii version from npm").argument("<version>","Exact stable or prerelease version allowed by this build environment").action(async(e,t,o)=>{ei("cli_install",await Xn(e),o)})}function ri(){return new Po("versions").description("List npm versions available to this build environment").action(async(e,t)=>{let o=await Zn();if(D(t)){_(I("cli_versions",o));return}J(`Available oiioii versions (${o.environment})`),o.versions.length===0?f("No matching versions found."):o.versions.forEach(r=>f(r))})}function ni(){let e=new oc;return e.name("oiioii").description("Agent-native CLI for Oiioii / Hogi GenAI capabilities").version(F,"-V, --version","Output the current version").option("--json","Output machine-readable JSON").option("--base-url <url>","Hogi backend base URL").option("--workspace <id>","Workspace ID override").option("--verbose","Enable verbose/debug output").option("--no-color","Disable colored output"),e.addCommand(qn()),e.addCommand(hr()),e.addCommand(Hr()),e.addCommand(en()),e.addCommand(sn()),e.addCommand(cn()),e.addCommand(mn()),e.addCommand(fn()),e.addCommand(wn()),e.addCommand(On()),e.addCommand(Un()),e.addCommand(Mn()),e.addCommand(ti()),e.addCommand(oi()),e.addCommand(ri()),e.hook("preAction",async(t,o)=>{let r=[],n=o;for(;n?.parent;)r.push(n.name()),n=n.parent;let i=r.reverse().join("."),s=i.startsWith("logs.")?void 0:Ht(i);await ro(o,i,s)}),e.hook("postAction",()=>{let t=typeof process.exitCode=="number"?process.exitCode:0;wt(M()?.failure?.code),kt(t),Jt(t)}),e}async function ii(e,t){e.exitOverride();try{return await e.parseAsync(t),typeof process.exitCode=="number"?process.exitCode:0}catch(o){if(o instanceof Mo&&(o.code==="commander.helpDisplayed"||o.code==="commander.version"))return 0;M()||Ht("cli.parse");let r=o instanceof c?o:o instanceof Mo?new c(l.INVALID_ARGUMENT,o.message):new c(l.SERVER_ERROR,o instanceof Error?o.message:String(o));return e.opts().json===!0?_(A("cli_error",r.code,r.message,r.details)):(Te(r.code,r.message),o instanceof Mo||C(r.message)),process.exitCode=1,wt(r.code),kt(1),Jt(1),1}}async function si(e){await no(),process.exit(e)}var sc=ni;var ac=nc(import.meta.url),dc=process.argv[1]!==void 0?rc(ic(process.argv[1])):void 0;dc===ac&&ii(sc(),process.argv).then(si);export{sc as createProgram,ii as runProgram};
|
|
45
45
|
//# sourceMappingURL=cli.js.map
|