@gencode/server 0.2.0 → 0.3.1

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 CHANGED
@@ -1,5 +1,28 @@
1
1
  # @gencode/server
2
2
 
3
+ ## 0.3.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [cbd1dba]
8
+ - Updated dependencies [cbd1dba]
9
+ - Updated dependencies [5af5e22]
10
+ - @gencode/agents@0.15.0
11
+ - @gencode/cli@0.13.0
12
+
13
+ ## 0.3.0
14
+
15
+ ### Minor Changes
16
+
17
+ - 8782104: Allow `/run` requests to include a top-level `env` object. These values are applied as request-scoped environment variables while the one-shot run executes, then restored afterward, so container prestart deployments can pass user-specific settings such as `AIMAX_BASE_URL`, `AIMAX_API_KEY`, `AIMAX_MODEL`, `AIMAX_DATA_DIR`, and `AIMAX_PLUGINS_CONFIG` after the server process is already warm.
18
+
19
+ The CLI run startup log now reports API key presence from the resolved LLM configuration, so API keys supplied through environment variables are shown as configured without exposing the secret value.
20
+
21
+ ### Patch Changes
22
+
23
+ - Updated dependencies [8782104]
24
+ - @gencode/cli@0.12.1
25
+
3
26
  ## 0.2.0
4
27
 
5
28
  ### Minor Changes
