@venos-inc/venos 0.1.2 → 0.1.3
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/dist/index.js +35 -34
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,52 +1,53 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{existsSync as
|
|
3
|
-
`}var w="http://127.0.0.1:4000/v1";var
|
|
2
|
+
import{existsSync as tr,mkdirSync as vt,readFileSync as wt,rmSync as St,writeFileSync as xt}from"node:fs";import{dirname as Ct,join as kt}from"node:path";import{randomBytes as Ot}from"node:crypto";import{existsSync as Sr,readFileSync as xr}from"node:fs";import{join as Cr}from"node:path";import{copyFileSync as gr,existsSync as ee,mkdirSync as hr,renameSync as yr,writeFileSync as vr}from"node:fs";import{dirname as wr}from"node:path";var re=".venos-backup";function d(e,r){hr(wr(e),{recursive:!0}),ee(e)&&!ee(e+re)&&gr(e,e+re);let t=e+".tmp";vr(t,r,{mode:420}),yr(t,e)}function m(e){return JSON.stringify(e,null,2)+`
|
|
3
|
+
`}var w="http://127.0.0.1:4000/v1";var oe="venos";function U(e){return(e??[]).some(r=>r.hooks.some(t=>typeof t.command=="string"&&t.command.includes(oe)))}function te(e,r){let t=e??[];return U(t)?t:[...t,{matcher:"*",hooks:[{type:"command",command:r}]}]}function ne(e){return(e??[]).map(r=>({...r,hooks:r.hooks.filter(t=>typeof t.command!="string"||!t.command.includes(oe))})).filter(r=>r.hooks.length>0)}var j={name:"claude-code",transport:"claude-hook",configPath(e){return Cr(e,".claude","settings.json")},isInstalled(e){return!0},load(e){if(!Sr(e))return{};try{return JSON.parse(xr(e,"utf8"))}catch{return{}}},isWired(e){return U(e.hooks?.PreToolUse)&&U(e.hooks?.PostToolUse)},inject(e,r){let t=e.hooks??{};return{...e,hooks:{...t,PreToolUse:te(t.PreToolUse,r.hookCommand),PostToolUse:te(t.PostToolUse,r.hookCommand)}}},remove(e){return e.hooks?{...e,hooks:{...e.hooks,PreToolUse:ne(e.hooks.PreToolUse),PostToolUse:ne(e.hooks.PostToolUse)}}:e},write(e,r){d(e,m(r))}};import{existsSync as S,readFileSync as kr}from"node:fs";import{join as E}from"node:path";function ie(e){let r=e.mcpServers?.venos;if(!r||r.command!=="node")return!1;let t=r.args?.[0];return!t||t.includes("/A2A/")?!1:S(t)}var W={name:"cursor",transport:"mcp-json",configPath(e){return E(e,".cursor","mcp.json")},isInstalled(e){let r=E(e,".cursor");return S(r)?S(E(r,"mcp.json"))||S(E(r,"extensions")):!1},load(e){if(!S(e))return{};try{return JSON.parse(kr(e,"utf8"))}catch{return{}}},isWired(e){return ie(e)},inject(e,r){return ie(e)?e:{...e,mcpServers:{...e.mcpServers??{},venos:{command:"node",args:[r.mcpServerPath],env:{VENOS_URL:r.orchestratorUrl,VENOS_ORG_ID:r.orgId,...r.apiKey?{VENOS_API_KEY:r.apiKey}:{}}}}}},remove(e){if(!e.mcpServers?.venos)return e;let{venos:r,...t}=e.mcpServers;return{...e,mcpServers:t}},write(e,r){d(e,m(r))}};import{existsSync as L,readFileSync as Vr}from"node:fs";import{join as me}from"node:path";function Or(e,r){let t=e.slice(0,r).split(/\r\n|\n|\r/g);return[t.length,t.pop().length+1]}function Er(e,r,t){let n=e.split(/\r\n|\n|\r/g),o="",i=(Math.log10(r+1)|0)+1;for(let s=r-1;s<=r+1;s++){let a=n[s-1];a&&(o+=s.toString().padEnd(i," "),o+=": ",o+=a,o+=`
|
|
4
4
|
`,s===r&&(o+=" ".repeat(i+t+2),o+=`^
|
|
5
|
-
`))}return o}var u=class extends Error{line;column;codeblock;constructor(r,t){let[n,o]=
|
|
5
|
+
`))}return o}var u=class extends Error{line;column;codeblock;constructor(r,t){let[n,o]=Or(t.toml,t.ptr),i=Er(t.toml,n,o);super(`Invalid TOML document: ${r}
|
|
6
6
|
|
|
7
|
-
${i}`,t),this.line=n,this.column=o,this.codeblock=i}};function
|
|
7
|
+
${i}`,t),this.line=n,this.column=o,this.codeblock=i}};function Pr(e,r){let t=0;for(;e[r-++t]==="\\";);return--t&&t%2}function P(e,r=0,t=e.length){let n=e.indexOf(`
|
|
8
8
|
`,r);return e[n-1]==="\r"&&n--,n<=t?n:-1}function y(e,r){for(let t=r;t<e.length;t++){let n=e[t];if(n===`
|
|
9
9
|
`)return t;if(n==="\r"&&e[t+1]===`
|
|
10
10
|
`)return t+1;if(n<" "&&n!==" "||n==="\x7F")throw new u("control characters are not allowed in comments",{toml:e,ptr:r})}return e.length}function g(e,r,t,n){let o;for(;;){for(;(o=e[r])===" "||o===" "||!t&&(o===`
|
|
11
11
|
`||o==="\r"&&e[r+1]===`
|
|
12
|
-
`);)r++;if(n||o!=="#")break;r=y(e,r)}return r}function
|
|
12
|
+
`);)r++;if(n||o!=="#")break;r=y(e,r)}return r}function se(e,r,t,n,o=!1){if(!n)return r=P(e,r),r<0?e.length:r;for(let i=r;i<e.length;i++){let s=e[i];if(s==="#")i=P(e,i);else{if(s===t)return i+1;if(s===n||o&&(s===`
|
|
13
13
|
`||s==="\r"&&e[i+1]===`
|
|
14
|
-
`))return i}}throw new u("cannot find end of structure",{toml:e,ptr:r})}function b(e,r){let t=e[r],n=t===e[r+1]&&e[r+1]===e[r+2]?e.slice(r,r+3):t;r+=n.length-1;do r=e.indexOf(n,++r);while(r>-1&&t!=="'"&&
|
|
14
|
+
`))return i}}throw new u("cannot find end of structure",{toml:e,ptr:r})}function b(e,r){let t=e[r],n=t===e[r+1]&&e[r+1]===e[r+2]?e.slice(r,r+3):t;r+=n.length-1;do r=e.indexOf(n,++r);while(r>-1&&t!=="'"&&Pr(e,r));return r>-1&&(r+=n.length,n.length>1&&(e[r]===t&&r++,e[r]===t&&r++)),r}var br=/^(\d{4}-\d{2}-\d{2})?[T ]?(?:(\d{2}):\d{2}(?::\d{2}(?:\.\d+)?)?)?(Z|[-+]\d{2}:\d{2})?$/i,x=class e extends Date{#r=!1;#t=!1;#e=null;constructor(r){let t=!0,n=!0,o="Z";if(typeof r=="string"){let i=r.match(br);i?(i[1]||(t=!1,r=`0000-01-01T${r}`),n=!!i[2],n&&r[10]===" "&&(r=r.replace(" ","T")),i[2]&&+i[2]>23?r="":(o=i[3]||null,r=r.toUpperCase(),!o&&n&&(r+="Z"))):r=""}super(r),isNaN(this.getTime())||(this.#r=t,this.#t=n,this.#e=o)}isDateTime(){return this.#r&&this.#t}isLocal(){return!this.#r||!this.#t||!this.#e}isDate(){return this.#r&&!this.#t}isTime(){return this.#t&&!this.#r}isValid(){return this.#r||this.#t}toISOString(){let r=super.toISOString();if(this.isDate())return r.slice(0,10);if(this.isTime())return r.slice(11,23);if(this.#e===null)return r.slice(0,-1);if(this.#e==="Z")return r;let t=+this.#e.slice(1,3)*60+ +this.#e.slice(4,6);return t=this.#e[0]==="-"?t:-t,new Date(this.getTime()-t*6e4).toISOString().slice(0,-1)+this.#e}static wrapAsOffsetDateTime(r,t="Z"){let n=new e(r);return n.#e=t,n}static wrapAsLocalDateTime(r){let t=new e(r);return t.#e=null,t}static wrapAsLocalDate(r){let t=new e(r);return t.#t=!1,t.#e=null,t}static wrapAsLocalTime(r){let t=new e(r);return t.#r=!1,t.#e=null,t}};var Tr=/^((0x[0-9a-fA-F](_?[0-9a-fA-F])*)|(([+-]|0[ob])?\d(_?\d)*))$/,_r=/^[+-]?\d(_?\d)*(\.\d(_?\d)*)?([eE][+-]?\d(_?\d)*)?$/,Ar=/^[+-]?0[0-9_]/,Rr=/^[0-9a-f]{2,8}$/i,ae={b:"\b",t:" ",n:`
|
|
15
15
|
`,f:"\f",r:"\r",e:"\x1B",'"':'"',"\\":"\\"};function T(e,r=0,t=e.length){let n=e[r]==="'",o=e[r++]===e[r]&&e[r]===e[r+1];o&&(t-=2,e[r+=2]==="\r"&&r++,e[r]===`
|
|
16
16
|
`&&r++);let i=0,s,a="",l=r;for(;r<t-1;){let c=e[r++];if(c===`
|
|
17
17
|
`||c==="\r"&&e[r]===`
|
|
18
|
-
`){if(!o)throw new u("newlines are not allowed in strings",{toml:e,ptr:r-1})}else if(c<" "&&c!==" "||c==="\x7F")throw new u("control characters are not allowed in strings",{toml:e,ptr:r-1});if(s){if(s=!1,c==="x"||c==="u"||c==="U"){let f=e.slice(r,r+=c==="x"?2:c==="u"?4:8);if(!
|
|
18
|
+
`){if(!o)throw new u("newlines are not allowed in strings",{toml:e,ptr:r-1})}else if(c<" "&&c!==" "||c==="\x7F")throw new u("control characters are not allowed in strings",{toml:e,ptr:r-1});if(s){if(s=!1,c==="x"||c==="u"||c==="U"){let f=e.slice(r,r+=c==="x"?2:c==="u"?4:8);if(!Rr.test(f))throw new u("invalid unicode escape",{toml:e,ptr:i});try{a+=String.fromCodePoint(parseInt(f,16))}catch{throw new u("invalid unicode escape",{toml:e,ptr:i})}}else if(o&&(c===`
|
|
19
19
|
`||c===" "||c===" "||c==="\r")){if(r=g(e,r-1,!0),e[r]!==`
|
|
20
|
-
`&&e[r]!=="\r")throw new u("invalid escape: only line-ending whitespace may be escaped",{toml:e,ptr:i});r=g(e,r)}else if(c in
|
|
21
|
-
`&&e[s]!=="\r")throw new u("unexpected character encountered",{toml:e,ptr:s});s+=+(e[s]===",")}return[l,s]}s=
|
|
22
|
-
`&&s!=="\r"){let a,l=o,c=!1,[f,p]=_(e,r-1);for(let O=0;O<f.length;O++){if(O&&(l=c?l[a]:l[a]={}),a=f[O],(c=Object.hasOwn(l,a))&&(typeof l[a]!="object"||i.has(l[a])))throw new u("trying to redefine an already defined value",{toml:e,ptr:r});!c&&a==="__proto__"&&Object.defineProperty(l,a,{enumerable:!0,configurable:!0,writable:!0})}if(c)throw new u("trying to redefine an already defined value",{toml:e,ptr:r});let[h,
|
|
23
|
-
`&&i!=="\r"){let s=C(e,r-1,"]",t-1,n);o.push(s[0]),r=s[1]}}if(!i)throw new u("unfinished array encountered",{toml:e,ptr:r});return[o,r]}function
|
|
24
|
-
`&&e[a]!=="\r")throw new u("each key-value declaration must be followed by an end-of-line",{toml:e,ptr:a});a=g(e,a)}return n}var
|
|
20
|
+
`&&e[r]!=="\r")throw new u("invalid escape: only line-ending whitespace may be escaped",{toml:e,ptr:i});r=g(e,r)}else if(c in ae)a+=ae[c];else throw new u("unrecognized escape sequence",{toml:e,ptr:i});l=r}else!n&&c==="\\"&&(i=r-1,s=!0,a+=e.slice(l,i))}return a+e.slice(l,t-1)}function ce(e,r,t,n){if(e==="true")return!0;if(e==="false")return!1;if(e==="-inf")return-1/0;if(e==="inf"||e==="+inf")return 1/0;if(e==="nan"||e==="+nan"||e==="-nan")return NaN;if(e==="-0")return n?0n:0;let o=Tr.test(e);if(o||_r.test(e)){if(Ar.test(e))throw new u("leading zeroes are not allowed",{toml:r,ptr:t});e=e.replace(/_/g,"");let s=+e;if(isNaN(s))throw new u("invalid number",{toml:r,ptr:t});if(o){if((o=!Number.isSafeInteger(s))&&!n)throw new u("integer value cannot be represented losslessly",{toml:r,ptr:t});(o||n===!0)&&(s=BigInt(e))}return s}let i=new x(e);if(!i.isValid())throw new u("invalid value",{toml:r,ptr:t});return i}function Ir(e,r,t){let n=e.slice(r,t),o=n.indexOf("#");return o>-1&&(y(e,o),n=n.slice(0,o)),[n.trimEnd(),o]}function C(e,r,t,n,o){if(n===0)throw new u("document contains excessively nested structures. aborting.",{toml:e,ptr:r});let i=e[r];if(i==="["||i==="{"){let[l,c]=i==="["?ue(e,r,n,o):le(e,r,n,o);if(t){if(c=g(e,c),e[c]===",")c++;else if(e[c]!==t)throw new u("expected comma or end of structure",{toml:e,ptr:c})}return[l,c]}let s;if(i==='"'||i==="'"){s=b(e,r);let l=T(e,r,s);if(t){if(s=g(e,s),e[s]&&e[s]!==","&&e[s]!==t&&e[s]!==`
|
|
21
|
+
`&&e[s]!=="\r")throw new u("unexpected character encountered",{toml:e,ptr:s});s+=+(e[s]===",")}return[l,s]}s=se(e,r,",",t);let a=Ir(e,r,s-+(e[s-1]===","));if(!a[0])throw new u("incomplete key-value declaration: no value specified",{toml:e,ptr:r});return t&&a[1]>-1&&(s=g(e,r+a[1]),s+=+(e[s]===",")),[ce(a[0],e,r,o),s]}var Ur=/^[a-zA-Z0-9-_]+[ \t]*$/;function _(e,r,t="="){let n=r-1,o=[],i=e.indexOf(t,r);if(i<0)throw new u("incomplete key-value: cannot find end of key",{toml:e,ptr:r});do{let s=e[r=++n];if(s!==" "&&s!==" ")if(s==='"'||s==="'"){if(s===e[r+1]&&s===e[r+2])throw new u("multiline strings are not allowed in keys",{toml:e,ptr:r});let a=b(e,r);if(a<0)throw new u("unfinished string encountered",{toml:e,ptr:r});n=e.indexOf(".",a);let l=e.slice(a,n<0||n>i?i:n),c=P(l);if(c>-1)throw new u("newlines are not allowed in keys",{toml:e,ptr:r+n+c});if(l.trimStart())throw new u("found extra tokens after the string part",{toml:e,ptr:a});if(i<a&&(i=e.indexOf(t,a),i<0))throw new u("incomplete key-value: cannot find end of key",{toml:e,ptr:r});o.push(T(e,r,a))}else{n=e.indexOf(".",r);let a=e.slice(r,n<0||n>i?i:n);if(!Ur.test(a))throw new u("only letter, numbers, dashes and underscores are allowed in keys",{toml:e,ptr:r});o.push(a.trimEnd())}}while(n+1&&n<i);return[o,g(e,i+1,!0,!0)]}function le(e,r,t,n){let o={},i=new Set,s;for(r++;(s=e[r++])!=="}"&&s;){if(s===",")throw new u("expected value, found comma",{toml:e,ptr:r-1});if(s==="#")r=y(e,r);else if(s!==" "&&s!==" "&&s!==`
|
|
22
|
+
`&&s!=="\r"){let a,l=o,c=!1,[f,p]=_(e,r-1);for(let O=0;O<f.length;O++){if(O&&(l=c?l[a]:l[a]={}),a=f[O],(c=Object.hasOwn(l,a))&&(typeof l[a]!="object"||i.has(l[a])))throw new u("trying to redefine an already defined value",{toml:e,ptr:r});!c&&a==="__proto__"&&Object.defineProperty(l,a,{enumerable:!0,configurable:!0,writable:!0})}if(c)throw new u("trying to redefine an already defined value",{toml:e,ptr:r});let[h,pr]=C(e,p,"}",t-1,n);i.add(h),l[a]=h,r=pr}}if(!s)throw new u("unfinished table encountered",{toml:e,ptr:r});return[o,r]}function ue(e,r,t,n){let o=[],i;for(r++;(i=e[r++])!=="]"&&i;){if(i===",")throw new u("expected value, found comma",{toml:e,ptr:r-1});if(i==="#")r=y(e,r);else if(i!==" "&&i!==" "&&i!==`
|
|
23
|
+
`&&i!=="\r"){let s=C(e,r-1,"]",t-1,n);o.push(s[0]),r=s[1]}}if(!i)throw new u("unfinished array encountered",{toml:e,ptr:r});return[o,r]}function fe(e,r,t,n){let o=r,i=t,s,a=!1,l;for(let c=0;c<e.length;c++){if(c){if(o=a?o[s]:o[s]={},i=(l=i[s]).c,n===0&&(l.t===1||l.t===2))return null;if(l.t===2){let f=o.length-1;o=o[f],i=i[f].c}}if(s=e[c],(a=Object.hasOwn(o,s))&&i[s]?.t===0&&i[s]?.d)return null;a||(s==="__proto__"&&(Object.defineProperty(o,s,{enumerable:!0,configurable:!0,writable:!0}),Object.defineProperty(i,s,{enumerable:!0,configurable:!0,writable:!0})),i[s]={t:c<e.length-1&&n===2?3:n,d:!1,i:0,c:{}})}if(l=i[s],l.t!==n&&!(n===1&&l.t===3)||(n===2&&(l.d||(l.d=!0,o[s]=[]),o[s].push(o={}),l.c[l.i++]=l={t:1,d:!1,i:0,c:{}}),l.d))return null;if(l.d=!0,n===1)o=a?o[s]:o[s]={};else if(n===0&&a)return null;return[s,o,l.c]}function N(e,{maxDepth:r=1e3,integersAsBigInt:t}={}){let n={},o={},i=n,s=o;for(let a=g(e,0);a<e.length;){if(e[a]==="["){let l=e[++a]==="[",c=_(e,a+=+l,"]");if(l){if(e[c[1]-1]!=="]")throw new u("expected end of table declaration",{toml:e,ptr:c[1]-1});c[1]++}let f=fe(c[0],n,o,l?2:1);if(!f)throw new u("trying to redefine an already defined table or value",{toml:e,ptr:a});s=f[2],i=f[1],a=c[1]}else{let l=_(e,a),c=fe(l[0],i,s,0);if(!c)throw new u("trying to redefine an already defined table or value",{toml:e,ptr:a});let f=C(e,l[1],void 0,r,t);c[1][c[0]]=f[0],a=f[1]}if(a=g(e,a,!0),e[a]&&e[a]!==`
|
|
24
|
+
`&&e[a]!=="\r")throw new u("each key-value declaration must be followed by an end-of-line",{toml:e,ptr:a});a=g(e,a)}return n}var de=/^[a-z0-9-_]+$/i;function k(e){let r=typeof e;if(r==="object"){if(Array.isArray(e))return"array";if(e instanceof Date)return"date"}return r}function jr(e){for(let r=0;r<e.length;r++)if(k(e[r])!=="object")return!1;return e.length!=0}function $(e){return JSON.stringify(e).replace(/\x7f/g,"\\u007f")}function V(e,r,t,n){if(t===0)throw new Error("Could not stringify the object: maximum object depth exceeded");if(r==="number")return isNaN(e)?"nan":e===1/0?"inf":e===-1/0?"-inf":n&&Number.isInteger(e)?e.toFixed(1):e.toString();if(r==="bigint"||r==="boolean")return e.toString();if(r==="string")return $(e);if(r==="date"){if(isNaN(e.getTime()))throw new TypeError("cannot serialize invalid date");return e.toISOString()}if(r==="object")return Wr(e,t,n);if(r==="array")return Nr(e,t,n)}function Wr(e,r,t){let n=Object.keys(e);if(n.length===0)return"{}";let o="{ ";for(let i=0;i<n.length;i++){let s=n[i];i&&(o+=", "),o+=de.test(s)?s:$(s),o+=" = ",o+=V(e[s],k(e[s]),r-1,t)}return o+" }"}function Nr(e,r,t){if(e.length===0)return"[]";let n="[ ";for(let o=0;o<e.length;o++){if(o&&(n+=", "),e[o]===null||e[o]===void 0)throw new TypeError("arrays cannot contain null or undefined values");n+=V(e[o],k(e[o]),r-1,t)}return n+" ]"}function $r(e,r,t,n){if(t===0)throw new Error("Could not stringify the object: maximum object depth exceeded");let o="";for(let i=0;i<e.length;i++)o+=`${o&&`
|
|
25
25
|
`}[[${r}]]
|
|
26
|
-
`,o+=
|
|
27
|
-
`)
|
|
28
|
-
`)+
|
|
26
|
+
`,o+=M(0,e[i],r,t,n);return o}function M(e,r,t,n,o){if(n===0)throw new Error("Could not stringify the object: maximum object depth exceeded");let i="",s="",a=Object.keys(r);for(let l=0;l<a.length;l++){let c=a[l];if(r[c]!==null&&r[c]!==void 0){let f=k(r[c]);if(f==="symbol"||f==="function")throw new TypeError(`cannot serialize values of type '${f}'`);let p=de.test(c)?c:$(c);if(f==="array"&&jr(r[c]))s+=(s&&`
|
|
27
|
+
`)+$r(r[c],t?`${t}.${p}`:p,n-1,o);else if(f==="object"){let h=t?`${t}.${p}`:p;s+=(s&&`
|
|
28
|
+
`)+M(h,r[c],h,n-1,o)}else i+=p,i+=" = ",i+=V(r[c],f,n,o),i+=`
|
|
29
29
|
`}}return e&&(i||!s)&&(i=i?`[${e}]
|
|
30
30
|
${i}`:`[${e}]`),i&&s?`${i}
|
|
31
|
-
${s}`:i||s}function
|
|
31
|
+
${s}`:i||s}function J(e,{maxDepth:r=1e3,numbersAsFloat:t=!1}={}){if(k(e)!=="object")throw new TypeError("stringify can only be called with an object");let n=M(0,e,"",r,t);return n[n.length-1]!==`
|
|
32
32
|
`?n+`
|
|
33
|
-
`:n}function
|
|
34
|
-
`)}};import{existsSync as
|
|
35
|
-
`).some(n=>n.trim()===
|
|
36
|
-
`);t.length>0&&t[t.length-1]===""&&t.pop();let n=t.filter(i=>!
|
|
33
|
+
`:n}function pe(e){let r=e.mcp_servers?.venos;if(!r||r.command!=="node")return!1;let t=r.args?.[0];return!t||t.includes("/A2A/")?!1:L(t)}var ge={name:"codex",transport:"mcp-toml",configPath(e){return me(e,".codex","config.toml")},isInstalled(e){return L(me(e,".codex"))},load(e){if(!L(e))return{};try{return N(Vr(e,"utf8"))}catch{return{}}},isWired(e){return pe(e)},inject(e,r){return pe(e)?e:{...e,mcp_servers:{...e.mcp_servers??{},venos:{command:"node",args:[r.mcpServerPath],env:{VENOS_URL:r.orchestratorUrl,VENOS_ORG_ID:r.orgId,...r.apiKey?{VENOS_API_KEY:r.apiKey}:{},VENOS_SOURCE:"codex"}}}}},remove(e){if(!e.mcp_servers?.venos)return e;let{venos:r,...t}=e.mcp_servers;return{...e,mcp_servers:t}},write(e,r){d(e,J(r)+`
|
|
34
|
+
`)}};import{existsSync as he,readFileSync as Mr}from"node:fs";import{join as ye}from"node:path";var Se="venos";function H(e){return(e??[]).some(r=>r.hooks.some(t=>typeof t.command=="string"&&t.command.includes(Se)))}function ve(e,r){let t=e??[];return H(t)?t:[...t,{matcher:"*",hooks:[{type:"command",command:r}]}]}function we(e){return(e??[]).map(r=>({...r,hooks:r.hooks.filter(t=>typeof t.command!="string"||!t.command.includes(Se))})).filter(r=>r.hooks.length>0)}function Jr(e){return`${e.hookCommand} --source codex`}var xe={name:"codex-hook",transport:"claude-hook",configPath(e){return ye(e,".codex","hooks.json")},isInstalled(e){return he(ye(e,".codex"))},load(e){if(!he(e))return{};try{return JSON.parse(Mr(e,"utf8"))}catch{return{}}},isWired(e){return H(e.hooks?.PreToolUse)&&H(e.hooks?.PostToolUse)},inject(e,r){let t=e.hooks??{},n=Jr(r);return{...e,hooks:{...t,PreToolUse:ve(t.PreToolUse,n),PostToolUse:ve(t.PostToolUse,n)}}},remove(e){return e.hooks?{...e,hooks:{...e.hooks,PreToolUse:we(e.hooks.PreToolUse),PostToolUse:we(e.hooks.PostToolUse)}}:e},write(e,r){d(e,m(r))}};import{existsSync as F,readFileSync as Lr}from"node:fs";import{join as Ce}from"node:path";function ke(e){let r=e.mcpServers?.venos;if(!r||r.command!=="node")return!1;let t=r.args?.[0];return!t||t.includes("/A2A/")?!1:F(t)}var Oe={name:"windsurf",transport:"mcp-json",configPath(e){return Ce(e,".codeium","windsurf","mcp_config.json")},isInstalled(e){return F(Ce(e,".codeium","windsurf"))},load(e){if(!F(e))return{};try{return JSON.parse(Lr(e,"utf8"))}catch{return{}}},isWired(e){return ke(e)},inject(e,r){return ke(e)?e:{...e,mcpServers:{...e.mcpServers??{},venos:{command:"node",args:[r.mcpServerPath],env:{VENOS_URL:r.orchestratorUrl,VENOS_ORG_ID:r.orgId,...r.apiKey?{VENOS_API_KEY:r.apiKey}:{}}}}}},remove(e){if(!e.mcpServers?.venos)return e;let{venos:r,...t}=e.mcpServers;return{...e,mcpServers:t}},write(e,r){d(e,m(r))}};import{existsSync as K,readFileSync as Hr}from"node:fs";import{join as v}from"node:path";var Ee="saoudrizwan.claude-dev",Fr="cline_mcp_settings.json";function Pe(e){if(process.platform==="darwin")return v(e,"Library","Application Support","Code","User");if(process.platform==="win32"){let r=process.env.APPDATA??v(e,"AppData","Roaming");return v(r,"Code","User")}return v(e,".config","Code","User")}function be(e){let r=e.mcpServers?.venos;if(!r||r.command!=="node")return!1;let t=r.args?.[0];return!t||t.includes("/A2A/")?!1:K(t)}var Te={name:"cline",transport:"mcp-json",configPath(e){return v(Pe(e),"globalStorage",Ee,"settings",Fr)},isInstalled(e){return K(v(Pe(e),"globalStorage",Ee))},load(e){if(!K(e))return{};try{return JSON.parse(Hr(e,"utf8"))}catch{return{}}},isWired(e){return be(e)},inject(e,r){return be(e)?e:{...e,mcpServers:{...e.mcpServers??{},venos:{command:"node",args:[r.mcpServerPath],env:{VENOS_URL:r.orchestratorUrl,VENOS_ORG_ID:r.orgId,...r.apiKey?{VENOS_API_KEY:r.apiKey}:{}}}}}},remove(e){if(!e.mcpServers?.venos)return e;let{venos:r,...t}=e.mcpServers;return{...e,mcpServers:t}},write(e,r){d(e,m(r))}};import{existsSync as D,readFileSync as Kr}from"node:fs";import{join as _e}from"node:path";function Ae(e){let r=e.context_servers?.venos;if(!r||r.command?.path!=="node")return!1;let t=r.command.args?.[0];return!t||t.includes("/A2A/")?!1:D(t)}var Re={name:"zed",transport:"mcp-json",configPath(e){return _e(e,".config","zed","settings.json")},isInstalled(e){return D(_e(e,".config","zed"))},load(e){if(!D(e))return{};try{return JSON.parse(Kr(e,"utf8"))}catch{return{}}},isWired(e){return Ae(e)},inject(e,r){return Ae(e)?e:{...e,context_servers:{...e.context_servers??{},venos:{command:{path:"node",args:[r.mcpServerPath],env:{VENOS_URL:r.orchestratorUrl,VENOS_ORG_ID:r.orgId,...r.apiKey?{VENOS_API_KEY:r.apiKey}:{}}},settings:{}}}}},remove(e){if(!e.context_servers?.venos)return e;let{venos:r,...t}=e.context_servers;return{...e,context_servers:t}},write(e,r){d(e,m(r))}};import{existsSync as B,readFileSync as Dr}from"node:fs";import{join as Ie}from"node:path";function Ue(e){let r=e.mcpServers?.venos;if(!r||r.command!=="node")return!1;let t=r.args?.[0];return!t||t.includes("/A2A/")?!1:B(t)}var je={name:"jetbrains",transport:"mcp-json",configPath(e){return Ie(e,".junie","mcp","mcp.json")},isInstalled(e){return B(Ie(e,".junie"))},load(e){if(!B(e))return{};try{return JSON.parse(Dr(e,"utf8"))}catch{return{}}},isWired(e){return Ue(e)},inject(e,r){return Ue(e)?e:{...e,mcpServers:{...e.mcpServers??{},venos:{command:"node",args:[r.mcpServerPath],env:{VENOS_URL:r.orchestratorUrl,VENOS_ORG_ID:r.orgId,...r.apiKey?{VENOS_API_KEY:r.apiKey}:{}}}}}},remove(e){if(!e.mcpServers?.venos)return e;let{venos:r,...t}=e.mcpServers;return{...e,mcpServers:t}},write(e,r){d(e,m(r))}};import{existsSync as We,readFileSync as Br,rmSync as Gr}from"node:fs";import{join as zr}from"node:path";var Yr="openai-api-base",Zr=".aider.conf.yml";function Ne(){return`${Yr}: ${w}`}function Xr(e){return/^\s*openai-api-base\s*:/.test(e)}var $e={name:"aider",transport:"mcp-json",configPath(e){return zr(e,Zr)},isInstalled(){return!0},load(e){let r=We(e)?Br(e,"utf8"):"";return{wired:r.split(`
|
|
35
|
+
`).some(n=>n.trim()===Ne()),raw:r}},isWired(e){return e.wired},inject(e){return e.wired?e:{...e,wired:!0}},remove(e){return{...e,wired:!1}},write(e,r){let t=r.raw===""?[]:r.raw.split(`
|
|
36
|
+
`);t.length>0&&t[t.length-1]===""&&t.pop();let n=t.filter(i=>!Xr(i)),o=r.wired?[...n,Ne()]:n;if(o.length===0){We(e)&&Gr(e,{force:!0});return}d(e,o.join(`
|
|
37
37
|
`)+`
|
|
38
|
-
`)}};import{accessSync as
|
|
38
|
+
`)}};import{accessSync as qr,constants as Qr,existsSync as Me,readFileSync as et}from"node:fs";import{delimiter as rt}from"node:path";import{join as Je}from"node:path";var tt="obsidian-cli",nt="obsidian-cli.json";function ot(e){try{return qr(e,Qr.X_OK),!0}catch{return!1}}function it(e){return(process.env.PATH??"").split(rt).some(t=>{if(t.trim()==="")return!1;let n=Je(t,e);return Me(n)&&ot(n)})}function Ve(e){return e.venos?.source==="obsidian-cli"&&e.venos.wired===!0}var Le={name:"obsidian-cli",transport:"mcp-json",configPath(e){return Je(e,".venos",nt)},isInstalled(){return it(tt)},load(e){if(!Me(e))return{};try{return JSON.parse(et(e,"utf8"))}catch{return{}}},isWired(e){return Ve(e)},inject(e,r){return Ve(e)?e:{...e,venos:{source:"obsidian-cli",orgId:r.orgId,orchestratorUrl:r.orchestratorUrl,wired:!0}}},remove(e){if(!e.venos)return e;let r={...e};return delete r.venos,r},write(e,r){d(e,m(r))}};var G=[j,W,ge,xe,Oe,Te,Re,je,$e,Le];import{existsSync as z}from"node:fs";import{dirname as st,join as He,resolve as Y}from"node:path";import{fileURLToPath as at}from"node:url";var Fe=st(at(import.meta.url));function Ke(){let e=process.env.VENOS_MCP_SERVER_PATH;if(e&&z(e))return Y(e);let r=Y(He(Fe,"..","etc","mcp-server","bin.js"));if(z(r))return r;let t=Y(He(Fe,"..","..","..","packages","mcp-server","dist","bin.js"));if(z(t))return t;throw new Error(`venos: bundled mcp-server not found. Tried:
|
|
39
39
|
VENOS_MCP_SERVER_PATH=${e??"(unset)"}
|
|
40
40
|
bundled: ${r}
|
|
41
41
|
sibling: ${t}
|
|
42
|
-
If you are developing locally, run: pnpm --filter @venos/mcp-server build`)}import{existsSync as
|
|
43
|
-
venos init ${t?"done":"(no changes)"}`),console.log(` org ID : ${r.orgId}`),console.log(` orchestrator: ${r.orchestratorUrl}`);for(let n of e){let o=
|
|
44
|
-
Next steps:`);let n={"claude-code":"Restart Claude Code for the hook to take effect.",cursor:"Restart Cursor to load the venos MCP server.",codex:"Restart Codex to pick up the new MCP config + gateway routing (~/.codex/.env).",windsurf:"Restart Windsurf to load the venos MCP server.",cline:"Reload the Cline extension (or restart VS Code) to load the venos MCP server.",zed:"Restart Zed to load the venos context server.",jetbrains:"Restart your JetBrains IDE (or just Junie) to load the venos MCP server.",aider:"Aider will route LLM calls through the venos gateway on next launch (~/.aider.conf.yml)."};for(let o of e){if(o.status!=="wired")continue;let i=n[o.client];i&&console.log(` \u2022 ${i}`)}console.log(` \u2022 Test: curl ${r.orchestratorUrl}/healthz`)}
|
|
45
|
-
Gateway routing (hard block via apps/mcp-proxy):`),console.log(` \u2022 Cursor \u2014 Settings \u2192 Models \u2192 Custom OpenAI Base URL: ${
|
|
46
|
-
venos init --remove ${t?"done":"(no changes)"}`);for(let i of e){let s=
|
|
47
|
-
`,"utf8")}var
|
|
48
|
-
venos init failed: orchestrator unreachable at ${t}/healthz`),console.error("Start the orchestrator first: apps/orchestrator/orchestrator"),process.exit(1));let n=
|
|
49
|
-
|
|
42
|
+
If you are developing locally, run: pnpm --filter @venos/mcp-server build`)}import{existsSync as ct}from"node:fs";function lt(e,r,t){let n=e.configPath(r);if(!e.isInstalled(r))return{client:e.name,transport:e.transport,status:"skipped-not-installed"};try{let o=e.load(n);if(e.isWired(o,t))return{client:e.name,transport:e.transport,status:"already-wired",path:n};let i=e.inject(o,t);return e.write(n,i),{client:e.name,transport:e.transport,status:"wired",path:n}}catch(o){return{client:e.name,transport:e.transport,status:"error",path:n,error:o instanceof Error?o.message:String(o)}}}function De(e,r,t){return t.map(n=>lt(n,e,r))}function ut(e,r){let t=e.configPath(r);if(!e.isInstalled(r))return{client:e.name,transport:e.transport,status:"skipped-not-installed"};if(!ct(t))return{client:e.name,transport:e.transport,status:"already-removed",path:t};try{let n=e.load(t),o=e.remove(n);return JSON.stringify(o)===JSON.stringify(n)?{client:e.name,transport:e.transport,status:"already-removed",path:t}:(e.write(t,o),{client:e.name,transport:e.transport,status:"removed",path:t})}catch(n){return{client:e.name,transport:e.transport,status:"error",path:t,error:n instanceof Error?n.message:String(n)}}}function Be(e,r){return r.map(t=>ut(t,e))}import{existsSync as Ge,mkdirSync as ft,readFileSync as dt}from"node:fs";import{join as ze}from"node:path";var Ye="cline.openaiBaseUrl";function Ze(e){let r=ze(e,".vscode");if(!Ge(r))return{status:"no-workspace"};let t=ze(r,"settings.json"),n={};if(Ge(t))try{let o=JSON.parse(dt(t,"utf8"));o&&typeof o=="object"&&(n=o)}catch{}return n[Ye]===w?{status:"already-wired",path:t}:(ft(r,{recursive:!0}),d(t,m({...n,[Ye]:w})),{status:"wired",path:t})}var mt={wired:"OK","already-wired":"\xB7","skipped-not-installed":"\u2014",error:"FAIL"},pt={wired:"wired","already-wired":"already wired","skipped-not-installed":"skipped (not installed)",error:"ERROR"},Z="http://127.0.0.1:4000/v1";function Xe(e,r){let t=e.some(n=>n.status==="wired");console.log(`
|
|
43
|
+
venos init ${t?"done":"(no changes)"}`),console.log(` org ID : ${r.orgId}`),console.log(` orchestrator: ${r.orchestratorUrl}`);for(let n of e){let o=mt[n.status],i=pt[n.status],s=n.path?` ${n.path}`:"",a=n.error?` \u2014 ${n.error}`:"";console.log(` ${o} ${n.client.padEnd(12)} ${i}${s}${a}`)}if(r.clineWorkspace){let n=r.clineWorkspace;n.status==="wired"?console.log(` OK cline (ws) wired ${n.path}`):n.status==="already-wired"&&console.log(` \xB7 cline (ws) already wired ${n.path}`)}if(t){console.log(`
|
|
44
|
+
Next steps:`);let n={"claude-code":"Restart Claude Code for the hook to take effect.",cursor:"Restart Cursor to load the venos MCP server.",codex:"Restart Codex to pick up the new MCP config + gateway routing (~/.codex/.env).",windsurf:"Restart Windsurf to load the venos MCP server.",cline:"Reload the Cline extension (or restart VS Code) to load the venos MCP server.",zed:"Restart Zed to load the venos context server.",jetbrains:"Restart your JetBrains IDE (or just Junie) to load the venos MCP server.",aider:"Aider will route LLM calls through the venos gateway on next launch (~/.aider.conf.yml)."};for(let o of e){if(o.status!=="wired")continue;let i=n[o.client];i&&console.log(` \u2022 ${i}`)}console.log(` \u2022 Test: curl ${r.orchestratorUrl}/healthz`)}gt(r.clineWorkspace)}function gt(e){console.log(`
|
|
45
|
+
Gateway routing (hard block via apps/mcp-proxy):`),console.log(` \u2022 Cursor \u2014 Settings \u2192 Models \u2192 Custom OpenAI Base URL: ${Z}`),console.log(" Optional: Custom HTTP Headers \u2192 X-Venos-Source: cursor"),console.log(` \u2022 Windsurf \u2014 Settings \u2192 Models \u2192 Custom OpenAI Base URL: ${Z}`),(!e||e.status==="no-workspace")&&(console.log(" \u2022 Cline \u2014 Open VS Code in your project, then add to .vscode/settings.json:"),console.log(` "cline.openaiBaseUrl": "${Z}"`)),console.log(" \u2022 VS Code Copilot \u2014 closed provider, no custom endpoint. Coverage = MCP advisory only."),console.log(" \u2022 JetBrains AI Assistant \u2014 closed provider, no custom endpoint. Coverage = MCP advisory only.")}function qe(e,r){console.log(JSON.stringify({...r,outcomes:e},null,2))}var ht={removed:"OK","already-removed":"\xB7","skipped-not-installed":"\u2014",error:"FAIL"},yt={removed:"removed","already-removed":"already removed","skipped-not-installed":"skipped (not installed)",error:"ERROR"};function Qe(e,r){let t=e.some(i=>i.status==="removed");console.log(`
|
|
46
|
+
venos init --remove ${t?"done":"(no changes)"}`);for(let i of e){let s=ht[i.status],a=yt[i.status],l=i.path?` ${i.path}`:"",c=i.error?` \u2014 ${i.error}`:"";console.log(` ${s} ${i.client.padEnd(12)} ${a}${l}${c}`)}let n=r.venosConfigRemoved?"OK":"\xB7",o=r.venosConfigRemoved?"removed":"already removed";console.log(` ${n} venos-config ${o} ${r.venosConfigPath}`),console.log("\nPre-venos `.venos-backup` snapshots are preserved \u2014 delete manually if you don't want them.")}function er(e,r){console.log(JSON.stringify({...r,outcomes:e},null,2))}var rr=1;function X(e){return kt(e,".venos","config.json")}function Et(){return`org-${Ot(4).toString("hex")}`}function Pt(e,r,t,n){let o=X(e);if(tr(o))try{let i=JSON.parse(wt(o,"utf8")),s={schemaVersion:i.schemaVersion??rr,...i,orchestratorUrl:r};return t&&(s.apiKey=t),n&&(s.orgId=n),s}catch{}return{schemaVersion:rr,orgId:n??Et(),orchestratorUrl:r,createdAt:new Date().toISOString(),...t?{apiKey:t}:{}}}function bt(e,r){let t=X(e);vt(Ct(t),{recursive:!0}),xt(t,JSON.stringify(r,null,2)+`
|
|
47
|
+
`,"utf8")}var Tt=5e3,_t=5e3;async function At(e){let r=e.replace(/\/$/,""),t=new AbortController,n=setTimeout(()=>t.abort(),Tt);try{return(await fetch(`${r}/healthz`,{signal:t.signal})).ok}catch{return!1}finally{clearTimeout(n)}}async function Rt(e,r){let t=e.replace(/\/$/,""),n=new AbortController,o=setTimeout(()=>n.abort(),_t);try{let i=await fetch(`${t}/api/activation/register`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({orgId:r}),signal:n.signal});i.ok||console.warn(`[venos] activation telemetry: non-200 response (${i.status}) \u2014 init continues`)}catch{console.warn("[venos] activation telemetry: failed to reach orchestrator \u2014 init continues")}finally{clearTimeout(o)}}function It(e){try{let r=new URL(e);return r.hostname==="localhost"||r.hostname==="127.0.0.1"||r.hostname==="::1"}catch{return!1}}async function nr(e={}){let r=e.home??process.env.HOME??process.env.USERPROFILE??"",t=e.orchestratorUrl??"http://127.0.0.1:8788";await At(t)||(console.error(`
|
|
48
|
+
venos init failed: orchestrator unreachable at ${t}/healthz`),console.error("Start the orchestrator first: apps/orchestrator/orchestrator"),process.exit(1));let n=Pt(r,t,e.apiKey,e.orgId),o={orgId:n.orgId,orchestratorUrl:t,mcpServerPath:Ke(),hookCommand:"venos hook",...n.apiKey?{apiKey:n.apiKey}:{}},i=De(r,o,G);bt(r,n);let s=Ze(e.cwd??process.cwd());e.noTelemetry===!0||It(t)||await Rt(t,n.orgId);let l={orgId:n.orgId,orchestratorUrl:t,clineWorkspace:s};e.json?qe(i,l):Xe(i,l)}function or(e={}){let r=e.home??process.env.HOME??process.env.USERPROFILE??"",t=Be(r,G),n=X(r),o=tr(n);o&&St(n,{force:!0});let i={venosConfigPath:n,venosConfigRemoved:o};e.json?er(t,i):Qe(t,i)}import{mkdirSync as Ut,readFileSync as A,existsSync as jt,writeFileSync as Wt}from"node:fs";import{hostname as Nt,userInfo as $t}from"node:os";import{randomBytes as Vt}from"node:crypto";import{dirname as Mt,join as ir}from"node:path";function Jt(e){return ir(e,".venos","config.json")}function Lt(e){let r=Jt(e);if(!jt(r))throw new Error(`venos config not found at ${r} \u2014 run "venos init" first`);return JSON.parse(A(r,"utf8"))}function Ht(){return new Promise((e,r)=>{let t="";process.stdin.setEncoding("utf8"),process.stdin.on("data",n=>{t+=n}),process.stdin.on("end",()=>e(t)),process.stdin.on("error",r)})}function Ft(e){let r;try{r=A(e,"utf8")}catch{return null}let t=r.split(/\r?\n/);for(let n=t.length-1;n>=0;n--){let o=t[n]?.trim();if(!o)continue;let i;try{i=JSON.parse(o)}catch{continue}if(i.type!=="assistant"||!i.message||i.message.model==="<synthetic>")continue;let s=i.message.usage;if(!s)continue;let a=typeof s.cache_creation_input_tokens=="number"?s.cache_creation_input_tokens:void 0,l=typeof s.cache_read_input_tokens=="number"?s.cache_read_input_tokens:void 0,c=(s.input_tokens??0)+(a??0)+(l??0),f=s.output_tokens??0,p=i.message.model??"";if(c===0&&f===0&&p==="")return null;let h={tokensIn:c,tokensOut:f,model:p};return l!==void 0&&(h.cacheReadTokens=l),a!==void 0&&(h.cacheWriteTokens=a),h}return null}function Kt(e){let r;try{r=JSON.parse(e)}catch{return e}if(typeof r!="object"||r===null||Array.isArray(r))return e;let t=r,n=t.transcript_path;if(typeof n!="string"||n==="")return e;let o=Ft(n);return o?(t.usage_tokens_in=o.tokensIn,t.usage_tokens_out=o.tokensOut,o.cacheReadTokens!==void 0&&(t.cache_read_input_tokens=o.cacheReadTokens),o.cacheWriteTokens!==void 0&&(t.cache_creation_input_tokens=o.cacheWriteTokens),o.model!==""&&(t.usage_model=o.model),JSON.stringify(t)):e}function Dt(e,r){if(r==="")return e;let t;try{t=JSON.parse(e)}catch{return JSON.stringify({orgId:r,content:e})}if(typeof t!="object"||t===null||Array.isArray(t))return e;let n=t;for(let o of["orgId","org_id","tenantId","tenant_id"]){let i=n[o];if(typeof i=="string"&&i.trim()!=="")return e}return n.orgId=r,JSON.stringify(n)}function Bt(e){try{let t=JSON.parse(e).cursor_version;return typeof t=="string"&&t!==""}catch{return!1}}function Gt(){try{let e=$t().username;if(typeof e=="string"&&e.trim()!=="")return e.trim()}catch{}for(let e of["USER","USERNAME","LOGNAME"]){let r=process.env[e];if(typeof r=="string"&&r.trim()!=="")return r.trim()}return""}function zt(e,r){if(r==="")return e;let t;try{t=JSON.parse(e)}catch{return e}if(typeof t!="object"||t===null||Array.isArray(t))return e;let n=t;for(let o of["userId","user_id"]){let i=n[o];if(typeof i=="string"&&i.trim()!=="")return e}return n.userId=r,JSON.stringify(n)}function Yt(e){let r=e===""?"":ir(e,".venos","machine-id");if(r!=="")try{let t=A(r,"utf8").trim();if(t!=="")return t}catch{}try{let t=A("/etc/machine-id","utf8").trim();if(t!=="")return t}catch{}if(r==="")return"";try{let t=Vt(16).toString("hex");return Ut(Mt(r),{recursive:!0}),Wt(r,t+`
|
|
49
|
+
`,"utf8"),t}catch{return""}}function Zt(e,r,t){if(r===""&&t==="")return e;let n;try{n=JSON.parse(e)}catch{return e}if(typeof n!="object"||n===null||Array.isArray(n))return e;let o=n,i=s=>{let a=o[s];return typeof a=="string"&&a.trim()!==""};return r!==""&&!i("machine_id")&&!i("machineId")&&(o.machine_id=r),t!==""&&!i("hostname")&&(o.hostname=t),JSON.stringify(o)}function Xt(){try{let e=Nt();return typeof e=="string"?e.trim():""}catch{return""}}function qt(e,r){let t={"Content-Type":"application/json","X-Venos-Org":e};return r&&(t.Authorization=`Bearer ${r}`),t}async function sr(e,r="claude-code"){let t=e??process.env.HOME??process.env.USERPROFILE??"",n=Lt(t),o=await Ht(),i=Bt(o),s=Zt(zt(Kt(Dt(o,n.orgId)),Gt()),Yt(t),Xt()),l=`${n.orchestratorUrl.replace(/\/$/,"")}/v1/hooks/${encodeURIComponent(r)}`,c=await fetch(l,{method:"POST",headers:qt(n.orgId,n.apiKey),body:s});if(i){await c.text();return}let f=await c.text(),p=r==="codex"?Qt(f):f;process.stdout.write(p),c.ok||(process.stderr.write(`venos hook: orchestrator returned ${c.status}
|
|
50
|
+
`),process.exit(1))}function Qt(e){let r;try{r=JSON.parse(e)}catch{return e}let t=typeof r.decision=="string"?r.decision:"";if(t==="deny"||t==="block"){let n=typeof r.severity=="string"?r.severity:"",o=typeof r.eventId=="string"?r.eventId:"",i=`blocked by venos policy${n?` (severity=${n})`:""}${o?` [event ${o}]`:""}`;return JSON.stringify({decision:"block",reason:i})}return t==="allow"?JSON.stringify({decision:"approve"}):e}import{readFile as en}from"node:fs/promises";import{homedir as rn}from"node:os";import{join as tn}from"node:path";async function ar(e={}){let r=e.home??rn(),t=tn(r,".venos","config.json"),n;try{n=JSON.parse(await en(t,"utf8"))}catch{process.stderr.write("venos: no config found \u2014 run `venos init` first\n"),process.exit(1);return}let o=`${n.orchestratorUrl}/api/billing/checkout`,i;try{i=await fetch(o,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({orgId:n.orgId}),signal:AbortSignal.timeout(5e3)})}catch{process.stderr.write(`venos: could not reach orchestrator
|
|
50
51
|
`),process.exit(1);return}if(i.status===503){process.stderr.write(`venos: billing is not yet configured on this server
|
|
51
52
|
`),process.exit(1);return}if(!i.ok){process.stderr.write(`venos: checkout failed (${i.status})
|
|
52
53
|
`),process.exit(1);return}let s=await i.json();if(!s.url){process.stderr.write(`venos: no checkout URL returned
|
|
@@ -55,11 +56,11 @@ Open this URL to upgrade your venos plan:
|
|
|
55
56
|
|
|
56
57
|
${s.url}
|
|
57
58
|
|
|
58
|
-
`)}import{readFileSync as
|
|
59
|
+
`)}import{readFileSync as sn,existsSync as an}from"node:fs";import{join as fr}from"node:path";import{execFile as cn}from"node:child_process";import{promisify as ln}from"node:util";import{existsSync as q}from"node:fs";import{dirname as nn,join as cr,resolve as Q}from"node:path";import{fileURLToPath as on}from"node:url";var lr=nn(on(import.meta.url));function ur(){let e=process.env.VENOS_SESSION_WASTE_PATH;if(e&&q(e))return Q(e);let r=Q(cr(lr,"..","etc","session-waste","bin.js"));if(q(r))return r;let t=Q(cr(lr,"..","..","..","packages","session-waste","dist","bin.js"));if(q(t))return t;throw new Error(`venos: bundled session-waste scanner not found. Tried:
|
|
59
60
|
VENOS_SESSION_WASTE_PATH=${e??"(unset)"}
|
|
60
61
|
bundled: ${r}
|
|
61
62
|
sibling: ${t}
|
|
62
|
-
If you are developing locally, run: pnpm --filter @venos/session-waste build`)}var
|
|
63
|
+
If you are developing locally, run: pnpm --filter @venos/session-waste build`)}var un=ln(cn);async function dr(e){let r=e??process.env.HOME??process.env.USERPROFILE??"",t=fr(r,".venos","config.json");if(!an(t))throw new Error(`venos config not found at ${t} \u2014 run "venos init" first`);let n=JSON.parse(sn(t,"utf8")),o=ur(),i=fr(r,".claude"),{stdout:s}=await un(process.execPath,[o,i],{maxBuffer:32*1024*1024}),a=JSON.parse(s),l=Array.isArray(a.findings)?a.findings:[];if(l.length===0)return{sessionsScanned:a.sessionsScanned??0,findingsStored:0};let f=`${n.orchestratorUrl.replace(/\/$/,"")}/api/finops/session-waste?orgId=${encodeURIComponent(n.orgId)}`,p=await fetch(f,{method:"POST",headers:{"Content-Type":"application/json","X-Venos-Org":n.orgId},body:JSON.stringify({findings:l})});if(!p.ok)throw new Error(`venos waste-scan: orchestrator returned ${p.status}`);let h=await p.json();return{sessionsScanned:a.sessionsScanned??0,findingsStored:h.stored??l.length}}var mr=`Usage: venos <command> [options]
|
|
63
64
|
|
|
64
65
|
Commands:
|
|
65
66
|
init Wire your AI client(s) to the venos security gateway
|
|
@@ -77,6 +78,6 @@ Options (init):
|
|
|
77
78
|
--remove Inverse of init \u2014 drop the venos entry from every
|
|
78
79
|
wired client's config and delete ~/.venos/config.json.
|
|
79
80
|
Pre-venos .venos-backup snapshots are preserved.
|
|
80
|
-
`;function
|
|
81
|
-
`);break}case"upgrade":await
|
|
82
|
-
${
|
|
81
|
+
`;function R(e,r){let t=e.indexOf(r);if(!(t===-1||t+1>=e.length))return e[t+1]}function I(e,r){return e.includes(r)}async function fn(){let e=process.argv.slice(2),r=e[0];switch(r){case"init":{if(I(e,"--remove")){or({json:I(e,"--json")});break}let t=R(e,"--orchestrator"),n=R(e,"--api-key"),o=R(e,"--org");await nr({...t!==void 0?{orchestratorUrl:t}:{},...n!==void 0?{apiKey:n}:{},...o!==void 0?{orgId:o}:{},json:I(e,"--json"),noTelemetry:I(e,"--no-telemetry")});break}case"hook":{let t=R(e,"--source");await sr(void 0,t??"claude-code");break}case"waste-scan":{let t=await dr();process.stdout.write(`venos waste-scan: ${t.sessionsScanned} session(s) scanned, ${t.findingsStored} finding(s) reported
|
|
82
|
+
`);break}case"upgrade":await ar();return;case"help":case void 0:process.stdout.write(mr),process.exit(0);break;default:process.stderr.write(`Unknown subcommand: ${r}
|
|
83
|
+
${mr}`),process.exit(2)}}await fn();
|