@voiden/runner 2.1.0 → 2.2.0

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 (65) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/bundled-runners/package.json +3 -0
  3. package/bundled-runners/simple-assertions-runner.js +1 -0
  4. package/bundled-runners/versions.json +9 -0
  5. package/bundled-runners/voiden-advanced-auth-runner.js +1 -0
  6. package/bundled-runners/voiden-faker-runner.js +9 -0
  7. package/bundled-runners/voiden-graphql-runner.js +1 -0
  8. package/bundled-runners/voiden-rest-api-runner.js +1 -0
  9. package/bundled-runners/voiden-scripting-runner.js +397 -0
  10. package/bundled-runners/voiden-sockets-grpcs-runner.js +1 -0
  11. package/dist/discovery.d.ts +11 -0
  12. package/dist/discovery.d.ts.map +1 -0
  13. package/dist/discovery.js +54 -0
  14. package/dist/discovery.js.map +1 -0
  15. package/dist/index.js +384 -112
  16. package/dist/index.js.map +1 -1
  17. package/dist/lib.d.ts +19 -0
  18. package/dist/lib.d.ts.map +1 -0
  19. package/dist/lib.js +19 -0
  20. package/dist/lib.js.map +1 -0
  21. package/dist/mcpInstall.d.ts +48 -0
  22. package/dist/mcpInstall.d.ts.map +1 -0
  23. package/dist/mcpInstall.js +194 -0
  24. package/dist/mcpInstall.js.map +1 -0
  25. package/dist/plugins/community.d.ts.map +1 -1
  26. package/dist/plugins/community.js +9 -2
  27. package/dist/plugins/community.js.map +1 -1
  28. package/dist/plugins/loader.d.ts +1 -0
  29. package/dist/plugins/loader.d.ts.map +1 -1
  30. package/dist/plugins/loader.js +32 -18
  31. package/dist/plugins/loader.js.map +1 -1
  32. package/dist/plugins/registry.d.ts +11 -0
  33. package/dist/plugins/registry.d.ts.map +1 -1
  34. package/dist/plugins/registry.js +63 -10
  35. package/dist/plugins/registry.js.map +1 -1
  36. package/dist/plugins/registryCache.d.ts +2 -0
  37. package/dist/plugins/registryCache.d.ts.map +1 -1
  38. package/dist/plugins/registryCache.js.map +1 -1
  39. package/dist/plugins/store.d.ts +28 -1
  40. package/dist/plugins/store.d.ts.map +1 -1
  41. package/dist/plugins/store.js +46 -9
  42. package/dist/plugins/store.js.map +1 -1
  43. package/dist/plugins/updateCheck.d.ts +9 -4
  44. package/dist/plugins/updateCheck.d.ts.map +1 -1
  45. package/dist/plugins/updateCheck.js +29 -15
  46. package/dist/plugins/updateCheck.js.map +1 -1
  47. package/dist/plugins/versionInfo.d.ts +15 -0
  48. package/dist/plugins/versionInfo.d.ts.map +1 -0
  49. package/dist/plugins/versionInfo.js +18 -0
  50. package/dist/plugins/versionInfo.js.map +1 -0
  51. package/dist/resultBlock.d.ts +31 -0
  52. package/dist/resultBlock.d.ts.map +1 -0
  53. package/dist/resultBlock.js +121 -0
  54. package/dist/resultBlock.js.map +1 -0
  55. package/dist/runner.d.ts +11 -0
  56. package/dist/runner.d.ts.map +1 -1
  57. package/dist/runner.js +61 -2
  58. package/dist/runner.js.map +1 -1
  59. package/dist/runtimeVars.js +3 -3
  60. package/dist/runtimeVars.js.map +1 -1
  61. package/dist/skillContent.d.ts +8 -0
  62. package/dist/skillContent.d.ts.map +1 -0
  63. package/dist/skillContent.js +42 -0
  64. package/dist/skillContent.js.map +1 -0
  65. package/package.json +13 -2