package/dist/bin.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{t as e}from"./server-DdorBHmR.js";function t(e){let t={};for(let a=0;a<e.length;a+=1){let o=e[a];if(o===`--host`){t.host=e[++a];continue}if(o===`--port`){t.port=n(e[++a],`--port`);continue}if(o===`--request-timeout-ms`){t.requestTimeoutMs=r(e[++a],`--request-timeout-ms`);continue}throw(o===`--help`||o===`-h`)&&(i(),process.exit(0)),Error(`Unknown option: ${o}`)}return t}function n(e,t){let n=r(e,t);if(n>65535)throw Error(`Invalid ${t}: ${e}. Must be between 0 and 65535.`);return n}function r(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 i(){process.stdout.write(`AIMax one-shot prestart server
2
+ import{t as e}from"./server-BMS-TOVR.js";function t(e){let t={};for(let a=0;a<e.length;a+=1){let o=e[a];if(o===`--host`){t.host=e[++a];continue}if(o===`--port`){t.port=n(e[++a],`--port`);continue}if(o===`--request-timeout-ms`){t.requestTimeoutMs=r(e[++a],`--request-timeout-ms`);continue}throw(o===`--help`||o===`-h`)&&(i(),process.exit(0)),Error(`Unknown option: ${o}`)}return t}function n(e,t){let n=r(e,t);if(n>65535)throw Error(`Invalid ${t}: ${e}. Must be between 0 and 65535.`);return n}function r(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 i(){process.stdout.write(`AIMax one-shot prestart server
3
3
 
4
4
  Usage:
5
5
  aimax-server [--host 127.0.0.1] [--port 0] [--request-timeout-ms 60000]
package/dist/index.d.ts CHANGED
@@ -1,9 +1,11 @@
1
1
  //#region src/server.d.ts
2
2
  type AimaxServerStatus = "starting" | "warming" | "ready" | "ready_degraded" | "running" | "draining" | "exiting";
3
3
  type ServerRunRequest = {
4
+ env?: ServerRequestEnv;
4
5
  run: ServerRunOptions;
5
6
  };
6
7
  type ServerRunOptions = Record<string, unknown>;
8
+ type ServerRequestEnv = Record<string, string | number | boolean | null>;
7
9
  type SystemWarmState = {
8
10
  runtimeInitialized: true;
9
11
  pluginSystem: unknown;
@@ -30,4 +32,4 @@ type AimaxServerHandle = {
30
32
  };
31
33
  declare function createAimaxServer(options?: AimaxServerOptions): AimaxServerHandle;
32
34
  //#endregion
33
- export { type AimaxServerHandle, type AimaxServerOptions, type AimaxServerStatus, type ServerRunRequest, createAimaxServer };
35
+ export { type AimaxServerHandle, type AimaxServerOptions, type AimaxServerStatus, type ServerRequestEnv, type ServerRunRequest, createAimaxServer };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{t as e}from"./server-DdorBHmR.js";export{e as createAimaxServer};
1
+ import{t as e}from"./server-BMS-TOVR.js";export{e as createAimaxServer};
@@ -0,0 +1 @@
1
+ import e from"node:http";function t(t={}){let r=t.host??`127.0.0.1`,s=t.port??0,u=t.maxBodyBytes??1048576,d=t.executeRun??a,f=t.prepareSystemRuntime??o,p=t.onLog??(()=>void 0),m=`starting`,h,g=null,_=!1,v=()=>void 0,y=new Promise(e=>{v=e});function b(e){_||(_=!0,v(e))}function x(e){m=e,p(`server status changed`,{status:e})}async function S(){let e=g;g=null,!(!e||!e.listening)&&await new Promise((t,n)=>{e.close(e=>{e?n(e):t()})})}async function C(e,t){if(m===`starting`||m===`warming`){l(t,503,{status:m,error:`server is not ready`});return}if(m!==`ready`&&m!==`ready_degraded`){l(t,409,{status:m,error:`server already accepted a run`});return}let r;try{r=n(await c(e,u))}catch(e){l(t,400,{status:m,error:e.message});return}x(`running`),S().catch(e=>{p(`failed to close listener after accepting run`,{error:String(e)})}),l(t,202,{status:m,accepted:!0}),w(r)}async function w(e){let t=0;try{await i(e.env,()=>d(e.run)),typeof process.exitCode==`number`&&process.exitCode!==0&&(t=process.exitCode),x(`draining`)}catch(e){t=1,p(`run failed`,{error:String(e)}),x(`draining`)}finally{await S().catch(e=>{p(`failed to stop server during drain`,{error:String(e)})}),x(`exiting`),b({exitCode:t})}}async function T(e,t){let n=new URL(e.url??`/`,`http://${r}`);if(e.method===`GET`&&n.pathname===`/healthz`){l(t,200,{status:m});return}if(e.method===`GET`&&n.pathname===`/readyz`){let e=m===`ready`||m===`ready_degraded`;l(t,e?200:503,{status:m,ready:e,degraded:m===`ready_degraded`,warmupError:h});return}if(e.method===`POST`&&n.pathname===`/run`){await C(e,t);return}l(t,404,{status:m,error:`not found`})}async function E(){if(!g){x(`warming`),g=e.createServer((e,t)=>{T(e,t).catch(e=>{l(t,500,{status:m,error:String(e)})})}),await new Promise((e,t)=>{g.once(`error`,t),g.listen(s,r,()=>{g.off(`error`,t),e()})});try{await f(),m===`warming`&&x(`ready`)}catch(e){h=String(e),p(`system warmup failed; continuing with cold run path`,{error:h}),m===`warming`&&x(`ready_degraded`)}t.requestTimeoutMs&&t.requestTimeoutMs>0&&setTimeout(()=>{(m===`ready`||m===`ready_degraded`)&&S().finally(()=>{x(`exiting`),b({exitCode:1})})},t.requestTimeoutMs).unref()}}function D(){if(!g?.listening)return``;let e=g.address();return`http://${e.address}:${e.port}`}return{start:E,stop:S,done:y,getStatus:()=>m,getUrl:D}}function n(e){if(!e||typeof e!=`object`)throw Error(`request body must be an object`);let t=e.env;t!==void 0&&r(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 r(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 i(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 a(e){await(await s(`@gencode/cli`)).executeRun(e)}async function o(){return(await s(`@gencode/agents/system-runtime`)).prepareSystemRuntime()}const s=Function(`specifier`,`return import(specifier)`);async function c(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 l(e,t,n){e.headersSent||(e.writeHead(t,{"content-type":`application/json; charset=utf-8`}),e.end(`${JSON.stringify(n)}\n`))}export{t};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gencode/server",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
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/agents": "0.14.0",
23
- "@gencode/cli": "0.12.0"
22
+ "@gencode/agents": "0.15.0",
23
+ "@gencode/cli": "0.13.0"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@types/node": "^22.0.0",
@@ -1 +0,0 @@
1
- import e from"node:http";function t(t={}){let a=t.host??`127.0.0.1`,c=t.port??0,l=t.maxBodyBytes??1048576,u=t.executeRun??r,d=t.prepareSystemRuntime??i,f=t.onLog??(()=>void 0),p=`starting`,m,h=null,g=!1,_=()=>void 0,v=new Promise(e=>{_=e});function y(e){g||(g=!0,_(e))}function b(e){p=e,f(`server status changed`,{status:e})}async function x(){let e=h;h=null,!(!e||!e.listening)&&await new Promise((t,n)=>{e.close(e=>{e?n(e):t()})})}async function S(e,t){if(p===`starting`||p===`warming`){s(t,503,{status:p,error:`server is not ready`});return}if(p!==`ready`&&p!==`ready_degraded`){s(t,409,{status:p,error:`server already accepted a run`});return}let r;try{r=n(await o(e,l))}catch(e){s(t,400,{status:p,error:e.message});return}b(`running`),x().catch(e=>{f(`failed to close listener after accepting run`,{error:String(e)})}),s(t,202,{status:p,accepted:!0}),C(r)}async function C(e){let t=0;try{await u(e.run),typeof process.exitCode==`number`&&process.exitCode!==0&&(t=process.exitCode),b(`draining`)}catch(e){t=1,f(`run failed`,{error:String(e)}),b(`draining`)}finally{await x().catch(e=>{f(`failed to stop server during drain`,{error:String(e)})}),b(`exiting`),y({exitCode:t})}}async function w(e,t){let n=new URL(e.url??`/`,`http://${a}`);if(e.method===`GET`&&n.pathname===`/healthz`){s(t,200,{status:p});return}if(e.method===`GET`&&n.pathname===`/readyz`){let e=p===`ready`||p===`ready_degraded`;s(t,e?200:503,{status:p,ready:e,degraded:p===`ready_degraded`,warmupError:m});return}if(e.method===`POST`&&n.pathname===`/run`){await S(e,t);return}s(t,404,{status:p,error:`not found`})}async function T(){if(!h){b(`warming`),h=e.createServer((e,t)=>{w(e,t).catch(e=>{s(t,500,{status:p,error:String(e)})})}),await new Promise((e,t)=>{h.once(`error`,t),h.listen(c,a,()=>{h.off(`error`,t),e()})});try{await d(),p===`warming`&&b(`ready`)}catch(e){m=String(e),f(`system warmup failed; continuing with cold run path`,{error:m}),p===`warming`&&b(`ready_degraded`)}t.requestTimeoutMs&&t.requestTimeoutMs>0&&setTimeout(()=>{(p===`ready`||p===`ready_degraded`)&&x().finally(()=>{b(`exiting`),y({exitCode:1})})},t.requestTimeoutMs).unref()}}function E(){if(!h?.listening)return``;let e=h.address();return`http://${e.address}:${e.port}`}return{start:T,stop:x,done:v,getStatus:()=>p,getUrl:E}}function n(e){if(!e||typeof e!=`object`)throw Error(`request body must be an object`);let t=e.run;if(!t||typeof t!=`object`||Array.isArray(t))throw Error(`request body must include run options`);return{run:t}}async function r(e){await(await a(`@gencode/cli`)).executeRun(e)}async function i(){return(await a(`@gencode/agents/system-runtime`)).prepareSystemRuntime()}const a=Function(`specifier`,`return import(specifier)`);async function o(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 s(e,t,n){e.headersSent||(e.writeHead(t,{"content-type":`application/json; charset=utf-8`}),e.end(`${JSON.stringify(n)}\n`))}export{t};