@gencode/cli 0.0.15 → 0.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bin.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{r as e,t}from"./program-B5oTNId3.js";function n(){globalThis.getPkgPath||(globalThis.getPkgPath=()=>`@wizard/aimax`)}n();const r=Date.now();e.info(`AIMax CLI starting (pid=${process.pid})`),t().parseAsync(process.argv).catch(t=>{e.error(`Unexpected error: ${t.message}`),process.exit(1)}).finally(()=>{let t=Date.now()-r;e.info(`AIMax CLI exited (total uptime: ${t}ms)`)});export{};
2
+ import{r as e,t}from"./program-Le8ajXzq.js";function n(){globalThis.getPkgPath||(globalThis.getPkgPath=()=>`@wizard/aimax`)}n();const r=Date.now();e.info(`AIMax CLI starting (pid=${process.pid})`),t().parseAsync(process.argv).catch(t=>{e.error(`Unexpected error: ${t.message}`),process.exit(1)}).finally(()=>{let t=Date.now()-r;e.info(`AIMax CLI exited (total uptime: ${t}ms)`)});export{};
@@ -0,0 +1,6 @@
1
+ import{createRequire as e}from"node:module";import{Command as t}from"commander";import{bootstrapMountLayout as n,createBuiltinMemoryProvider as r,ensureBootstrapMountLayout as i,exportSession as a,hasBootstrapSentinel as o,initializePluginSystem as s,inspectSession as c,listAvailableSlashCommands as l,listSessionSummaries as u,loadSkillsWithPluginDirs as ee,normalizePluginsConfig as te,resolveMemoryProvider as ne,runAgent as re}from"@gencode/agents";import{isAgentDiagnosticEvent as ie}from"@gencode/shared";import d from"node:path";import ae from"gensign-node";import f from"node:fs/promises";import{addAgent as oe,addBinding as se,getAgentConfig as p,listAgents as ce,listBindings as m,loadAgentsConfig as h,normalizeAgentId as g,removeAgent as le,removeBindings as _,resolveAgentDir as v,resolveDefaultAgentId as y,updateAgentIdentity as b}from"@gencode/agents/config";function x(e){process.stdout.write(e)}function S(e){process.stdout.write(e+`
2
+ `)}function C(e){process.stderr.write(e+`
3
+ `)}function w(e){switch(e.type){case`start`:S(`\n[start] ${e.message}`);break;case`text`:x(e.text);break;case`stream_text_delta`:x(e.text);break;case`bootstrap`:S(`\n[bootstrap:${e.phase}] ${e.dataDir}`);break;case`session_reset`:S(`\n[session:${e.action}] ${e.message}`);break;case`tool_start`:S(`\n[tool:${e.name}] ${JSON.stringify(e.input)}`);break;case`tool_end`:S(`[tool:${e.name}] ${e.isError?`ERROR`:`OK`} ${e.output.slice(0,200)}`);break;case`compaction`:S(`\n[compaction${e.layer?`:${e.layer}`:``}] ${e.reason}${e.strategy?` (${e.strategy})`:``}`);break;case`skill_used`:S(`\n[skill] ${e.skillName} agent=${e.agent} task=${e.taskId}`);break;case`error`:C(`\n[error] ${e.message}`);break;case`diagnostic`:break;case`subagent_spawn`:S(`\n[subagent:spawn]${e.label?` "${e.label}"`:``} ${e.task}`);break;case`subagent_complete`:S(`[subagent:${e.status}] ${e.task}`);break}}function ue(e,t){if(t===`json`){S(JSON.stringify(e,null,2));return}S(`
4
+ `),S(`session: ${e.sessionId}`),S(`duration: ${e.durationMs}ms`),S(`tokens: input=${e.usage.input} output=${e.usage.output} total=${e.usage.total}`),e.context&&(S(`context: ${e.context.snapshotPath}`),S(`tool-results: ${e.context.toolResultsDir}`)),e.error&&C(`error: ${e.error}`)}function de(e,t){if(t===`json`){S(JSON.stringify(e,null,2));return}if(e.length===0){S(`No sessions found.`);return}for(let t of e){let e=t.createdAt?new Date(t.createdAt).toLocaleString():`unknown`;S(`${t.id} ${e} [${t.channel}] ${t.title}`)}}function fe(e,t){if(t===`json`){S(JSON.stringify(e,null,2));return}S(`session: ${e.id}`),e.metadata&&(S(`title: ${e.metadata.title}`),S(`channel: ${e.metadata.channel}`),S(`created: ${e.metadata.createdAt}`),S(`updated: ${e.metadata.updatedAt}`)),S(`transcript: ${e.transcriptPath}`),S(`entries: ${e.transcriptEntryCount}`),S(`context: ${e.contextSnapshotPath}`),S(`session-memory: ${e.sessionMemoryPath}`),S(`collapse-log: ${e.collapseLogPath}`),S(`read-states: ${e.readStateCount}`),S(`tool-results: ${e.toolResultRefCount}`),S(`tool-results-dir: ${e.toolResultsDir}`)}function pe(e,t){if(t===`json`){S(JSON.stringify(e,null,2));return}S(`session: ${e.id}`),S(`transcript: ${e.paths.transcriptPath}`),S(`context: ${e.paths.contextSnapshotPath}`),S(`session-memory: ${e.paths.sessionMemoryPath}`),S(`collapse-log: ${e.paths.collapseLogPath}`),S(`tool-results-dir: ${e.paths.toolResultsDir}`),S(`transcript-entries: ${e.transcript.length}`),S(`read-states: ${e.context.readStates.length}`),S(`tool-results: ${e.context.toolResults.length}`),S(`collapse-spans: ${e.context.compaction.collapseSpans.length}`)}function me(e,t){if(t===`json`){S(JSON.stringify(e,null,2));return}S(`Bootstrap completed.`),S(`dataDir: ${e.dataDir}`),S(`created dirs: ${e.createdDirs.length}`),S(`created files: ${e.createdFiles.length}`),S(`skipped dirs: ${e.skippedDirs.length}`),S(`skipped files: ${e.skippedFiles.length}`)}function he(e){e.command(`bootstrap`).description(`Initialize the data directory with required directories and templates`).requiredOption(`-d, --data-dir <path>`,`Data directory path`).option(`--output <format>`,`Output format: text (default) or json`,`text`).action(async e=>{let t=e.output===`json`?`json`:`text`;try{me(await n(e.dataDir),t)}catch(e){C(`Error bootstrapping data directory: ${e.message}`),process.exit(1)}})}function ge(e){return ae.sm4_encrypt_ecb(e)}function T(e){return ge(e)}function _e(e={}){let t=e.baseUrl??process.env.AIMAX_BASE_URL,n=process.env.AIMAX_AUTH_TOKEN,r=e.authToken?T(e.authToken):n?T(n):e.apiKey??process.env.AIMAX_API_KEY,i=e.model??process.env.AIMAX_MODEL,a=[];if(t||a.push(`--base-url / AIMAX_BASE_URL`),r||a.push(`--api-key / AIMAX_API_KEY`),i||a.push(`--model / AIMAX_MODEL`),a.length>0)throw Error(`Missing required LLM configuration: ${a.join(`, `)}`);return{baseUrl:t,apiKey:r,model:i,contextWindow:e.contextWindow??(process.env.AIMAX_CONTEXT_WINDOW?Number(process.env.AIMAX_CONTEXT_WINDOW):void 0)}}function E(e,t){return t?d.resolve(t):d.join(e,`.aimax`,`plugins.json`)}async function D(e,t){let n=E(e,t);try{let e=await f.readFile(n,`utf-8`);return JSON.parse(e)}catch(e){if(e.code===`ENOENT`)return;throw e}}async function O(e,t,n){let r=E(e,n);await f.mkdir(d.dirname(r),{recursive:!0}),await f.writeFile(r,JSON.stringify(t,null,2),`utf-8`)}function k(e){return typeof e==`object`&&!!e}function A(e){return k(e)&&e.type===`text`&&typeof e.text==`string`&&(e.textSignature===void 0||typeof e.textSignature==`string`)}function j(e){return k(e)&&e.type===`image`&&typeof e.data==`string`&&typeof e.mimeType==`string`}function M(e){return k(e)&&e.type===`thinking`&&typeof e.thinking==`string`&&(e.thinkingSignature===void 0||typeof e.thinkingSignature==`string`)&&(e.redacted===void 0||typeof e.redacted==`boolean`)}function N(e){return k(e)&&e.type===`toolCall`&&typeof e.id==`string`&&typeof e.name==`string`&&k(e.arguments)&&(e.thoughtSignature===void 0||typeof e.thoughtSignature==`string`)}function P(e){return typeof e==`string`||Array.isArray(e)&&e.every(e=>A(e)||j(e))}function F(e){return Array.isArray(e)&&e.every(e=>A(e)||M(e)||N(e))}function I(e){return k(e)&&typeof e.input==`number`&&typeof e.output==`number`&&typeof e.cacheRead==`number`&&typeof e.cacheWrite==`number`&&typeof e.totalTokens==`number`&&k(e.cost)&&typeof e.cost.input==`number`&&typeof e.cost.output==`number`&&typeof e.cost.cacheRead==`number`&&typeof e.cost.cacheWrite==`number`&&typeof e.cost.total==`number`}function ve(e){return!k(e)||typeof e.role!=`string`?!1:e.role===`user`?P(e.content):e.role===`assistant`?F(e.content)&&typeof e.api==`string`&&typeof e.provider==`string`&&typeof e.model==`string`&&I(e.usage)&&(e.stopReason===`stop`||e.stopReason===`length`||e.stopReason===`toolUse`||e.stopReason===`error`||e.stopReason===`aborted`)&&(e.errorMessage===void 0||typeof e.errorMessage==`string`):e.role===`toolResult`?typeof e.toolCallId==`string`&&typeof e.toolName==`string`&&Array.isArray(e.content)&&e.content.every(e=>A(e)||j(e))&&typeof e.isError==`boolean`:!1}async function ye(e){let t;try{t=await f.readFile(e,`utf-8`)}catch(e){throw Error(`Failed to read message file: ${e.message}`)}let n;try{n=JSON.parse(t)}catch(e){throw Error(`Invalid JSON in message file: ${e.message}`)}let r=Array.isArray(n)?n:[n];if(r.length===0||!r.every(e=>ve(e)))throw Error(`Message file must contain one Message object or an array of Message objects`);return r}async function be(e){if(!!e.message==!!e.fromFile)throw Error(`Exactly one of --message or --from-file must be provided`);return e.fromFile?{kind:`messages`,messages:await ye(e.fromFile)}:{kind:`text`,message:e.message}}let L=function(e){return e.INFO=`INFO`,e.ERROR=`ERROR`,e.WARN=`WARN`,e}({});function xe(){let e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)} ${String(e.getHours()).padStart(2,`0`)}:${String(e.getMinutes()).padStart(2,`0`)}:${String(e.getSeconds()).padStart(2,`0`)}.${String(e.getMilliseconds()).padStart(3,`0`)}`}function Se(e){if(!e)return``;let t=Object.entries(e).filter(([,e])=>e!==void 0).map(([e,t])=>`${e}=${JSON.stringify(t)}`);return t.length>0?` ${t.join(` `)}`:``}function R(e,t,n){let r=xe();process.stderr.write(`[${r}] [${e}] ${t}${Se(n)}\n`)}const z={info:(e,t)=>R(L.INFO,e,t),warn:(e,t)=>R(L.WARN,e,t),error:(e,t)=>R(L.ERROR,e,t)};var Ce=class{startTime;name;constructor(e){this.name=e,this.startTime=Date.now()}end(){let e=Date.now()-this.startTime;return z.info(`${this.name} completed in ${e}ms`),e}},we=class{constructor(e){this.sinks=e}async send(e){await Promise.allSettled(this.sinks.map(async t=>{await t.send(e)}))}async close(){await Promise.allSettled(this.sinks.map(async e=>{await e.close()}))}},Te=class{constructor(e){this.url=e}async send(e){await this.post(this.toPayload(e))}async close(){}async post(e){let t=Date.now(),n=Ee(e);z.info(`sending callback event`,{callbackUrl:this.url,...n});let r=await fetch(this.url,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e)}),i=Date.now()-t;if(!r.ok)throw z.error(`callback event failed`,{callbackUrl:this.url,httpStatus:r.status,durationMs:i,...n}),Error(`Callback failed with status ${r.status}`);z.info(`callback event delivered`,{callbackUrl:this.url,httpStatus:r.status,durationMs:i,...n})}toPayload(e){switch(e.type){case`start`:return e;case`progress`:return e;case`done`:return e;case`error`:return e;case`session_reset`:return e;default:{let t=e;throw Error(`Unsupported callback event: ${JSON.stringify(t)}`)}}}};function Ee(e){return{eventType:e.type,sessionId:e.sessionId,messageId:e.messageId,channel:e.channel,progressType:e.type===`progress`?e.event.type:void 0}}function De(e,t){if(t.kind===`none`)return e;let n=new URL(e);return n.searchParams.set(`authToken`,t.token),n.toString()}function B(){let e=globalThis.WebSocket;if(!e)throw Error(`WebSocket is not available in this runtime`);return e}function Oe(e){return e?{kind:`query_token`,token:e}:{kind:`none`}}function V(e,t,n){if(typeof e.once==`function`){e.once(t,n);return}if(typeof e.addEventListener==`function`&&typeof e.removeEventListener==`function`){let r=(...i)=>{e.removeEventListener?.(t,r),n(...i)};e.addEventListener(t,r);return}throw Error(`WebSocket does not support one-time listener registration for "${t}"`)}function ke(e,t,n){if(typeof e.on==`function`){e.on(t,n);return}if(typeof e.addEventListener==`function`){e.addEventListener(t,n);return}throw Error(`WebSocket does not support listener registration for "${t}"`)}var Ae=class{socket=null;connectPromise=null;enabled=!0;textSequence=0;constructor(e,t,n){this.url=e,this.events=t,this.authToken=n}async send(e){let t=this.toEnvelope(e);if(!(!t||!this.enabled))try{await this.ensureConnected();let e=B();if(!this.socket||this.socket.readyState!==e.OPEN)return;this.socket.send(JSON.stringify(t))}catch(e){z.warn(`websocket sink disabled after send failure`,{url:this.url,error:e instanceof Error?e.message:String(e)}),this.enabled=!1}}async sendTextDelta(e){if(!this.enabled||!this.events.has(`text`))return;this.textSequence+=1;let t={type:`text`,sessionId:e.sessionId,messageId:e.messageId,channel:e.channel,timestamp:new Date().toISOString(),sequence:this.textSequence,delta:e.text};try{await this.ensureConnected();let e=B();if(!this.socket||this.socket.readyState!==e.OPEN)return;this.socket.send(JSON.stringify(t))}catch(e){z.warn(`websocket sink disabled after text delta send failure`,{url:this.url,error:e instanceof Error?e.message:String(e)}),this.enabled=!1}}async close(){this.enabled=!1;let e=this.socket;if(this.socket=null,this.connectPromise=null,!e)return;let t=B();e.readyState!==t.CLOSED&&await new Promise(t=>{V(e,`close`,()=>t()),e.close()})}async ensureConnected(){if(!this.enabled)return;let e=B();if(this.socket&&this.socket.readyState===e.OPEN)return;if(this.connectPromise){await this.connectPromise;return}let t=new e(De(this.url,Oe(this.authToken)));this.connectPromise=new Promise((e,n)=>{V(t,`open`,()=>{this.socket=t,ke(t,`close`,()=>{this.socket===t&&(this.socket=null)}),e()}),V(t,`error`,e=>{n(e)})});try{await this.connectPromise}finally{this.connectPromise=null}}toEnvelope(e){let t=new Date().toISOString();switch(e.type){case`start`:return this.events.has(`start`)?{...e,timestamp:t}:null;case`done`:return this.events.has(`done`)?{...e,timestamp:t}:null;case`error`:return this.events.has(`error`)?{...e,timestamp:t}:null;case`session_reset`:return null;case`progress`:return e.event.type===`text`?this.events.has(`text`)?(this.textSequence+=1,{type:`text`,sessionId:e.sessionId,messageId:e.messageId,channel:e.channel,timestamp:t,sequence:this.textSequence,delta:e.event.text}):null:e.event.type===`stream_text_delta`||!this.events.has(`progress`)?null:{type:`progress`,sessionId:e.sessionId,messageId:e.messageId,channel:e.channel,timestamp:t,event:e.event};default:{let t=e;throw Error(`Unsupported stream event: ${JSON.stringify(t)}`)}}}};const H=[`start`,`text`,`done`,`error`],je=[`H5`,`WEB`,`KLPA`,`CRON`,`EIP_ASSISTANT`];function Me(e){if(!e?.trim())return new Set(H);let t=e.split(`,`).map(e=>e.trim().toLowerCase()).filter(Boolean),n=new Set([`start`,`text`,`progress`,`done`,`error`]),r=new Set;for(let e of t){if(!n.has(e))throw Error(`Invalid stream event: ${e}. Must be one of start,text,progress,done,error`);r.add(e)}return r.size>0?r:new Set(H)}function Ne(e){let t=e.dataDir??process.env.AIMAX_DATA_DIR;if(!t)throw Error(`Data directory must be specified via --data-dir option or AIMAX_DATA_DIR environment variable`);return t}function Pe(e){let t=e??`WEB`;if(!je.includes(t))throw Error(`Invalid channel: ${t}. Must be 'H5', 'WEB', 'KLPA', 'CRON', or 'EIP_ASSISTANT'`);return t}async function Fe(e){let t=Ne(e),n=Pe(e.channel),r=_e({baseUrl:e.baseUrl,apiKey:e.apiKey,authToken:e.authToken,model:e.model,contextWindow:e.contextWindow?Number(e.contextWindow):void 0}),i=await be({message:e.message,fromFile:e.fromFile});return{dataDir:t,channel:n,format:e.output===`json`?`json`:`text`,timeoutMs:e.timeout?Number(e.timeout):void 0,llm:r,input:i}}function Ie(e){let t=[],n=null;return e.callbackUrl&&t.push(new Te(e.callbackUrl)),e.streamUrl&&(n=new Ae(e.streamUrl,Me(e.streamEvents),e.streamAuthToken),t.push(n)),{sink:new we(t),websocketSink:n}}async function U(e,t){z.info(`dispatching external event`,Ze(t)),await e.sink.send(t)}function Le(e){if(!e)return{};let t={};for(let[n,r]of Object.entries(e)){if(r===null||typeof r==`string`||typeof r==`number`||typeof r==`boolean`){t[n]=r;continue}if(r instanceof Error){t[n]=`${r.name}: ${r.message}`;continue}t[n]=JSON.stringify(r)}return t}function Re(e){let t={sessionId:e.sessionId,messageId:e.messageId,parentSessionId:e.parentSessionId,depth:e.depth,scope:e.scope,phase:e.phase,...Le(e.details)};if(e.level===`error`){z.error(e.message,t);return}if(e.level===`warn`){z.warn(e.message,t);return}z.info(e.message,t)}function W(e,t,n,r){return{sink:e,websocketSink:t,channel:n,defaultMessageId:r}}function ze(){let e=new AbortController,t=()=>e.abort();return process.once(`SIGTERM`,t),process.once(`SIGINT`,t),{controller:e,cleanup:()=>{process.off(`SIGTERM`,t),process.off(`SIGINT`,t)}}}function Be(e){return{activeSessionId:e??`pending`,finalResult:null}}function Ve(e,t){e.activeSessionId=t.sessionId??e.activeSessionId}function G(e,t){return e.messageId??t}async function He(e,t,n){if(!await o(e.dataDir)){if(await K(t,e.format,n.activeSessionId,e.dataDir,`checking`),(await i(e.dataDir)).performedBootstrap){await K(t,e.format,n.activeSessionId,e.dataDir,`initializing`),await K(t,e.format,n.activeSessionId,e.dataDir,`initialized`);return}await K(t,e.format,n.activeSessionId,e.dataDir,`ready`)}}async function K(e,t,n,r,i){let a={type:`bootstrap`,phase:i,dataDir:r};t===`text`&&w(a),await U(e,{sessionId:n,channel:e.channel,messageId:e.defaultMessageId,type:`progress`,event:a})}function Ue(e,t,n){return async r=>{if(Ve(n,r),ie(r)){Re(r);return}if(r.type===`stream_text_delta`){e.format===`text`&&w(r),await t.websocketSink?.sendTextDelta({sessionId:n.activeSessionId,channel:e.channel,messageId:G(r,t.defaultMessageId),text:r.text});return}e.format===`text`&&w(r);let i=G(r,t.defaultMessageId);if(r.type===`start`){await U(t,{sessionId:n.activeSessionId,channel:e.channel,messageId:i,type:`start`,message:r.message});return}if(r.type===`session_reset`){await U(t,{sessionId:n.activeSessionId,channel:e.channel,messageId:i,type:`session_reset`,action:r.action,previousSessionId:r.previousSessionId,message:r.message});return}await U(t,{sessionId:n.activeSessionId,channel:e.channel,messageId:i,type:`progress`,event:r})}}function We(e,t,n,r,i){let a={dataDir:t.dataDir,sessionId:e.sessionId,messageId:e.messageId,channel:t.channel,llm:t.llm,timeoutMs:t.timeoutMs,abortSignal:n.signal,plugins:i?{config:i,dataDir:t.dataDir,workspaceDir:d.join(t.dataDir,`workspace`),bundledDir:process.env.AIMAX_PLUGINS_BUNDLED_DIR,llmAllowlist:i.llmAllowlist}:void 0,onProgress:r};return t.input.kind===`messages`?{...a,messages:t.input.messages}:{...a,message:t.input.message}}async function Ge(e,t,n,r){if(t.activeSessionId=r.sessionId,t.finalResult=r,r.error){await U(e,{sessionId:r.sessionId,channel:e.channel,messageId:n,type:`error`,message:r.error});return}await U(e,{sessionId:r.sessionId,channel:e.channel,messageId:n,type:`done`,result:{text:r.text,usage:r.usage,durationMs:r.durationMs,error:r.error}})}async function Ke(e,t,n,r){await U(e,{sessionId:t.finalResult?.sessionId??t.activeSessionId,channel:e.channel,messageId:n,type:`error`,message:`Fatal: ${r.message}`})}function qe(e,t){z.info(`run command started`,{channel:t.channel,dataDir:t.dataDir,sessionId:e.sessionId??`new`,messageId:e.messageId,output:t.format,hasCallback:!!e.callbackUrl,hasStream:!!e.streamUrl})}function Je(e,t,n){ue(t,n),t.error?z.error(`run command failed: ${t.error}`):z.info(`run command succeeded`),e.end(),process.exit(t.error?1:0)}function Ye(e,t){z.error(`run command error: ${t.message}`),C(`Fatal: ${t.message}`),e.end(),process.exit(1)}async function Xe(e){let t=new Ce(`run command`),{controller:n,cleanup:r}=ze(),i=null,a=e.channel??`WEB`,o=Be(e.sessionId);try{let r=await Fe(e);a=r.channel,qe(e,r);let s=Ie(e);i=s.sink,z.info(`external sink configured`,{callbackUrl:e.callbackUrl,streamUrl:e.streamUrl,streamEvents:e.streamEvents});let c=W(i,s.websocketSink,r.channel,e.messageId);await He(r,c,o);let l=await D(r.dataDir,e.pluginsConfig),u=await re(We(e,r,n,Ue(r,c,o),l));await Ge(c,o,e.messageId,u),Je(t,u,r.format)}catch(n){let r=n;i&&await Ke(W(i,null,a,e.messageId),o,e.messageId,r),Ye(t,r)}finally{await i?.close(),r()}}function Ze(e){return{eventType:e.type,sessionId:e.sessionId,messageId:e.messageId,channel:e.channel,progressType:e.type===`progress`?e.event.type:void 0,textLength:e.type===`done`?e.result.text.length:void 0,hasError:e.type===`error`?!0:e.type===`done`?!!e.result.error:void 0}}function Qe(e){e.command(`run`).description(`Run an agent task`).option(`-d, --data-dir <path>`,`Data directory path (overrides AIMAX_DATA_DIR)`).option(`--message <text>`,`User message to send to the agent`).option(`--from-file <path>`,`Load structured Message JSON from a file`).option(`-s, --session-id <id>`,`Resume an existing session by ID`).option(`--message-id <id>`,`Message ID for correlating events`).option(`-c, --channel <channel>`,`Channel type: H5 | WEB | KLPA | CRON | EIP_ASSISTANT (default: WEB)`,`WEB`).option(`--base-url <url>`,`LLM API base URL (overrides AIMAX_BASE_URL)`).option(`--api-key <key>`,`LLM API key (overrides AIMAX_API_KEY)`).option(`--auth-token <token>`,`Auth token used to generate the API key (highest priority)`).option(`--model <name>`,`LLM model name (overrides AIMAX_MODEL)`).option(`--context-window <n>`,`LLM context window size`).option(`--callback-url <url>`,`HTTP callback URL for progress events`).option(`--stream-url <url>`,`WebSocket URL for streaming text events`).option(`--stream-auth-token <token>`,`Auth token for WebSocket streaming`).option(`--stream-events <list>`,`Comma-separated stream events: start,text,progress,done,error`).option(`--timeout <ms>`,`Execution timeout in milliseconds (default: 600000)`).option(`--output <format>`,`Output format: text (default) or json`,`text`).option(`--plugins-config <path>`,`Plugins config file path`).action(async e=>{await Xe(e)})}function $e(e){e.command(`sessions`).description(`List or inspect sessions for a data directory`).argument(`[action]`,`Action: list (default) | inspect | export`).option(`-d, --data-dir <path>`,`Data directory path`).option(`-c, --channel <channel>`,`Filter by channel type: H5 | WEB | KLPA | CRON | EIP_ASSISTANT`).option(`-s, --session-id <id>`,`Session ID for inspect/export`).option(`--output <format>`,`Output format: text or json`).action(async(e,t,n)=>{let r=n.opts(),i=e??`list`,o=i===`export`?r.output===`text`?`text`:`json`:r.output===`json`?`json`:`text`;r.dataDir||(C(`error: required option '-d, --data-dir <path>' not specified`),process.exit(1)),r.channel&&r.channel!==`H5`&&r.channel!==`WEB`&&r.channel!==`KLPA`&&r.channel!==`CRON`&&r.channel!==`EIP_ASSISTANT`&&(C(`Invalid channel: ${r.channel}. Must be 'H5', 'WEB', 'KLPA', 'CRON', or 'EIP_ASSISTANT'`),process.exit(1));try{if(i===`list`){de(await u(r.dataDir,r.channel),o);return}if(r.sessionId||(C(`error: required option '-s, --session-id <id>' not specified`),process.exit(1)),i===`inspect`){fe(await c(r.dataDir,r.sessionId),o);return}if(i===`export`){pe(await a(r.dataDir,r.sessionId),o);return}C(`Invalid sessions action: ${i}. Must be 'list', 'inspect', or 'export'`),process.exit(1)}catch(e){C(`${i===`inspect`?`Error inspecting session`:i===`export`?`Error exporting session`:`Error listing sessions`}: ${e.message}`),process.exit(1)}})}function et(e,t){let n=[];return n.push(`backend: ${e.backend}`),n.push(`provider: ${e.provider}${e.model?` (${e.model})`:``}`),typeof e.files==`number`&&n.push(`files: ${e.files}`),typeof e.chunks==`number`&&n.push(`chunks: ${e.chunks}`),typeof e.dirty==`boolean`&&n.push(`dirty: ${e.dirty}`),e.dbPath&&n.push(`db: ${e.dbPath}`),e.sources?.length&&n.push(`sources: ${e.sources.join(`, `)}`),t&&(e.fts&&(n.push(`fts: enabled=${e.fts.enabled} available=${e.fts.available}`),e.fts.error&&n.push(`fts_error: ${e.fts.error}`)),e.vector&&(n.push(`vector: enabled=${e.vector.enabled} available=${e.vector.available??`unknown`}`),e.vector.dims&&n.push(`vector_dims: ${e.vector.dims}`),e.vector.loadError&&n.push(`vector_error: ${e.vector.loadError}`)),e.cache&&n.push(`cache: enabled=${e.cache.enabled} entries=${e.cache.entries??0}`)),n.join(`
5
+ `)}function q(e){let t=d.join(e.dataDir,`.aimax`),n=ne({providerId:e.provider,pluginId:e.providerPlugin,dataDir:e.dataDir,memoryDir:t});return n?n.provider:r({dataDir:e.dataDir,memoryDir:t},{includeSessions:e.includeSessions})}function tt(e){let t=e.command(`memory`).description(`Manage semantic memory indexing and search`);t.command(`status`).description(`Show memory index status`).requiredOption(`-d, --data-dir <path>`,`Data directory path`).option(`--deep`,`Probe embedding/vector availability`).option(`--index`,`Run a refresh before reporting status`).option(`--include-sessions`,`Include session transcripts in indexing`).option(`--provider <id>`,`Memory provider id`).option(`--provider-plugin <id>`,`Memory provider plugin id`).option(`--verbose`,`Verbose output`).option(`--output <format>`,`Output format: text (default) or json`,`text`).action(async e=>{let t=e.output===`json`?`json`:`text`;try{let n=q({dataDir:e.dataDir,provider:e.provider,providerPlugin:e.providerPlugin,includeSessions:e.includeSessions});e.index&&n.sync&&await n.sync(`cli-status`);let r=n.status();e.deep&&((r.custom??={}).note=`deep probe is only supported by builtin provider`),S(t===`json`?JSON.stringify(r,null,2):et(r,e.deep))}catch(e){C(`Error getting memory status: ${e.message}`),process.exit(1)}}),t.command(`index`).description(`Reindex memory files`).requiredOption(`-d, --data-dir <path>`,`Data directory path`).option(`--include-sessions`,`Include session transcripts in indexing`).option(`--provider <id>`,`Memory provider id`).option(`--provider-plugin <id>`,`Memory provider plugin id`).option(`--verbose`,`Verbose output`).action(async e=>{try{let t=q({dataDir:e.dataDir,provider:e.provider,providerPlugin:e.providerPlugin,includeSessions:e.includeSessions});t.sync&&await t.sync(`cli-index`),S(`Memory index refreshed.`)}catch(e){C(`Error indexing memory: ${e.message}`),process.exit(1)}}),t.command(`search [query]`).description(`Search semantic memory`).requiredOption(`-d, --data-dir <path>`,`Data directory path`).option(`--query <text>`,`Search query`).option(`--include-sessions`,`Include session transcripts in search`).option(`--provider <id>`,`Memory provider id`).option(`--provider-plugin <id>`,`Memory provider plugin id`).option(`--output <format>`,`Output format: text (default) or json`,`text`).action(async(e,t)=>{let n=t.output===`json`?`json`:`text`,r=t.query?.trim()||e?.trim();r||(C(`Query is required: provide [query] or --query <text>`),process.exit(1));try{let e=await q({dataDir:t.dataDir,provider:t.provider,providerPlugin:t.providerPlugin,includeSessions:t.includeSessions}).search(r);if(n===`json`){S(JSON.stringify(e,null,2));return}if(e.length===0){S(`No results found for: ${r}`);return}S(e.map(e=>{let t=`${e.path}:${e.startLine}-${e.endLine} (${e.score.toFixed(4)}) ${e.snippet}`;return e.citation?`${t}\n${e.citation}`:t}).join(`
6
+ `))}catch(e){C(`Error searching memory: ${e.message}`),process.exit(1)}})}function J(e){return`${e.match.accountId?`${e.match.channel}:${e.match.accountId}`:e.match.channel} -> ${e.agentId}`}function nt(e){return async t=>{let n=await h(t),r=ce(n),i=m(n);if(y(n),e.json){console.log(JSON.stringify({agents:r,bindings:i},null,2));return}console.log(`Agents:`);for(let e of r){let n=e.default?` (default)`:``,r=e.name&&e.name!==e.id?`${e.id}${n} (${e.name})`:`${e.id}${n}`;if(console.log(` - ${r}`),e.identity?.emoji||e.identity?.name){let t=[e.identity.emoji,e.identity.name].filter(Boolean).join(` `);console.log(` Identity: ${t}`)}let a=v(t,e.id);if(console.log(` Agent dir: ${a}`),e.model){let t=typeof e.model==`string`?e.model:e.model.primary;console.log(` Model: ${t}`)}let o=i.filter(t=>t.agentId===e.id);if(o.length>0){console.log(` Routing rules:`);for(let e of o)console.log(` - ${J(e)}`)}}}}function rt(e,t){return async n=>{p(await h(n),g(e))&&(console.error(`Agent "${e}" already exists.`),process.exit(1)),await oe(n,{id:e,name:t.name,model:t.model,default:t.default})||(console.error(`Agent "${e}" already exists.`),process.exit(1));let r=v(n,e);console.log(`Agent "${e}" added successfully.`),console.log(` Agent dir: ${r}`)}}function it(e){return async t=>{let n=p(await h(t),g(e));n||(console.error(`Agent "${e}" not found.`),process.exit(1)),n.default===!0&&(console.error(`Cannot delete default agent "${e}".`),process.exit(1)),await le(t,e)||(console.error(`Failed to delete agent "${e}".`),process.exit(1)),console.log(`Agent "${e}" deleted.`)}}function at(e){return async t=>{let n=await h(t),r=e.agent??y(n);p(n,r)||(console.error(`Agent "${r}" not found.`),process.exit(1)),(!e.bind||e.bind.length===0)&&(console.error(`Please specify --bind <channel>[:<account>]`),process.exit(1));for(let n of e.bind){let[e,...i]=n.split(`:`),a=i.join(`:`),o=[`H5`,`WEB`,`KLPA`,`CRON`,`EIP_ASSISTANT`];o.includes(e)||(console.error(`Invalid channel: ${e}`),console.error(`Valid channels: ${o.join(`, `)}`),process.exit(1)),await se(t,{agentId:r,match:{channel:e,accountId:a||void 0}}),console.log(`Binding added: ${n} -> ${r}`)}}}function Y(e){return async t=>{let n=await h(t),r=e.agent??y(n);if(p(n,r)||(console.error(`Agent "${r}" not found.`),process.exit(1)),e.all){let e=await _(t,r,`*`);console.log(`Removed ${e} binding(s) for agent "${r}".`)}else if(e.bind&&e.bind.length>0){let n=0;for(let i of e.bind){let[e,...a]=i.split(`:`),o=await _(t,r,e,a.join(`:`)||void 0);o>0?(console.log(`Binding removed: ${i} -> ${r}`),n+=o):console.log(`No binding found: ${i} -> ${r}`)}}else console.error(`Please specify --bind <channel>[:<account>] or --all`),process.exit(1)}}function ot(e){return async t=>{let n=m(await h(t));if(e.agent&&(n=n.filter(t=>t.agentId===e.agent)),e.json){console.log(JSON.stringify(n,null,2));return}if(n.length===0){console.log(`No bindings configured.`);return}console.log(`Routing bindings:`);for(let e of n)console.log(` ${J(e)}`)}}function st(e){return async t=>{let n=await h(t),r=e.agent??y(n);p(n,r)||(console.error(`Agent "${r}" not found.`),process.exit(1)),await b(t,r,{name:e.name,emoji:e.emoji,avatar:e.avatar})||(console.error(`Failed to update identity for agent "${r}".`),process.exit(1)),console.log(`Identity updated for agent "${r}".`)}}function ct(e,t){let n=e.command(`agents`).description(`Manage agents`);n.command(`list`).description(`List all configured agents`).option(`-j, --json`,`Output as JSON`).option(`-b, --bindings`,`Show detailed binding rules`).action(async e=>{let n=t();await nt(e)(n)}),n.command(`add <id>`).description(`Add a new agent`).option(`-n, --name <name>`,`Display name`).option(`-m, --model <model>`,`Model identifier`).option(`--default`,`Mark as default agent`).action(async(e,n)=>{let r=t();await rt(e,n)(r)}),n.command(`delete <id>`).description(`Delete an agent`).action(async e=>{let n=t();await it(e)(n)}),n.command(`bind`).description(`Bind a channel to an agent`).option(`-a, --agent <id>`,`Target agent ID`).option(`-b, --bind <channel...>`,`Channel binding (e.g., WEB, KLPA:ops)`).action(async e=>{let n=t();await at(e)(n)}),n.command(`unbind`).description(`Unbind a channel from an agent`).option(`-a, --agent <id>`,`Target agent ID`).option(`-b, --bind <channel...>`,`Channel binding to remove`).option(`--all`,`Remove all bindings for the agent`).action(async e=>{let n=t();await Y(e)(n)}),n.command(`bindings`).description(`List routing bindings`).option(`-a, --agent <id>`,`Filter by agent ID`).option(`-j, --json`,`Output as JSON`).action(async e=>{let n=t();await ot(e)(n)}),n.command(`set-identity`).description(`Set agent identity`).option(`-a, --agent <id>`,`Target agent ID`).option(`-n, --name <name>`,`Agent name`).option(`-e, --emoji <emoji>`,`Agent emoji`).option(`--avatar <path>`,`Avatar path`).action(async e=>{let n=t();await st(e)(n)})}function X(e){return d.join(e,`workspace`)}function Z(){let e=process.env.AIMAX_PLUGINS_BUNDLED_DIR;return e&&e.trim()||void 0}function lt(e){if(e.length===0){S(`No plugins discovered.`);return}for(let t of e){let e=t.status.padEnd(8,` `);S(`${t.id} ${e} ${t.origin} ${t.source}`)}}function ut(e){S(`id: ${e.id}`),S(`status: ${e.status}`),S(`origin: ${e.origin}`),S(`source: ${e.source}`),S(`enabled: ${e.enabled}`),e.error&&S(`error: ${e.error}`),S(`tools: ${e.toolCount}`),S(`hooks: ${e.hookCount}`),e.skills.length>0&&S(`skills: ${e.skills.join(`, `)}`)}function Q(e){return Array.from(new Set((e??[]).map(e=>e.trim()).filter(Boolean)))}function dt(e){if(e.length===0){S(`LLM allowlist is empty.`);return}for(let t of e)S(t)}function ft(e,t){let n=e.command(`plugins`).description(`Manage AIMax plugins`),r=e=>e.option(`--plugins-config <path>`,`Plugins config file path`);r(n.command(`list`)).description(`List discovered plugins`).option(`-d, --data-dir <path>`,`Data directory path`).action(async e=>{let n=e.dataDir??t();lt(s({config:await D(n,e.pluginsConfig),dataDir:n,workspaceDir:X(n),bundledDir:Z()}).registry.plugins)}),r(n.command(`info`)).description(`Show plugin details`).argument(`<id>`,`Plugin id`).option(`-d, --data-dir <path>`,`Data directory path`).action(async(e,n)=>{let r=n.dataDir??t(),i=s({config:await D(r,n.pluginsConfig),dataDir:r,workspaceDir:X(r),bundledDir:Z()}).registry.plugins.find(t=>t.id===e);i||(C(`Plugin not found: ${e}`),process.exit(1)),ut(i)}),r(n.command(`enable`)).description(`Enable a plugin`).argument(`<id>`,`Plugin id`).option(`-d, --data-dir <path>`,`Data directory path`).action(async(e,n)=>{let r=n.dataDir??t(),i=await D(r,n.pluginsConfig)??{},a=te(i);s({config:i,dataDir:r,workspaceDir:X(r),bundledDir:Z()}).registry.plugins.some(t=>t.id===e)||(C(`Plugin not found: ${e}`),process.exit(1)),await O(r,{...i,entries:{...i.entries,[e]:{...i.entries?.[e]??{},enabled:!0}}},n.pluginsConfig),S(`Enabled ${e}`),a.allow.length>0&&!a.allow.includes(e)&&S(`Note: plugins.allow is set; add this plugin id to allowlist if needed.`)}),r(n.command(`disable`)).description(`Disable a plugin`).argument(`<id>`,`Plugin id`).option(`-d, --data-dir <path>`,`Data directory path`).action(async(e,n)=>{let r=n.dataDir??t(),i=await D(r,n.pluginsConfig)??{};s({config:i,dataDir:r,workspaceDir:X(r),bundledDir:Z()}).registry.plugins.some(t=>t.id===e)||(C(`Plugin not found: ${e}`),process.exit(1)),await O(r,{...i,entries:{...i.entries,[e]:{...i.entries?.[e]??{},enabled:!1}}},n.pluginsConfig),S(`Disabled ${e}`)}),r(n.command(`doctor`)).description(`Validate plugin configuration`).option(`-d, --data-dir <path>`,`Data directory path`).action(async e=>{let n=e.dataDir??t(),r=s({config:await D(n,e.pluginsConfig),dataDir:n,workspaceDir:X(n),bundledDir:Z()});if(r.diagnostics.length===0){S(`No plugin issues detected.`);return}for(let e of r.diagnostics)S(`${e.level===`error`?`ERROR`:`WARN`}${e.pluginId?` ${e.pluginId}`:``}: ${e.message}`);r.diagnostics.some(e=>e.level===`error`)&&process.exit(1)});let i=n.command(`llm-allow`).description(`Manage plugin LLM allowlist`);r(i.command(`list`)).description(`List LLM allowlist entries`).option(`-d, --data-dir <path>`,`Data directory path`).action(async e=>{dt(Q((await D(e.dataDir??t(),e.pluginsConfig))?.llmAllowlist))}),r(i.command(`add`)).description(`Add entries to the LLM allowlist (plugin id or tool name)`).argument(`<entry...>`,`Plugin id or tool name`).option(`-d, --data-dir <path>`,`Data directory path`).action(async(e,n)=>{let r=n.dataDir??t(),i=await D(r,n.pluginsConfig)??{},a=Q([...i.llmAllowlist??[],...e]);await O(r,{...i,llmAllowlist:a},n.pluginsConfig),S(`LLM allowlist updated (${a.length} entries).`)}),r(i.command(`remove`)).description(`Remove entries from the LLM allowlist`).argument(`<entry...>`,`Plugin id or tool name`).option(`-d, --data-dir <path>`,`Data directory path`).action(async(e,n)=>{let r=n.dataDir??t(),i=await D(r,n.pluginsConfig)??{},a=new Set(e.map(e=>e.trim()).filter(Boolean)),o=Q(i.llmAllowlist).filter(e=>!a.has(e));await O(r,{...i,llmAllowlist:o},n.pluginsConfig),S(`LLM allowlist updated (${o.length} entries).`)}),r(i.command(`clear`)).description(`Clear the LLM allowlist`).option(`-d, --data-dir <path>`,`Data directory path`).action(async e=>{let n=e.dataDir??t();await O(n,{...await D(n,e.pluginsConfig)??{},llmAllowlist:[]},e.pluginsConfig),S(`LLM allowlist cleared.`)})}function pt(e){e.command(`commands`).description(`List available slash commands for a data directory`).requiredOption(`-d, --data-dir <path>`,`Data directory path`).option(`--output <format>`,`Output format: text (default) or json`,`text`).action(async e=>{let t=e.output===`json`?`json`:`text`;try{let n=l(await ee(e.dataDir,[]));if(t===`json`){S(JSON.stringify(n,null,2));return}S(`Commands`),S(` builtin: ${n.builtin.map(e=>e.name).join(` | `)}`),n.skillCommands.length>0?S(` skills: ${n.skillCommands.map(e=>e.name).join(` | `)}`):S(` skills: (none)`)}catch(e){C(`Error listing commands: ${e.message}`),process.exit(1)}})}const mt=e(import.meta.url)(`../package.json`);function $(){return process.env.AIMAX_DATA_DIR||process.cwd()}function ht(){let e=new t;return e.name(`aimax`).description(`AIMax CLI — runs agent tasks in a containerized environment`).version(mt.version),Qe(e),$e(e),pt(e),he(e),tt(e),ct(e,$),ft(e,$),e}export{$ as n,z as r,ht as t};
package/dist/program.js CHANGED
@@ -1 +1 @@
1
- import{n as e,t}from"./program-B5oTNId3.js";export{t as createProgram,e as getDataDir};
1
+ import{n as e,t}from"./program-Le8ajXzq.js";export{t as createProgram,e as getDataDir};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gencode/cli",
3
- "version": "0.0.15",
3
+ "version": "0.0.17",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "aimax": "./dist/bin.js"
@@ -17,22 +17,22 @@
17
17
  "publishConfig": {
18
18
  "access": "public"
19
19
  },
20
+ "scripts": {
21
+ "build": "tsdown",
22
+ "test": "vitest run",
23
+ "test:coverage": "vitest run --coverage",
24
+ "typecheck": "tsc --noEmit"
25
+ },
20
26
  "dependencies": {
27
+ "@gencode/agents": "workspace:*",
28
+ "@gencode/shared": "workspace:*",
21
29
  "commander": "^14.0.3",
22
- "gensign-node": "latest",
23
- "@gencode/agents": "0.0.15",
24
- "@gencode/shared": "0.0.4"
30
+ "gensign-node": "latest"
25
31
  },
26
32
  "devDependencies": {
27
33
  "@types/node": "^22.0.0",
28
34
  "@vitest/coverage-v8": "^4.0.18",
29
35
  "typescript": "^5.9.3",
30
36
  "vitest": "^4.0.18"
31
- },
32
- "scripts": {
33
- "build": "tsdown",
34
- "test": "vitest run",
35
- "test:coverage": "vitest run --coverage",
36
- "typecheck": "tsc --noEmit"
37
37
  }
38
- }
38
+ }
@@ -1,6 +0,0 @@
1
- import{createRequire as e}from"node:module";import{Command as t}from"commander";import{bootstrapMountLayout as n,createBuiltinMemoryProvider as r,ensureBootstrapMountLayout as i,exportSession as a,hasBootstrapSentinel as o,initializePluginSystem as s,inspectSession as c,listAvailableSlashCommands as l,listSessionSummaries as u,loadSkillsWithPluginDirs as ee,normalizePluginsConfig as te,resolveMemoryProvider as ne,runAgent as d}from"@gencode/agents";import{isAgentDiagnosticEvent as f}from"@gencode/shared";import p from"node:path";import m from"gensign-node";import h from"node:fs/promises";import{addAgent as re,addBinding as ie,getAgentConfig as g,listAgents as ae,listBindings as _,loadAgentsConfig as v,normalizeAgentId as y,removeAgent as b,removeBindings as x,resolveAgentDir as S,resolveDefaultAgentId as C,updateAgentIdentity as oe}from"@gencode/agents/config";function se(e){process.stdout.write(e)}function w(e){process.stdout.write(e+`
2
- `)}function T(e){process.stderr.write(e+`
3
- `)}function E(e){switch(e.type){case`start`:w(`\n[start] ${e.message}`);break;case`text`:se(e.text);break;case`bootstrap`:w(`\n[bootstrap:${e.phase}] ${e.dataDir}`);break;case`session_reset`:w(`\n[session:${e.action}] ${e.message}`);break;case`tool_start`:w(`\n[tool:${e.name}] ${JSON.stringify(e.input)}`);break;case`tool_end`:w(`[tool:${e.name}] ${e.isError?`ERROR`:`OK`} ${e.output.slice(0,200)}`);break;case`compaction`:w(`\n[compaction${e.layer?`:${e.layer}`:``}] ${e.reason}${e.strategy?` (${e.strategy})`:``}`);break;case`skill_used`:w(`\n[skill] ${e.skillName} agent=${e.agent} task=${e.taskId}`);break;case`error`:T(`\n[error] ${e.message}`);break;case`diagnostic`:break;case`subagent_spawn`:w(`\n[subagent:spawn]${e.label?` "${e.label}"`:``} ${e.task}`);break;case`subagent_complete`:w(`[subagent:${e.status}] ${e.task}`);break}}function ce(e,t){if(t===`json`){w(JSON.stringify(e,null,2));return}w(`
4
- `),w(`session: ${e.sessionId}`),w(`duration: ${e.durationMs}ms`),w(`tokens: input=${e.usage.input} output=${e.usage.output} total=${e.usage.total}`),e.context&&(w(`context: ${e.context.snapshotPath}`),w(`tool-results: ${e.context.toolResultsDir}`)),e.error&&T(`error: ${e.error}`)}function le(e,t){if(t===`json`){w(JSON.stringify(e,null,2));return}if(e.length===0){w(`No sessions found.`);return}for(let t of e){let e=t.createdAt?new Date(t.createdAt).toLocaleString():`unknown`;w(`${t.id} ${e} [${t.channel}] ${t.title}`)}}function ue(e,t){if(t===`json`){w(JSON.stringify(e,null,2));return}w(`session: ${e.id}`),e.metadata&&(w(`title: ${e.metadata.title}`),w(`channel: ${e.metadata.channel}`),w(`created: ${e.metadata.createdAt}`),w(`updated: ${e.metadata.updatedAt}`)),w(`transcript: ${e.transcriptPath}`),w(`entries: ${e.transcriptEntryCount}`),w(`context: ${e.contextSnapshotPath}`),w(`session-memory: ${e.sessionMemoryPath}`),w(`collapse-log: ${e.collapseLogPath}`),w(`read-states: ${e.readStateCount}`),w(`tool-results: ${e.toolResultRefCount}`),w(`tool-results-dir: ${e.toolResultsDir}`)}function de(e,t){if(t===`json`){w(JSON.stringify(e,null,2));return}w(`session: ${e.id}`),w(`transcript: ${e.paths.transcriptPath}`),w(`context: ${e.paths.contextSnapshotPath}`),w(`session-memory: ${e.paths.sessionMemoryPath}`),w(`collapse-log: ${e.paths.collapseLogPath}`),w(`tool-results-dir: ${e.paths.toolResultsDir}`),w(`transcript-entries: ${e.transcript.length}`),w(`read-states: ${e.context.readStates.length}`),w(`tool-results: ${e.context.toolResults.length}`),w(`collapse-spans: ${e.context.compaction.collapseSpans.length}`)}function fe(e,t){if(t===`json`){w(JSON.stringify(e,null,2));return}w(`Bootstrap completed.`),w(`dataDir: ${e.dataDir}`),w(`created dirs: ${e.createdDirs.length}`),w(`created files: ${e.createdFiles.length}`),w(`skipped dirs: ${e.skippedDirs.length}`),w(`skipped files: ${e.skippedFiles.length}`)}function pe(e){e.command(`bootstrap`).description(`Initialize the data directory with required directories and templates`).requiredOption(`-d, --data-dir <path>`,`Data directory path`).option(`--output <format>`,`Output format: text (default) or json`,`text`).action(async e=>{let t=e.output===`json`?`json`:`text`;try{fe(await n(e.dataDir),t)}catch(e){T(`Error bootstrapping data directory: ${e.message}`),process.exit(1)}})}function me(e){return m.sm4_encrypt_ecb(e)}function D(e){return me(e)}function he(e={}){let t=e.baseUrl??process.env.AIMAX_BASE_URL,n=process.env.AIMAX_AUTH_TOKEN,r=e.authToken?D(e.authToken):n?D(n):e.apiKey??process.env.AIMAX_API_KEY,i=e.model??process.env.AIMAX_MODEL,a=[];if(t||a.push(`--base-url / AIMAX_BASE_URL`),r||a.push(`--api-key / AIMAX_API_KEY`),i||a.push(`--model / AIMAX_MODEL`),a.length>0)throw Error(`Missing required LLM configuration: ${a.join(`, `)}`);return{baseUrl:t,apiKey:r,model:i,contextWindow:e.contextWindow??(process.env.AIMAX_CONTEXT_WINDOW?Number(process.env.AIMAX_CONTEXT_WINDOW):void 0)}}function O(e,t){return t?p.resolve(t):p.join(e,`.aimax`,`plugins.json`)}async function k(e,t){let n=O(e,t);try{let e=await h.readFile(n,`utf-8`);return JSON.parse(e)}catch(e){if(e.code===`ENOENT`)return;throw e}}async function A(e,t,n){let r=O(e,n);await h.mkdir(p.dirname(r),{recursive:!0}),await h.writeFile(r,JSON.stringify(t,null,2),`utf-8`)}function j(e){return typeof e==`object`&&!!e}function M(e){return j(e)&&e.type===`text`&&typeof e.text==`string`&&(e.textSignature===void 0||typeof e.textSignature==`string`)}function N(e){return j(e)&&e.type===`image`&&typeof e.data==`string`&&typeof e.mimeType==`string`}function P(e){return j(e)&&e.type===`thinking`&&typeof e.thinking==`string`&&(e.thinkingSignature===void 0||typeof e.thinkingSignature==`string`)&&(e.redacted===void 0||typeof e.redacted==`boolean`)}function F(e){return j(e)&&e.type===`toolCall`&&typeof e.id==`string`&&typeof e.name==`string`&&j(e.arguments)&&(e.thoughtSignature===void 0||typeof e.thoughtSignature==`string`)}function I(e){return typeof e==`string`||Array.isArray(e)&&e.every(e=>M(e)||N(e))}function L(e){return Array.isArray(e)&&e.every(e=>M(e)||P(e)||F(e))}function R(e){return j(e)&&typeof e.input==`number`&&typeof e.output==`number`&&typeof e.cacheRead==`number`&&typeof e.cacheWrite==`number`&&typeof e.totalTokens==`number`&&j(e.cost)&&typeof e.cost.input==`number`&&typeof e.cost.output==`number`&&typeof e.cost.cacheRead==`number`&&typeof e.cost.cacheWrite==`number`&&typeof e.cost.total==`number`}function ge(e){return!j(e)||typeof e.role!=`string`?!1:e.role===`user`?I(e.content):e.role===`assistant`?L(e.content)&&typeof e.api==`string`&&typeof e.provider==`string`&&typeof e.model==`string`&&R(e.usage)&&(e.stopReason===`stop`||e.stopReason===`length`||e.stopReason===`toolUse`||e.stopReason===`error`||e.stopReason===`aborted`)&&(e.errorMessage===void 0||typeof e.errorMessage==`string`):e.role===`toolResult`?typeof e.toolCallId==`string`&&typeof e.toolName==`string`&&Array.isArray(e.content)&&e.content.every(e=>M(e)||N(e))&&typeof e.isError==`boolean`:!1}async function _e(e){let t;try{t=await h.readFile(e,`utf-8`)}catch(e){throw Error(`Failed to read message file: ${e.message}`)}let n;try{n=JSON.parse(t)}catch(e){throw Error(`Invalid JSON in message file: ${e.message}`)}let r=Array.isArray(n)?n:[n];if(r.length===0||!r.every(e=>ge(e)))throw Error(`Message file must contain one Message object or an array of Message objects`);return r}async function ve(e){if(!!e.message==!!e.fromFile)throw Error(`Exactly one of --message or --from-file must be provided`);return e.fromFile?{kind:`messages`,messages:await _e(e.fromFile)}:{kind:`text`,message:e.message}}let z=function(e){return e.INFO=`INFO`,e.ERROR=`ERROR`,e.WARN=`WARN`,e}({});function ye(){let e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)} ${String(e.getHours()).padStart(2,`0`)}:${String(e.getMinutes()).padStart(2,`0`)}:${String(e.getSeconds()).padStart(2,`0`)}.${String(e.getMilliseconds()).padStart(3,`0`)}`}function be(e){if(!e)return``;let t=Object.entries(e).filter(([,e])=>e!==void 0).map(([e,t])=>`${e}=${JSON.stringify(t)}`);return t.length>0?` ${t.join(` `)}`:``}function B(e,t,n){let r=ye();process.stderr.write(`[${r}] [${e}] ${t}${be(n)}\n`)}const V={info:(e,t)=>B(z.INFO,e,t),warn:(e,t)=>B(z.WARN,e,t),error:(e,t)=>B(z.ERROR,e,t)};var xe=class{startTime;name;constructor(e){this.name=e,this.startTime=Date.now()}end(){let e=Date.now()-this.startTime;return V.info(`${this.name} completed in ${e}ms`),e}},Se=class{constructor(e){this.sinks=e}async send(e){await Promise.allSettled(this.sinks.map(async t=>{await t.send(e)}))}async close(){await Promise.allSettled(this.sinks.map(async e=>{await e.close()}))}},Ce=class{constructor(e){this.url=e}async send(e){await this.post(this.toPayload(e))}async close(){}async post(e){let t=Date.now(),n=we(e);V.info(`sending callback event`,{callbackUrl:this.url,...n});let r=await fetch(this.url,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e)}),i=Date.now()-t;if(!r.ok)throw V.error(`callback event failed`,{callbackUrl:this.url,httpStatus:r.status,durationMs:i,...n}),Error(`Callback failed with status ${r.status}`);V.info(`callback event delivered`,{callbackUrl:this.url,httpStatus:r.status,durationMs:i,...n})}toPayload(e){switch(e.type){case`start`:return e;case`progress`:return e;case`done`:return e;case`error`:return e;case`session_reset`:return e;default:{let t=e;throw Error(`Unsupported callback event: ${JSON.stringify(t)}`)}}}};function we(e){return{eventType:e.type,sessionId:e.sessionId,messageId:e.messageId,channel:e.channel,progressType:e.type===`progress`?e.event.type:void 0}}function Te(e,t){if(t.kind===`none`)return e;let n=new URL(e);return n.searchParams.set(`authToken`,t.token),n.toString()}function H(){let e=globalThis.WebSocket;if(!e)throw Error(`WebSocket is not available in this runtime`);return e}function Ee(e){return e?{kind:`query_token`,token:e}:{kind:`none`}}var De=class{socket=null;connectPromise=null;enabled=!0;textSequence=0;constructor(e,t,n){this.url=e,this.events=t,this.authToken=n}async send(e){let t=this.toEnvelope(e);if(!(!t||!this.enabled))try{await this.ensureConnected();let e=H();if(!this.socket||this.socket.readyState!==e.OPEN)return;this.socket.send(JSON.stringify(t))}catch{this.enabled=!1}}async close(){this.enabled=!1;let e=this.socket;if(this.socket=null,this.connectPromise=null,!e)return;let t=H();e.readyState!==t.CLOSED&&await new Promise(t=>{e.once(`close`,()=>t()),e.close()})}async ensureConnected(){if(!this.enabled)return;let e=H();if(this.socket&&this.socket.readyState===e.OPEN)return;if(this.connectPromise){await this.connectPromise;return}let t=new e(Te(this.url,Ee(this.authToken)));this.connectPromise=new Promise((e,n)=>{t.once(`open`,()=>{this.socket=t,t.on(`close`,()=>{this.socket===t&&(this.socket=null)}),e()}),t.once(`error`,e=>{n(e)})});try{await this.connectPromise}finally{this.connectPromise=null}}toEnvelope(e){let t=new Date().toISOString();switch(e.type){case`start`:return this.events.has(`start`)?{...e,timestamp:t}:null;case`done`:return this.events.has(`done`)?{...e,timestamp:t}:null;case`error`:return this.events.has(`error`)?{...e,timestamp:t}:null;case`session_reset`:return null;case`progress`:return e.event.type===`text`?this.events.has(`text`)?(this.textSequence+=1,{type:`text`,sessionId:e.sessionId,messageId:e.messageId,channel:e.channel,timestamp:t,sequence:this.textSequence,delta:e.event.text}):null:this.events.has(`progress`)?{type:`progress`,sessionId:e.sessionId,messageId:e.messageId,channel:e.channel,timestamp:t,event:e.event}:null;default:{let t=e;throw Error(`Unsupported stream event: ${JSON.stringify(t)}`)}}}};const U=[`start`,`text`,`done`,`error`],Oe=[`H5`,`WEB`,`KLPA`,`CRON`,`EIP_ASSISTANT`];function ke(e){if(!e?.trim())return new Set(U);let t=e.split(`,`).map(e=>e.trim().toLowerCase()).filter(Boolean),n=new Set([`start`,`text`,`progress`,`done`,`error`]),r=new Set;for(let e of t){if(!n.has(e))throw Error(`Invalid stream event: ${e}. Must be one of start,text,progress,done,error`);r.add(e)}return r.size>0?r:new Set(U)}function Ae(e){let t=e.dataDir??process.env.AIMAX_DATA_DIR;if(!t)throw Error(`Data directory must be specified via --data-dir option or AIMAX_DATA_DIR environment variable`);return t}function je(e){let t=e??`WEB`;if(!Oe.includes(t))throw Error(`Invalid channel: ${t}. Must be 'H5', 'WEB', 'KLPA', 'CRON', or 'EIP_ASSISTANT'`);return t}async function Me(e){let t=Ae(e),n=je(e.channel),r=he({baseUrl:e.baseUrl,apiKey:e.apiKey,authToken:e.authToken,model:e.model,contextWindow:e.contextWindow?Number(e.contextWindow):void 0}),i=await ve({message:e.message,fromFile:e.fromFile});return{dataDir:t,channel:n,format:e.output===`json`?`json`:`text`,timeoutMs:e.timeout?Number(e.timeout):void 0,llm:r,input:i}}function Ne(e){let t=[];return e.callbackUrl&&t.push(new Ce(e.callbackUrl)),e.streamUrl&&t.push(new De(e.streamUrl,ke(e.streamEvents),e.streamAuthToken)),new Se(t)}async function W(e,t){V.info(`dispatching external event`,Ye(t)),await e.sink.send(t)}function Pe(e){if(!e)return{};let t={};for(let[n,r]of Object.entries(e)){if(r===null||typeof r==`string`||typeof r==`number`||typeof r==`boolean`){t[n]=r;continue}if(r instanceof Error){t[n]=`${r.name}: ${r.message}`;continue}t[n]=JSON.stringify(r)}return t}function Fe(e){let t={sessionId:e.sessionId,messageId:e.messageId,parentSessionId:e.parentSessionId,depth:e.depth,scope:e.scope,phase:e.phase,...Pe(e.details)};if(e.level===`error`){V.error(e.message,t);return}if(e.level===`warn`){V.warn(e.message,t);return}V.info(e.message,t)}function G(e,t,n){return{sink:e,channel:t,defaultMessageId:n}}function Ie(){let e=new AbortController,t=()=>e.abort();return process.once(`SIGTERM`,t),process.once(`SIGINT`,t),{controller:e,cleanup:()=>{process.off(`SIGTERM`,t),process.off(`SIGINT`,t)}}}function Le(e){return{activeSessionId:e??`pending`,finalResult:null}}function Re(e,t){e.activeSessionId=t.sessionId??e.activeSessionId}function ze(e,t){return e.messageId??t}async function Be(e,t,n){if(!await o(e.dataDir)){if(await K(t,e.format,n.activeSessionId,e.dataDir,`checking`),(await i(e.dataDir)).performedBootstrap){await K(t,e.format,n.activeSessionId,e.dataDir,`initializing`),await K(t,e.format,n.activeSessionId,e.dataDir,`initialized`);return}await K(t,e.format,n.activeSessionId,e.dataDir,`ready`)}}async function K(e,t,n,r,i){let a={type:`bootstrap`,phase:i,dataDir:r};t===`text`&&E(a),await W(e,{sessionId:n,channel:e.channel,messageId:e.defaultMessageId,type:`progress`,event:a})}function Ve(e,t,n){return async r=>{if(Re(n,r),f(r)){Fe(r);return}e.format===`text`&&E(r);let i=ze(r,t.defaultMessageId);if(r.type===`start`){await W(t,{sessionId:n.activeSessionId,channel:e.channel,messageId:i,type:`start`,message:r.message});return}if(r.type===`session_reset`){await W(t,{sessionId:n.activeSessionId,channel:e.channel,messageId:i,type:`session_reset`,action:r.action,previousSessionId:r.previousSessionId,message:r.message});return}await W(t,{sessionId:n.activeSessionId,channel:e.channel,messageId:i,type:`progress`,event:r})}}function He(e,t,n,r,i){let a={dataDir:t.dataDir,sessionId:e.sessionId,messageId:e.messageId,channel:t.channel,llm:t.llm,timeoutMs:t.timeoutMs,abortSignal:n.signal,plugins:i?{config:i,dataDir:t.dataDir,workspaceDir:p.join(t.dataDir,`workspace`),bundledDir:process.env.AIMAX_PLUGINS_BUNDLED_DIR,llmAllowlist:i.llmAllowlist}:void 0,onProgress:r};return t.input.kind===`messages`?{...a,messages:t.input.messages}:{...a,message:t.input.message}}async function Ue(e,t,n,r){if(t.activeSessionId=r.sessionId,t.finalResult=r,r.error){await W(e,{sessionId:r.sessionId,channel:e.channel,messageId:n,type:`error`,message:r.error});return}await W(e,{sessionId:r.sessionId,channel:e.channel,messageId:n,type:`done`,result:{text:r.text,usage:r.usage,durationMs:r.durationMs,error:r.error}})}async function We(e,t,n,r){await W(e,{sessionId:t.finalResult?.sessionId??t.activeSessionId,channel:e.channel,messageId:n,type:`error`,message:`Fatal: ${r.message}`})}function Ge(e,t){V.info(`run command started`,{channel:t.channel,dataDir:t.dataDir,sessionId:e.sessionId??`new`,messageId:e.messageId,output:t.format,hasCallback:!!e.callbackUrl,hasStream:!!e.streamUrl})}function Ke(e,t,n){ce(t,n),t.error?V.error(`run command failed: ${t.error}`):V.info(`run command succeeded`),e.end(),process.exit(t.error?1:0)}function qe(e,t){V.error(`run command error: ${t.message}`),T(`Fatal: ${t.message}`),e.end(),process.exit(1)}async function Je(e){let t=new xe(`run command`),{controller:n,cleanup:r}=Ie(),i=null,a=e.channel??`WEB`,o=Le(e.sessionId);try{let r=await Me(e);a=r.channel,Ge(e,r),i=Ne(e),V.info(`external sink configured`,{callbackUrl:e.callbackUrl,streamUrl:e.streamUrl,streamEvents:e.streamEvents});let s=G(i,r.channel,e.messageId);await Be(r,s,o);let c=await k(r.dataDir,e.pluginsConfig),l=await d(He(e,r,n,Ve(r,s,o),c));await Ue(s,o,e.messageId,l),Ke(t,l,r.format)}catch(n){let r=n;i&&await We(G(i,a,e.messageId),o,e.messageId,r),qe(t,r)}finally{await i?.close(),r()}}function Ye(e){return{eventType:e.type,sessionId:e.sessionId,messageId:e.messageId,channel:e.channel,progressType:e.type===`progress`?e.event.type:void 0,textLength:e.type===`done`?e.result.text.length:void 0,hasError:e.type===`error`?!0:e.type===`done`?!!e.result.error:void 0}}function Xe(e){e.command(`run`).description(`Run an agent task`).option(`-d, --data-dir <path>`,`Data directory path (overrides AIMAX_DATA_DIR)`).option(`--message <text>`,`User message to send to the agent`).option(`--from-file <path>`,`Load structured Message JSON from a file`).option(`-s, --session-id <id>`,`Resume an existing session by ID`).option(`--message-id <id>`,`Message ID for correlating events`).option(`-c, --channel <channel>`,`Channel type: H5 | WEB | KLPA | CRON | EIP_ASSISTANT (default: WEB)`,`WEB`).option(`--base-url <url>`,`LLM API base URL (overrides AIMAX_BASE_URL)`).option(`--api-key <key>`,`LLM API key (overrides AIMAX_API_KEY)`).option(`--auth-token <token>`,`Auth token used to generate the API key (highest priority)`).option(`--model <name>`,`LLM model name (overrides AIMAX_MODEL)`).option(`--context-window <n>`,`LLM context window size`).option(`--callback-url <url>`,`HTTP callback URL for progress events`).option(`--stream-url <url>`,`WebSocket URL for streaming text events`).option(`--stream-auth-token <token>`,`Auth token for WebSocket streaming`).option(`--stream-events <list>`,`Comma-separated stream events: start,text,progress,done,error`).option(`--timeout <ms>`,`Execution timeout in milliseconds (default: 600000)`).option(`--output <format>`,`Output format: text (default) or json`,`text`).option(`--plugins-config <path>`,`Plugins config file path`).action(async e=>{await Je(e)})}function Ze(e){e.command(`sessions`).description(`List or inspect sessions for a data directory`).argument(`[action]`,`Action: list (default) | inspect | export`).option(`-d, --data-dir <path>`,`Data directory path`).option(`-c, --channel <channel>`,`Filter by channel type: H5 | WEB | KLPA | CRON | EIP_ASSISTANT`).option(`-s, --session-id <id>`,`Session ID for inspect/export`).option(`--output <format>`,`Output format: text or json`).action(async(e,t,n)=>{let r=n.opts(),i=e??`list`,o=i===`export`?r.output===`text`?`text`:`json`:r.output===`json`?`json`:`text`;r.dataDir||(T(`error: required option '-d, --data-dir <path>' not specified`),process.exit(1)),r.channel&&r.channel!==`H5`&&r.channel!==`WEB`&&r.channel!==`KLPA`&&r.channel!==`CRON`&&r.channel!==`EIP_ASSISTANT`&&(T(`Invalid channel: ${r.channel}. Must be 'H5', 'WEB', 'KLPA', 'CRON', or 'EIP_ASSISTANT'`),process.exit(1));try{if(i===`list`){le(await u(r.dataDir,r.channel),o);return}if(r.sessionId||(T(`error: required option '-s, --session-id <id>' not specified`),process.exit(1)),i===`inspect`){ue(await c(r.dataDir,r.sessionId),o);return}if(i===`export`){de(await a(r.dataDir,r.sessionId),o);return}T(`Invalid sessions action: ${i}. Must be 'list', 'inspect', or 'export'`),process.exit(1)}catch(e){T(`${i===`inspect`?`Error inspecting session`:i===`export`?`Error exporting session`:`Error listing sessions`}: ${e.message}`),process.exit(1)}})}function Qe(e,t){let n=[];return n.push(`backend: ${e.backend}`),n.push(`provider: ${e.provider}${e.model?` (${e.model})`:``}`),typeof e.files==`number`&&n.push(`files: ${e.files}`),typeof e.chunks==`number`&&n.push(`chunks: ${e.chunks}`),typeof e.dirty==`boolean`&&n.push(`dirty: ${e.dirty}`),e.dbPath&&n.push(`db: ${e.dbPath}`),e.sources?.length&&n.push(`sources: ${e.sources.join(`, `)}`),t&&(e.fts&&(n.push(`fts: enabled=${e.fts.enabled} available=${e.fts.available}`),e.fts.error&&n.push(`fts_error: ${e.fts.error}`)),e.vector&&(n.push(`vector: enabled=${e.vector.enabled} available=${e.vector.available??`unknown`}`),e.vector.dims&&n.push(`vector_dims: ${e.vector.dims}`),e.vector.loadError&&n.push(`vector_error: ${e.vector.loadError}`)),e.cache&&n.push(`cache: enabled=${e.cache.enabled} entries=${e.cache.entries??0}`)),n.join(`
5
- `)}function q(e){let t=p.join(e.dataDir,`.aimax`),n=ne({providerId:e.provider,pluginId:e.providerPlugin,dataDir:e.dataDir,memoryDir:t});return n?n.provider:r({dataDir:e.dataDir,memoryDir:t},{includeSessions:e.includeSessions})}function $e(e){let t=e.command(`memory`).description(`Manage semantic memory indexing and search`);t.command(`status`).description(`Show memory index status`).requiredOption(`-d, --data-dir <path>`,`Data directory path`).option(`--deep`,`Probe embedding/vector availability`).option(`--index`,`Run a refresh before reporting status`).option(`--include-sessions`,`Include session transcripts in indexing`).option(`--provider <id>`,`Memory provider id`).option(`--provider-plugin <id>`,`Memory provider plugin id`).option(`--verbose`,`Verbose output`).option(`--output <format>`,`Output format: text (default) or json`,`text`).action(async e=>{let t=e.output===`json`?`json`:`text`;try{let n=q({dataDir:e.dataDir,provider:e.provider,providerPlugin:e.providerPlugin,includeSessions:e.includeSessions});e.index&&n.sync&&await n.sync(`cli-status`);let r=n.status();e.deep&&((r.custom??={}).note=`deep probe is only supported by builtin provider`),w(t===`json`?JSON.stringify(r,null,2):Qe(r,e.deep))}catch(e){T(`Error getting memory status: ${e.message}`),process.exit(1)}}),t.command(`index`).description(`Reindex memory files`).requiredOption(`-d, --data-dir <path>`,`Data directory path`).option(`--include-sessions`,`Include session transcripts in indexing`).option(`--provider <id>`,`Memory provider id`).option(`--provider-plugin <id>`,`Memory provider plugin id`).option(`--verbose`,`Verbose output`).action(async e=>{try{let t=q({dataDir:e.dataDir,provider:e.provider,providerPlugin:e.providerPlugin,includeSessions:e.includeSessions});t.sync&&await t.sync(`cli-index`),w(`Memory index refreshed.`)}catch(e){T(`Error indexing memory: ${e.message}`),process.exit(1)}}),t.command(`search [query]`).description(`Search semantic memory`).requiredOption(`-d, --data-dir <path>`,`Data directory path`).option(`--query <text>`,`Search query`).option(`--include-sessions`,`Include session transcripts in search`).option(`--provider <id>`,`Memory provider id`).option(`--provider-plugin <id>`,`Memory provider plugin id`).option(`--output <format>`,`Output format: text (default) or json`,`text`).action(async(e,t)=>{let n=t.output===`json`?`json`:`text`,r=t.query?.trim()||e?.trim();r||(T(`Query is required: provide [query] or --query <text>`),process.exit(1));try{let e=await q({dataDir:t.dataDir,provider:t.provider,providerPlugin:t.providerPlugin,includeSessions:t.includeSessions}).search(r);if(n===`json`){w(JSON.stringify(e,null,2));return}if(e.length===0){w(`No results found for: ${r}`);return}w(e.map(e=>{let t=`${e.path}:${e.startLine}-${e.endLine} (${e.score.toFixed(4)}) ${e.snippet}`;return e.citation?`${t}\n${e.citation}`:t}).join(`
6
- `))}catch(e){T(`Error searching memory: ${e.message}`),process.exit(1)}})}function J(e){return`${e.match.accountId?`${e.match.channel}:${e.match.accountId}`:e.match.channel} -> ${e.agentId}`}function et(e){return async t=>{let n=await v(t),r=ae(n),i=_(n);if(C(n),e.json){console.log(JSON.stringify({agents:r,bindings:i},null,2));return}console.log(`Agents:`);for(let e of r){let n=e.default?` (default)`:``,r=e.name&&e.name!==e.id?`${e.id}${n} (${e.name})`:`${e.id}${n}`;if(console.log(` - ${r}`),e.identity?.emoji||e.identity?.name){let t=[e.identity.emoji,e.identity.name].filter(Boolean).join(` `);console.log(` Identity: ${t}`)}let a=S(t,e.id);if(console.log(` Agent dir: ${a}`),e.model){let t=typeof e.model==`string`?e.model:e.model.primary;console.log(` Model: ${t}`)}let o=i.filter(t=>t.agentId===e.id);if(o.length>0){console.log(` Routing rules:`);for(let e of o)console.log(` - ${J(e)}`)}}}}function tt(e,t){return async n=>{g(await v(n),y(e))&&(console.error(`Agent "${e}" already exists.`),process.exit(1)),await re(n,{id:e,name:t.name,model:t.model,default:t.default})||(console.error(`Agent "${e}" already exists.`),process.exit(1));let r=S(n,e);console.log(`Agent "${e}" added successfully.`),console.log(` Agent dir: ${r}`)}}function nt(e){return async t=>{let n=g(await v(t),y(e));n||(console.error(`Agent "${e}" not found.`),process.exit(1)),n.default===!0&&(console.error(`Cannot delete default agent "${e}".`),process.exit(1)),await b(t,e)||(console.error(`Failed to delete agent "${e}".`),process.exit(1)),console.log(`Agent "${e}" deleted.`)}}function rt(e){return async t=>{let n=await v(t),r=e.agent??C(n);g(n,r)||(console.error(`Agent "${r}" not found.`),process.exit(1)),(!e.bind||e.bind.length===0)&&(console.error(`Please specify --bind <channel>[:<account>]`),process.exit(1));for(let n of e.bind){let[e,...i]=n.split(`:`),a=i.join(`:`),o=[`H5`,`WEB`,`KLPA`,`CRON`,`EIP_ASSISTANT`];o.includes(e)||(console.error(`Invalid channel: ${e}`),console.error(`Valid channels: ${o.join(`, `)}`),process.exit(1)),await ie(t,{agentId:r,match:{channel:e,accountId:a||void 0}}),console.log(`Binding added: ${n} -> ${r}`)}}}function it(e){return async t=>{let n=await v(t),r=e.agent??C(n);if(g(n,r)||(console.error(`Agent "${r}" not found.`),process.exit(1)),e.all){let e=await x(t,r,`*`);console.log(`Removed ${e} binding(s) for agent "${r}".`)}else if(e.bind&&e.bind.length>0){let n=0;for(let i of e.bind){let[e,...a]=i.split(`:`),o=await x(t,r,e,a.join(`:`)||void 0);o>0?(console.log(`Binding removed: ${i} -> ${r}`),n+=o):console.log(`No binding found: ${i} -> ${r}`)}}else console.error(`Please specify --bind <channel>[:<account>] or --all`),process.exit(1)}}function at(e){return async t=>{let n=_(await v(t));if(e.agent&&(n=n.filter(t=>t.agentId===e.agent)),e.json){console.log(JSON.stringify(n,null,2));return}if(n.length===0){console.log(`No bindings configured.`);return}console.log(`Routing bindings:`);for(let e of n)console.log(` ${J(e)}`)}}function Y(e){return async t=>{let n=await v(t),r=e.agent??C(n);g(n,r)||(console.error(`Agent "${r}" not found.`),process.exit(1)),await oe(t,r,{name:e.name,emoji:e.emoji,avatar:e.avatar})||(console.error(`Failed to update identity for agent "${r}".`),process.exit(1)),console.log(`Identity updated for agent "${r}".`)}}function ot(e,t){let n=e.command(`agents`).description(`Manage agents`);n.command(`list`).description(`List all configured agents`).option(`-j, --json`,`Output as JSON`).option(`-b, --bindings`,`Show detailed binding rules`).action(async e=>{let n=t();await et(e)(n)}),n.command(`add <id>`).description(`Add a new agent`).option(`-n, --name <name>`,`Display name`).option(`-m, --model <model>`,`Model identifier`).option(`--default`,`Mark as default agent`).action(async(e,n)=>{let r=t();await tt(e,n)(r)}),n.command(`delete <id>`).description(`Delete an agent`).action(async e=>{let n=t();await nt(e)(n)}),n.command(`bind`).description(`Bind a channel to an agent`).option(`-a, --agent <id>`,`Target agent ID`).option(`-b, --bind <channel...>`,`Channel binding (e.g., WEB, KLPA:ops)`).action(async e=>{let n=t();await rt(e)(n)}),n.command(`unbind`).description(`Unbind a channel from an agent`).option(`-a, --agent <id>`,`Target agent ID`).option(`-b, --bind <channel...>`,`Channel binding to remove`).option(`--all`,`Remove all bindings for the agent`).action(async e=>{let n=t();await it(e)(n)}),n.command(`bindings`).description(`List routing bindings`).option(`-a, --agent <id>`,`Filter by agent ID`).option(`-j, --json`,`Output as JSON`).action(async e=>{let n=t();await at(e)(n)}),n.command(`set-identity`).description(`Set agent identity`).option(`-a, --agent <id>`,`Target agent ID`).option(`-n, --name <name>`,`Agent name`).option(`-e, --emoji <emoji>`,`Agent emoji`).option(`--avatar <path>`,`Avatar path`).action(async e=>{let n=t();await Y(e)(n)})}function X(e){return p.join(e,`workspace`)}function Z(){let e=process.env.AIMAX_PLUGINS_BUNDLED_DIR;return e&&e.trim()||void 0}function st(e){if(e.length===0){w(`No plugins discovered.`);return}for(let t of e){let e=t.status.padEnd(8,` `);w(`${t.id} ${e} ${t.origin} ${t.source}`)}}function ct(e){w(`id: ${e.id}`),w(`status: ${e.status}`),w(`origin: ${e.origin}`),w(`source: ${e.source}`),w(`enabled: ${e.enabled}`),e.error&&w(`error: ${e.error}`),w(`tools: ${e.toolCount}`),w(`hooks: ${e.hookCount}`),e.skills.length>0&&w(`skills: ${e.skills.join(`, `)}`)}function Q(e){return Array.from(new Set((e??[]).map(e=>e.trim()).filter(Boolean)))}function lt(e){if(e.length===0){w(`LLM allowlist is empty.`);return}for(let t of e)w(t)}function ut(e,t){let n=e.command(`plugins`).description(`Manage AIMax plugins`),r=e=>e.option(`--plugins-config <path>`,`Plugins config file path`);r(n.command(`list`)).description(`List discovered plugins`).option(`-d, --data-dir <path>`,`Data directory path`).action(async e=>{let n=e.dataDir??t();st(s({config:await k(n,e.pluginsConfig),dataDir:n,workspaceDir:X(n),bundledDir:Z()}).registry.plugins)}),r(n.command(`info`)).description(`Show plugin details`).argument(`<id>`,`Plugin id`).option(`-d, --data-dir <path>`,`Data directory path`).action(async(e,n)=>{let r=n.dataDir??t(),i=s({config:await k(r,n.pluginsConfig),dataDir:r,workspaceDir:X(r),bundledDir:Z()}).registry.plugins.find(t=>t.id===e);i||(T(`Plugin not found: ${e}`),process.exit(1)),ct(i)}),r(n.command(`enable`)).description(`Enable a plugin`).argument(`<id>`,`Plugin id`).option(`-d, --data-dir <path>`,`Data directory path`).action(async(e,n)=>{let r=n.dataDir??t(),i=await k(r,n.pluginsConfig)??{},a=te(i);s({config:i,dataDir:r,workspaceDir:X(r),bundledDir:Z()}).registry.plugins.some(t=>t.id===e)||(T(`Plugin not found: ${e}`),process.exit(1)),await A(r,{...i,entries:{...i.entries,[e]:{...i.entries?.[e]??{},enabled:!0}}},n.pluginsConfig),w(`Enabled ${e}`),a.allow.length>0&&!a.allow.includes(e)&&w(`Note: plugins.allow is set; add this plugin id to allowlist if needed.`)}),r(n.command(`disable`)).description(`Disable a plugin`).argument(`<id>`,`Plugin id`).option(`-d, --data-dir <path>`,`Data directory path`).action(async(e,n)=>{let r=n.dataDir??t(),i=await k(r,n.pluginsConfig)??{};s({config:i,dataDir:r,workspaceDir:X(r),bundledDir:Z()}).registry.plugins.some(t=>t.id===e)||(T(`Plugin not found: ${e}`),process.exit(1)),await A(r,{...i,entries:{...i.entries,[e]:{...i.entries?.[e]??{},enabled:!1}}},n.pluginsConfig),w(`Disabled ${e}`)}),r(n.command(`doctor`)).description(`Validate plugin configuration`).option(`-d, --data-dir <path>`,`Data directory path`).action(async e=>{let n=e.dataDir??t(),r=s({config:await k(n,e.pluginsConfig),dataDir:n,workspaceDir:X(n),bundledDir:Z()});if(r.diagnostics.length===0){w(`No plugin issues detected.`);return}for(let e of r.diagnostics)w(`${e.level===`error`?`ERROR`:`WARN`}${e.pluginId?` ${e.pluginId}`:``}: ${e.message}`);r.diagnostics.some(e=>e.level===`error`)&&process.exit(1)});let i=n.command(`llm-allow`).description(`Manage plugin LLM allowlist`);r(i.command(`list`)).description(`List LLM allowlist entries`).option(`-d, --data-dir <path>`,`Data directory path`).action(async e=>{lt(Q((await k(e.dataDir??t(),e.pluginsConfig))?.llmAllowlist))}),r(i.command(`add`)).description(`Add entries to the LLM allowlist (plugin id or tool name)`).argument(`<entry...>`,`Plugin id or tool name`).option(`-d, --data-dir <path>`,`Data directory path`).action(async(e,n)=>{let r=n.dataDir??t(),i=await k(r,n.pluginsConfig)??{},a=Q([...i.llmAllowlist??[],...e]);await A(r,{...i,llmAllowlist:a},n.pluginsConfig),w(`LLM allowlist updated (${a.length} entries).`)}),r(i.command(`remove`)).description(`Remove entries from the LLM allowlist`).argument(`<entry...>`,`Plugin id or tool name`).option(`-d, --data-dir <path>`,`Data directory path`).action(async(e,n)=>{let r=n.dataDir??t(),i=await k(r,n.pluginsConfig)??{},a=new Set(e.map(e=>e.trim()).filter(Boolean)),o=Q(i.llmAllowlist).filter(e=>!a.has(e));await A(r,{...i,llmAllowlist:o},n.pluginsConfig),w(`LLM allowlist updated (${o.length} entries).`)}),r(i.command(`clear`)).description(`Clear the LLM allowlist`).option(`-d, --data-dir <path>`,`Data directory path`).action(async e=>{let n=e.dataDir??t();await A(n,{...await k(n,e.pluginsConfig)??{},llmAllowlist:[]},e.pluginsConfig),w(`LLM allowlist cleared.`)})}function dt(e){e.command(`commands`).description(`List available slash commands for a data directory`).requiredOption(`-d, --data-dir <path>`,`Data directory path`).option(`--output <format>`,`Output format: text (default) or json`,`text`).action(async e=>{let t=e.output===`json`?`json`:`text`;try{let n=l(await ee(e.dataDir,[]));if(t===`json`){w(JSON.stringify(n,null,2));return}w(`Commands`),w(` builtin: ${n.builtin.map(e=>e.name).join(` | `)}`),n.skillCommands.length>0?w(` skills: ${n.skillCommands.map(e=>e.name).join(` | `)}`):w(` skills: (none)`)}catch(e){T(`Error listing commands: ${e.message}`),process.exit(1)}})}const ft=e(import.meta.url)(`../package.json`);function $(){return process.env.AIMAX_DATA_DIR||process.cwd()}function pt(){let e=new t;return e.name(`aimax`).description(`AIMax CLI — runs agent tasks in a containerized environment`).version(ft.version),Xe(e),Ze(e),dt(e),pe(e),$e(e),ot(e,$),ut(e,$),e}export{$ as n,V as r,pt as t};