package/CHANGELOG.md ADDED
@@ -0,0 +1,26 @@
1
+ # Changelog
2
+
3
+ All notable changes to `@voiden/runner` are documented here. This package is
4
+ versioned and released independently of the Voiden desktop app.
5
+
6
+ ## v2.2.0 - 2026-07-23
7
+
8
+ ### Added
9
+ - Deterministic exit codes for `run`: `0` success, `1` one or more requests failed (assertions/errors, or `--bail`/`--fail-on-error` — unchanged from prior releases), `2` the runner could not execute the run at all (bad CLI args, missing files, missing plugins, invalid env). Previously every non-success path exited `1`, so CI couldn't tell "the API broke" from "the pipeline is misconfigured." See [CI/CD Integration](https://docs.voiden.md/docs/developer-tools/voiden-runner/ci-cd) for the full table.
10
+ - `schemaVersion` field on the `--json` and `--output-json` payloads for `run` and `report generate` — a stable, versioned contract for tooling that parses runner output. Currently `"1"`.
11
+
12
+ ## v2.1.1 - 2026-06-25
13
+
14
+ ### Fixed
15
+ - A 0-byte file left behind by a failed or interrupted plugin runner download is no longer treated as an installed runner — `hasCoreRunner`/`hasCommunityRunner` now check file size, so the loader falls back to the bundled copy (or re-downloads) instead of importing an empty module
16
+ - Bundled runner assets (`bundled-runners/**`) are now included in the published npm package — `plugin install`/`plugin update` for bundled core plugins no longer requires a network download on a fresh install
17
+
18
+ ## v2.1.0 - 2026-06-24
19
+
20
+ First release published under the `@voiden/runner` name and versioned in lockstep with the desktop app (previously `0.1.0-beta.x`).
21
+
22
+ ### Fixed
23
+ - Set-cookie capture in runtime variables no longer lags one request behind — `byPath` can now navigate `set-cookie.<name>.value`, duplicate `set-cookie` headers are preserved instead of being collapsed, and variable capture now runs before post-request hooks so scripts see the current response's values
24
+ - Restored plugin registry modules (`registryCache.ts`, `updateCheck.ts`) that had gone missing from the package, breaking `plugin list`/`plugin update`
25
+ - Dropped a stale `@voiden/core-extensions` build dependency that no longer exists in the reworked plugin architecture
26
+ - Fixed `npm publish` metadata so the package publishes correctly under the `@voiden` npm scope
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -0,0 +1 @@
1
+ "use strict";var y=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var R=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var A=(r,e)=>()=>(r&&(e=r(r=0)),e);var w=(r,e)=>{for(var t in e)y(r,t,{get:e[t],enumerable:!0})},D=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of R(e))!T.call(r,s)&&s!==t&&y(r,s,{get:()=>e[s],enumerable:!(n=C(e,s))||n.enumerable});return r};var E=r=>D(y({},"__esModule",{value:!0}),r);function F(r,e){let t=r.trim();if(t==="status"||t==="statusCode")return e.response.status;if(t==="statusText")return e.response.statusText;if(t==="responseTime"||t==="duration")return e.response.timing?.duration||0;if(t.startsWith("header.")||t.startsWith("headers.")){let n=t.split("."),s=n[1];if(s.toLowerCase()==="set-cookie"){let i=(0,x.parseCookies)(e.response.headers);if(n.length===2)return i;let c=n.slice(2).join(".");return l(i,c)}return e.response.headers.find(i=>i.key.toLowerCase()===s.toLowerCase())?.value}if(t==="body"||t==="response.body")return e.response.body;if(t.startsWith("body.")||t.startsWith("response.body.")){let n=t.replace(/^(response\.)?body\./,"");return l(e.response.body,n)}if(t.startsWith("response.")){let n=t.replace(/^response\./,"");return l(e.response,n)}return l(e.response.body,t)}function l(r,e){if(!r)return;let t=e.split(/\.|\[/).map(s=>s.replace(/\]$/,"")),n=r;for(let s of t){if(n==null)return;/^\d+$/.test(s)?n=n[parseInt(s,10)]:n=n[s]}return n}function O(r,e){try{if(r.enabled===!1)return{assertion:r,passed:!0,actualValue:null,error:"Skipped (disabled)"};let t=j(r.field),n=t.field,s=t.operator||r.operator||"equals",o=r.expectedValue,i=F(n,e),c=W(s,i,o);return{assertion:r,passed:c,actualValue:i}}catch(t){return{assertion:r,passed:!1,actualValue:null,error:t.message||String(t)}}}function j(r){let e=["equals","eq","==","===","not-equals","ne","!=","!==","contains","includes","not-contains","not-includes","starts-with","startswith","ends-with","endswith","matches","regex","exists","is-defined","not-exists","is-null","is-undefined","greater-than","gt",">","less-than","lt","<","greater-equal","gte",">=","less-equal","lte","<=","is-empty","empty","not-empty","is-truthy","truthy","is-falsy","falsy","type-is","typeof"],t=r.trim().split(/\s+/);if(t.length>=2){let n=t[t.length-1].toLowerCase();if(e.includes(n))return{field:t.slice(0,-1).join(" "),operator:n}}return{field:r.trim(),operator:null}}function W(r,e,t){switch(r.toLowerCase().trim()){case"equals":case"eq":case"==":case"===":return e==null?!1:String(e)===t;case"not-equals":case"ne":case"!=":case"!==":return e==null?!1:String(e)!==t;case"contains":case"includes":return e==null?!1:String(e).includes(t);case"not-contains":case"not-includes":return e==null?!1:!String(e).includes(t);case"starts-with":case"startswith":return e==null?!1:String(e).startsWith(t);case"ends-with":case"endswith":return e==null?!1:String(e).endsWith(t);case"matches":case"regex":if(e==null)return!1;try{return new RegExp(t).test(String(e))}catch{return!1}case"exists":case"is-defined":return e!=null;case"not-exists":case"is-null":case"is-undefined":return e==null;case"greater-than":case"gt":case">":{let s=Number(e),o=Number(t);return!isNaN(s)&&!isNaN(o)&&s>o}case"less-than":case"lt":case"<":{let s=Number(e),o=Number(t);return!isNaN(s)&&!isNaN(o)&&s<o}case"greater-equal":case"gte":case">=":{let s=Number(e),o=Number(t);return!isNaN(s)&&!isNaN(o)&&s>=o}case"less-equal":case"lte":case"<=":{let s=Number(e),o=Number(t);return!isNaN(s)&&!isNaN(o)&&s<=o}case"is-empty":case"empty":return e==null?!1:Array.isArray(e)?e.length===0:typeof e=="string"?e==="":typeof e=="object"?Object.keys(e).length===0:!1;case"not-empty":return e==null?!1:Array.isArray(e)?e.length>0:typeof e=="string"?e!=="":typeof e=="object"?Object.keys(e).length>0:!0;case"is-truthy":case"truthy":return!!e;case"is-falsy":case"falsy":return!e;case"type-is":case"typeof":return typeof e===t.toLowerCase();default:throw new Error(`Unknown operator: ${r}`)}}function S(r,e){return r.map(t=>O(t,e))}var x,N=A(()=>{"use strict";x=require("@voiden/sdk/shared")});var q={};w(q,{postProcessAssertionsHook:()=>$});function v(r){let e=[];if(!r||!r.content)return e;function t(n){if(n.type==="assertions-table"){let s=L(n);e.push(...s)}n.content&&Array.isArray(n.content)&&n.content.forEach(s=>t(s))}return t(r),e}function L(r){let e=[];try{if(r.attrs&&Array.isArray(r.attrs.rows)){let s=r.attrs.rows;for(let o of s)!o.description&&!o.field&&!o.operator&&!o.expectedValue||o.enabled!==!1&&e.push({description:o.description||"",field:o.field||"",operator:o.operator||"equals",expectedValue:o.expectedValue||"",enabled:!0});return e}let t=Array.isArray(r.content)?r.content.find(s=>s.type==="table"||s.type==="assertions-table"):null;if(!t)return e;let n=t.rows||t.content||[];for(let s=0;s<n.length;s++){let o=n[s];if(Array.isArray(o.row)){if(o.attrs?.disabled===!0)continue;let[a,g,h,b]=o.row;if(!a&&!g&&!h&&!b)continue;e.push({description:String(a||"").trim(),field:String(g||"").trim(),operator:String(h||"equals").trim()||"equals",expectedValue:String(b||"").trim(),enabled:!0});continue}if(o.type!=="tableRow"||o.attrs&&o.attrs.disabled===!0)continue;let i=o.content||[];if(i.length<4)continue;let c=d(i[0]).trim(),p=d(i[1]).trim(),f=d(i[2]).trim(),u=d(i[3]).trim();!c&&!p&&!f&&!u||!(!(i.length>=5)||P(i[4]))||e.push({description:c,field:p,operator:f||"equals",expectedValue:u,enabled:!0})}}catch(t){console.error("Error extracting assertions from table:",t)}return e}function d(r){return r?r.type==="text"?r.text||"":r.content&&Array.isArray(r.content)?r.content.map(e=>d(e)).join(""):"":""}function P(r){if(!r||!r.content)return!0;let e=r.content.find(t=>t.type==="checkbox");return e&&e.attrs?e.attrs.checked!==!1:!0}async function $(r){let{requestState:e,responseState:t,metadata:n}=r;try{let s=e?.metadata?.editorDocument||n?.requestDocument||n?.editorDocument;if(!s)return;let o=v(s);if(o.length===0)return;let i=(typeof window<"u"?window:void 0)?.electron?.env?.replaceVariables;if(i)for(let a of o)a.expectedValue&&a.expectedValue.includes("{{")&&(a.expectedValue=await i(a.expectedValue)),a.field&&a.field.includes("{{")&&(a.field=await i(a.field));let c=t.body;if(typeof c=="string"&&c.trim())try{c=JSON.parse(c)}catch{}let p={response:{status:t.status,statusText:t.statusText,headers:t.headers||[],body:c,contentType:t.contentType,timing:t.timing}},f=S(o,p),u=f.filter(a=>a.passed).length,m=f.filter(a=>!a.passed).length;t.metadata||(t.metadata={}),t.metadata.assertionResults={results:f,totalAssertions:o.length,passedAssertions:u,failedAssertions:m}}catch(s){console.error("[Simple Assertions] Error in post-process assertions hook:",s)}}var k=A(()=>{"use strict";N()});var J={};w(J,{default:()=>z});module.exports=E(J);var H=r=>({onload(){r.pipeline.registerHook("pre-processing",async e=>{e.editor&&(e.requestState.metadata||(e.requestState.metadata={}),e.requestState.metadata.editorDocument=e.editor.getJSON())},5),r.pipeline.registerHook("post-processing",async e=>{let{postProcessAssertionsHook:t}=await Promise.resolve().then(()=>(k(),q));await t(e)},15),r.pipeline.registerHook("post-processing",async e=>{let t=e.responseState?.metadata?.assertionResults;if(t?.results?.length){e.responseState.metadata||(e.responseState.metadata={}),Array.isArray(e.responseState.metadata.reportEntries)||(e.responseState.metadata.reportEntries=[]);for(let n of t.results){let s=n.assertion?.description?.trim()||`${n.assertion?.field??""} ${n.assertion?.operator??""} ${n.assertion?.expectedValue??""}`.trim();e.responseState.metadata.reportEntries.push({type:"assertion",message:s||"Assertion",passed:n.passed,actual:n.actualValue,expected:n.assertion?.expectedValue,operator:n.assertion?.operator})}}},50)}}),z=H;
@@ -0,0 +1,9 @@
1
+ {
2
+ "simple-assertions": "1.0.3",
3
+ "voiden-advanced-auth": "2.0.6",
4
+ "voiden-faker": "1.1.0",
5
+ "voiden-graphql": "1.0.5",
6
+ "voiden-rest-api": "1.4.7",
7
+ "voiden-scripting": "1.1.5",
8
+ "voiden-sockets-grpcs": "1.1.5"
9
+ }
@@ -0,0 +1 @@
1
+ "use strict";var o=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var R=(e,n)=>{for(var r in n)o(e,r,{get:n[r],enumerable:!0})},x=(e,n,r,u)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of c(n))!d.call(e,t)&&t!==r&&o(e,t,{get:()=>n[t],enumerable:!(u=a(n,t))||u.enumerable});return e};var p=e=>x(o({},"__esModule",{value:!0}),e);var i={};R(i,{default:()=>f});module.exports=p(i);var y=e=>({onload(){}}),f=y;