stable-harness 0.0.1 → 0.0.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stable-harness",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "type": "module",
5
5
  "description": "Stable application runtime and operator control plane for agent workspaces.",
6
6
  "license": "MIT",
@@ -61,9 +61,11 @@
61
61
  "test": "node --test dist/test/*.test.js dist/test/memory/*.test.js dist/test/retry/*.test.js dist/test/workspace/*.test.js",
62
62
  "test:langmem:maintenance:e2e": "node scripts/run-langmem-maintenance-e2e.mjs",
63
63
  "test:skill-mining:e2e": "node scripts/run-skill-candidate-mining-e2e.mjs",
64
+ "prepublishOnly": "npm run build && npm run release:check-package",
64
65
  "prepack": "npm run release:minify",
65
66
  "release:minify": "find dist packages -type f -name '*.js' \\( -path 'dist/*' -o -path '*/dist/*' \\) -exec sh -c 'for f do ./node_modules/.bin/terser \"$f\" --compress passes=2 --mangle --module --toplevel --comments false --output \"$f\"; done' sh {} +",
66
- "release:pack": "npm pack --dry-run",
67
+ "release:check-package": "node scripts/release/check-npm-package.mjs",
68
+ "release:pack": "npm run build && npm run release:check-package && npm pack --dry-run",
67
69
  "release:publish": "npm publish --access public --registry https://registry.npmjs.org/",
68
70
  "example:minimal": "node dist/examples/minimal-deepagents/run.js"
69
71
  },
