@zonease/aiworker-cli 0.9.6 → 0.9.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/aiworker-bun.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -269,7 +269,7 @@ New features go through the `/pma` skill in three stages: investigate → propos
|
|
|
269
269
|
|
|
270
270
|
> Before going to production, read the conformance table and residual-boundary section in [`docs/governance-node-status.md`](docs/governance-node-status.md). Pre-1.0 the CLI / API / config does not guarantee backwards compatibility (an explicit AGENTS.md commitment).
|
|
271
271
|
|
|
272
|
-
CLI npm latest: **0.9.
|
|
272
|
+
CLI npm latest: **0.9.7**.
|
|
273
273
|
|
|
274
274
|
| Module | Status |
|
|
275
275
|
|---|---|
|
package/aiworker-bun.js
CHANGED
|
@@ -396,7 +396,7 @@ ${F.trim()}`)}var RDD=10,Lz=6000;var zz=R(()=>{D0();pQ()});function EDD(D={}){le
|
|
|
396
396
|
`)});if(J)G=J(G)||G;console.log(G.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}/${$} ${JS}`)}checkRequiredArgs(){let D=this.args.filter(($)=>$.required).length;if(this.cli.args.length<D)throw new v4(`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 v4(`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 G=F.some((Y)=>Y.negated&&Y.names.includes(X.name));if(J===!0||J===!1&&!G)throw new v4(`option \`${X.rawName}\` value is missing`)}}}}class IJ extends PJ{constructor(D){super("@@global@@","",{},D)}}var y4=Object.assign;class gU extends sT{constructor(D=""){super();this.name=D,this.commands=[],this.rawArgs=[],this.args=[],this.options={},this.globalCommand=new IJ(this),this.globalCommand.usage("<command> [options]")}usage(D){return this.globalCommand.usage(D),this}command(D,$,F){let X=new PJ(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=XS,{run:$=!0}={}){if(this.rawArgs=D,!this.name)this.name=D[1]?FS(D[1]):"cli";let F=!0;for(let J of this.commands){let G=this.mri(D.slice(2),J),Y=G.args[0];if(J.isMatched(Y)){F=!1;let B=y4(y4({},G),{args:G.args.slice(1)});this.setParsedInfo(B,J,Y),this.emit(`command:${Y}`,J)}}if(F){for(let J of this.commands)if(J.name===""){F=!1;let G=this.mri(D.slice(2),J);this.setParsedInfo(G,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=tT(F),J=[],G=D.indexOf("--");if(G>-1)J=D.slice(G+1),D=D.slice(0,G);let Y=aT(D,X);Y=Object.keys(Y).reduce((U,K)=>{return y4(y4({},U),{[fU(K)]:Y[K]})},{_:[]});let B=Y._,H={"--":J},Q=$&&$.config.ignoreOptionDefaultValue?$.config.ignoreOptionDefaultValue:this.globalCommand.config.ignoreOptionDefaultValue,V=Object.create(null);for(let U of F){if(!Q&&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(Y))if(U!=="_"){let K=U.split(".");DS(H,K,Y[U]),$S(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,G)=>{if(J.variadic)X.push(D.slice(G));else X.push(D[G])}),X.push($),F.commandAction.apply(this,X)}}var GS=(D="")=>new gU(D),xU=GS;YD();var z6={name:"@zonease/aiworker-cli",type:"module",version:"0.9.
|
|
399
|
+
`))}outputVersion(){let{name:D}=this.cli,{versionNumber:$}=this.cli.globalCommand;if($)console.log(`${D}/${$} ${JS}`)}checkRequiredArgs(){let D=this.args.filter(($)=>$.required).length;if(this.cli.args.length<D)throw new v4(`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 v4(`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 G=F.some((Y)=>Y.negated&&Y.names.includes(X.name));if(J===!0||J===!1&&!G)throw new v4(`option \`${X.rawName}\` value is missing`)}}}}class IJ extends PJ{constructor(D){super("@@global@@","",{},D)}}var y4=Object.assign;class gU extends sT{constructor(D=""){super();this.name=D,this.commands=[],this.rawArgs=[],this.args=[],this.options={},this.globalCommand=new IJ(this),this.globalCommand.usage("<command> [options]")}usage(D){return this.globalCommand.usage(D),this}command(D,$,F){let X=new PJ(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=XS,{run:$=!0}={}){if(this.rawArgs=D,!this.name)this.name=D[1]?FS(D[1]):"cli";let F=!0;for(let J of this.commands){let G=this.mri(D.slice(2),J),Y=G.args[0];if(J.isMatched(Y)){F=!1;let B=y4(y4({},G),{args:G.args.slice(1)});this.setParsedInfo(B,J,Y),this.emit(`command:${Y}`,J)}}if(F){for(let J of this.commands)if(J.name===""){F=!1;let G=this.mri(D.slice(2),J);this.setParsedInfo(G,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=tT(F),J=[],G=D.indexOf("--");if(G>-1)J=D.slice(G+1),D=D.slice(0,G);let Y=aT(D,X);Y=Object.keys(Y).reduce((U,K)=>{return y4(y4({},U),{[fU(K)]:Y[K]})},{_:[]});let B=Y._,H={"--":J},Q=$&&$.config.ignoreOptionDefaultValue?$.config.ignoreOptionDefaultValue:this.globalCommand.config.ignoreOptionDefaultValue,V=Object.create(null);for(let U of F){if(!Q&&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(Y))if(U!=="_"){let K=U.split(".");DS(H,K,Y[U]),$S(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,G)=>{if(J.variadic)X.push(D.slice(G));else X.push(D[G])}),X.push($),F.commandAction.apply(this,X)}}var GS=(D="")=>new gU(D),xU=GS;YD();var z6={name:"@zonease/aiworker-cli",type:"module",version:"0.9.7",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"}};YD();import UA from"process";M0();class z0 extends Error{code;constructor(D,$="operator_ws_error"){super(D);this.code=$;this.name="OperatorWsError"}}function XA(){let D=null,$=!1,F=!1,X=new Map,J=new Map;function G(M){for(let[,O]of X){if(O.timer)clearTimeout(O.timer);O.signalCleanup?.(),O.reject(M)}X.clear()}function Y(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 z0(`${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")Y(N);else if(N.type==="event")B(N)}async function Q(M){if($)throw new z0("aiworker client \u5DF2\u7ECF\u8FDE\u63A5","already_connected");let O=M.timeoutMs??1e4;await new Promise((N,q)=>{let w=!1,g;try{g=new WebSocket(M.url)}catch(j){q(new z0(`WebSocket \u6784\u9020\u5931\u8D25 (${M.url}): ${j instanceof Error?j.message:String(j)}`,"ws_construct_failed"));return}D=g;let P=setTimeout(()=>{if(w)return;w=!0;try{g.close()}catch{}q(new z0(`\u8FDE\u63A5 gateway \u8D85\u65F6 (>${O}ms): ${M.url}`,"connect_timeout"))},O);g.onopen=()=>{let j={type:"connect",role:w1.OPERATOR,agentId:M.deviceId,deviceId:M.deviceId,auth:{token:M.token},...M.meta?{meta:M.meta}:{}};try{g.send(dD(j))}catch(I){if(w)return;w=!0,clearTimeout(P),q(new z0(`\u53D1\u9001 connect \u5E27\u5931\u8D25: ${I instanceof Error?I.message:String(I)}`,"connect_send_failed"));return}if(!w)w=!0,clearTimeout(P),$=!0,N()},g.onmessage=(j)=>{let I=typeof j.data==="string"?j.data:j.data instanceof ArrayBuffer?new TextDecoder().decode(j.data):String(j.data);H(I)},g.onerror=(j)=>{if(w)return;w=!0,clearTimeout(P);let I=j.message??"unknown";q(new z0(`WS \u8FDE\u63A5\u9519\u8BEF: ${I}`,"ws_error"))},g.onclose=(j)=>{if(F=!0,$=!1,G(new z0(`WS \u5DF2\u5173\u95ED (code=${j.code}, reason=${j.reason||"n/a"})`,"ws_closed")),!w)w=!0,clearTimeout(P),q(new z0(`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 z0("aiworker client \u672A\u8FDE\u63A5\u6216\u5DF2\u5173\u95ED","not_connected")}async function U(M,O,N){V();let q=crypto.randomUUID(),w={type:"request",id:q,method:M,...O===void 0?{}:{params:O}};return await new Promise((g,P)=>{let j=N?.timeoutMs??30000,I=null,i=null,T={resolve:g,reject:P,timer:null,signalCleanup:null};if(I=setTimeout(()=>{X.delete(q),i?.(),P(new z0(`request ${M} \u8D85\u65F6 (>${j}ms)`,"request_timeout"))},j),T.timer=I,N?.signal){let y=N.signal;if(y.aborted){X.delete(q),clearTimeout(I),P(y.reason??new z0(`request ${M} \u88AB abort`,"aborted"));return}let v=()=>{if(X.delete(q),I)clearTimeout(I);P(y.reason??new z0(`request ${M} \u88AB abort`,"aborted"))};y.addEventListener("abort",v,{once:!0}),i=()=>y.removeEventListener("abort",v),T.signalCleanup=i}X.set(q,T);try{D?.send(dD(w))}catch(y){if(X.delete(q),I)clearTimeout(I);i?.(),P(new z0(`request ${M} \u53D1\u9001\u5931\u8D25: ${y instanceof Error?y.message:String(y)}`,"send_failed"))}})}async function K(M,O,N){if(!i5(M))throw new z0(`method ${M} \u672A\u5728 @zonease/aiworker-gateway-proto \u6CE8\u518C`,"unknown_method");return await U(M,O,N)}function _(M,O){if(!eJ(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 w=q.onclose;q.onclose=(g)=>{if(typeof w==="function")w.call(q,g);N()};try{q.close(M,O)}catch{}})}function C(){return $&&!F&&D!==null&&D.readyState===WebSocket.OPEN}return{connect:Q,request:K,requestRaw:U,onEvent:_,close:Z,isOpen:C}}f1();async function kD(D,$={}){let F=await D$(),X=($.createClient??XA)();try{await X.connect({url:v9($.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 sD(D){let $=JSON.stringify(D,null,2);UA.stdout.write(`${$}
|
|
400
400
|
`)}function y2(D){UA.stdout.write(`${JSON.stringify(D)}
|
|
401
401
|
`)}function qD(D){if(!(D instanceof z0))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 KA(D={}){try{let $=await kD(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((Y)=>Y.online).map((Y)=>Y.workerId),G=[];for(let Y of J)try{let B=await F.request("approval.list",{workerId:Y});for(let H of B.approvals)G.push(H)}catch(B){A.warn(`approval.list ${Y} \u5931\u8D25: ${B instanceof Error?B.message:String(B)}`)}return{approvals:G}});return sD($),0}catch($){return A.error(`fleet approvals list \u5931\u8D25: ${$ instanceof Error?$.message:String($)}`),qD($)}}async function _A(D){try{let $=await kD(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 sD($),0}catch($){return A.error(`fleet approvals grant \u5931\u8D25: ${$ instanceof Error?$.message:String($)}`),qD($)}}M0();YD();async function AA(D){let $=D.timeoutMs??120000;try{return await kD(async({client:F})=>{return await new Promise((X)=>{let J=!1,G=(V)=>{if(J)return;J=!0,X(V)},Y=setTimeout(()=>{y2({kind:"error",payload:{code:"timeout",message:`chat \u7B49\u5F85 agent.done \u8D85\u65F6 (>${$}ms)`}}),G(3)},$),B=D.workerId,H=(V)=>{if(V===null||typeof V!=="object")return!1;let U=V.workerId;return typeof U==="string"&&U===B},Q=[];Q.push(F.onEvent(JD.CHAT_MESSAGE,(V)=>{if(!H(V))return;y2({kind:JD.CHAT_MESSAGE,payload:V})})),Q.push(F.onEvent(JD.AGENT_THINKING,(V)=>{if(!H(V))return;y2({kind:JD.AGENT_THINKING,payload:V})})),Q.push(F.onEvent(JD.AGENT_TOOL_CALL,(V)=>{if(!H(V))return;y2({kind:JD.AGENT_TOOL_CALL,payload:V})})),Q.push(F.onEvent(JD.AGENT_DONE,(V)=>{if(!H(V))return;y2({kind:"done",payload:V}),clearTimeout(Y);for(let U of Q)U();G(0)})),F.request("chat.send",{workerId:D.workerId,content:D.content,...D.conversationId===void 0?{}:{conversationId:D.conversationId}},{timeoutMs:Math.min($,30000)}).then((V)=>{y2({kind:"accepted",payload:V})}).catch((V)=>{y2({kind:"error",payload:{code:"request_failed",message:V instanceof Error?V.message:String(V)}}),clearTimeout(Y);for(let U of Q)U();G(qD(V))})})})}catch(F){return A.error(`chat \u5931\u8D25: ${F instanceof Error?F.message:String(F)}`),qD(F)}}YD();async function CA(D){try{let $=await kD(async({client:F})=>{return await F.request("config.get",{workerId:D})});return sD($),0}catch($){return A.error(`fleet config get \u5931\u8D25: ${$ instanceof Error?$.message:String($)}`),qD($)}}async function ZA(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 kD(async({client:X})=>{return await X.request("config.put",{workerId:D.workerId,ifMatch:D.ifMatch,config:$})});return sD(F),0}catch(F){return A.error(`fleet config set \u5931\u8D25: ${F instanceof Error?F.message:String(F)}`),qD(F)}}YD();async function MA(D={}){let $=D.withSession??kD,F=D.printJson??sD,X=D.errorToExitCode??qD;try{let J=await $(async({client:G})=>{return await G.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 OA(D,$={}){let F=$.withSession??kD,X=$.printJson??sD,J=$.errorToExitCode??qD;try{let G=await F(async({client:Y})=>{return await Y.request("enroll.approve",{otp:D})});return A.success(`\u5DF2\u6279\u51C6 OTP ${D}\uFF0CworkerId=${G.workerId}`),X({workerId:G.workerId,deviceToken:G.deviceToken}),0}catch(G){return A.error(`fleet enroll approve \u5931\u8D25: ${G instanceof Error?G.message:String(G)}`),J(G)}}async function RA(D,$={}){let F=$.withSession??kD,X=$.printJson??sD,J=$.errorToExitCode??qD;try{let G=await F(async({client:Y})=>{return await Y.request("enroll.reject",{otp:D})});if(G.rejected)A.info(`\u5DF2\u62D2\u7EDD OTP ${D}`);else A.warn(`OTP ${D} \u4E0D\u5B58\u5728\u6216\u5DF2\u8FC7\u671F`);return X(G),0}catch(G){return A.error(`fleet enroll reject \u5931\u8D25: ${G instanceof Error?G.message:String(G)}`),J(G)}}M0();YD();async function EA(D){let $=D.follow===!0,F=D.timeoutMs??($?3600000:5000);try{return await kD(async({client:X})=>{return await new Promise((J)=>{let G=!1,Y=(Q)=>{if(G)return;G=!0,J(Q)},B=X.onEvent(JD.LOGS_LINE,(Q)=>{if(Q===null||typeof Q!=="object")return;let V=Q.workerId;if(typeof V!=="string"||V!==D.workerId)return;y2(Q)}),H=setTimeout(()=>{B(),Y(0)},F);X.request("logs.tail",{workerId:D.workerId,follow:$,...D.tail===void 0?{}:{lines:D.tail}}).then(()=>{}).catch((Q)=>{B(),clearTimeout(H),y2({kind:"error",payload:{code:"request_failed",message:Q instanceof Error?Q.message:String(Q)}}),Y(qD(Q))})})})}catch(X){return A.error(`logs \u5931\u8D25: ${X instanceof Error?X.message:String(X)}`),qD(X)}}YD();f1();async function NA(D,$={}){let F=$.withSession??kD,X=$.patchOperatorState??b1,J=$.printJson??sD,G=$.errorToExitCode??qD;try{let Y=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:Y.deviceToken,defaultWorkerId:Y.workerId}),A.success(`\u5DF2\u914D\u5BF9 worker ${Y.workerId}`),J({workerId:Y.workerId}),0}catch(Y){return A.error(`fleet pair \u5931\u8D25: ${Y instanceof Error?Y.message:String(Y)}`),G(Y)}}YD();var jA=["web","line","telegram","lark","whatsapp"];function rf(D){if(!jA.includes(D))throw Error(`\u65E0\u6548 channel "${D}"\uFF0C\u53EF\u9009\u503C\uFF1A${jA.join(", ")}`);return D}async function qA(D){try{let $=await kD(async({client:F})=>{return await F.request("cron.list",{workerId:D})});return sD($),0}catch($){return A.error(`fleet schedule list \u5931\u8D25: ${$ instanceof Error?$.message:String($)}`),qD($)}}async function LA(D){try{let $=rf(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 kD(async({client:J})=>{return await J.request("cron.add",{workerId:D.workerId,job:F})});return sD(X),0}catch($){return A.error(`fleet schedule add \u5931\u8D25: ${$ instanceof Error?$.message:String($)}`),qD($)}}async function zA(D,$){try{let F=await kD(async({client:X})=>{return await X.request("cron.remove",{workerId:D,jobId:$})});return sD(F),0}catch(F){return A.error(`fleet schedule remove \u5931\u8D25: ${F instanceof Error?F.message:String(F)}`),qD(F)}}YD();async function PA(D){try{let $=await kD(async({client:F})=>{return await F.request("token.rotate",{workerId:D})});return sD($),0}catch($){return A.error(`fleet token rotate \u5931\u8D25: ${$ instanceof Error?$.message:String($)}`),qD($)}}YD();async function IA(){try{let D=await kD(async({client:$})=>{return await $.request("workers.list",{})});return sD(D),0}catch(D){return A.error(`workers list \u5931\u8D25: ${D instanceof Error?D.message:String(D)}`),qD(D)}}async function TA(D){try{let $=await kD(async({client:F})=>{return await F.request("workers.info",{workerId:D})});return sD($),0}catch($){return A.error(`workers info \u5931\u8D25: ${$ instanceof Error?$.message:String($)}`),qD($)}}async function SA(D={}){try{let $=await kD(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(() => (f1(),eG));return await F({deviceToken:$.deviceToken,defaultWorkerId:$.workerId}),A.success(`\u5DF2 launch worker ${$.workerId}`),sD({workerId:$.workerId}),0}catch($){return A.error(`workers launch \u5931\u8D25: ${$ instanceof Error?$.message:String($)}`),qD($)}}async function wA(D){try{let $=await kD(async({client:F})=>{return await F.request("workers.stop",{workerId:D})});return sD($),0}catch($){return A.error(`workers stop \u5931\u8D25: ${$ instanceof Error?$.message:String($)}`),qD($)}}async function kA(D){try{let $=await kD(async({client:G})=>{return await G.request("workers.remove",{workerId:D})}),{loadOperatorState:F,saveOperatorState:X}=await Promise.resolve().then(() => (f1(),eG)),J=await F();if(J.defaultWorkerId===D){let G={...J};delete G.defaultWorkerId,await X(G)}return sD($),0}catch($){return A.error(`workers remove \u5931\u8D25: ${$ instanceof Error?$.message:String($)}`),qD($)}}import d$ from"process";import{createHash as xg}from"crypto";M0();sY();aY();import{existsSync as hZ,mkdirSync as _h}from"fs";import J7 from"path";import{fileURLToPath as Ah}from"url";import{Database as Ch}from"bun:sqlite";q$();var oY={};j1(oY,{registeredWorkers:()=>yD,auditEvents:()=>L8});var yD=W0("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:xD("last_config_version")}),L8=W0("audit_events",{id:xD("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:J0("audit_events_worker_id_idx").on(D.workerId)}));var gZ=J7.dirname(Ah(import.meta.url));function Zh(D){let $=J7.resolve(gZ,"../../drizzle",D);if(hZ($))return $;let F=J7.resolve(gZ,"drizzle",D);if(hZ(F))return F;return $}var tY=Zh("fleet"),G7=null;function Mh(D){let $=D===":memory:"?D:J7.resolve(D);try{if($!==":memory:")_h(J7.dirname($),{recursive:!0,mode:448});let F=new Ch($,{create:!0});return F.exec("PRAGMA journal_mode = WAL"),F.exec("PRAGMA foreign_keys = ON"),e6(F,{schema:oY})}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 xZ(D){return G7=Mh(D),G7}function eY(){if(!G7)throw Error("Fleet database not initialized. Call initFleetDb() first.");return G7}function DB(){G7=null}function yZ(D=tY){z$(eY(),{migrationsFolder:D})}YD();D0();ZD();ID();import vZ from"path";import Oh from"process";var Rh=W.object({AIWORKER_GATEWAY_PORT:W.coerce.number().int().positive().max(65535).default(9218),AIWORKER_GATEWAY_HOST:W.string().min(1).default("127.0.0.1"),AIWORKER_ADMIN_EXTERNAL_AUTH:W.enum(["1","true","0","false"]).default("0").transform(S9),INTERNAL_SHARED_SECRET:W.string().min(16).optional(),NODE_ENV:W.enum(["development","production","test"]).default("development"),AIWORKER_MASTER_KEY:W.string().regex(/^[0-9a-f]{64}$/,"AIWORKER_MASTER_KEY must be 32-byte hex (64 hex chars)").optional(),AIWORKER_FLEET_DB_PATH:W.string().optional(),AIWORKER_GATEWAY_CAN_LAUNCH:W.enum(["true","false"]).default("false").transform((D)=>D==="true"),AIWORKER_MAX_WORKERS:W.coerce.number().int().positive().optional(),AIWORKER_JOIN_TOKEN:W.string().min(16).optional(),AIWORKER_ENROLL_OTP_TTL_SEC:W.coerce.number().int().min(30).max(3600).default(300),DOCKER_HOST:W.string().default("/var/run/docker.sock"),AIWORKER_IMAGE:W.string().optional(),AIWORKER_NETWORK:W.string().default("aiworker_default"),WORKER_DATA_ROOT:W.string().optional(),WORKER_MEMORY_LIMIT:W.string().optional(),WORKER_CPU_LIMIT:W.coerce.number().optional(),AIWORKER_LAUNCH_BASE_URL_TEMPLATE:W.string().default("http://{containerName}:9217")}).superRefine((D,$)=>{if(!D.AIWORKER_GATEWAY_CAN_LAUNCH)return;if(!D.INTERNAL_SHARED_SECRET)$.addIssue({code:W.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:W.ZodIssueCode.custom,path:[X],message:`${X} is required when AIWORKER_GATEWAY_CAN_LAUNCH=true`})});function uZ(){let D=Rh.parse(Oh.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:Eh(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 Eh(D){if(D===":memory:")return D;let $=D&&D.length>0?D:vZ.join(x2(),"fleet.db");return vZ.resolve($)}M0();function X2(D,$){let F=dD($);D.forEach((X)=>{try{X.ws.send(F)}catch{}})}class P${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 I${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 T${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 S${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 Nh}from"crypto";var $B="ABCDEFGHJKMNPQRSTVWXYZ23456789",mZ=4,jh=5;class w${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??qh}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<jh;D++){let $=this.generator();if(!this.entries.has($))return $}throw Error("PendingEnrollmentRegistry: failed to allocate unique OTP after retries")}}function qh(){return`${cZ(mZ)}-${cZ(mZ)}`}function cZ(D){let $=Nh(D),F="";for(let X=0;X<D;X++)F+=$B[$[X]%$B.length];return F}Q0();import{Buffer as o8}from"buffer";import{createCipheriv as Lh,createDecipheriv as zh,randomBytes as Ph,timingSafeEqual as Ih}from"crypto";var pZ="aes-256-gcm",Th=12,Sh=32,wh=/^[0-9a-f]{64}$/;function dZ(D){if(!wh.test(D))throw Error("Gateway AIWORKER_MASTER_KEY must be 32-byte hex");let $=o8.from(D,"hex");if($.length!==Sh)throw Error("Gateway AIWORKER_MASTER_KEY must be 32-byte hex");return $}function k$(D,$){let F=dZ($),X=Ph(Th),J=Lh(pZ,F,X),G=o8.concat([J.update(D,"utf8"),J.final()]),Y=J.getAuthTag();return{ciphertext:G.toString("base64"),nonce:X.toString("base64"),authTag:Y.toString("base64")}}function b$(D,$,F,X){let J=dZ(X),G=zh(pZ,J,o8.from($,"base64"));return G.setAuthTag(o8.from(F,"base64")),o8.concat([G.update(o8.from(D,"base64")),G.final()]).toString("utf8")}function f$(D,$){let F=o8.from(D,"utf8"),X=o8.from($,"utf8");if(F.length!==X.length)return!1;return Ih(F,X)}function kh(D){return D.replace(/[\\%_]/g,($)=>`\\${$}`)}class h${db;constructor(D){this.db=D}listRegisteredWorkers(){return this.db.select().from(yD).orderBy(MD(yD.addedAt)).all().map(($)=>{let{apiTokenEnc:F,nonce:X,authTag:J,...G}=$;return{...G,lastSeenAt:G.lastSeenAt??void 0,lastSeenState:G.lastSeenState??void 0,lastConfigVersion:G.lastConfigVersion??void 0}})}getRegisteredWorker(D){let $=this.db.select().from(yD).where(S(yD.id,D)).get();if(!$)return;let{apiTokenEnc:F,nonce:X,authTag:J,...G}=$;return{...G,lastSeenAt:G.lastSeenAt??void 0,lastSeenState:G.lastSeenState??void 0,lastConfigVersion:G.lastConfigVersion??void 0}}getRegisteredWorkerRaw(D){let $=this.db.select().from(yD).where(S(yD.id,D)).get();if(!$)return;return{...$,lastSeenAt:$.lastSeenAt??void 0,lastSeenState:$.lastSeenState??void 0,lastConfigVersion:$.lastConfigVersion??void 0}}createRegisteredWorker(D,$){let F=k$(D.apiToken,$),X=new Date().toISOString(),J=D.baseUrl.replace(/\/+$/,""),G={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(yD).values(G).run(),this.db.insert(L8).values({actor:"gateway",action:"gateway.worker.paired",workerId:D.workerId,detail:{baseUrl:J,displayName:D.displayName,addedBy:G.addedBy}}).run();let{apiTokenEnc:Y,nonce:B,authTag:H,...Q}=G;return{...Q,lastSeenAt:Q.lastSeenAt??void 0,lastSeenState:Q.lastSeenState??void 0,lastConfigVersion:Q.lastConfigVersion??void 0}}upsertEnrolledWorker(D,$){let F=D.baseUrl.replace(/\/+$/,""),X=new Date().toISOString(),J=this.db.select().from(yD).where(S(yD.id,D.workerId)).get();if(!J){let Q=k$(D.apiToken,$),V={id:D.workerId,baseUrl:F,displayName:D.displayName,apiTokenEnc:Q.ciphertext,nonce:Q.nonce,authTag:Q.authTag,addedAt:X,addedBy:D.addedBy??"self-enroll",lastSeenAt:X,lastSeenState:"online",lastConfigVersion:D.configVersion};this.db.insert(yD).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(yD).set({displayName:D.displayName,lastSeenAt:X,lastSeenState:"online"}).where(S(yD.id,D.workerId)).run();let{apiTokenEnc:Q,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(yD).set({lastSeenAt:X,lastSeenState:"online"}).where(S(yD.id,D.workerId)).run();let{apiTokenEnc:G,nonce:Y,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:yD.id}).from(yD).where(S(yD.id,D.workerId)).get())return!1;let X=k$(D.newToken,$);return this.db.update(yD).set({apiTokenEnc:X.ciphertext,nonce:X.nonce,authTag:X.authTag}).where(S(yD.id,D.workerId)).run(),!0}removeRegisteredWorker(D){if(!this.db.select({id:yD.id}).from(yD).where(S(yD.id,D)).get())return!1;return this.db.delete(yD).where(S(yD.id,D)).run(),!0}countRegisteredWorkers(){return this.db.select({value:C$()}).from(yD).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(Y$(L8.id,D.before));if(D.actionPrefix&&D.actionPrefix.length>0){let B=`${kh(D.actionPrefix)}%`;F.push(E`${L8.action} LIKE ${B} ESCAPE '\\'`)}if(D.workerId&&D.workerId.length>0)F.push(S(L8.workerId,D.workerId));let X=F.length===0?void 0:F.length===1?F[0]:SD(...F),J=this.db.select().from(L8).where(X).orderBy(MD(L8.id)).limit($+1).all(),G=J.length>$;return{events:(G?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:G}}}M0();ZD();import{Buffer as Mg}from"buffer";import{createHash as Og}from"crypto";import{resolve as FB,sep as bh}from"path";async function g$(D){let{webStaticDir:$}=D,F=FB($),X;try{X=fh(decodeURIComponent(D.pathnameAfterPrefix))}catch{return new Response("forbidden",{status:403})}let J=X===""?"index.html":X,G=FB(F,J);if(G!==F&&!G.startsWith(F+bh))return new Response("forbidden",{status:403});let Y=Bun.file(G);if(await Y.exists())return new Response(Y);if(!hh(J)){let B=Bun.file(FB(F,"index.html"));if(await B.exists())return new Response(B)}return new Response("not found",{status:404})}function fh(D){let $=0;while($<D.length&&D[$]==="/")$+=1;return D.slice($)}function hh(D){let $=D.lastIndexOf("/");return($===-1?D:D.slice($+1)).includes(".")}ZD();function lZ(D){if(S1(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
|
`+`
|