@zonease/aiworker-cli 0.9.1 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/aiworker-bun.js +1 -1
  2. package/package.json +1 -1
package/aiworker-bun.js CHANGED
@@ -396,7 +396,7 @@ ${F.trim()}`)}var ye=10,AP=6000;var CP=R(()=>{eD();xQ()});function ve(D={}){let
396
396
  `)});if(J)Y=J(Y)||Y;console.log(Y.map((H)=>{return H.title?`${H.title}:
397
397
  ${H.body}`:H.body}).join(`
398
398
 
399
- `))}outputVersion(){let{name:D}=this.cli,{versionNumber:$}=this.cli.globalCommand;if($)console.log(`${D}/${$} ${mT}`)}checkRequiredArgs(){let D=this.args.filter(($)=>$.required).length;if(this.cli.args.length<D)throw new g4(`missing required args for command \`${this.rawName}\``)}checkUnknownOptions(){let{options:D,globalCommand:$}=this.cli;if(!this.config.allowUnknownOptions){for(let F of Object.keys(D))if(F!=="--"&&!this.hasOption(F)&&!$.hasOption(F))throw new g4(`Unknown option \`${F.length>1?`--${F}`:`-${F}`}\``)}}checkOptionValue(){let{options:D,globalCommand:$}=this.cli,F=[...$.options,...this.options];for(let X of F){let J=D[X.name.split(".")[0]];if(X.required){let Y=F.some((G)=>G.negated&&G.names.includes(X.name));if(J===!0||J===!1&&!Y)throw new g4(`option \`${X.rawName}\` value is missing`)}}}}class NJ extends EJ{constructor(D){super("@@global@@","",{},D)}}var h4=Object.assign;class TU extends wT{constructor(D=""){super();this.name=D,this.commands=[],this.rawArgs=[],this.args=[],this.options={},this.globalCommand=new NJ(this),this.globalCommand.usage("<command> [options]")}usage(D){return this.globalCommand.usage(D),this}command(D,$,F){let X=new EJ(D,$||"",F,this);return X.globalCommand=this.globalCommand,this.commands.push(X),X}option(D,$,F){return this.globalCommand.option(D,$,F),this}help(D){return this.globalCommand.option("-h, --help","Display this message"),this.globalCommand.helpCallback=D,this.showHelpOnExit=!0,this}version(D,$="-v, --version"){return this.globalCommand.version(D,$),this.showVersionOnExit=!0,this}example(D){return this.globalCommand.example(D),this}outputHelp(){if(this.matchedCommand)this.matchedCommand.outputHelp();else this.globalCommand.outputHelp()}outputVersion(){this.globalCommand.outputVersion()}setParsedInfo({args:D,options:$},F,X){if(this.args=D,this.options=$,F)this.matchedCommand=F;if(X)this.matchedCommandName=X;return this}unsetMatchedCommand(){this.matchedCommand=void 0,this.matchedCommandName=void 0}parse(D=uT,{run:$=!0}={}){if(this.rawArgs=D,!this.name)this.name=D[1]?vT(D[1]):"cli";let F=!0;for(let J of this.commands){let Y=this.mri(D.slice(2),J),G=Y.args[0];if(J.isMatched(G)){F=!1;let B=h4(h4({},Y),{args:Y.args.slice(1)});this.setParsedInfo(B,J,G),this.emit(`command:${G}`,J)}}if(F){for(let J of this.commands)if(J.name===""){F=!1;let Y=this.mri(D.slice(2),J);this.setParsedInfo(Y,J),this.emit("command:!",J)}}if(F){let J=this.mri(D.slice(2));this.setParsedInfo(J)}if(this.options.help&&this.showHelpOnExit)this.outputHelp(),$=!1,this.unsetMatchedCommand();if(this.options.version&&this.showVersionOnExit&&this.matchedCommandName==null)this.outputVersion(),$=!1,this.unsetMatchedCommand();let X={args:this.args,options:this.options};if($)this.runMatchedCommand();if(!this.matchedCommand&&this.args[0])this.emit("command:*");return X}mri(D,$){let F=[...this.globalCommand.options,...$?$.options:[]],X=hT(F),J=[],Y=D.indexOf("--");if(Y>-1)J=D.slice(Y+1),D=D.slice(0,Y);let G=bT(D,X);G=Object.keys(G).reduce((U,K)=>{return h4(h4({},U),{[zU(K)]:G[K]})},{_:[]});let B=G._,H={"--":J},W=$&&$.config.ignoreOptionDefaultValue?$.config.ignoreOptionDefaultValue:this.globalCommand.config.ignoreOptionDefaultValue,V=Object.create(null);for(let U of F){if(!W&&U.config.default!==void 0)for(let K of U.names)H[K]=U.config.default;if(Array.isArray(U.config.type)){if(V[U.name]===void 0)V[U.name]=Object.create(null),V[U.name].shouldTransform=!0,V[U.name].transformFunction=U.config.type[0]}}for(let U of Object.keys(G))if(U!=="_"){let K=U.split(".");xT(H,K,G[U]),yT(H,V)}return{args:B,options:H}}runMatchedCommand(){let{args:D,options:$,matchedCommand:F}=this;if(!F||!F.commandAction)return;F.checkUnknownOptions(),F.checkOptionValue(),F.checkRequiredArgs();let X=[];return F.args.forEach((J,Y)=>{if(J.variadic)X.push(D.slice(Y));else X.push(D[Y])}),X.push($),F.commandAction.apply(this,X)}}var cT=(D="")=>new TU(D),SU=cT;GD();var N6={name:"@zonease/aiworker-cli",type:"module",version:"0.9.1",description:"AIWorker CLI \u2014 self-hosted Project Brain and Worker/Fleet aggregation runtime",license:"MIT",homepage:"https://github.com/ZonEaseTech/aiworker#readme",repository:{type:"git",url:"git+https://github.com/ZonEaseTech/aiworker.git"},publishConfig:{access:"public"},bin:{aiworker:"./dist/aiworker.js"},files:["README.md","dist/"],engines:{bun:">=1.1"},scripts:{typecheck:"tsc --noEmit",test:"bun test --timeout=15000","test:stress":"bun test --timeout=15000 --rerun-each=3 src/commands/worker/init.integration.test.ts src/commands/worker/sessions.test.ts",build:"bun run --filter '@zonease/aiworker-web' build && bun run build:bundle","build:bundle":"bun build --target=bun --minify --outfile=dist/aiworker-bun.js src/aiworker.ts && bun scripts/build-publish-manifest.ts",prepublishOnly:"bun run build","smoke:aiworker-run":"bun scripts/smoke-aiworker-run.ts","smoke:aiworker-fleet":"bun scripts/smoke-aiworker-fleet.ts"},devDependencies:{"@types/bun":"^1.2.13","@zonease/aiworker-api":"workspace:*","@zonease/aiworker-core":"workspace:*","@zonease/aiworker-fs-layout":"workspace:*","@zonease/aiworker-gateway":"workspace:*","@zonease/aiworker-gateway-proto":"workspace:*","@zonease/aiworker-shared":"workspace:*","@zonease/aiworker-storage-sqlite":"workspace:*",cac:"^6.7.14",consola:"^3.4.2",typescript:"^5.8.3",yaml:"^2.7.1"}};GD();import JA from"process";C0();class q0 extends Error{code;constructor(D,$="operator_ws_error"){super(D);this.code=$;this.name="OperatorWsError"}}function s_(){let D=null,$=!1,F=!1,X=new Map,J=new Map;function Y(M){for(let[,O]of X){if(O.timer)clearTimeout(O.timer);O.signalCleanup?.(),O.reject(M)}X.clear()}function G(M){let O=X.get(M.id);if(!O)return;if(X.delete(M.id),O.timer)clearTimeout(O.timer);if(O.signalCleanup?.(),M.ok)O.resolve(M.result);else{let N=M.error;O.reject(new q0(`${N.code}: ${N.message}`,N.code))}}function B(M){let O=J.get(M.name);if(!O||O.size===0)return;for(let N of O)try{N(M.payload)}catch{}}function H(M){let O=J8(M);if(!O.ok)return;let N=O.frame;if(N.type==="response")G(N);else if(N.type==="event")B(N)}async function W(M){if($)throw new q0("aiworker client \u5DF2\u7ECF\u8FDE\u63A5","already_connected");let O=M.timeoutMs??1e4;await new Promise((N,q)=>{let S=!1,h;try{h=new WebSocket(M.url)}catch(j){q(new q0(`WebSocket \u6784\u9020\u5931\u8D25 (${M.url}): ${j instanceof Error?j.message:String(j)}`,"ws_construct_failed"));return}D=h;let z=setTimeout(()=>{if(S)return;S=!0;try{h.close()}catch{}q(new q0(`\u8FDE\u63A5 gateway \u8D85\u65F6 (>${O}ms): ${M.url}`,"connect_timeout"))},O);h.onopen=()=>{let j={type:"connect",role:I1.OPERATOR,agentId:M.deviceId,deviceId:M.deviceId,auth:{token:M.token},...M.meta?{meta:M.meta}:{}};try{h.send(mD(j))}catch(I){if(S)return;S=!0,clearTimeout(z),q(new q0(`\u53D1\u9001 connect \u5E27\u5931\u8D25: ${I instanceof Error?I.message:String(I)}`,"connect_send_failed"));return}if(!S)S=!0,clearTimeout(z),$=!0,N()},h.onmessage=(j)=>{let I=typeof j.data==="string"?j.data:j.data instanceof ArrayBuffer?new TextDecoder().decode(j.data):String(j.data);H(I)},h.onerror=(j)=>{if(S)return;S=!0,clearTimeout(z);let I=j.message??"unknown";q(new q0(`WS \u8FDE\u63A5\u9519\u8BEF: ${I}`,"ws_error"))},h.onclose=(j)=>{if(F=!0,$=!1,Y(new q0(`WS \u5DF2\u5173\u95ED (code=${j.code}, reason=${j.reason||"n/a"})`,"ws_closed")),!S)S=!0,clearTimeout(z),q(new q0(`WS \u5728\u63E1\u624B\u9636\u6BB5\u88AB\u5173\u95ED (code=${j.code})`,"ws_closed_early"))}})}function V(){if(!$||F||D===null||D.readyState!==WebSocket.OPEN)throw new q0("aiworker client \u672A\u8FDE\u63A5\u6216\u5DF2\u5173\u95ED","not_connected")}async function U(M,O,N){V();let q=crypto.randomUUID(),S={type:"request",id:q,method:M,...O===void 0?{}:{params:O}};return await new Promise((h,z)=>{let j=N?.timeoutMs??30000,I=null,l=null,x={resolve:h,reject:z,timer:null,signalCleanup:null};if(I=setTimeout(()=>{X.delete(q),l?.(),z(new q0(`request ${M} \u8D85\u65F6 (>${j}ms)`,"request_timeout"))},j),x.timer=I,N?.signal){let d=N.signal;if(d.aborted){X.delete(q),clearTimeout(I),z(d.reason??new q0(`request ${M} \u88AB abort`,"aborted"));return}let s=()=>{if(X.delete(q),I)clearTimeout(I);z(d.reason??new q0(`request ${M} \u88AB abort`,"aborted"))};d.addEventListener("abort",s,{once:!0}),l=()=>d.removeEventListener("abort",s),x.signalCleanup=l}X.set(q,x);try{D?.send(mD(S))}catch(d){if(X.delete(q),I)clearTimeout(I);l?.(),z(new q0(`request ${M} \u53D1\u9001\u5931\u8D25: ${d instanceof Error?d.message:String(d)}`,"send_failed"))}})}async function K(M,O,N){if(!d5(M))throw new q0(`method ${M} \u672A\u5728 @zonease/aiworker-gateway-proto \u6CE8\u518C`,"unknown_method");return await U(M,O,N)}function _(M,O){if(!nJ(M));let N=J.get(M);if(!N)N=new Set,J.set(M,N);return N.add(O),()=>{let q=J.get(M);if(!q)return;if(q.delete(O),q.size===0)J.delete(M)}}async function Z(M,O){if(!D||F)return;await new Promise((N)=>{let q=D;if(!q){N();return}if(q.readyState===WebSocket.CLOSED){F=!0,$=!1,N();return}let S=q.onclose;q.onclose=(h)=>{if(typeof S==="function")S.call(q,h);N()};try{q.close(M,O)}catch{}})}function C(){return $&&!F&&D!==null&&D.readyState===WebSocket.OPEN}return{connect:W,request:K,requestRaw:U,onEvent:_,close:Z,isOpen:C}}w1();async function wD(D,$={}){let F=await t5(),X=($.createClient??s_)();try{await X.connect({url:g9($.gatewayUrl??F.gatewayUrl),deviceId:F.deviceId,token:$.token??F.deviceToken,...$.connectTimeoutMs===void 0?{}:{timeoutMs:$.connectTimeoutMs}});let J=await D({client:X,state:F});return await X.close(1000,"aiworker session done"),J}catch(J){try{await X.close(1011,"aiworker session error")}catch{}throw J}}function iD(D){let $=JSON.stringify(D,null,2);JA.stdout.write(`${$}
399
+ `))}outputVersion(){let{name:D}=this.cli,{versionNumber:$}=this.cli.globalCommand;if($)console.log(`${D}/${$} ${mT}`)}checkRequiredArgs(){let D=this.args.filter(($)=>$.required).length;if(this.cli.args.length<D)throw new g4(`missing required args for command \`${this.rawName}\``)}checkUnknownOptions(){let{options:D,globalCommand:$}=this.cli;if(!this.config.allowUnknownOptions){for(let F of Object.keys(D))if(F!=="--"&&!this.hasOption(F)&&!$.hasOption(F))throw new g4(`Unknown option \`${F.length>1?`--${F}`:`-${F}`}\``)}}checkOptionValue(){let{options:D,globalCommand:$}=this.cli,F=[...$.options,...this.options];for(let X of F){let J=D[X.name.split(".")[0]];if(X.required){let Y=F.some((G)=>G.negated&&G.names.includes(X.name));if(J===!0||J===!1&&!Y)throw new g4(`option \`${X.rawName}\` value is missing`)}}}}class NJ extends EJ{constructor(D){super("@@global@@","",{},D)}}var h4=Object.assign;class TU extends wT{constructor(D=""){super();this.name=D,this.commands=[],this.rawArgs=[],this.args=[],this.options={},this.globalCommand=new NJ(this),this.globalCommand.usage("<command> [options]")}usage(D){return this.globalCommand.usage(D),this}command(D,$,F){let X=new EJ(D,$||"",F,this);return X.globalCommand=this.globalCommand,this.commands.push(X),X}option(D,$,F){return this.globalCommand.option(D,$,F),this}help(D){return this.globalCommand.option("-h, --help","Display this message"),this.globalCommand.helpCallback=D,this.showHelpOnExit=!0,this}version(D,$="-v, --version"){return this.globalCommand.version(D,$),this.showVersionOnExit=!0,this}example(D){return this.globalCommand.example(D),this}outputHelp(){if(this.matchedCommand)this.matchedCommand.outputHelp();else this.globalCommand.outputHelp()}outputVersion(){this.globalCommand.outputVersion()}setParsedInfo({args:D,options:$},F,X){if(this.args=D,this.options=$,F)this.matchedCommand=F;if(X)this.matchedCommandName=X;return this}unsetMatchedCommand(){this.matchedCommand=void 0,this.matchedCommandName=void 0}parse(D=uT,{run:$=!0}={}){if(this.rawArgs=D,!this.name)this.name=D[1]?vT(D[1]):"cli";let F=!0;for(let J of this.commands){let Y=this.mri(D.slice(2),J),G=Y.args[0];if(J.isMatched(G)){F=!1;let B=h4(h4({},Y),{args:Y.args.slice(1)});this.setParsedInfo(B,J,G),this.emit(`command:${G}`,J)}}if(F){for(let J of this.commands)if(J.name===""){F=!1;let Y=this.mri(D.slice(2),J);this.setParsedInfo(Y,J),this.emit("command:!",J)}}if(F){let J=this.mri(D.slice(2));this.setParsedInfo(J)}if(this.options.help&&this.showHelpOnExit)this.outputHelp(),$=!1,this.unsetMatchedCommand();if(this.options.version&&this.showVersionOnExit&&this.matchedCommandName==null)this.outputVersion(),$=!1,this.unsetMatchedCommand();let X={args:this.args,options:this.options};if($)this.runMatchedCommand();if(!this.matchedCommand&&this.args[0])this.emit("command:*");return X}mri(D,$){let F=[...this.globalCommand.options,...$?$.options:[]],X=hT(F),J=[],Y=D.indexOf("--");if(Y>-1)J=D.slice(Y+1),D=D.slice(0,Y);let G=bT(D,X);G=Object.keys(G).reduce((U,K)=>{return h4(h4({},U),{[zU(K)]:G[K]})},{_:[]});let B=G._,H={"--":J},W=$&&$.config.ignoreOptionDefaultValue?$.config.ignoreOptionDefaultValue:this.globalCommand.config.ignoreOptionDefaultValue,V=Object.create(null);for(let U of F){if(!W&&U.config.default!==void 0)for(let K of U.names)H[K]=U.config.default;if(Array.isArray(U.config.type)){if(V[U.name]===void 0)V[U.name]=Object.create(null),V[U.name].shouldTransform=!0,V[U.name].transformFunction=U.config.type[0]}}for(let U of Object.keys(G))if(U!=="_"){let K=U.split(".");xT(H,K,G[U]),yT(H,V)}return{args:B,options:H}}runMatchedCommand(){let{args:D,options:$,matchedCommand:F}=this;if(!F||!F.commandAction)return;F.checkUnknownOptions(),F.checkOptionValue(),F.checkRequiredArgs();let X=[];return F.args.forEach((J,Y)=>{if(J.variadic)X.push(D.slice(Y));else X.push(D[Y])}),X.push($),F.commandAction.apply(this,X)}}var cT=(D="")=>new TU(D),SU=cT;GD();var N6={name:"@zonease/aiworker-cli",type:"module",version:"0.9.2",description:"AIWorker CLI \u2014 self-hosted Project Brain and Worker/Fleet aggregation runtime",license:"MIT",homepage:"https://github.com/ZonEaseTech/aiworker#readme",repository:{type:"git",url:"git+https://github.com/ZonEaseTech/aiworker.git"},publishConfig:{access:"public"},bin:{aiworker:"./dist/aiworker.js"},files:["README.md","dist/"],engines:{bun:">=1.1"},scripts:{typecheck:"tsc --noEmit",test:"bun test --timeout=15000","test:stress":"bun test --timeout=15000 --rerun-each=3 src/commands/worker/init.integration.test.ts src/commands/worker/sessions.test.ts",build:"bun run --filter '@zonease/aiworker-web' build && bun run build:bundle","build:bundle":"bun build --target=bun --minify --outfile=dist/aiworker-bun.js src/aiworker.ts && bun scripts/build-publish-manifest.ts",prepublishOnly:"bun run build","smoke:aiworker-run":"bun scripts/smoke-aiworker-run.ts","smoke:aiworker-fleet":"bun scripts/smoke-aiworker-fleet.ts"},devDependencies:{"@types/bun":"^1.2.13","@zonease/aiworker-api":"workspace:*","@zonease/aiworker-core":"workspace:*","@zonease/aiworker-fs-layout":"workspace:*","@zonease/aiworker-gateway":"workspace:*","@zonease/aiworker-gateway-proto":"workspace:*","@zonease/aiworker-shared":"workspace:*","@zonease/aiworker-storage-sqlite":"workspace:*",cac:"^6.7.14",consola:"^3.4.2",typescript:"^5.8.3",yaml:"^2.7.1"}};GD();import JA from"process";C0();class q0 extends Error{code;constructor(D,$="operator_ws_error"){super(D);this.code=$;this.name="OperatorWsError"}}function s_(){let D=null,$=!1,F=!1,X=new Map,J=new Map;function Y(M){for(let[,O]of X){if(O.timer)clearTimeout(O.timer);O.signalCleanup?.(),O.reject(M)}X.clear()}function G(M){let O=X.get(M.id);if(!O)return;if(X.delete(M.id),O.timer)clearTimeout(O.timer);if(O.signalCleanup?.(),M.ok)O.resolve(M.result);else{let N=M.error;O.reject(new q0(`${N.code}: ${N.message}`,N.code))}}function B(M){let O=J.get(M.name);if(!O||O.size===0)return;for(let N of O)try{N(M.payload)}catch{}}function H(M){let O=J8(M);if(!O.ok)return;let N=O.frame;if(N.type==="response")G(N);else if(N.type==="event")B(N)}async function W(M){if($)throw new q0("aiworker client \u5DF2\u7ECF\u8FDE\u63A5","already_connected");let O=M.timeoutMs??1e4;await new Promise((N,q)=>{let S=!1,h;try{h=new WebSocket(M.url)}catch(j){q(new q0(`WebSocket \u6784\u9020\u5931\u8D25 (${M.url}): ${j instanceof Error?j.message:String(j)}`,"ws_construct_failed"));return}D=h;let z=setTimeout(()=>{if(S)return;S=!0;try{h.close()}catch{}q(new q0(`\u8FDE\u63A5 gateway \u8D85\u65F6 (>${O}ms): ${M.url}`,"connect_timeout"))},O);h.onopen=()=>{let j={type:"connect",role:I1.OPERATOR,agentId:M.deviceId,deviceId:M.deviceId,auth:{token:M.token},...M.meta?{meta:M.meta}:{}};try{h.send(mD(j))}catch(I){if(S)return;S=!0,clearTimeout(z),q(new q0(`\u53D1\u9001 connect \u5E27\u5931\u8D25: ${I instanceof Error?I.message:String(I)}`,"connect_send_failed"));return}if(!S)S=!0,clearTimeout(z),$=!0,N()},h.onmessage=(j)=>{let I=typeof j.data==="string"?j.data:j.data instanceof ArrayBuffer?new TextDecoder().decode(j.data):String(j.data);H(I)},h.onerror=(j)=>{if(S)return;S=!0,clearTimeout(z);let I=j.message??"unknown";q(new q0(`WS \u8FDE\u63A5\u9519\u8BEF: ${I}`,"ws_error"))},h.onclose=(j)=>{if(F=!0,$=!1,Y(new q0(`WS \u5DF2\u5173\u95ED (code=${j.code}, reason=${j.reason||"n/a"})`,"ws_closed")),!S)S=!0,clearTimeout(z),q(new q0(`WS \u5728\u63E1\u624B\u9636\u6BB5\u88AB\u5173\u95ED (code=${j.code})`,"ws_closed_early"))}})}function V(){if(!$||F||D===null||D.readyState!==WebSocket.OPEN)throw new q0("aiworker client \u672A\u8FDE\u63A5\u6216\u5DF2\u5173\u95ED","not_connected")}async function U(M,O,N){V();let q=crypto.randomUUID(),S={type:"request",id:q,method:M,...O===void 0?{}:{params:O}};return await new Promise((h,z)=>{let j=N?.timeoutMs??30000,I=null,l=null,x={resolve:h,reject:z,timer:null,signalCleanup:null};if(I=setTimeout(()=>{X.delete(q),l?.(),z(new q0(`request ${M} \u8D85\u65F6 (>${j}ms)`,"request_timeout"))},j),x.timer=I,N?.signal){let d=N.signal;if(d.aborted){X.delete(q),clearTimeout(I),z(d.reason??new q0(`request ${M} \u88AB abort`,"aborted"));return}let s=()=>{if(X.delete(q),I)clearTimeout(I);z(d.reason??new q0(`request ${M} \u88AB abort`,"aborted"))};d.addEventListener("abort",s,{once:!0}),l=()=>d.removeEventListener("abort",s),x.signalCleanup=l}X.set(q,x);try{D?.send(mD(S))}catch(d){if(X.delete(q),I)clearTimeout(I);l?.(),z(new q0(`request ${M} \u53D1\u9001\u5931\u8D25: ${d instanceof Error?d.message:String(d)}`,"send_failed"))}})}async function K(M,O,N){if(!d5(M))throw new q0(`method ${M} \u672A\u5728 @zonease/aiworker-gateway-proto \u6CE8\u518C`,"unknown_method");return await U(M,O,N)}function _(M,O){if(!nJ(M));let N=J.get(M);if(!N)N=new Set,J.set(M,N);return N.add(O),()=>{let q=J.get(M);if(!q)return;if(q.delete(O),q.size===0)J.delete(M)}}async function Z(M,O){if(!D||F)return;await new Promise((N)=>{let q=D;if(!q){N();return}if(q.readyState===WebSocket.CLOSED){F=!0,$=!1,N();return}let S=q.onclose;q.onclose=(h)=>{if(typeof S==="function")S.call(q,h);N()};try{q.close(M,O)}catch{}})}function C(){return $&&!F&&D!==null&&D.readyState===WebSocket.OPEN}return{connect:W,request:K,requestRaw:U,onEvent:_,close:Z,isOpen:C}}w1();async function wD(D,$={}){let F=await t5(),X=($.createClient??s_)();try{await X.connect({url:g9($.gatewayUrl??F.gatewayUrl),deviceId:F.deviceId,token:$.token??F.deviceToken,...$.connectTimeoutMs===void 0?{}:{timeoutMs:$.connectTimeoutMs}});let J=await D({client:X,state:F});return await X.close(1000,"aiworker session done"),J}catch(J){try{await X.close(1011,"aiworker session error")}catch{}throw J}}function iD(D){let $=JSON.stringify(D,null,2);JA.stdout.write(`${$}
400
400
  `)}function g2(D){JA.stdout.write(`${JSON.stringify(D)}
401
401
  `)}function ND(D){if(!(D instanceof q0))return 1;switch(D.code){case"NOT_FOUND":case"unknown_method":return 2;case"request_timeout":case"connect_timeout":return 3;case"ws_closed":case"ws_closed_early":case"not_connected":return 4;default:return 1}}async function YA(D={}){try{let $=await wD(async({client:F})=>{if(D.workerId!==void 0&&D.workerId.length>0)return await F.request("approval.list",{workerId:D.workerId});let J=(await F.request("workers.list",{})).workers.filter((G)=>G.online).map((G)=>G.workerId),Y=[];for(let G of J)try{let B=await F.request("approval.list",{workerId:G});for(let H of B.approvals)Y.push(H)}catch(B){A.warn(`approval.list ${G} \u5931\u8D25: ${B instanceof Error?B.message:String(B)}`)}return{approvals:Y}});return iD($),0}catch($){return A.error(`fleet approvals list \u5931\u8D25: ${$ instanceof Error?$.message:String($)}`),ND($)}}async function GA(D){try{let $=await wD(async({client:F})=>{return await F.request("approval.grant",{workerId:D.workerId,taskId:D.taskId,toolCallId:D.toolCallId,decision:D.deny===!0?"deny":"allow"})});return iD($),0}catch($){return A.error(`fleet approvals grant \u5931\u8D25: ${$ instanceof Error?$.message:String($)}`),ND($)}}C0();GD();async function BA(D){let $=D.timeoutMs??120000;try{return await wD(async({client:F})=>{return await new Promise((X)=>{let J=!1,Y=(V)=>{if(J)return;J=!0,X(V)},G=setTimeout(()=>{g2({kind:"error",payload:{code:"timeout",message:`chat \u7B49\u5F85 agent.done \u8D85\u65F6 (>${$}ms)`}}),Y(3)},$),B=D.workerId,H=(V)=>{if(V===null||typeof V!=="object")return!1;let U=V.workerId;return typeof U==="string"&&U===B},W=[];W.push(F.onEvent(JD.CHAT_MESSAGE,(V)=>{if(!H(V))return;g2({kind:JD.CHAT_MESSAGE,payload:V})})),W.push(F.onEvent(JD.AGENT_THINKING,(V)=>{if(!H(V))return;g2({kind:JD.AGENT_THINKING,payload:V})})),W.push(F.onEvent(JD.AGENT_TOOL_CALL,(V)=>{if(!H(V))return;g2({kind:JD.AGENT_TOOL_CALL,payload:V})})),W.push(F.onEvent(JD.AGENT_DONE,(V)=>{if(!H(V))return;g2({kind:"done",payload:V}),clearTimeout(G);for(let U of W)U();Y(0)})),F.request("chat.send",{workerId:D.workerId,content:D.content,...D.conversationId===void 0?{}:{conversationId:D.conversationId}},{timeoutMs:Math.min($,30000)}).then((V)=>{g2({kind:"accepted",payload:V})}).catch((V)=>{g2({kind:"error",payload:{code:"request_failed",message:V instanceof Error?V.message:String(V)}}),clearTimeout(G);for(let U of W)U();Y(ND(V))})})})}catch(F){return A.error(`chat \u5931\u8D25: ${F instanceof Error?F.message:String(F)}`),ND(F)}}GD();async function HA(D){try{let $=await wD(async({client:F})=>{return await F.request("config.get",{workerId:D})});return iD($),0}catch($){return A.error(`fleet config get \u5931\u8D25: ${$ instanceof Error?$.message:String($)}`),ND($)}}async function WA(D){let $;try{$=JSON.parse(D.configJson)}catch(F){return A.error(`fleet config set \u53C2\u6570\u4E0D\u662F\u5408\u6CD5 JSON: ${F instanceof Error?F.message:String(F)}`),2}try{let F=await wD(async({client:X})=>{return await X.request("config.put",{workerId:D.workerId,ifMatch:D.ifMatch,config:$})});return iD(F),0}catch(F){return A.error(`fleet config set \u5931\u8D25: ${F instanceof Error?F.message:String(F)}`),ND(F)}}GD();async function QA(D={}){let $=D.withSession??wD,F=D.printJson??iD,X=D.errorToExitCode??ND;try{let J=await $(async({client:Y})=>{return await Y.request("enroll.list",{})});return F(J),0}catch(J){return A.error(`fleet enroll list \u5931\u8D25: ${J instanceof Error?J.message:String(J)}`),X(J)}}async function VA(D,$={}){let F=$.withSession??wD,X=$.printJson??iD,J=$.errorToExitCode??ND;try{let Y=await F(async({client:G})=>{return await G.request("enroll.approve",{otp:D})});return A.success(`\u5DF2\u6279\u51C6 OTP ${D}\uFF0CworkerId=${Y.workerId}`),X({workerId:Y.workerId,deviceToken:Y.deviceToken}),0}catch(Y){return A.error(`fleet enroll approve \u5931\u8D25: ${Y instanceof Error?Y.message:String(Y)}`),J(Y)}}async function UA(D,$={}){let F=$.withSession??wD,X=$.printJson??iD,J=$.errorToExitCode??ND;try{let Y=await F(async({client:G})=>{return await G.request("enroll.reject",{otp:D})});if(Y.rejected)A.info(`\u5DF2\u62D2\u7EDD OTP ${D}`);else A.warn(`OTP ${D} \u4E0D\u5B58\u5728\u6216\u5DF2\u8FC7\u671F`);return X(Y),0}catch(Y){return A.error(`fleet enroll reject \u5931\u8D25: ${Y instanceof Error?Y.message:String(Y)}`),J(Y)}}C0();GD();async function KA(D){let $=D.follow===!0,F=D.timeoutMs??($?3600000:5000);try{return await wD(async({client:X})=>{return await new Promise((J)=>{let Y=!1,G=(W)=>{if(Y)return;Y=!0,J(W)},B=X.onEvent(JD.LOGS_LINE,(W)=>{if(W===null||typeof W!=="object")return;let V=W.workerId;if(typeof V!=="string"||V!==D.workerId)return;g2(W)}),H=setTimeout(()=>{B(),G(0)},F);X.request("logs.tail",{workerId:D.workerId,follow:$,...D.tail===void 0?{}:{lines:D.tail}}).then(()=>{}).catch((W)=>{B(),clearTimeout(H),g2({kind:"error",payload:{code:"request_failed",message:W instanceof Error?W.message:String(W)}}),G(ND(W))})})})}catch(X){return A.error(`logs \u5931\u8D25: ${X instanceof Error?X.message:String(X)}`),ND(X)}}GD();w1();async function _A(D,$={}){let F=$.withSession??wD,X=$.patchOperatorState??S1,J=$.printJson??iD,Y=$.errorToExitCode??ND;try{let G=await F(async({client:B})=>{return await B.request("workers.pair",{workerBaseUrl:D.workerUrl,bootstrapToken:D.bootstrapToken,...D.displayName===void 0?{}:{displayName:D.displayName}})},D.url===void 0?{}:{gatewayUrl:D.url});return await X({...D.url===void 0?{}:{gatewayUrl:D.url},deviceToken:G.deviceToken,defaultWorkerId:G.workerId}),A.success(`\u5DF2\u914D\u5BF9 worker ${G.workerId}`),J({workerId:G.workerId}),0}catch(G){return A.error(`fleet pair \u5931\u8D25: ${G instanceof Error?G.message:String(G)}`),Y(G)}}GD();var AA=["web","line","telegram","lark","whatsapp"];function Of(D){if(!AA.includes(D))throw Error(`\u65E0\u6548 channel "${D}"\uFF0C\u53EF\u9009\u503C\uFF1A${AA.join(", ")}`);return D}async function CA(D){try{let $=await wD(async({client:F})=>{return await F.request("cron.list",{workerId:D})});return iD($),0}catch($){return A.error(`fleet schedule list \u5931\u8D25: ${$ instanceof Error?$.message:String($)}`),ND($)}}async function MA(D){try{let $=Of(D.channel),F={expression:D.expression,prompt:D.prompt,channel:$,chatId:D.chatId};if(D.accountId!==void 0)F.accountId=D.accountId;if(D.enabled!==void 0)F.enabled=D.enabled;let X=await wD(async({client:J})=>{return await J.request("cron.add",{workerId:D.workerId,job:F})});return iD(X),0}catch($){return A.error(`fleet schedule add \u5931\u8D25: ${$ instanceof Error?$.message:String($)}`),ND($)}}async function ZA(D,$){try{let F=await wD(async({client:X})=>{return await X.request("cron.remove",{workerId:D,jobId:$})});return iD(F),0}catch(F){return A.error(`fleet schedule remove \u5931\u8D25: ${F instanceof Error?F.message:String(F)}`),ND(F)}}GD();async function OA(D){try{let $=await wD(async({client:F})=>{return await F.request("token.rotate",{workerId:D})});return iD($),0}catch($){return A.error(`fleet token rotate \u5931\u8D25: ${$ instanceof Error?$.message:String($)}`),ND($)}}GD();async function RA(){try{let D=await wD(async({client:$})=>{return await $.request("workers.list",{})});return iD(D),0}catch(D){return A.error(`workers list \u5931\u8D25: ${D instanceof Error?D.message:String(D)}`),ND(D)}}async function EA(D){try{let $=await wD(async({client:F})=>{return await F.request("workers.info",{workerId:D})});return iD($),0}catch($){return A.error(`workers info \u5931\u8D25: ${$ instanceof Error?$.message:String($)}`),ND($)}}async function NA(D={}){try{let $=await wD(async({client:X})=>{let J={...D.env??{}};if(D.forceId!==void 0&&D.forceId.length>0)J.AIWORKER_FORCE_ID=D.forceId;return await X.request("workers.launch",{...D.displayName===void 0?{}:{displayName:D.displayName},...D.image===void 0?{}:{image:D.image},...Object.keys(J).length===0?{}:{env:J}})}),{patchOperatorState:F}=await Promise.resolve().then(() => (w1(),nY));return await F({deviceToken:$.deviceToken,defaultWorkerId:$.workerId}),A.success(`\u5DF2 launch worker ${$.workerId}`),iD({workerId:$.workerId}),0}catch($){return A.error(`workers launch \u5931\u8D25: ${$ instanceof Error?$.message:String($)}`),ND($)}}async function jA(D){try{let $=await wD(async({client:F})=>{return await F.request("workers.stop",{workerId:D})});return iD($),0}catch($){return A.error(`workers stop \u5931\u8D25: ${$ instanceof Error?$.message:String($)}`),ND($)}}async function qA(D){try{let $=await wD(async({client:Y})=>{return await Y.request("workers.remove",{workerId:D})}),{loadOperatorState:F,saveOperatorState:X}=await Promise.resolve().then(() => (w1(),nY)),J=await F();if(J.defaultWorkerId===D){let Y={...J};delete Y.defaultWorkerId,await X(Y)}return iD($),0}catch($){return A.error(`workers remove \u5931\u8D25: ${$ instanceof Error?$.message:String($)}`),ND($)}}import v$ from"process";import{createHash as $g}from"crypto";C0();cG();dG();import{existsSync as zM,mkdirSync as yf}from"fs";import $7 from"path";import{fileURLToPath as vf}from"url";import{Database as uf}from"bun:sqlite";N$();var lG={};R1(lG,{registeredWorkers:()=>hD,auditEvents:()=>L8});var hD=Y0("registered_workers",{id:L("id").primaryKey(),baseUrl:L("base_url").notNull(),displayName:L("display_name").notNull(),apiTokenEnc:L("api_token_enc").notNull(),nonce:L("nonce").notNull(),authTag:L("auth_tag").notNull(),addedAt:L("added_at").notNull().$defaultFn(()=>new Date().toISOString()),addedBy:L("added_by").$type().notNull(),lastSeenAt:L("last_seen_at"),lastSeenState:L("last_seen_state").$type(),lastConfigVersion:fD("last_config_version")}),L8=Y0("audit_events",{id:fD("id").primaryKey({autoIncrement:!0}),at:L("at").notNull().$defaultFn(()=>new Date().toISOString()),actor:L("actor").notNull(),action:L("action").notNull(),workerId:L("worker_id"),detail:L("detail",{mode:"json"}).$type()},(D)=>({workerIdIdx:D0("audit_events_worker_id_idx").on(D.workerId)}));var IM=$7.dirname(vf(import.meta.url));function mf(D){let $=$7.resolve(IM,"../../drizzle",D);if(zM($))return $;let F=$7.resolve(IM,"drizzle",D);if(zM(F))return F;return $}var iG=mf("fleet"),F7=null;function cf(D){let $=D===":memory:"?D:$7.resolve(D);try{if($!==":memory:")yf($7.dirname($),{recursive:!0,mode:448});let F=new uf($,{create:!0});return F.exec("PRAGMA journal_mode = WAL"),F.exec("PRAGMA foreign_keys = ON"),r6(F,{schema:lG})}catch(F){let X=F instanceof Error?F.message:String(F);throw Error(`Unable to open fleet database at ${$}. Ensure the parent directory exists and is writable, or set AIWORKER_FLEET_DB_PATH to a writable location. Original error: ${X}`)}}function TM(D){return F7=cf(D),F7}function nG(){if(!F7)throw Error("Fleet database not initialized. Call initFleetDb() first.");return F7}function rG(){F7=null}function SM(D=iG){q$(nG(),{migrationsFolder:D})}GD();eD();_D();PD();import wM from"path";import pf from"process";var df=Q.object({AIWORKER_GATEWAY_PORT:Q.coerce.number().int().positive().max(65535).default(9218),AIWORKER_GATEWAY_HOST:Q.string().min(1).default("127.0.0.1"),AIWORKER_ADMIN_EXTERNAL_AUTH:Q.enum(["1","true","0","false"]).default("0").transform(z9),INTERNAL_SHARED_SECRET:Q.string().min(16).optional(),NODE_ENV:Q.enum(["development","production","test"]).default("development"),AIWORKER_MASTER_KEY:Q.string().regex(/^[0-9a-f]{64}$/,"AIWORKER_MASTER_KEY must be 32-byte hex (64 hex chars)").optional(),AIWORKER_FLEET_DB_PATH:Q.string().optional(),AIWORKER_GATEWAY_CAN_LAUNCH:Q.enum(["true","false"]).default("false").transform((D)=>D==="true"),AIWORKER_MAX_WORKERS:Q.coerce.number().int().positive().optional(),AIWORKER_JOIN_TOKEN:Q.string().min(16).optional(),AIWORKER_ENROLL_OTP_TTL_SEC:Q.coerce.number().int().min(30).max(3600).default(300),DOCKER_HOST:Q.string().default("/var/run/docker.sock"),AIWORKER_IMAGE:Q.string().optional(),AIWORKER_NETWORK:Q.string().default("aiworker_default"),WORKER_DATA_ROOT:Q.string().optional(),WORKER_MEMORY_LIMIT:Q.string().optional(),WORKER_CPU_LIMIT:Q.coerce.number().optional(),AIWORKER_LAUNCH_BASE_URL_TEMPLATE:Q.string().default("http://{containerName}:9217")}).superRefine((D,$)=>{if(!D.AIWORKER_GATEWAY_CAN_LAUNCH)return;if(!D.INTERNAL_SHARED_SECRET)$.addIssue({code:Q.ZodIssueCode.custom,path:["INTERNAL_SHARED_SECRET"],message:"INTERNAL_SHARED_SECRET is required when AIWORKER_GATEWAY_CAN_LAUNCH=true"});let F=[["AIWORKER_IMAGE",D.AIWORKER_IMAGE],["WORKER_DATA_ROOT",D.WORKER_DATA_ROOT],["WORKER_MEMORY_LIMIT",D.WORKER_MEMORY_LIMIT],["WORKER_CPU_LIMIT",D.WORKER_CPU_LIMIT]];for(let[X,J]of F)if(J===void 0||J==="")$.addIssue({code:Q.ZodIssueCode.custom,path:[X],message:`${X} is required when AIWORKER_GATEWAY_CAN_LAUNCH=true`})});function kM(){let D=df.parse(pf.env);return{port:D.AIWORKER_GATEWAY_PORT,host:D.AIWORKER_GATEWAY_HOST,adminExternalAuthAcknowledged:D.AIWORKER_ADMIN_EXTERNAL_AUTH,internalSharedSecret:D.INTERNAL_SHARED_SECRET,masterKeyHex:D.AIWORKER_MASTER_KEY,fleetDbPath:lf(D.AIWORKER_FLEET_DB_PATH),canLaunch:D.AIWORKER_GATEWAY_CAN_LAUNCH,maxWorkers:D.AIWORKER_MAX_WORKERS,joinToken:D.AIWORKER_JOIN_TOKEN,enrollOtpTtlSec:D.AIWORKER_ENROLL_OTP_TTL_SEC,nodeEnv:D.NODE_ENV,supervisor:{dockerHost:D.DOCKER_HOST,image:D.AIWORKER_IMAGE,network:D.AIWORKER_NETWORK,workerDataRoot:D.WORKER_DATA_ROOT,workerMemoryLimit:D.WORKER_MEMORY_LIMIT,workerCpuLimit:D.WORKER_CPU_LIMIT,launchBaseUrlTemplate:D.AIWORKER_LAUNCH_BASE_URL_TEMPLATE}}}function lf(D){if(D===":memory:")return D;let $=D&&D.length>0?D:wM.join(h2(),"fleet.db");return wM.resolve($)}C0();function $2(D,$){let F=mD($);D.forEach((X)=>{try{X.ws.send(F)}catch{}})}class L${windowMs;threshold;blockMs;now;entries=new Map;constructor(D={}){this.windowMs=D.windowMs??60000,this.threshold=D.threshold??5,this.blockMs=D.blockMs??600000,this.now=D.now??(()=>Date.now())}isBlocked(D){if(!D)return{blocked:!1,retryAfterMs:0,blockUntil:0};let $=this.entries.get(D);if(!$)return{blocked:!1,retryAfterMs:0,blockUntil:0};let F=this.now();if($.blockUntil>F)return{blocked:!0,retryAfterMs:$.blockUntil-F,blockUntil:$.blockUntil};return{blocked:!1,retryAfterMs:0,blockUntil:0}}recordFailure(D){if(!D)return{blockedNow:!1,fails:0,blockUntil:0};let $=this.now(),F=this.entries.get(D);if(F&&F.blockUntil>$)return{blockedNow:!1,fails:F.fails,blockUntil:F.blockUntil};if(!F||$-F.firstFailAt>this.windowMs)F={fails:1,firstFailAt:$,blockUntil:0};else F.fails+=1;let X=!1;if(F.fails>=this.threshold&&F.blockUntil===0)F.blockUntil=$+this.blockMs,X=!0;return this.entries.set(D,F),{blockedNow:X,fails:F.fails,blockUntil:F.blockUntil}}recordSuccess(D){if(!D)return;this.entries.delete(D)}prune(){let D=this.now(),$=0;for(let[F,X]of this.entries){if(X.blockUntil>D)continue;if(D-X.firstFailAt>this.windowMs)this.entries.delete(F),$+=1}return $}snapshot(D){return this.entries.get(D)}size(){return this.entries.size}clear(){this.entries.clear()}}class P${map=new Map;timeoutMs;now;idFactory;onExpire;timers=new Map;constructor(D={}){this.timeoutMs=D.timeoutMs??60000,this.now=D.now??(()=>Date.now()),this.idFactory=D.idFactory??(()=>crypto.randomUUID()),this.onExpire=D.onExpire}allocate(D){let $=this.idFactory(),F={...D,gatewayRequestId:$,createdAt:this.now()};if(this.map.set($,F),this.timeoutMs>0){let X=setTimeout(()=>{let J=this.map.get($);if(!J)return;this.map.delete($),this.timers.delete($),this.onExpire?.(J,"timeout")},this.timeoutMs);if(typeof X.unref==="function")X.unref();this.timers.set($,X)}return F}consume(D){let $=this.map.get(D);if(!$)return;return this.map.delete(D),this.clearTimer(D),$}cancelByOperator(D){let $=[];for(let F of this.map.values())if(F.operatorWs===D)$.push(F);for(let F of $)this.map.delete(F.gatewayRequestId),this.clearTimer(F.gatewayRequestId),this.onExpire?.(F,"operator_gone");return $}cancelByWorker(D){let $=[];for(let F of this.map.values())if(F.workerId===D)$.push(F);for(let F of $)this.map.delete(F.gatewayRequestId),this.clearTimer(F.gatewayRequestId),this.onExpire?.(F,"node_gone");return $}size(){return this.map.size}dispose(){for(let D of this.timers.values())clearTimeout(D);this.timers.clear(),this.map.clear()}clearTimer(D){let $=this.timers.get(D);if($)clearTimeout($),this.timers.delete(D)}}class z${byWorkerId=new Map;byWs=new WeakMap;register(D){let $=this.byWorkerId.get(D.workerId);if(this.byWorkerId.set(D.workerId,D),this.byWs.set(D.ws,D),$)return this.byWs.delete($.ws),{replaced:$};return{}}unregisterByWs(D){let $=this.byWs.get(D);if(!$)return;let F=this.byWorkerId.get($.workerId);if(F&&F.ws===D)this.byWorkerId.delete($.workerId);return this.byWs.delete(D),$}get(D){return this.byWorkerId.get(D)}has(D){return this.byWorkerId.has(D)}list(){return Array.from(this.byWorkerId.values())}size(){return this.byWorkerId.size}}class I${byWs=new Map;register(D){this.byWs.set(D.ws,D)}unregister(D){let $=this.byWs.get(D);if(!$)return;return this.byWs.delete(D),$}list(){return Array.from(this.byWs.values())}size(){return this.byWs.size}forEach(D){this.byWs.forEach(D)}}import{randomBytes as nf}from"crypto";var sG="ABCDEFGHJKMNPQRSTVWXYZ23456789",bM=4,rf=5;class T${ttlMs;onExpire;generator;entries=new Map;wsToOtp=new WeakMap;disposed=!1;constructor(D){if(!Number.isFinite(D.ttlMs)||D.ttlMs<=0)throw Error("PendingEnrollmentRegistry: ttlMs \u5FC5\u987B\u4E3A\u6B63\u6570");this.ttlMs=D.ttlMs,this.onExpire=D.onExpire,this.generator=D.generateOtp??sf}submit(D){if(this.disposed)throw Error("PendingEnrollmentRegistry: already disposed");let $=this.allocateUniqueOtp(),F=Date.now(),X=F+this.ttlMs,J={otp:$,workerId:D.workerId,apiToken:D.apiToken,displayName:D.displayName,ws:D.ws,submittedAt:F,expiresAt:X,timer:setTimeout(()=>this.handleExpire($),this.ttlMs)};return this.entries.set($,J),this.wsToOtp.set(D.ws,$),{otp:$,expiresAt:X}}list(){return Array.from(this.entries.values()).map((D)=>({otp:D.otp,workerId:D.workerId,displayName:D.displayName,submittedAt:D.submittedAt,expiresAt:D.expiresAt}))}approve(D){return this.popInternal(D)}reject(D){return this.popInternal(D)}has(D){return this.entries.has(D)}removeByWs(D){let $=this.wsToOtp.get(D);if(!$)return;return this.popInternal($)}size(){return this.entries.size}dispose(){if(this.disposed)return;this.disposed=!0;for(let D of this.entries.values())clearTimeout(D.timer);this.entries.clear()}popInternal(D){let $=this.entries.get(D);if(!$)return;clearTimeout($.timer),this.entries.delete(D),this.wsToOtp.delete($.ws);let{timer:F,...X}=$;return X}handleExpire(D){let $=this.entries.get(D);if(!$)return;if(this.entries.delete(D),this.wsToOtp.delete($.ws),!this.onExpire)return;try{let{timer:F,...X}=$;this.onExpire(X)}catch{}}allocateUniqueOtp(){for(let D=0;D<rf;D++){let $=this.generator();if(!this.entries.has($))return $}throw Error("PendingEnrollmentRegistry: failed to allocate unique OTP after retries")}}function sf(){return`${fM(bM)}-${fM(bM)}`}function fM(D){let $=nf(D),F="";for(let X=0;X<D;X++)F+=sG[$[X]%sG.length];return F}G0();import{Buffer as hM}from"buffer";import{createCipheriv as af,createDecipheriv as UJD,randomBytes as of,timingSafeEqual as KJD}from"crypto";var tf="aes-256-gcm",ef=12,Dh=32,$h=/^[0-9a-f]{64}$/;function Fh(D){if(!$h.test(D))throw Error("Gateway AIWORKER_MASTER_KEY must be 32-byte hex");let $=hM.from(D,"hex");if($.length!==Dh)throw Error("Gateway AIWORKER_MASTER_KEY must be 32-byte hex");return $}function S$(D,$){let F=Fh($),X=of(ef),J=af(tf,F,X),Y=hM.concat([J.update(D,"utf8"),J.final()]),G=J.getAuthTag();return{ciphertext:Y.toString("base64"),nonce:X.toString("base64"),authTag:G.toString("base64")}}function Xh(D){return D.replace(/[\\%_]/g,($)=>`\\${$}`)}class w${db;constructor(D){this.db=D}listRegisteredWorkers(){return this.db.select().from(hD).orderBy(AD(hD.addedAt)).all().map(($)=>{let{apiTokenEnc:F,nonce:X,authTag:J,...Y}=$;return{...Y,lastSeenAt:Y.lastSeenAt??void 0,lastSeenState:Y.lastSeenState??void 0,lastConfigVersion:Y.lastConfigVersion??void 0}})}getRegisteredWorker(D){let $=this.db.select().from(hD).where(T(hD.id,D)).get();if(!$)return;let{apiTokenEnc:F,nonce:X,authTag:J,...Y}=$;return{...Y,lastSeenAt:Y.lastSeenAt??void 0,lastSeenState:Y.lastSeenState??void 0,lastConfigVersion:Y.lastConfigVersion??void 0}}getRegisteredWorkerRaw(D){let $=this.db.select().from(hD).where(T(hD.id,D)).get();if(!$)return;return{...$,lastSeenAt:$.lastSeenAt??void 0,lastSeenState:$.lastSeenState??void 0,lastConfigVersion:$.lastConfigVersion??void 0}}createRegisteredWorker(D,$){let F=S$(D.apiToken,$),X=new Date().toISOString(),J=D.baseUrl.replace(/\/+$/,""),Y={id:D.workerId,baseUrl:J,displayName:D.displayName,apiTokenEnc:F.ciphertext,nonce:F.nonce,authTag:F.authTag,addedAt:X,addedBy:D.addedBy??"manual",lastSeenAt:X,lastSeenState:"online",lastConfigVersion:D.configVersion};this.db.insert(hD).values(Y).run(),this.db.insert(L8).values({actor:"gateway",action:"gateway.worker.paired",workerId:D.workerId,detail:{baseUrl:J,displayName:D.displayName,addedBy:Y.addedBy}}).run();let{apiTokenEnc:G,nonce:B,authTag:H,...W}=Y;return{...W,lastSeenAt:W.lastSeenAt??void 0,lastSeenState:W.lastSeenState??void 0,lastConfigVersion:W.lastConfigVersion??void 0}}upsertEnrolledWorker(D,$){let F=D.baseUrl.replace(/\/+$/,""),X=new Date().toISOString(),J=this.db.select().from(hD).where(T(hD.id,D.workerId)).get();if(!J){let W=S$(D.apiToken,$),V={id:D.workerId,baseUrl:F,displayName:D.displayName,apiTokenEnc:W.ciphertext,nonce:W.nonce,authTag:W.authTag,addedAt:X,addedBy:D.addedBy??"self-enroll",lastSeenAt:X,lastSeenState:"online",lastConfigVersion:D.configVersion};this.db.insert(hD).values(V).run();let{apiTokenEnc:U,nonce:K,authTag:_,...Z}=V;return{kind:"created",row:{...Z,lastSeenAt:Z.lastSeenAt??void 0,lastSeenState:Z.lastSeenState??void 0,lastConfigVersion:Z.lastConfigVersion??void 0}}}if(J.displayName!==D.displayName){this.db.update(hD).set({displayName:D.displayName,lastSeenAt:X,lastSeenState:"online"}).where(T(hD.id,D.workerId)).run();let{apiTokenEnc:W,nonce:V,authTag:U,...K}=J;return{kind:"updated",row:{...K,displayName:D.displayName,lastSeenAt:X,lastSeenState:"online",lastConfigVersion:K.lastConfigVersion??void 0}}}this.db.update(hD).set({lastSeenAt:X,lastSeenState:"online"}).where(T(hD.id,D.workerId)).run();let{apiTokenEnc:Y,nonce:G,authTag:B,...H}=J;return{kind:"unchanged",row:{...H,lastSeenAt:X,lastSeenState:"online",lastConfigVersion:H.lastConfigVersion??void 0}}}updateEncryptedToken(D,$){if(!this.db.select({id:hD.id}).from(hD).where(T(hD.id,D.workerId)).get())return!1;let X=S$(D.newToken,$);return this.db.update(hD).set({apiTokenEnc:X.ciphertext,nonce:X.nonce,authTag:X.authTag}).where(T(hD.id,D.workerId)).run(),!0}removeRegisteredWorker(D){if(!this.db.select({id:hD.id}).from(hD).where(T(hD.id,D)).get())return!1;return this.db.delete(hD).where(T(hD.id,D)).run(),!0}countRegisteredWorkers(){return this.db.select({value:_$()}).from(hD).get()?.value??0}recordAudit(D){this.db.insert(L8).values({actor:D.actor,action:D.action,workerId:D.workerId??null,detail:D.detail}).run()}listAuditEvents(D={}){let $=Math.max(1,Math.min(200,D.limit??50)),F=[];if(typeof D.before==="number"&&Number.isFinite(D.before))F.push(J$(L8.id,D.before));if(D.actionPrefix&&D.actionPrefix.length>0){let B=`${Xh(D.actionPrefix)}%`;F.push(E`${L8.action} LIKE ${B} ESCAPE '\\'`)}if(D.workerId&&D.workerId.length>0)F.push(T(L8.workerId,D.workerId));let X=F.length===0?void 0:F.length===1?F[0]:TD(...F),J=this.db.select().from(L8).where(X).orderBy(AD(L8.id)).limit($+1).all(),Y=J.length>$;return{events:(Y?J.slice(0,$):J).map((B)=>({id:B.id,at:B.at,actor:B.actor,action:B.action,workerId:B.workerId??null,detail:B.detail??null})),hasMore:Y}}}C0();_D();import{Buffer as xh}from"buffer";import{createHash as yh}from"crypto";import{resolve as aG,sep as Jh}from"path";async function k$(D){let{webStaticDir:$}=D,F=aG($),X;try{X=Yh(decodeURIComponent(D.pathnameAfterPrefix))}catch{return new Response("forbidden",{status:403})}let J=X===""?"index.html":X,Y=aG(F,J);if(Y!==F&&!Y.startsWith(F+Jh))return new Response("forbidden",{status:403});let G=Bun.file(Y);if(await G.exists())return new Response(G);if(!Gh(J)){let B=Bun.file(aG(F,"index.html"));if(await B.exists())return new Response(B)}return new Response("not found",{status:404})}function Yh(D){let $=0;while($<D.length&&D[$]==="/")$+=1;return D.slice($)}function Gh(D){let $=D.lastIndexOf("/");return($===-1?D:D.slice($+1)).includes(".")}_D();function gM(D){if(z1(D.host))return;if(D.internalSharedSecret&&D.internalSharedSecret.length>0)return;throw Error(`[gateway] \u62D2\u7EDD\u542F\u52A8\uFF1Ahost="${D.host}" \u975E loopback\uFF0C\u4F46\u672A\u914D\u7F6E INTERNAL_SHARED_SECRET\u3002
402
402
  `+`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zonease/aiworker-cli",
3
- "version": "0.9.1",
3
+ "version": "0.9.2",
4
4
  "description": "AIWorker CLI — self-hosted Project Brain and Worker/Fleet aggregation runtime",
5
5
  "license": "MIT",
6
6
  "type": "module",