@@ -1 +1 @@
1
- import{createServer as e}from"node:http";import{randomUUID as t}from"node:crypto";export function createOpenAiCompatibleHttpServer(o,c={}){return e(async(e,p)=>{try{if(function(e,t,n){return"OPTIONS"===e.method&&(t.writeHead(204,l(n)),t.end(),!0)}(e,p,c))return;if(!function(e,t){return!t.bearerToken||e.headers.authorization===`Bearer ${t.bearerToken}`}(e,c))return void u(p,401,{error:{message:"unauthorized",type:"invalid_request_error"}},c);if("GET"===e.method&&"/v1/models"===e.url)return void u(p,200,function(e,t){const n=Object.keys(t.modelAgentMap??{});return{object:"list",data:[...new Set([...e.inspect().agents,...n])].sort().map(e=>({id:e,object:"model",created:0,owned_by:"stable-harness"}))}}(o,c),c);if("GET"===e.method&&"/v1/capabilities"===e.url)return void u(p,200,{object:"stable_harness.capabilities",endpoints:["/v1/models","/v1/chat/completions","/v1/capabilities"],streaming:!0,toolProgressEvents:!0},c);if("POST"===e.method&&"/v1/chat/completions"===e.url)return void await async function(e,o,c,p){const f=await async function(e){const t=[];for await(const n of e)t.push(Buffer.isBuffer(n)?n:Buffer.from(n));return 0===t.length?{}:JSON.parse(Buffer.concat(t).toString("utf8"))}(o);if(f.model&&!r(f.model,e,p))return void u(c,404,{error:{message:`model_not_found: ${f.model}`,type:"invalid_request_error"}},p);const m=function(e,o,s){const a=function(e){if(!Array.isArray(e)||0===e.length)throw new Error("messages must be a non-empty array");return e.map(e=>`${e.role??"user"}: ${n(e.content)}`).join("\n\n")}(e.messages);return{input:a,requestId:`chatcmpl-${t()}`,agentId:r(e.model,o,s),metadata:{protocol:"openai-compatible",openaiStream:!0===e.stream,openaiMessages:(i=e.messages,Array.isArray(i)?i.map(e=>({role:e.role??"user",content:n(e.content)})):[]),model:e.model,user:e.user,clientMetadata:e.metadata}};var i}(f,e,p);f.stream?await async function(e,t,n,o,r){(function(e,t){e.writeHead(200,{"content-type":"text/event-stream","cache-control":"no-cache",connection:"keep-alive",...l(t)})})(t,r),d(t,a(o.requestId,n.model,{role:"assistant"},null));let i=!1;const c=e.subscribe(e=>{e.requestId===o.requestId&&(i=function(e,t,n,o){const r=function(e){if("adapter.event"!==e.type||"object"!=typeof e.event||null===e.event)return;const t=e.event;return"output.delta"===t.phase&&"string"==typeof t.text?t.text:void 0}(t);return r?(d(e,s(n,o,r)),!0):(function(e,t){const n=function(e){if("tool.started"===e.type||"tool.completed"===e.type)return{request_id:e.requestId,session_id:e.sessionId,agent_id:e.agentId,type:e.type,tool_id:e.toolId};if("adapter.event"!==e.type||"object"!=typeof e.event||null===e.event)return;const t=e.event,n="tool.start"===t.phase?"tool.started":"tool.result"===t.phase?"tool.completed":void 0,o="string"==typeof t.toolId?t.toolId:void 0;return n&&o?{request_id:e.requestId,session_id:e.sessionId,agent_id:e.agentId,type:n,tool_id:o,adapter:t.adapter}:void 0}(t);n&&function(e,t,n){e.write("event: stable_harness.tool.progress\n"),e.write(`data: ${JSON.stringify(n)}\n\n`)}(e,0,n)}(e,t),!1)}(t,e,o.requestId,n.model)||i)});try{const r=await e.request(o);i||d(t,s(o.requestId,n.model,r.output)),d(t,function(e,t){return a(e,t,{},"stop")}(o.requestId,n.model)),t.write("data: [DONE]\n\n"),t.end()}finally{c()}}(e,c,f,m,p):u(c,200,function(e,t){return{id:t.requestId,object:"chat.completion",created:Math.floor(Date.now()/1e3),model:e.model??t.agentId,choices:[{index:0,message:{role:"assistant",content:t.output},finish_reason:"stop"}],usage:i(e.messages,t.output),metadata:{sessionId:t.sessionId,agentId:t.agentId,state:t.state}}}(f,await e.request(m)),p)}(o,e,p,c);u(p,404,{error:{message:"not_found",type:"invalid_request_error"}},c)}catch(e){u(p,400,{error:{message:e instanceof Error?e.message:String(e),type:"invalid_request_error"}},c)}})}function n(e){if("string"==typeof e)return e;if(!Array.isArray(e))throw new Error("message content must be a string or content part array");return e.map(o).join("\n")}function o(e){if("object"!=typeof e||null===e)throw new Error("message content parts must be objects");const t=e;if("text"===t.type&&"string"==typeof t.text)return t.text;const n=t.image_url;if("image_url"===t.type&&"string"==typeof n?.url)return`[image:${n.url}]`;throw new Error("unsupported_content_type")}function r(e,t,n){if(!e)return;const o=n.modelAgentMap?.[e];return o||(t.inspect().agents.includes(e)?e:void 0)}function s(e,t,n){return a(e,t,{content:n},null)}function a(e,t,n,o){return{id:e,object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:t??"stable-harness",choices:[{index:0,delta:n,finish_reason:o}]}}function i(e,t){const o=c(Array.isArray(e)?e.map(e=>n(e.content)).join("\n"):""),r=c(t);return{prompt_tokens:o,completion_tokens:r,total_tokens:o+r}}function c(e){return e.trim()?Math.ceil(1.3*e.trim().split(/\s+/u).length):0}function u(e,t,n,o){e.writeHead(t,{"content-type":"application/json",...l(o)}),e.end(JSON.stringify(n))}function d(e,t){e.write(`data: ${JSON.stringify(t)}\n\n`)}function l(e){return e.corsOrigins?.length?{"access-control-allow-origin":e.corsOrigins.join(", "),"access-control-allow-headers":"authorization, content-type, idempotency-key","access-control-allow-methods":"GET, POST, OPTIONS"}:{}}
1
+ import{createServer as e}from"node:http";import{randomUUID as t}from"node:crypto";export function createOpenAiCompatibleHttpServer(r,c={}){return e(async(e,p)=>{try{if(function(e,t,n){return"OPTIONS"===e.method&&(t.writeHead(204,l(n)),t.end(),!0)}(e,p,c))return;if(!function(e,t){return!t.bearerToken||e.headers.authorization===`Bearer ${t.bearerToken}`}(e,c))return void u(p,401,{error:{message:"unauthorized",type:"invalid_request_error"}},c);if("GET"===e.method&&"/v1/models"===e.url)return void u(p,200,function(e,t){const n=Object.keys(t.modelAgentMap??{});return{object:"list",data:[...new Set([...e.inspect().agents,...n])].sort().map(e=>({id:e,object:"model",created:0,owned_by:"stable-harness"}))}}(r,c),c);if("GET"===e.method&&"/v1/capabilities"===e.url)return void u(p,200,{object:"stable_harness.capabilities",endpoints:["/v1/models","/v1/chat/completions","/v1/capabilities"],streaming:!0,toolProgressEvents:!0},c);if("POST"===e.method&&"/v1/chat/completions"===e.url)return void await async function(e,r,c,p){const f=await async function(e){const t=[];for await(const n of e)t.push(Buffer.isBuffer(n)?n:Buffer.from(n));return 0===t.length?{}:JSON.parse(Buffer.concat(t).toString("utf8"))}(r);if(f.model&&!o(f.model,e,p))return void u(c,404,{error:{message:`model_not_found: ${f.model}`,type:"invalid_request_error"}},p);const m=function(e,r,s){const a=function(e){if(!Array.isArray(e)||0===e.length)throw new Error("messages must be a non-empty array");return e.map(e=>`${e.role??"user"}: ${n(e.content)}`).join("\n\n")}(e.messages);return{input:a,requestId:`chatcmpl-${t()}`,agentId:o(e.model,r,s),metadata:{protocol:"openai-compatible",openaiStream:!0===e.stream,openaiMessages:(i=e.messages,Array.isArray(i)?i.map(e=>({role:e.role??"user",content:n(e.content)})):[]),model:e.model,user:e.user,clientMetadata:e.metadata}};var i}(f,e,p);f.stream?await async function(e,t,n,r,o){(function(e,t){e.writeHead(200,{"content-type":"text/event-stream","cache-control":"no-cache",connection:"keep-alive",...l(t)})})(t,o),d(t,a(r.requestId,n.model,{role:"assistant"},null));let i="";const c=e.subscribe(e=>{e.requestId===r.requestId&&(i+=function(e,t,n,r){const o=function(e){if("adapter.event"!==e.type||"object"!=typeof e.event||null===e.event)return;const t=e.event;return"output.delta"===t.phase&&"string"==typeof t.text?t.text:void 0}(t);if(o)return d(e,s(n,r,o)),o;!function(e,t){const n=function(e){if("tool.started"===e.type||"tool.completed"===e.type)return{request_id:e.requestId,session_id:e.sessionId,agent_id:e.agentId,type:e.type,tool_id:e.toolId};if("adapter.event"!==e.type||"object"!=typeof e.event||null===e.event)return;const t=e.event,n="tool.start"===t.phase?"tool.started":"tool.result"===t.phase?"tool.completed":void 0,r="string"==typeof t.toolId?t.toolId:void 0;return n&&r?{request_id:e.requestId,session_id:e.sessionId,agent_id:e.agentId,type:n,tool_id:r,adapter:t.adapter}:void 0}(t);n&&function(e,t,n){e.write("event: stable_harness.tool.progress\n"),e.write(`data: ${JSON.stringify(n)}\n\n`)}(e,0,n)}(e,t)}(t,e,r.requestId,n.model)??"")});try{const o=await e.request(r),c=function(e,t){return e?!t||e.includes(t)?"":t.startsWith(e)?t.slice(e.length):t:t}(i,o.output);c&&d(t,s(r.requestId,n.model,c)),d(t,function(e,t){return a(e,t,{},"stop")}(r.requestId,n.model)),t.write("data: [DONE]\n\n"),t.end()}finally{c()}}(e,c,f,m,p):u(c,200,function(e,t){return{id:t.requestId,object:"chat.completion",created:Math.floor(Date.now()/1e3),model:e.model??t.agentId,choices:[{index:0,message:{role:"assistant",content:t.output},finish_reason:"stop"}],usage:i(e.messages,t.output),metadata:{sessionId:t.sessionId,agentId:t.agentId,state:t.state}}}(f,await e.request(m)),p)}(r,e,p,c);u(p,404,{error:{message:"not_found",type:"invalid_request_error"}},c)}catch(e){u(p,400,{error:{message:e instanceof Error?e.message:String(e),type:"invalid_request_error"}},c)}})}function n(e){if("string"==typeof e)return e;if(!Array.isArray(e))throw new Error("message content must be a string or content part array");return e.map(r).join("\n")}function r(e){if("object"!=typeof e||null===e)throw new Error("message content parts must be objects");const t=e;if("text"===t.type&&"string"==typeof t.text)return t.text;const n=t.image_url;if("image_url"===t.type&&"string"==typeof n?.url)return`[image:${n.url}]`;throw new Error("unsupported_content_type")}function o(e,t,n){if(!e)return;const r=n.modelAgentMap?.[e];return r||(t.inspect().agents.includes(e)?e:void 0)}function s(e,t,n){return a(e,t,{content:n},null)}function a(e,t,n,r){return{id:e,object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:t??"stable-harness",choices:[{index:0,delta:n,finish_reason:r}]}}function i(e,t){const r=c(Array.isArray(e)?e.map(e=>n(e.content)).join("\n"):""),o=c(t);return{prompt_tokens:r,completion_tokens:o,total_tokens:r+o}}function c(e){return e.trim()?Math.ceil(1.3*e.trim().split(/\s+/u).length):0}function u(e,t,n,r){e.writeHead(t,{"content-type":"application/json",...l(r)}),e.end(JSON.stringify(n))}function d(e,t){e.write(`data: ${JSON.stringify(t)}\n\n`)}function l(e){return e.corsOrigins?.length?{"access-control-allow-origin":e.corsOrigins.join(", "),"access-control-allow-headers":"authorization, content-type, idempotency-key","access-control-allow-methods":"GET, POST, OPTIONS"}:{}}