@gencode/server 0.3.12 → 0.3.14
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/CHANGELOG.md +29 -0
- package/dist/bin.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/server-DPKs0UO_.js +1 -0
- package/package.json +3 -3
- package/dist/server-VB3yAKQp.js +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,10 +1,39 @@
|
|
|
1
1
|
# @gencode/server
|
|
2
2
|
|
|
3
|
+
## 0.3.14
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [ee0f689]
|
|
8
|
+
- Updated dependencies [bc161b3]
|
|
9
|
+
- Updated dependencies [d77a70b]
|
|
10
|
+
- @gencode/cli@0.16.2
|
|
11
|
+
- @gencode/agents@0.18.1
|
|
12
|
+
|
|
13
|
+
## 0.3.13
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- e32aa85: `aimax-server` now preloads the CLI run orchestration during server startup instead of waiting until the accepted `/run` request begins execution. Deployments using the one-shot prestart server should see less delay between the HTTP `202 accepted` response and the first CLI run log. The CLI also exposes a lightweight `@gencode/cli/run` entrypoint for server-style embedders that only need `executeRun` without importing the full command program surface.
|
|
18
|
+
- Updated dependencies [e32aa85]
|
|
19
|
+
- @gencode/cli@0.16.1
|
|
20
|
+
|
|
3
21
|
## 0.3.12
|
|
4
22
|
|
|
5
23
|
### Patch Changes
|
|
6
24
|
|
|
7
25
|
- ac37ac3: `aimax-server` 的 `POST /run` 成功接收响应现在会返回 `receivedAt` 和 `respondedAt` 两个中国本地时间字段,格式与 CLI 日志一致(`YYYY-MM-DD HH:mm:ss.SSS`),方便上游记录 server 接收请求与返回 HTTP acceptance 的时间点。任务进度和最终结果仍继续通过 CLI stdout、callback 或 websocket 通道发送。
|
|
26
|
+
- Updated dependencies [37f0256]
|
|
27
|
+
- Updated dependencies [0279e82]
|
|
28
|
+
- Updated dependencies [0279e82]
|
|
29
|
+
- Updated dependencies [0279e82]
|
|
30
|
+
- Updated dependencies [6717f94]
|
|
31
|
+
- Updated dependencies [0279e82]
|
|
32
|
+
- Updated dependencies [0279e82]
|
|
33
|
+
- Updated dependencies [0279e82]
|
|
34
|
+
- Updated dependencies [9ff9574]
|
|
35
|
+
- @gencode/cli@0.16.0
|
|
36
|
+
- @gencode/agents@0.18.0
|
|
8
37
|
|
|
9
38
|
## 0.3.11
|
|
10
39
|
|
package/dist/bin.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{t as e}from"./server-
|
|
2
|
+
import{t as e}from"./server-DPKs0UO_.js";function t(e){let t=!1;return()=>{t||(t=!0,n(e))}}async function n(e){let t=e.exit??(e=>process.exit(e)),n=e.onLog??(()=>void 0),a=e.graceMs??3e4,o=e.server.getStatus();if(!r(o)){await e.server.stop().catch(e=>{n(`server shutdown stop failed`,{error:String(e),status:o})}),t(0);return}n(`server shutdown signal received; waiting for active run`,{status:o,graceMs:a}),await e.server.stop().catch(e=>{n(`server shutdown stop failed`,{error:String(e),status:o})});let s=await i(e.server.done,a);if(s.timedOut){n(`server shutdown grace period elapsed before run finished`,{status:o,graceMs:a}),t(1);return}n(`server shutdown completed after active run finished`,{status:o,exitCode:s.exitCode}),t(s.exitCode)}function r(e){return e===`running`||e===`draining`}async function i(e,t){let n,r=new Promise(e=>{n=setTimeout(()=>e({timedOut:!0}),t),n.unref?.()});try{return await Promise.race([e.then(e=>({timedOut:!1,exitCode:e.exitCode})),r])}finally{n&&clearTimeout(n)}}function a(e){let t={};for(let n=0;n<e.length;n+=1){let r=e[n];if(r===`--host`){t.host=e[++n];continue}if(r===`--port`){t.port=o(e[++n],`--port`);continue}if(r===`--plugins-config`){t.pluginsConfig=s(e[++n],`--plugins-config`);continue}if(r===`--request-timeout-ms`){t.requestTimeoutMs=c(e[++n],`--request-timeout-ms`);continue}if(r===`--shutdown-grace-ms`){t.shutdownGraceMs=c(e[++n],`--shutdown-grace-ms`);continue}throw(r===`--help`||r===`-h`)&&(l(),process.exit(0)),Error(`Unknown option: ${r}`)}return t}function o(e,t){let n=c(e,t);if(n>65535)throw Error(`Invalid ${t}: ${e}. Must be between 0 and 65535.`);return n}function s(e,t){if(e===void 0||e.trim()===``)throw Error(`Missing value for ${t}`);return e}function c(e,t){if(e===void 0||e.trim()===``)throw Error(`Missing value for ${t}`);let n=Number(e);if(!Number.isInteger(n)||n<0)throw Error(`Invalid ${t}: ${e}. Must be a non-negative integer.`);return n}function l(){process.stdout.write(`AIMax one-shot prestart server
|
|
3
3
|
|
|
4
4
|
Usage:
|
|
5
5
|
aimax-server [--host 127.0.0.1] [--port 0] [--plugins-config /image/plugins.json] [--request-timeout-ms 60000] [--shutdown-grace-ms 30000]
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./server-
|
|
1
|
+
import{t as e}from"./server-DPKs0UO_.js";export{e as createAimaxServer};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import e from"node:http";import t from"node:fs/promises";import{executeRun as n}from"@gencode/cli/run";import{prepareSystemRuntime as r}from"@gencode/agents/system-runtime";function i(t={}){let n=t.host??`127.0.0.1`,r=t.port??0,i=t.maxBodyBytes??1048576,c=t.executeRun??u,h=t.prepareSystemRuntime??d,g=t.onLog??(()=>void 0),_=t.pluginsConfig,v=`starting`,y,b,x=null,S=!1,C=()=>void 0,w=new Promise(e=>{C=e});function T(e){S||(S=!0,C(e))}function E(e){v=e,g(`server status changed`,{status:e})}async function D(){let e=x;x=null,!(!e||!e.listening)&&await new Promise((t,n)=>{e.close(e=>{e?n(e):t()})})}async function O(e,t){let n=a();if(v===`starting`||v===`warming`){m(t,503,{status:v,error:`server is not ready`});return}if(v!==`ready`&&v!==`ready_degraded`){m(t,409,{status:v,error:`server already accepted a run`});return}let r;try{r=s(await p(e,i))}catch(e){m(t,400,{status:v,error:e.message});return}E(`running`),D().catch(e=>{g(`failed to close listener after accepting run`,{error:String(e)})});let o=a();m(t,202,{status:v,accepted:!0,receivedAt:n,respondedAt:o}),k(r,{receivedAt:n,respondedAt:o,acceptedAtMs:Date.now()})}async function k(e,t){let n=0;try{let r=Date.now();g(`accepted run execution starting`,{receivedAt:t.receivedAt,respondedAt:t.respondedAt,delayAfterAcceptedMs:r-t.acceptedAtMs});let i=o(e.run,e.env,b);g(`invoking CLI run`,{dataDir:i.dataDir,sessionId:i.sessionId,messageId:i.messageId,delayAfterAcceptedMs:Date.now()-t.acceptedAtMs}),await l(e.env,()=>c(i)),g(`CLI run completed`,{durationMs:Date.now()-r}),typeof process.exitCode==`number`&&process.exitCode!==0&&(n=process.exitCode),E(`draining`)}catch(e){n=1,g(`run failed`,{error:String(e)}),E(`draining`)}finally{await D().catch(e=>{g(`failed to stop server during drain`,{error:String(e)})}),E(`exiting`),T({exitCode:n})}}async function A(e,t){let r=new URL(e.url??`/`,`http://${n}`);if(e.method===`GET`&&r.pathname===`/healthz`){m(t,200,{status:v});return}if(e.method===`GET`&&r.pathname===`/readyz`){let e=v===`ready`||v===`ready_degraded`;m(t,e?200:503,{status:v,ready:e,degraded:v===`ready_degraded`,warmupError:y});return}if(e.method===`POST`&&r.pathname===`/run`){await O(e,t);return}m(t,404,{status:v,error:`not found`})}async function j(){if(!x){E(`warming`),x=e.createServer((e,t)=>{A(e,t).catch(e=>{m(t,500,{status:v,error:String(e)})})}),await new Promise((e,t)=>{x.once(`error`,t),x.listen(r,n,()=>{x.off(`error`,t),e()})});try{let e=_?await f(_):void 0;e!==void 0&&(b=_),await h({pluginsConfig:e}),v===`warming`&&E(`ready`)}catch(e){y=String(e),g(`system warmup failed; continuing with cold run path`,{error:y}),v===`warming`&&E(`ready_degraded`)}t.requestTimeoutMs&&t.requestTimeoutMs>0&&setTimeout(()=>{(v===`ready`||v===`ready_degraded`)&&D().finally(()=>{E(`exiting`),T({exitCode:1})})},t.requestTimeoutMs).unref()}}function M(){if(!x?.listening)return``;let e=x.address();return`http://${e.address}:${e.port}`}return{start:j,stop:D,done:w,getStatus:()=>v,getUrl:M}}function a(e=new Date){let t=new Intl.DateTimeFormat(`en-CA`,{timeZone:`Asia/Shanghai`,year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1}),n=Object.fromEntries(t.formatToParts(e).map(e=>[e.type,e.value])),r=String(e.getMilliseconds()).padStart(3,`0`);return`${n.year}-${n.month}-${n.day} ${n.hour}:${n.minute}:${n.second}.${r}`}function o(e,t,n){return!n||Object.prototype.hasOwnProperty.call(e,`pluginsConfig`)||t&&Object.prototype.hasOwnProperty.call(t,`AIMAX_PLUGINS_CONFIG`)?e:{...e,pluginsConfig:n}}function s(e){if(!e||typeof e!=`object`)throw Error(`request body must be an object`);let t=e.env;t!==void 0&&c(t);let n=e.run;if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`request body must include run options`);return{env:t,run:n}}function c(e){if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`request env must be an object when provided`);for(let[t,n]of Object.entries(e)){if(!t||t.includes(`=`))throw Error(`request env contains invalid key: ${t}`);if(n!==null&&typeof n!=`string`&&typeof n!=`number`&&typeof n!=`boolean`)throw Error(`request env value for ${t} must be string, number, boolean, or null`)}}async function l(e,t){if(!e||Object.keys(e).length===0)return t();let n=new Map;for(let[t,r]of Object.entries(e))n.set(t,process.env[t]),r===null?delete process.env[t]:process.env[t]=String(r);try{return await t()}finally{for(let[e,t]of n)t===void 0?delete process.env[e]:process.env[e]=t}}async function u(e){await n(e)}async function d(e={}){return r({config:e.pluginsConfig})}async function f(e){let n=await t.readFile(e,`utf-8`);return JSON.parse(n)}async function p(e,t){let n=[],r=0;for await(let i of e){let e=Buffer.isBuffer(i)?i:Buffer.from(i);if(r+=e.byteLength,r>t)throw Error(`request body is too large`);n.push(e)}let i=Buffer.concat(n).toString(`utf-8`);if(!i.trim())throw Error(`request body must not be empty`);try{return JSON.parse(i)}catch{throw Error(`request body must be valid JSON`)}}function m(e,t,n){e.headersSent||(e.writeHead(t,{"content-type":`application/json; charset=utf-8`}),e.end(`${JSON.stringify(n)}\n`))}export{i as t};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gencode/server",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.14",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"aimax-server": "./dist/bin.js"
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
"access": "public"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@gencode/
|
|
23
|
-
"@gencode/
|
|
22
|
+
"@gencode/agents": "0.18.1",
|
|
23
|
+
"@gencode/cli": "0.16.2"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@types/node": "^22.0.0",
|
package/dist/server-VB3yAKQp.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import e from"node:http";import t from"node:fs/promises";function n(t={}){let n=t.host??`127.0.0.1`,o=t.port??0,d=t.maxBodyBytes??1048576,m=t.executeRun??c,h=t.prepareSystemRuntime??l,g=t.onLog??(()=>void 0),_=t.pluginsConfig,v=`starting`,y,b,x=null,S=!1,C=()=>void 0,w=new Promise(e=>{C=e});function T(e){S||(S=!0,C(e))}function E(e){v=e,g(`server status changed`,{status:e})}async function D(){let e=x;x=null,!(!e||!e.listening)&&await new Promise((t,n)=>{e.close(e=>{e?n(e):t()})})}async function O(e,t){let n=r();if(v===`starting`||v===`warming`){p(t,503,{status:v,error:`server is not ready`});return}if(v!==`ready`&&v!==`ready_degraded`){p(t,409,{status:v,error:`server already accepted a run`});return}let i;try{i=a(await f(e,d))}catch(e){p(t,400,{status:v,error:e.message});return}E(`running`),D().catch(e=>{g(`failed to close listener after accepting run`,{error:String(e)})});let o=r();p(t,202,{status:v,accepted:!0,receivedAt:n,respondedAt:o}),k(i)}async function k(e){let t=0;try{let n=i(e.run,e.env,b);await s(e.env,()=>m(n)),typeof process.exitCode==`number`&&process.exitCode!==0&&(t=process.exitCode),E(`draining`)}catch(e){t=1,g(`run failed`,{error:String(e)}),E(`draining`)}finally{await D().catch(e=>{g(`failed to stop server during drain`,{error:String(e)})}),E(`exiting`),T({exitCode:t})}}async function A(e,t){let r=new URL(e.url??`/`,`http://${n}`);if(e.method===`GET`&&r.pathname===`/healthz`){p(t,200,{status:v});return}if(e.method===`GET`&&r.pathname===`/readyz`){let e=v===`ready`||v===`ready_degraded`;p(t,e?200:503,{status:v,ready:e,degraded:v===`ready_degraded`,warmupError:y});return}if(e.method===`POST`&&r.pathname===`/run`){await O(e,t);return}p(t,404,{status:v,error:`not found`})}async function j(){if(!x){E(`warming`),x=e.createServer((e,t)=>{A(e,t).catch(e=>{p(t,500,{status:v,error:String(e)})})}),await new Promise((e,t)=>{x.once(`error`,t),x.listen(o,n,()=>{x.off(`error`,t),e()})});try{let e=_?await u(_):void 0;e!==void 0&&(b=_),await h({pluginsConfig:e}),v===`warming`&&E(`ready`)}catch(e){y=String(e),g(`system warmup failed; continuing with cold run path`,{error:y}),v===`warming`&&E(`ready_degraded`)}t.requestTimeoutMs&&t.requestTimeoutMs>0&&setTimeout(()=>{(v===`ready`||v===`ready_degraded`)&&D().finally(()=>{E(`exiting`),T({exitCode:1})})},t.requestTimeoutMs).unref()}}function M(){if(!x?.listening)return``;let e=x.address();return`http://${e.address}:${e.port}`}return{start:j,stop:D,done:w,getStatus:()=>v,getUrl:M}}function r(e=new Date){let t=new Intl.DateTimeFormat(`en-CA`,{timeZone:`Asia/Shanghai`,year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1}),n=Object.fromEntries(t.formatToParts(e).map(e=>[e.type,e.value])),r=String(e.getMilliseconds()).padStart(3,`0`);return`${n.year}-${n.month}-${n.day} ${n.hour}:${n.minute}:${n.second}.${r}`}function i(e,t,n){return!n||Object.prototype.hasOwnProperty.call(e,`pluginsConfig`)||t&&Object.prototype.hasOwnProperty.call(t,`AIMAX_PLUGINS_CONFIG`)?e:{...e,pluginsConfig:n}}function a(e){if(!e||typeof e!=`object`)throw Error(`request body must be an object`);let t=e.env;t!==void 0&&o(t);let n=e.run;if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`request body must include run options`);return{env:t,run:n}}function o(e){if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`request env must be an object when provided`);for(let[t,n]of Object.entries(e)){if(!t||t.includes(`=`))throw Error(`request env contains invalid key: ${t}`);if(n!==null&&typeof n!=`string`&&typeof n!=`number`&&typeof n!=`boolean`)throw Error(`request env value for ${t} must be string, number, boolean, or null`)}}async function s(e,t){if(!e||Object.keys(e).length===0)return t();let n=new Map;for(let[t,r]of Object.entries(e))n.set(t,process.env[t]),r===null?delete process.env[t]:process.env[t]=String(r);try{return await t()}finally{for(let[e,t]of n)t===void 0?delete process.env[e]:process.env[e]=t}}async function c(e){await(await d(`@gencode/cli`)).executeRun(e)}async function l(e={}){return(await d(`@gencode/agents/system-runtime`)).prepareSystemRuntime({config:e.pluginsConfig})}async function u(e){let n=await t.readFile(e,`utf-8`);return JSON.parse(n)}const d=Function(`specifier`,`return import(specifier)`);async function f(e,t){let n=[],r=0;for await(let i of e){let e=Buffer.isBuffer(i)?i:Buffer.from(i);if(r+=e.byteLength,r>t)throw Error(`request body is too large`);n.push(e)}let i=Buffer.concat(n).toString(`utf-8`);if(!i.trim())throw Error(`request body must not be empty`);try{return JSON.parse(i)}catch{throw Error(`request body must be valid JSON`)}}function p(e,t,n){e.headersSent||(e.writeHead(t,{"content-type":`application/json; charset=utf-8`}),e.end(`${JSON.stringify(n)}\n`))}export{n as t};
|