@vibecontrols/agent 2026.602.2 → 2026.602.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.
Files changed (116) hide show
  1. package/dist/{agent-config-85pskv43.js → agent-config-4ppenhqp.js} +1 -1
  2. package/dist/{agent-ready-tracker-zp6p8e6f.js → agent-ready-tracker-kgs7td6t.js} +1 -1
  3. package/dist/app-9j2t5geq.js +2 -0
  4. package/dist/bootstrap-workspace-qgs6d5f0.js +2 -0
  5. package/dist/bootstrap.service-vg72w8pa.js +2 -0
  6. package/dist/{bridge-client-341r9rry.js → bridge-client-1fxza4p7.js} +1 -1
  7. package/dist/cli.js +1 -1
  8. package/dist/daemon-profile-gwdcqx0q.js +2 -0
  9. package/dist/esm-6f3dfn6v.js +2 -0
  10. package/dist/{finalize-retry-handle-registry-vv241fsq.js → finalize-retry-handle-registry-xnm9kxry.js} +1 -1
  11. package/dist/{finalize-retry-worker-xp1nhv3c.js → finalize-retry-worker-dvykrzed.js} +1 -1
  12. package/dist/gateway-client-9kwnmk89.js +2 -0
  13. package/dist/{getMachineId-bsd-a56s0v8c.js → getMachineId-bsd-753751sw.js} +1 -1
  14. package/dist/{getMachineId-darwin-w9k0yw9r.js → getMachineId-darwin-na1pranq.js} +1 -1
  15. package/dist/{getMachineId-linux-anh31jbf.js → getMachineId-linux-dmn0ncdm.js} +1 -1
  16. package/dist/{getMachineId-unsupported-5hv3pwca.js → getMachineId-unsupported-yv77j894.js} +1 -1
  17. package/dist/{getMachineId-win-njb8tery.js → getMachineId-win-9hmyqmm0.js} +1 -1
  18. package/dist/highlights-00fcgwwq.js +2 -0
  19. package/dist/highlights-23bc8zge.js +2 -0
  20. package/dist/highlights-4mhb2pb0.js +2 -0
  21. package/dist/highlights-q7w64nwb.js +2 -0
  22. package/dist/highlights-xwdw5xay.js +2 -0
  23. package/dist/{index-678rwfc0.js → index-0924jp9m.js} +1 -1
  24. package/dist/{index-fzzwprvk.js → index-11grwjm1.js} +5 -5
  25. package/dist/index-1evqt03m.js +11 -0
  26. package/dist/{index-z5a4yxzz.js → index-1mppacnx.js} +3 -3
  27. package/dist/{index-jw1k4vbk.js → index-4qq083yd.js} +1 -1
  28. package/dist/{index-d5ysy1yn.js → index-5dysvvjv.js} +1 -1
  29. package/dist/{index-n7qyrdr1.js → index-5wpck4aw.js} +1 -1
  30. package/dist/{index-mtm8cfyt.js → index-8053zege.js} +2 -2
  31. package/dist/{index-5mw3eshk.js → index-8nqp3a4d.js} +1 -1
  32. package/dist/{index-2xs9cvjn.js → index-8sdrhr3q.js} +2 -2
  33. package/dist/{index-6mprnf7p.js → index-97mq40rr.js} +1 -1
  34. package/dist/{index-1hnw0rhc.js → index-9f52em7g.js} +29 -29
  35. package/dist/{index-0cn9bv8z.js → index-a4854mwz.js} +1 -1
  36. package/dist/{index-g8zv1gta.js → index-atp2ayra.js} +1 -1
  37. package/dist/{index-xjzmb1pn.js → index-b6x6a4xp.js} +2 -2
  38. package/dist/{index-yy1mm8zs.js → index-c7554sg7.js} +1 -1
  39. package/dist/{index-2gsarrbn.js → index-d1xjj001.js} +1 -1
  40. package/dist/{index-h8a8s8sn.js → index-ebwwtwwc.js} +1 -1
  41. package/dist/{index-8sm0nkh8.js → index-ep3zb271.js} +1 -1
  42. package/dist/index-gxgftnbh.js +26 -0
  43. package/dist/{index-g2raeeh4.js → index-h74va4wd.js} +2 -2
  44. package/dist/{index-v9fx5wab.js → index-hvjqgb97.js} +1 -1
  45. package/dist/{index-g3ap3xpr.js → index-jdh30t6c.js} +4 -4
  46. package/dist/{index-9bqd8veb.js → index-js1xn4sq.js} +3 -3
  47. package/dist/{index-x1h8r7pr.js → index-kt5zxp42.js} +1 -1
  48. package/dist/{index-ssjmzqcz.js → index-n6bdbgb9.js} +1 -1
  49. package/dist/{index-rdp5xq4r.js → index-nrsqzcfc.js} +1 -1
  50. package/dist/index-p23tet7a.js +2 -0
  51. package/dist/{index-04n4qgvd.js → index-pgew6sge.js} +3 -3
  52. package/dist/{index-1zw3kea7.js → index-qwtspxw8.js} +1 -1
  53. package/dist/index-rqq0k5fc.js +16 -0
  54. package/dist/{index-6jq17k9s.js → index-rv6h14n8.js} +1 -1
  55. package/dist/{index-qfz9fy56.js → index-rw9x93zb.js} +1 -1
  56. package/dist/{index-dm6yjmgq.js → index-rzpaqrhx.js} +2 -2
  57. package/dist/{index-vdahdt49.js → index-tgrt61qr.js} +1 -1
  58. package/dist/{index-ef95xr4z.js → index-thammzct.js} +2 -2
  59. package/dist/{index-tp4y9jde.js → index-wccxsz72.js} +1 -1
  60. package/dist/{index-scsjyj4m.js → index-x649afed.js} +2 -2
  61. package/dist/{index-8kvc8ttn.js → index-xrs52f2c.js} +1 -1
  62. package/dist/{index-yrgm89r8.js → index-ydc0tk17.js} +1 -1
  63. package/dist/{index-0248afsn.js → index-z5s398n0.js} +1 -1
  64. package/dist/index.js +2 -2
  65. package/dist/injections-x3xya90r.js +2 -0
  66. package/dist/interactive-qc1j66mq.js +2 -0
  67. package/dist/key.cmd-972133dv.js +2 -0
  68. package/dist/log-shipper-hjnn1d5p.js +2 -0
  69. package/dist/{path-utils-35re7qf9.js → path-utils-hxdyv2zn.js} +1 -1
  70. package/dist/{plugin-system-c916v9an.js → plugin-system-8hby8x1m.js} +1 -1
  71. package/dist/prereqs-runner-27x3j1md.js +2 -0
  72. package/dist/profile-mount-8dc9jwt5.js +2 -0
  73. package/dist/prune-stale-shims-23y0stm8.js +2 -0
  74. package/dist/register-core-qcj272qh.js +2 -0
  75. package/dist/secondary-profile-attach-xkvpmm08.js +2 -0
  76. package/dist/subprocess-1nna3d3x.js +2 -0
  77. package/dist/telemetry-8jfdyt51.js +2 -0
  78. package/dist/tree-sitter-javascript-q22gvtms.js +2 -0
  79. package/dist/tree-sitter-markdown-pntsjzm3.js +2 -0
  80. package/dist/tree-sitter-markdown_inline-g1wzqf7k.js +2 -0
  81. package/dist/tree-sitter-typescript-m9yfes10.js +2 -0
  82. package/dist/tree-sitter-zig-jmh62j90.js +2 -0
  83. package/dist/tunnel-bootstrap-5wgt9a1h.js +2 -0
  84. package/package.json +1 -1
  85. package/dist/app-y4yzq7yw.js +0 -2
  86. package/dist/bootstrap-workspace-zpm20zez.js +0 -2
  87. package/dist/bootstrap.service-pjmnpxha.js +0 -2
  88. package/dist/daemon-profile-vas1vf2t.js +0 -2
  89. package/dist/esm-9fpye77x.js +0 -2
  90. package/dist/gateway-client-43gzvj5s.js +0 -2
  91. package/dist/highlights-8d9mgr01.js +0 -2
  92. package/dist/highlights-jwvdxm9x.js +0 -2
  93. package/dist/highlights-qbx2vnme.js +0 -2
  94. package/dist/highlights-r3m83kn9.js +0 -2
  95. package/dist/highlights-s7mqapt6.js +0 -2
  96. package/dist/index-01qzsnwd.js +0 -16
  97. package/dist/index-hrdamx5j.js +0 -2
  98. package/dist/index-tmrbs96r.js +0 -11
  99. package/dist/index-z2yjbq9a.js +0 -26
  100. package/dist/injections-srewsjcz.js +0 -2
  101. package/dist/interactive-22ta89hc.js +0 -2
  102. package/dist/key.cmd-wgcq6kt8.js +0 -2
  103. package/dist/log-shipper-k24m8yw5.js +0 -2
  104. package/dist/prereqs-runner-ca4kt803.js +0 -2
  105. package/dist/profile-mount-npcknw6v.js +0 -2
  106. package/dist/prune-stale-shims-nkx9vq5m.js +0 -2
  107. package/dist/register-core-xhrk6ay5.js +0 -2
  108. package/dist/secondary-profile-attach-db5cr3e1.js +0 -2
  109. package/dist/subprocess-g9sk1ep9.js +0 -2
  110. package/dist/telemetry-tnq47dcs.js +0 -2
  111. package/dist/tree-sitter-javascript-3h25c6bs.js +0 -2
  112. package/dist/tree-sitter-markdown-3nemcjhe.js +0 -2
  113. package/dist/tree-sitter-markdown_inline-16ftwa53.js +0 -2
  114. package/dist/tree-sitter-typescript-f6mq6ze6.js +0 -2
  115. package/dist/tree-sitter-zig-s2trkm2d.js +0 -2
  116. package/dist/tunnel-bootstrap-2kg79ng8.js +0 -2
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{a as P,b as S,c as v}from"./index-8kvc8ttn.js";import{g as M}from"./index-x1h8r7pr.js";import{fe as z,he as E}from"./index-yy1mm8zs.js";var I=z((_)=>{Object.defineProperty(_,"__esModule",{value:!0});_.PrometheusSerializer=void 0;var b=M(),H=v(),T=S(),y=P(),h="otel.scope.schema_url";function C(F){return F.replace(/\\/g,"\\\\").replace(/\n/g,"\\n")}function k(F=""){if(typeof F!=="string")F=JSON.stringify(F);return C(F).replace(/"/g,"\\\"")}var d=/[^a-z0-9_]/gi,l=/_{2,}/g;function w(F){return F.replace(d,"_").replace(l,"_")}function p(F,J){if(!F.endsWith("_total")&&J.dataPointType===H.DataPointType.SUM&&J.isMonotonic)F=F+"_total";return F}function u(F){if(F===1/0)return"+Inf";else if(F===-1/0)return"-Inf";else return`${F}`}function m(F){switch(F.dataPointType){case H.DataPointType.SUM:if(F.isMonotonic)return"counter";return"gauge";case H.DataPointType.GAUGE:return"gauge";case H.DataPointType.HISTOGRAM:return"histogram";default:return"untyped"}}function B(F,J,K,Q,V){let W=!1,X="";for(let[Y,$]of Object.entries(J)){let Z=w(Y);W=!0,X+=`${X.length>0?",":""}${Z}="${k($)}"`}if(V)for(let[Y,$]of Object.entries(V)){let Z=w(Y);W=!0,X+=`${X.length>0?",":""}${Z}="${k($)}"`}if(W)F+=`{${X}}`;return`${F} ${u(K)}${Q!==void 0?" "+String(Q):""}
2
+ import{a as P,b as S,c as v}from"./index-xrs52f2c.js";import{g as M}from"./index-kt5zxp42.js";import{ge as z,ie as E}from"./index-c7554sg7.js";var I=z((_)=>{Object.defineProperty(_,"__esModule",{value:!0});_.PrometheusSerializer=void 0;var b=M(),H=v(),T=S(),y=P(),h="otel.scope.schema_url";function C(F){return F.replace(/\\/g,"\\\\").replace(/\n/g,"\\n")}function k(F=""){if(typeof F!=="string")F=JSON.stringify(F);return C(F).replace(/"/g,"\\\"")}var d=/[^a-z0-9_]/gi,l=/_{2,}/g;function w(F){return F.replace(d,"_").replace(l,"_")}function p(F,J){if(!F.endsWith("_total")&&J.dataPointType===H.DataPointType.SUM&&J.isMonotonic)F=F+"_total";return F}function u(F){if(F===1/0)return"+Inf";else if(F===-1/0)return"-Inf";else return`${F}`}function m(F){switch(F.dataPointType){case H.DataPointType.SUM:if(F.isMonotonic)return"counter";return"gauge";case H.DataPointType.GAUGE:return"gauge";case H.DataPointType.HISTOGRAM:return"histogram";default:return"untyped"}}function B(F,J,K,Q,V){let W=!1,X="";for(let[Y,$]of Object.entries(J)){let Z=w(Y);W=!0,X+=`${X.length>0?",":""}${Z}="${k($)}"`}if(V)for(let[Y,$]of Object.entries(V)){let Z=w(Y);W=!0,X+=`${X.length>0?",":""}${Z}="${k($)}"`}if(W)F+=`{${X}}`;return`${F} ${u(K)}${Q!==void 0?" "+String(Q):""}
3
3
  `}var c="# no registered metrics";class A{_prefix;_appendTimestamp;_additionalAttributes;_withResourceConstantLabels;_withoutScopeInfo;_withoutTargetInfo;constructor(F,J=!1,K,Q,V){if(F)this._prefix=F+"_";this._appendTimestamp=J,this._withResourceConstantLabels=K,this._withoutScopeInfo=!!V,this._withoutTargetInfo=!!Q}serialize(F){let J="";this._additionalAttributes=this._filterResourceConstantLabels(F.resource.attributes,this._withResourceConstantLabels);for(let K of F.scopeMetrics)J+=this._serializeScopeMetrics(K);if(J==="")J+=c;return this._serializeResource(F.resource)+J}_filterResourceConstantLabels(F,J){if(J){let K={};for(let[Q,V]of Object.entries(F))if(Q.match(J))K[Q]=V;return K}return}_serializeScopeMetrics(F){let J="";for(let K of F.metrics)J+=this._serializeMetricData(K,F.scope)+`
4
4
  `;return J}_serializeMetricData(F,J){let K=w(C(F.descriptor.name));if(this._prefix)K=`${this._prefix}${K}`;let Q=F.dataPointType;K=p(K,F);let V=`# HELP ${K} ${C(F.descriptor.description||"description missing")}`,W=F.descriptor.unit?`
5
5
  # UNIT ${K} ${C(F.descriptor.unit)}`:"",X=`# TYPE ${K} ${m(F)}`,Y;if(this._withoutScopeInfo)Y=this._additionalAttributes;else{let Z={[y.ATTR_OTEL_SCOPE_NAME]:J.name};if(J.schemaUrl)Z[h]=J.schemaUrl;if(J.version)Z[y.ATTR_OTEL_SCOPE_VERSION]=J.version;Y=Object.assign(Z,this._additionalAttributes)}let $="";switch(Q){case H.DataPointType.SUM:case H.DataPointType.GAUGE:{$=F.dataPoints.map((Z)=>this._serializeSingularDataPoint(K,F,Z,Y)).join("");break}case H.DataPointType.HISTOGRAM:{$=F.dataPoints.map((Z)=>this._serializeHistogramDataPoint(K,F,Z,Y)).join("");break}default:b.diag.error(`Unrecognizable DataPointType: ${Q} for metric "${K}"`)}return`${V}${W}
@@ -0,0 +1,16 @@
1
+ // @bun
2
+ import{Tb as GY}from"./index-5dysvvjv.js";import{Vb as JY}from"./index-pgew6sge.js";import{Sc as jY,Tc as k,od as l,qd as d}from"./index-h74va4wd.js";import{Ld as HY,Md as BY,Od as V}from"./index-js1xn4sq.js";import{Yd as P}from"./index-a4854mwz.js";import{randomBytes as K,createHmac as g,timingSafeEqual as UY}from"crypto";var T=600,r=600,A=K(32),M="p2.";function S(Y){if(!Y.startsWith("/"))return`/${Y}`;return Y.length>1&&Y.endsWith("/")?Y.slice(0,-1):Y}var wY=/^\/terminal\/[A-Za-z0-9_-]{1,128}(?:\/.*)?$/,XY=/^\/ui\/[a-z0-9-]{1,64}(?:\/.*)?$/,NY=/^\/plan\/[A-Za-z0-9_-]{1,128}(?:\/.*)?$/,bY=/^\/git(?:\/.*)?$/,OY="/ws/logs",LY=/^\/code-server(?:\/.*)?$/,CY=/^\/api\/plugins\/[a-z0-9-]{1,64}\/ui(?:\/.*)?$/;function a(Y){if(typeof Y!=="string"||Y.length===0)return!1;if(Y.includes("\x00")||Y.includes(`
3
+ `)||Y.includes("|"))return!1;if(Y.includes(".."))return!1;if(new Set(["/","/api","/api/agent","/api/plugins","/api/profiles","/health","/metrics","/ws","/api/ai","/api/logs"]).has(Y))return!1;if(wY.test(Y))return!0;if(XY.test(Y))return!0;if(NY.test(Y))return!0;if(bY.test(Y))return!0;if(Y===OY)return!0;if(LY.test(Y))return!0;if(CY.test(Y))return!0;return!1}var DY=new Set(["*","GET","HEAD","POST","PUT","PATCH","DELETE","OPTIONS"]);function MY(Y){if(!Y||Y.length===0)return["*"];let Z=new Set,$=[];for(let Q of Y){if(typeof Q!=="string")continue;let W=Q.toUpperCase();if(!DY.has(W))throw Error(`invalid method: ${Q}`);if(!Z.has(W))Z.add(W),$.push(W)}if($.length===0)return["*"];return $.sort()}function i(Y,Z){if(Y.includes("*"))return!0;return Y.includes(Z.toUpperCase())}var KY=/^[A-Za-z0-9_-]{1,128}$/;function SY(Y){return typeof Y==="string"&&KY.test(Y)}function h(Y,Z,$){return g("sha256",A).update(`${Y}
4
+ ${Z}
5
+ ${$}`).digest("hex")}var y=new Map;function kY(Y){for(let[Z,$]of y)if($<=Y)y.delete(Z)}function t(Y,Z){let $=Date.parse(Z);if(!Number.isFinite($))return;y.set(Y,$)}function e(Y){return kY(Date.now()),y.has(Y)}function c(Y,Z,$,Q){return g("sha256",A).update(`v2
6
+ ${Y}
7
+ ${Z}
8
+ ${$}
9
+ ${Q}`).digest("hex")}function I(Y){return Buffer.from(Y,"utf8").toString("base64").replace(/=+$/g,"").replace(/\+/g,"-").replace(/\//g,"_")}function _(Y){try{let Z=Y.replace(/-/g,"+").replace(/_/g,"/"),$=Z.length%4===0?Z:Z+"=".repeat(4-Z.length%4);return Buffer.from($,"base64").toString("utf8")}catch{return null}}var s=16;function qY(Y){if(Y.length>s)throw Error(`pathPrefixes exceeds maximum count (${Y.length} > ${s})`);let Z=new Set,$=[];for(let Q of Y){if(!Q||typeof Q!=="string")continue;if(Q.includes("..")||Q.includes("\x00"))throw Error("invalid pathPrefix");let W=S(Q);if(!a(W))throw Error(`pathPrefix '${W}' is not an allowed iframe surface`);if(!Z.has(W))Z.add(W),$.push(W)}return $.sort()}function nY(Y,Z=T){if(!Y||typeof Y!=="string")throw Error("pathPrefix is required");if(Y.includes("..")||Y.includes("\x00"))throw Error("invalid pathPrefix");let $=Math.min(Math.max(1,Math.floor(Z||T)),r),Q=S(Y);if(!a(Q))throw Error(`pathPrefix '${Q}' is not an allowed iframe surface`);let W=new Date(Date.now()+$*1000).toISOString(),z=K(16).toString("hex"),J=h(Q,W,z);return{token:`${W}|${z}|${J}`,expiresAt:W}}function sY(Y,Z=T){if(!Y||!Array.isArray(Y.pathPrefixes)||Y.pathPrefixes.length===0)throw Error("pathPrefixes is required");let $=qY(Y.pathPrefixes);if($.length===0)throw Error("pathPrefixes is required");let Q=MY(Y.methods),W=Math.min(Math.max(1,Math.floor(Z||T)),r),z=new Date(Date.now()+W*1000).toISOString(),J=K(16).toString("hex"),j=I(JSON.stringify($)),G=I(JSON.stringify(Q)),H=`${M}${j}.${G}`,B=c(j,G,z,J);return{token:`${z}|${J}|${H}|${B}`,expiresAt:z}}function L(Y,Z){if(Y.length!==Z.length)return!1;try{return UY(Buffer.from(Y,"hex"),Buffer.from(Z,"hex"))}catch{return!1}}function E(Y,Z){let $=S(Z);return Y===$||Y.startsWith(`${$}/`)}function YY(Y,Z,$="*"){return FY(Y,Z,$).ok}function FY(Y,Z,$="*"){if(!Y||typeof Y!=="string")return{ok:!1,reason:"missing"};let Q=Y.split("|");if(Q.length===3)return RY(Q,Z);if(Q.length===4)return TY(Q,Z,$);return{ok:!1,reason:"malformed"}}function RY(Y,Z){let[$,Q,W]=Y;if(!$||!Q||!W)return{ok:!1,reason:"malformed"};if(!C($))return{ok:!1,reason:"expired"};let z=Z.split("/").filter(Boolean),J=["/"],j="";for(let G of z)j+=`/${G}`,J.push(j);for(let G of J){let H=h(S(G),$,Q);if(L(H,W)){if(!E(Z,G))return{ok:!1,reason:"path_mismatch"};if(e(Q))return{ok:!1,reason:"replayed"};return t(Q,$),{ok:!0}}}return{ok:!1,reason:"bad_signature"}}function TY(Y,Z,$){let[Q,W,z,J]=Y;if(!Q||!W||!z||!J)return{ok:!1,reason:"malformed"};if(!z.startsWith(M))return{ok:!1,reason:"malformed"};if(!C(Q))return{ok:!1,reason:"expired"};let G=z.slice(M.length).split("."),H=G[0]??"",B=G[1]??I(JSON.stringify(["*"]));if(!H)return{ok:!1,reason:"malformed"};let N=c(H,B,Q,W);if(!L(N,J))return{ok:!1,reason:"bad_signature"};let R=_(H);if(R===null)return{ok:!1,reason:"malformed"};let b;try{b=JSON.parse(R)}catch{return{ok:!1,reason:"malformed"}}if(!Array.isArray(b))return{ok:!1,reason:"malformed"};let O=_(B),D=["*"];if(O!==null)try{let v=JSON.parse(O);if(Array.isArray(v)&&v.every((w)=>typeof w==="string"))D=v}catch{return{ok:!1,reason:"malformed"}}if($!=="*"&&!i(D,$))return{ok:!1,reason:"method_mismatch"};for(let v of b){if(typeof v!=="string")continue;if(E(Z,v)){if(e(W))return{ok:!1,reason:"replayed"};return t(W,Q),{ok:!0}}}return{ok:!1,reason:"path_mismatch"}}function rY(Y,Z,$="*"){if(!Y||typeof Y!=="string")return!1;let Q=Y.split("|");if(Q.length===3){let[W,z,J]=Q;if(!W||!z||!J)return!1;if(!C(W))return!1;let j=Z.split("/").filter(Boolean),G=["/"],H="";for(let B of j)H+=`/${B}`,G.push(H);for(let B of G){let N=h(S(B),W,z);if(L(N,J))return E(Z,B)}return!1}if(Q.length===4){let[W,z,J,j]=Q;if(!W||!z||!J||!j)return!1;if(!J.startsWith(M))return!1;if(!C(W))return!1;let H=J.slice(M.length).split("."),B=H[0]??"",N=H[1]??I(JSON.stringify(["*"]));if(!B)return!1;let R=c(B,N,W,z);if(!L(R,j))return!1;let b=_(B);if(b===null)return!1;let O;try{O=JSON.parse(b)}catch{return!1}if(!Array.isArray(O))return!1;let D=_(N),v=["*"];if(D!==null)try{let w=JSON.parse(D);if(Array.isArray(w)&&w.every((vY)=>typeof vY==="string"))v=w}catch{return!1}if($!=="*"&&!i(v,$))return!1;for(let w of O){if(typeof w!=="string")continue;if(E(Z,w))return!0}return!1}return!1}function C(Y){let Z=Date.parse(Y);return Number.isFinite(Z)&&Date.now()<Z}function o(Y,Z){let $=Y.headers.get("x-vibe-iframe-token")??Y.headers.get("X-Vibe-Iframe-Token");if($)return $;try{let Q=new URL(Y.url).searchParams.get("vt");if(Q)return Q}catch{}return null}var m="tc1|",u=600,yY=600;function ZY(Y,Z,$){return g("sha256",A).update(`tc1
10
+ ${Y}
11
+ ${Z}
12
+ ${$}`).digest("hex")}function aY(Y,Z=u){if(!SY(Y))throw Error("invalid sid");let $=Math.min(Math.max(1,Math.floor(Z||u)||u),yY),Q=new Date(Date.now()+$*1000).toISOString(),W=K(16).toString("hex"),z=ZY(Y,Q,W);return{token:`${m}${Q}|${Y}|${W}|${z}`,expiresAt:Q}}function iY(Y,Z){if(!Y||typeof Y!=="string")return!1;if(!Y.startsWith(m))return!1;let Q=Y.slice(m.length).split("|");if(Q.length!==4)return!1;let[W,z,J,j]=Q;if(!W||!z||!J||!j)return!1;if(z!==Z)return!1;if(!C(W))return!1;let G=ZY(z,W,J);return L(G,j)}function IY(Y,Z){let $;if(Y instanceof Headers)$=Y.get("cookie")??Y.get("Cookie")??void 0;else $=Y.cookie??Y.Cookie??void 0;if(!$)return null;let Q=`vt_term_${Z}`;for(let W of $.split(";")){let z=W.indexOf("=");if(z===-1)continue;if(W.slice(0,z).trim()!==Q)continue;return W.slice(z+1).trim()||null}return null}function tY(Y,Z){return IY(Y.headers,Z)}var x="uc1|",f=600,_Y=600,EY=/^[a-z0-9-]{1,64}$/;function gY(Y){return typeof Y==="string"&&EY.test(Y)}function $Y(Y,Z,$){return g("sha256",A).update(`uc1
13
+ ${Y}
14
+ ${Z}
15
+ ${$}`).digest("hex")}function eY(Y,Z=f){if(!gY(Y))throw Error("invalid plugin name");let $=Math.min(Math.max(1,Math.floor(Z||f)||f),_Y),Q=new Date(Date.now()+$*1000).toISOString(),W=K(16).toString("hex"),z=$Y(Y,Q,W);return{token:`${x}${Q}|${Y}|${W}|${z}`,expiresAt:Q}}function YZ(Y,Z){if(!Y||typeof Y!=="string")return!1;if(!Y.startsWith(x))return!1;let Q=Y.slice(x.length).split("|");if(Q.length!==4)return!1;let[W,z,J,j]=Q;if(!W||!z||!J||!j)return!1;if(z!==Z)return!1;if(!C(W))return!1;let G=$Y(z,W,J);return L(G,j)}function AY(Y,Z){let $;if(Y instanceof Headers)$=Y.get("cookie")??Y.get("Cookie")??void 0;else $=Y.cookie??Y.Cookie??void 0;if(!$)return null;let Q=`vt_ui_${Z}`;for(let W of $.split(";")){let z=W.indexOf("=");if(z===-1)continue;if(W.slice(0,z).trim()!==Q)continue;return W.slice(z+1).trim()||null}return null}function ZZ(Y,Z){return AY(Y.headers,Z)}import{timingSafeEqual as PY}from"crypto";var lY=["/health","/ui","/code-server","/terminal","/plan","/git","/api/agent/status","/api/agent/version","/api/agent/identity","/api/agent/terminal-exchange","/api/agent/ui-exchange","/api/agent/ui-exchange-plugin","/metrics"];function QY(Y,Z){if(!Z||Z==="/")return!1;let $=Z.endsWith("/")?Z.slice(0,-1):Z;return Y===$||Y.startsWith(`${$}/`)}function uY(Y){let Z=Y.replace(/^\/api\/profiles\/[^/]+/,"/api");return Z==="/api"?"/":Z}function fY(Y){let Z=/^\/api\/profiles\/([^/]+)(?:\/|$)/.exec(Y);if(!Z)return null;let $=Z[1];if(!$)return null;return $}function WY(Y,Z){let $=[Y],Q=uY(Y);if(Q!==Y)$.push(Q);for(let W of $){if(lY.some((z)=>QY(W,z)))return!0;if(Z.some((z)=>QY(W,z)))return!0}return!1}function VY(){let Y=new Uint8Array(32);return crypto.getRandomValues(Y),`vcak_${Buffer.from(Y).toString("base64url")}`}var U=null;function n(){return`${P()}:static-api-key`}async function vZ(){let Y=process.env.AGENT_API_KEY;if(Y)return U=Y,Y;let Z=n(),$=await jY(Z);if($)return U=$,$;let Q=l({dir:V().dataDir})["static-api-key"];if(Q){try{await k(Z,Q)}catch(z){V().logger.warn("auth","could not persist legacy api key into secrets backend",{error:String(z)})}return U=Q,Q}let W=VY();return await k(Z,W),U=W,V().logger.info("auth","Generated and persisted new agent API key"),V().audit.emit("agent","apikey.minted",{profile:P(),via:"loadAgentApiKey"}),W}function q(){let Y=process.env.AGENT_API_KEY;if(Y)return Y;if(U!==null)return U;let Z=l()["static-api-key"];if(Z)return U=Z,Z;let $=VY();U=$;try{d({"static-api-key":$},{dir:V().dataDir,scope:V().name})}catch{}return k(n(),$).catch(()=>{}),$}async function UZ(Y){if(process.env.AGENT_API_KEY)throw Error("AGENT_API_KEY is pinned via the environment \u2014 cannot rotate the key at runtime. Update the env var and restart.");let Z=(Y??"").trim();if(!/^vcak_[A-Za-z0-9_-]{16,}$/.test(Z))throw Error("Invalid agent API key format (expected vcak_<base64url>).");U=Z,await k(n(),Z);try{d({"static-api-key":Z},{dir:V().dataDir,scope:V().name})}catch{}V().audit.emit("agent","apikey.rotated",{profile:P(),via:"reset-key"})}function mY(Y){let Z=Y["x-agent-api-key"]??Y["X-Agent-Api-Key"];if(Z)return Z;let $=Y.authorization??Y.Authorization;if($?.startsWith("Bearer "))return $.slice(7);return null}function xY(Y){return!1}function hY(Y,Z){let $=mY(Object.fromEntries(Y.headers.entries()));if($)return $;if(!xY(Z))return null;try{let Q=new URL(Y.url).searchParams.get("apiKey");if(Q)return Q}catch{}return null}function F(Y,Z){let $=Buffer.from(Y),Q=Buffer.from(Z);if($.length!==Q.length)return!1;try{return PY($,Q)}catch{return!1}}function wZ(Y){if(!Y)return!1;return F(Y,q())}async function cY(Y,Z){if(!Y)return!1;let $=fY(Z);if($){let Q=BY.get($);if(Q){try{if(await Q.keyVault.match(Y))return!0}catch{}if($===V().name){try{if(await V().keyVault.match(Y))return!0}catch{}return F(Y,q())}return!1}}try{if(await V().keyVault.match(Y))return!0}catch{}if(F(Y,q()))return!0;if(oY(Y)!==null)return!0;return!1}function oY(Y){if(!Y)return null;if(F(Y,q()))return{name:"default",scopes:new Set(["admin"])};let Z=HY()??V(),$=l({dir:Z.dataDir}),Q=Date.now();for(let W of $.apiKeys??[]){if(!F(Y,W.key))continue;if(W.notBefore){let z=Date.parse(W.notBefore);if(Number.isFinite(z)&&Q<z)return null}if(W.expiresAt){let z=Date.parse(W.expiresAt);if(Number.isFinite(z)&&Q>=z)return null}return{name:W.name,scopes:new Set(W.scopes)}}return null}function XZ(Y,Z){if(!Y)return!1;if(Y.scopes.has("admin"))return!0;return Z.some(($)=>Y.scopes.has($))}var X=null;function p(Y,Z){try{V().audit.emit("auth",Y,Z)}catch{V().logger.warn("auth.audit",Y,Z)}}function pY(Y){let Z=new Set(Y());if(X===null)for(let $ of Z)p("plugin.public_path.declared",{path:$});else{for(let $ of Z)if(!X.has($))p("plugin.public_path.added",{path:$});for(let $ of X)if(!Z.has($))p("plugin.public_path.removed",{path:$})}return X=Z,Z}function NZ(){X=null}function zY(Y){if(!Y)return[];if(X===null)return[...pY(Y)];return[...X]}function bZ(Y){let Z=q();return V().logger.info("auth",`Agent API key: ${Z.substring(0,8)}****${Z.substring(Z.length-4)}`),new JY({name:"plugin/auth"}).decorate("apiKey",Z).derive(async({request:$,path:Q})=>{let W=zY(Y),z;if(WY(Q,W))z=!0;else if(GY($.headers))z=!0;else{let J=o($,Q);if(J&&YY(J,Q,$.method))z=!0;else{let j=hY($,Q);z=await cY(j,Q)}}return{isAuthenticated:z}}).onBeforeHandle(({isAuthenticated:$,request:Q,path:W,set:z})=>{let J=zY(Y);if(!$&&!WY(W,J)){if(o(Q,W))return z.status=401,{error:"invalid iframe token"};return z.status=401,{error:"Unauthorized",message:"Invalid or missing API key"}}}).as("global")}
16
+ export{SY as tb,nY as ub,sY as vb,YY as wb,FY as xb,rY as yb,o as zb,aY as Ab,iY as Bb,IY as Cb,tY as Db,gY as Eb,eY as Fb,YZ as Gb,ZZ as Hb,vZ as Ib,q as Jb,UZ as Kb,mY as Lb,wZ as Mb,oY as Nb,XZ as Ob,NZ as Pb,bZ as Qb};
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{Nd as H}from"./index-9bqd8veb.js";import{_d as Q,be as U}from"./index-0cn9bv8z.js";import{existsSync as Z,mkdirSync as $,readFileSync as x,appendFileSync as k,writeFileSync as A}from"fs";import{join as V,relative as b,resolve as M,isAbsolute as j}from"path";var z=".boff/",F=new Set([".boff",".boff/","/.boff","/.boff/"]);function u(){$(Q(),{recursive:!0}),f()}function f(){let W=M(U()),J=M(process.cwd()),K=b(J,W);if(K.startsWith("..")||j(K))return;let q=V(J,".gitignore");if(!Z(q)){A(q,`${z}
2
+ import{Od as H}from"./index-js1xn4sq.js";import{$d as Q,ce as U}from"./index-a4854mwz.js";import{existsSync as Z,mkdirSync as $,readFileSync as x,appendFileSync as k,writeFileSync as A}from"fs";import{join as V,relative as b,resolve as M,isAbsolute as j}from"path";var z=".boff/",F=new Set([".boff",".boff/","/.boff","/.boff/"]);function u(){$(Q(),{recursive:!0}),f()}function f(){let W=M(U()),J=M(process.cwd()),K=b(J,W);if(K.startsWith("..")||j(K))return;let q=V(J,".gitignore");if(!Z(q)){A(q,`${z}
3
3
  `,{mode:420}),H().logger.info("bootstrap",`Created .gitignore with ${z}`);return}let B=x(q,"utf8");if(B.split(/\r?\n/).some((Y)=>{let C=Y.trim();if(!C||C.startsWith("#"))return!1;return F.has(C)}))return;let X=B.length>0&&!B.endsWith(`
4
4
  `);k(q,`${X?`
5
5
  `:""}${z}
@@ -1,3 +1,3 @@
1
1
  // @bun
2
- import{Xa as R}from"./index-0ckffygp.js";import{bb as j}from"./index-yrgm89r8.js";import{Ad as D,Dd as P,Kd as g,Nd as M}from"./index-9bqd8veb.js";import{$d as A,Xd as y,_d as x}from"./index-0cn9bv8z.js";import{spawn as _}from"child_process";import{createHash as f}from"crypto";import{existsSync as u,promises as V,createWriteStream as h}from"fs";import{homedir as m,tmpdir as p}from"os";import*as q from"path";import{Readable as d}from"stream";import{pipeline as l}from"stream/promises";function n(){let G=process.arch==="x64"?"x64":"arm64";return`${process.platform==="win32"?"win32":process.platform==="darwin"?"darwin":"linux"}-${G}`}function c(){return q.join(m(),".boff","vibecontrols","tools")}function L(G,J){let X=J??G;if(process.platform==="win32"&&!X.toLowerCase().endsWith(".exe"))return`${X}.exe`;return X}function o(G,J,X){return q.join(X??c(),G,L(G,J))}async function E(G,J){if(!J.versionMatcher)return!0;return new Promise((X)=>{let Y=_(G,J.versionArgs??["--version"],{stdio:["ignore","pipe","pipe"]}),K="";Y.stdout.on("data",(H)=>K+=H.toString()),Y.stderr.on("data",(H)=>K+=H.toString()),Y.on("close",()=>{try{X(new RegExp(J.versionMatcher).test(K))}catch{X(!1)}}),Y.on("error",()=>X(!1))})}async function i(G){let J=G.platform??n(),X=L(G.name,G.binaryName),Y=o(G.name,G.binaryName,G.cacheRoot);if(u(Y)&&await E(Y,G))return Y;try{let H=typeof Bun<"u"&&typeof Bun.which==="function"?Bun.which(G.binaryName??G.name,{PATH:process.env.PATH}):null;if(H&&await E(H,G))return G.log?.info?.(`[install] using PATH binary ${G.name} (${H})`),H}catch{}let K=G.downloads[J];if(!K)throw Error(`[install] no download manifest entry for ${G.name} on ${J}`);return G.log?.info?.(`[install] downloading ${G.name} for ${J}`),await V.mkdir(q.dirname(Y),{recursive:!0}),await a(K,Y,X,G.name),G.log?.info?.(`[install] installed ${G.name} \u2192 ${Y}`),Y}async function a(G,J,X,Y){let K=q.dirname(J),H=q.join(p(),`vibe-install-${Y}-${process.pid}`);await V.mkdir(H,{recursive:!0});let $=q.join(H,"artifact");try{let Z=await fetch(G.url,{redirect:"follow"});if(!Z.ok)throw Error(`download failed (${Z.status}) for ${G.url}`);if(!Z.body)throw Error(`empty response body for ${G.url}`);if(await l(d.fromWeb(Z.body),h($)),G.sha256){let I=f("sha256").update(await V.readFile($)).digest("hex");if(I!==G.sha256)throw Error(`sha256 mismatch for ${Y}: expected ${G.sha256}, got ${I}`)}let z=G.archive??(G.url.endsWith(".tar.gz")||G.url.endsWith(".tgz")?"tar.gz":G.url.endsWith(".zip")?"zip":"raw");if(z==="raw")await V.copyFile($,J);else{if(z==="tar.gz")await w("tar",["-xzf",$,"-C",H]);else await s($,H);let I=G.binaryWithinArchive??X;await V.copyFile(q.join(H,I),J)}if(process.platform!=="win32")await V.chmod(J,493)}finally{await V.rm(H,{recursive:!0,force:!0})}}async function s(G,J){try{await w("unzip",["-q","-o",G,"-d",J]);return}catch(X){if(process.platform!=="win32")throw X;await w("tar",["-xf",G,"-C",J])}}async function w(G,J){return new Promise((X,Y)=>{let K=_(G,J,{stdio:["ignore","ignore","pipe"]}),H="";K.stderr.on("data",($)=>H+=$.toString()),K.on("close",($)=>$===0?X():Y(Error(`${G} exit ${$}: ${H}`))),K.on("error",Y)})}var W="https://github.com/cloudflare/cloudflared/releases/latest/download",r={"linux-x64":{url:`${W}/cloudflared-linux-amd64`,archive:"raw"},"linux-arm64":{url:`${W}/cloudflared-linux-arm64`,archive:"raw"},"darwin-x64":{url:`${W}/cloudflared-darwin-amd64.tgz`,archive:"tar.gz",binaryWithinArchive:"cloudflared"},"darwin-arm64":{url:`${W}/cloudflared-darwin-arm64.tgz`,archive:"tar.gz",binaryWithinArchive:"cloudflared"},"win32-x64":{url:`${W}/cloudflared-windows-amd64.exe`,archive:"raw"},"win32-arm64":{url:`${W}/cloudflared-windows-arm64.exe`,archive:"raw"}},t=/(https:\/\/(?!api\.)[a-zA-Z0-9-]+\.trycloudflare\.com)/;async function N(G,J){let X=J?.log??{},Y;try{Y=await i({name:"cloudflared",downloads:r,versionMatcher:"cloudflared version",log:X})}catch($){return X.warn?.(`quick-tunnel: could not obtain cloudflared: ${String($)}`),null}let K;try{K=_(Y,["tunnel","--url",`http://127.0.0.1:${G}`,"--no-autoupdate"],{stdio:["ignore","pipe","pipe"]})}catch($){return X.warn?.(`quick-tunnel: failed to spawn cloudflared: ${String($)}`),null}let H=await new Promise(($)=>{let Z=!1,z=(Q)=>{if(Z)return;Z=!0,$(Q)},I=setTimeout(()=>{X.warn?.("quick-tunnel: cloudflared did not advertise a URL in time"),z(null)},J?.timeoutMs??30000),O=(Q)=>{let B=Q.toString("utf8").match(t);if(B)clearTimeout(I),z(B[0])};K.stdout?.on("data",O),K.stderr?.on("data",O),K.on("error",(Q)=>{clearTimeout(I),X.warn?.(`quick-tunnel: cloudflared failed to spawn: ${String(Q)}`),z(null)}),K.on("exit",(Q)=>{clearTimeout(I),X.warn?.(`quick-tunnel: cloudflared exited (code=${Q})`),z(null)})});if(!H)return null;return{url:H,child:K}}import{existsSync as b,mkdirSync as e,readFileSync as GG,writeFileSync as JG,unlinkSync as XG}from"fs";import{dirname as YG,join as S}from"path";import{readdirSync as $G}from"fs";function T(G){return S(G??x(),"tunnel.state.json")}function v(G,J){let X=T(J);try{e(YG(X),{recursive:!0}),JG(X,JSON.stringify(G,null,2),"utf8")}catch(Y){M().logger.warn("tunnel-state","Failed to persist tunnel state",{error:String(Y)})}}function k(G){let J=T(G);if(!b(J))return null;try{let X=GG(J,"utf8"),Y=JSON.parse(X);if(typeof Y.pid!=="number")return null;return Y}catch(X){return M().logger.warn("tunnel-state","Failed to read tunnel state",{error:String(X)}),null}}function F(G){let J=T(G);if(!b(J))return;try{XG(J)}catch{}}function C(G){return R().isProcessAlive(G)}function xG(G){let J=[];if(G?.allProfiles){let Y;try{Y=A()}catch{return J}let K;try{K=$G(Y)}catch{return J}for(let H of K){let $=S(Y,H),Z=k($);if(Z)J.push({...Z,alive:C(Z.pid),profileDir:$})}return J}let X=k();if(X)J.push({...X,alive:C(X.pid),profileDir:x()});return J}function HG(G){return G.replace(/[^A-Za-z0-9_]/g,"_")}function U(){return(g()??M()).tunnel}async function AG(G,J){let X=U();MG(G),KG();let Y=process.env.AGENT_TUNNEL_URL;if(Y){let $=P(Y);if(!$)return M().logger.warn("tunnel-bootstrap","Ignoring invalid AGENT_TUNNEL_URL"),null;X.url=$,X.externalUrl=!0,M().logger.info("tunnel-bootstrap",`Using AGENT_TUNNEL_URL=${$}`);try{j.emit("tunnel.url_assigned",{provider:"external"})}catch{}return $}let K=J.port,H=await N(K,{log:{info:($)=>M().logger.info("tunnel-bootstrap",$),warn:($)=>M().logger.warn("tunnel-bootstrap",$)}});if(!H)return M().logger.warn("tunnel-bootstrap","No bootstrap tunnel \u2014 the agent will register once the tunnel provider starts post-config"),null;if(X.child=H.child,X.url=H.url,X.url){M().logger.info("tunnel-bootstrap",`Bootstrap tunnel ready: ${X.url}`);try{let z=new URL(X.url).hostname.split(".");if(z.length>=2)D("."+z.slice(-2).join("."))}catch{}try{j.emit("tunnel.url_assigned",{provider:"bootstrap"})}catch{}let $=HG(y());if(process.env[`AGENT_TUNNEL_URL_${$}`]=X.url,X.child?.pid!==void 0)process.env[`AGENT_TUNNEL_PID_${$}`]=String(X.child.pid),v({pid:X.child.pid,url:X.url,startedAt:new Date().toISOString(),provider:"bootstrap",port:K,cmd:`cloudflared tunnel --url http://127.0.0.1:${K}`})}return X.url}function bG(){let G=U();if(G.externalUrl)return!1;if(!G.child||G.child.killed)return!1;let J=G.child.pid;if(J===void 0)return!1;try{process.kill(J,0)}catch{return!1}return G.child=null,F(),M().logger.info("tunnel-bootstrap",`Handed over bootstrap tunnel (PID ${J}) to plugin \u2014 process kept alive`),!0}function SG(){let G=U();if(G.externalUrl){F();return}let J=G.child;if(G.child=null,F(),!J||J.killed)return;try{J.kill("SIGTERM"),M().logger.info("tunnel-bootstrap","Bootstrap tunnel stopped")}catch{}}function vG(){return U().url}function KG(){let G=k();if(!G)return;if(!C(G.pid)){F();return}try{process.kill(G.pid,"SIGTERM"),M().logger.info("tunnel-bootstrap","Reaped orphan tunnel from prior run",{pid:G.pid,provider:G.provider})}catch{}let J=Date.now();while(Date.now()-J<2000&&C(G.pid))Bun.sleepSync(50);if(C(G.pid))try{process.kill(G.pid,"SIGKILL")}catch{}F()}function MG(G){let J={name:"bootstrap",async getActiveTunnelUrl(){return U().url}};G.registerProvider("tunnel",J,"bootstrap")}
2
+ import{Xa as R}from"./index-0ckffygp.js";import{bb as j}from"./index-ydc0tk17.js";import{Bd as D,Ed as P,Ld as g,Od as M}from"./index-js1xn4sq.js";import{$d as x,Yd as y,ae as A}from"./index-a4854mwz.js";import{spawn as _}from"child_process";import{createHash as f}from"crypto";import{existsSync as u,promises as V,createWriteStream as h}from"fs";import{homedir as m,tmpdir as p}from"os";import*as q from"path";import{Readable as d}from"stream";import{pipeline as l}from"stream/promises";function n(){let G=process.arch==="x64"?"x64":"arm64";return`${process.platform==="win32"?"win32":process.platform==="darwin"?"darwin":"linux"}-${G}`}function c(){return q.join(m(),".boff","vibecontrols","tools")}function L(G,J){let X=J??G;if(process.platform==="win32"&&!X.toLowerCase().endsWith(".exe"))return`${X}.exe`;return X}function o(G,J,X){return q.join(X??c(),G,L(G,J))}async function E(G,J){if(!J.versionMatcher)return!0;return new Promise((X)=>{let Y=_(G,J.versionArgs??["--version"],{stdio:["ignore","pipe","pipe"]}),K="";Y.stdout.on("data",(H)=>K+=H.toString()),Y.stderr.on("data",(H)=>K+=H.toString()),Y.on("close",()=>{try{X(new RegExp(J.versionMatcher).test(K))}catch{X(!1)}}),Y.on("error",()=>X(!1))})}async function i(G){let J=G.platform??n(),X=L(G.name,G.binaryName),Y=o(G.name,G.binaryName,G.cacheRoot);if(u(Y)&&await E(Y,G))return Y;try{let H=typeof Bun<"u"&&typeof Bun.which==="function"?Bun.which(G.binaryName??G.name,{PATH:process.env.PATH}):null;if(H&&await E(H,G))return G.log?.info?.(`[install] using PATH binary ${G.name} (${H})`),H}catch{}let K=G.downloads[J];if(!K)throw Error(`[install] no download manifest entry for ${G.name} on ${J}`);return G.log?.info?.(`[install] downloading ${G.name} for ${J}`),await V.mkdir(q.dirname(Y),{recursive:!0}),await a(K,Y,X,G.name),G.log?.info?.(`[install] installed ${G.name} \u2192 ${Y}`),Y}async function a(G,J,X,Y){let K=q.dirname(J),H=q.join(p(),`vibe-install-${Y}-${process.pid}`);await V.mkdir(H,{recursive:!0});let $=q.join(H,"artifact");try{let Z=await fetch(G.url,{redirect:"follow"});if(!Z.ok)throw Error(`download failed (${Z.status}) for ${G.url}`);if(!Z.body)throw Error(`empty response body for ${G.url}`);if(await l(d.fromWeb(Z.body),h($)),G.sha256){let I=f("sha256").update(await V.readFile($)).digest("hex");if(I!==G.sha256)throw Error(`sha256 mismatch for ${Y}: expected ${G.sha256}, got ${I}`)}let z=G.archive??(G.url.endsWith(".tar.gz")||G.url.endsWith(".tgz")?"tar.gz":G.url.endsWith(".zip")?"zip":"raw");if(z==="raw")await V.copyFile($,J);else{if(z==="tar.gz")await w("tar",["-xzf",$,"-C",H]);else await s($,H);let I=G.binaryWithinArchive??X;await V.copyFile(q.join(H,I),J)}if(process.platform!=="win32")await V.chmod(J,493)}finally{await V.rm(H,{recursive:!0,force:!0})}}async function s(G,J){try{await w("unzip",["-q","-o",G,"-d",J]);return}catch(X){if(process.platform!=="win32")throw X;await w("tar",["-xf",G,"-C",J])}}async function w(G,J){return new Promise((X,Y)=>{let K=_(G,J,{stdio:["ignore","ignore","pipe"]}),H="";K.stderr.on("data",($)=>H+=$.toString()),K.on("close",($)=>$===0?X():Y(Error(`${G} exit ${$}: ${H}`))),K.on("error",Y)})}var W="https://github.com/cloudflare/cloudflared/releases/latest/download",r={"linux-x64":{url:`${W}/cloudflared-linux-amd64`,archive:"raw"},"linux-arm64":{url:`${W}/cloudflared-linux-arm64`,archive:"raw"},"darwin-x64":{url:`${W}/cloudflared-darwin-amd64.tgz`,archive:"tar.gz",binaryWithinArchive:"cloudflared"},"darwin-arm64":{url:`${W}/cloudflared-darwin-arm64.tgz`,archive:"tar.gz",binaryWithinArchive:"cloudflared"},"win32-x64":{url:`${W}/cloudflared-windows-amd64.exe`,archive:"raw"},"win32-arm64":{url:`${W}/cloudflared-windows-arm64.exe`,archive:"raw"}},t=/(https:\/\/(?!api\.)[a-zA-Z0-9-]+\.trycloudflare\.com)/;async function N(G,J){let X=J?.log??{},Y;try{Y=await i({name:"cloudflared",downloads:r,versionMatcher:"cloudflared version",log:X})}catch($){return X.warn?.(`quick-tunnel: could not obtain cloudflared: ${String($)}`),null}let K;try{K=_(Y,["tunnel","--url",`http://127.0.0.1:${G}`,"--no-autoupdate"],{stdio:["ignore","pipe","pipe"]})}catch($){return X.warn?.(`quick-tunnel: failed to spawn cloudflared: ${String($)}`),null}let H=await new Promise(($)=>{let Z=!1,z=(Q)=>{if(Z)return;Z=!0,$(Q)},I=setTimeout(()=>{X.warn?.("quick-tunnel: cloudflared did not advertise a URL in time"),z(null)},J?.timeoutMs??30000),O=(Q)=>{let B=Q.toString("utf8").match(t);if(B)clearTimeout(I),z(B[0])};K.stdout?.on("data",O),K.stderr?.on("data",O),K.on("error",(Q)=>{clearTimeout(I),X.warn?.(`quick-tunnel: cloudflared failed to spawn: ${String(Q)}`),z(null)}),K.on("exit",(Q)=>{clearTimeout(I),X.warn?.(`quick-tunnel: cloudflared exited (code=${Q})`),z(null)})});if(!H)return null;return{url:H,child:K}}import{existsSync as b,mkdirSync as e,readFileSync as GG,writeFileSync as JG,unlinkSync as XG}from"fs";import{dirname as YG,join as S}from"path";import{readdirSync as $G}from"fs";function T(G){return S(G??x(),"tunnel.state.json")}function v(G,J){let X=T(J);try{e(YG(X),{recursive:!0}),JG(X,JSON.stringify(G,null,2),"utf8")}catch(Y){M().logger.warn("tunnel-state","Failed to persist tunnel state",{error:String(Y)})}}function k(G){let J=T(G);if(!b(J))return null;try{let X=GG(J,"utf8"),Y=JSON.parse(X);if(typeof Y.pid!=="number")return null;return Y}catch(X){return M().logger.warn("tunnel-state","Failed to read tunnel state",{error:String(X)}),null}}function F(G){let J=T(G);if(!b(J))return;try{XG(J)}catch{}}function C(G){return R().isProcessAlive(G)}function xG(G){let J=[];if(G?.allProfiles){let Y;try{Y=A()}catch{return J}let K;try{K=$G(Y)}catch{return J}for(let H of K){let $=S(Y,H),Z=k($);if(Z)J.push({...Z,alive:C(Z.pid),profileDir:$})}return J}let X=k();if(X)J.push({...X,alive:C(X.pid),profileDir:x()});return J}function HG(G){return G.replace(/[^A-Za-z0-9_]/g,"_")}function U(){return(g()??M()).tunnel}async function AG(G,J){let X=U();MG(G),KG();let Y=process.env.AGENT_TUNNEL_URL;if(Y){let $=P(Y);if(!$)return M().logger.warn("tunnel-bootstrap","Ignoring invalid AGENT_TUNNEL_URL"),null;X.url=$,X.externalUrl=!0,M().logger.info("tunnel-bootstrap",`Using AGENT_TUNNEL_URL=${$}`);try{j.emit("tunnel.url_assigned",{provider:"external"})}catch{}return $}let K=J.port,H=await N(K,{log:{info:($)=>M().logger.info("tunnel-bootstrap",$),warn:($)=>M().logger.warn("tunnel-bootstrap",$)}});if(!H)return M().logger.warn("tunnel-bootstrap","No bootstrap tunnel \u2014 the agent will register once the tunnel provider starts post-config"),null;if(X.child=H.child,X.url=H.url,X.url){M().logger.info("tunnel-bootstrap",`Bootstrap tunnel ready: ${X.url}`);try{let z=new URL(X.url).hostname.split(".");if(z.length>=2)D("."+z.slice(-2).join("."))}catch{}try{j.emit("tunnel.url_assigned",{provider:"bootstrap"})}catch{}let $=HG(y());if(process.env[`AGENT_TUNNEL_URL_${$}`]=X.url,X.child?.pid!==void 0)process.env[`AGENT_TUNNEL_PID_${$}`]=String(X.child.pid),v({pid:X.child.pid,url:X.url,startedAt:new Date().toISOString(),provider:"bootstrap",port:K,cmd:`cloudflared tunnel --url http://127.0.0.1:${K}`})}return X.url}function bG(){let G=U();if(G.externalUrl)return!1;if(!G.child||G.child.killed)return!1;let J=G.child.pid;if(J===void 0)return!1;try{process.kill(J,0)}catch{return!1}return G.child=null,F(),M().logger.info("tunnel-bootstrap",`Handed over bootstrap tunnel (PID ${J}) to plugin \u2014 process kept alive`),!0}function SG(){let G=U();if(G.externalUrl){F();return}let J=G.child;if(G.child=null,F(),!J||J.killed)return;try{J.kill("SIGTERM"),M().logger.info("tunnel-bootstrap","Bootstrap tunnel stopped")}catch{}}function vG(){return U().url}function KG(){let G=k();if(!G)return;if(!C(G.pid)){F();return}try{process.kill(G.pid,"SIGTERM"),M().logger.info("tunnel-bootstrap","Reaped orphan tunnel from prior run",{pid:G.pid,provider:G.provider})}catch{}let J=Date.now();while(Date.now()-J<2000&&C(G.pid))Bun.sleepSync(50);if(C(G.pid))try{process.kill(G.pid,"SIGKILL")}catch{}F()}function MG(G){let J={name:"bootstrap",async getActiveTunnelUrl(){return U().url}};G.registerProvider("tunnel",J,"bootstrap")}
3
3
  export{k as la,F as ma,C as na,xG as oa,HG as pa,AG as qa,bG as ra,SG as sa,vG as ta,KG as ua};
@@ -1,3 +1,3 @@
1
1
  // @bun
2
- import{ic as O,jc as L,kc as Y}from"./index-5mw3eshk.js";import{nc as D,pc as R,qc as U,rc as W,tc as C,uc as E,vc as X,wc as I,xc as K}from"./index-z5a4yxzz.js";import{Rc as J,nd as T,pd as V,rd as w}from"./index-g2raeeh4.js";import{Xd as h}from"./index-0cn9bv8z.js";async function P(){if(process.env.AGENT_API_KEY)return process.env.AGENT_API_KEY;let F="default";try{F=h()}catch{}let H=await J(`${F}:static-api-key`);if(H)return H;return T()["static-api-key"]??null}var j=["read","mutate","plugin:install","plugin:remove","update","admin"];function _(F){if(F.length<=12)return"[redacted]";return`${F.slice(0,8)}...${F.slice(-4)}`}function x(){let F=new Uint8Array(32);return crypto.getRandomValues(F),`vcak_${Buffer.from(F).toString("base64url")}`}function b(){return crypto.randomUUID()}function A(F){if(!F)return;let H=/^(\d+)([smhdw]?)$/.exec(F.trim());if(!H)throw Error(`Invalid --expires-in: ${F} (use 30s, 12h, 7d, 4w; bare digits = days)`);let q=Number(H[1]),N=H[2]||"d",z=N==="s"?q*1000:N==="m"?q*60000:N==="h"?q*3600000:N==="w"?q*7*86400000:q*86400000;return new Date(Date.now()+z).toISOString()}function S(F){if(!F)return["read"];let H=F.split(",").map((q)=>q.trim()).filter(Boolean);for(let q of H)if(!j.includes(q))throw Error(`Unknown scope: ${q}. Allowed: ${j.join(", ")}`);return H}function f(F){let H=F.command("key").description("Show or manage VibeControls agent API keys");H.command("show",{isDefault:!0}).description("Show the default agent API key").option("--show-secret","Print the full API key",!1).option("--json","Emit JSON").option("--plain","Force plain text output").action(async function(q){let N={...F.opts(),...q};try{await L({mode:O(N),fetchData:async()=>{return{apiKey:await P()??null}},plain:(z)=>{if(E("Agent API Key"),I(),!z.apiKey){R("No API key found in AGENT_API_KEY or local agent config.");return}if(X("API Key",D.bold(q.showSecret?z.apiKey:_(z.apiKey))),!q.showSecret)X("Full key",D.dim("hidden; rerun with --show-secret"));I()},json:(z)=>({apiKey:z.apiKey?q.showSecret?z.apiKey:"[redacted]":null})})}catch(z){R(`Failed to get API key: ${U(z)}`)}}),H.command("list").description("List all scoped API keys (default + minted)").option("--json","Emit JSON").option("--plain","Force plain text output").option("--show-secret","Include full key values in JSON output",!1).action(async function(q){let N={...F.opts(),...q};try{await L({mode:O(N),fetchData:()=>w(),plain:(z)=>{let B=[],Q=z["static-api-key"];if(Q)B.push({ID:"default",Name:"default",Scopes:"admin",Expires:"never",Key:_(Q)});for(let G of z.apiKeys??[])B.push({ID:G.id??"(legacy)",Name:G.name,Scopes:G.scopes.join(","),Expires:G.expiresAt??"never",Key:_(G.key)});if(B.length===0){C("No keys configured.");return}E("Agent API Keys"),K(B)},json:(z)=>{let B=[],Q=z["static-api-key"];if(Q)B.push({id:"default",name:"default",scopes:["admin"],expiresAt:null,key:q.showSecret?Q:"[redacted]"});for(let G of z.apiKeys??[])B.push({id:G.id??"(legacy)",name:G.name,scopes:G.scopes,expiresAt:G.expiresAt??null,key:q.showSecret?G.key:"[redacted]"});return B}})}catch(z){R(U(z))}}),H.command("add").description("Mint a new scoped API key").requiredOption("--name <name>","Display name (logs only)").option("--scope <scope>",`Comma-separated scope list (default: read). Allowed: ${j.join(",")}`,"read").option("--expires-in <duration>","TTL (e.g. 7d, 12h, 30m). Omit for no expiry.").option("--not-before <iso>","ISO timestamp before which the key is rejected.").option("--json","Emit JSON").action(function(q){let N={...F.opts(),...q};try{let z=S(q.scope),B=A(q.expiresIn),Q=T(),G=b(),Z=x(),$={id:G,name:q.name,key:Z,scopes:z,expiresAt:B,notBefore:q.notBefore,createdAt:new Date().toISOString()},M=[...Q.apiKeys??[],$];if(V({apiKeys:M}),Y(N,{ok:!0,id:G,name:q.name,scopes:z,expiresAt:B??null,key:Z}))return;if(W(`Minted key ${G}`),X("Name",q.name),X("Scopes",z.join(",")),B)X("Expires",B);if(q.notBefore)X("Not before",q.notBefore);I(),X("Key (save now)",D.bold(Z))}catch(z){if(N.json){Y(N,{ok:!1,error:U(z)});return}R(U(z))}}),H.command("revoke <id>").description("Revoke a scoped key by ID").option("--json","Emit JSON").action(function(q,N){let z={...F.opts(),...N};try{let B=T(),Q=(B.apiKeys??[]).length,G=(B.apiKeys??[]).filter((Z)=>Z.id!==q);if(G.length===Q){if(z.json){Y(z,{ok:!1,error:`No key with id ${q}`});return}R(`No key with id ${q}`);return}if(V({apiKeys:G}),Y(z,{ok:!0,id:q}))return;W(`Revoked key ${q}`)}catch(B){if(z.json){Y(z,{ok:!1,error:U(B)});return}R(U(B))}}),H.command("rotate <id>").description("Rotate the secret of an existing scoped key (preserves scopes/expiry)").option("--json","Emit JSON").action(function(q,N){let z={...F.opts(),...N};try{let B=T();if(!(B.apiKeys??[]).find(($)=>$.id===q)){if(z.json){Y(z,{ok:!1,error:`No key with id ${q}`});return}R(`No key with id ${q}`);return}let G=x(),Z=(B.apiKeys??[]).map(($)=>$.id===q?{...$,key:G}:$);if(V({apiKeys:Z}),Y(z,{ok:!0,id:q,key:G}))return;W(`Rotated key ${q}`),X("New key (save now)",D.bold(G))}catch(B){if(z.json){Y(z,{ok:!1,error:U(B)});return}R(U(B))}})}
3
- export{P as Vb,f as Wb};
2
+ import{jc as O,kc as L,lc as Y}from"./index-8nqp3a4d.js";import{oc as D,qc as R,rc as U,sc as W,uc as C,vc as E,wc as X,xc as I,yc as K}from"./index-1mppacnx.js";import{Sc as J,od as T,qd as V,sd as w}from"./index-h74va4wd.js";import{Yd as h}from"./index-a4854mwz.js";async function P(){if(process.env.AGENT_API_KEY)return process.env.AGENT_API_KEY;let F="default";try{F=h()}catch{}let H=await J(`${F}:static-api-key`);if(H)return H;return T()["static-api-key"]??null}var j=["read","mutate","plugin:install","plugin:remove","update","admin"];function _(F){if(F.length<=12)return"[redacted]";return`${F.slice(0,8)}...${F.slice(-4)}`}function x(){let F=new Uint8Array(32);return crypto.getRandomValues(F),`vcak_${Buffer.from(F).toString("base64url")}`}function b(){return crypto.randomUUID()}function A(F){if(!F)return;let H=/^(\d+)([smhdw]?)$/.exec(F.trim());if(!H)throw Error(`Invalid --expires-in: ${F} (use 30s, 12h, 7d, 4w; bare digits = days)`);let q=Number(H[1]),N=H[2]||"d",z=N==="s"?q*1000:N==="m"?q*60000:N==="h"?q*3600000:N==="w"?q*7*86400000:q*86400000;return new Date(Date.now()+z).toISOString()}function S(F){if(!F)return["read"];let H=F.split(",").map((q)=>q.trim()).filter(Boolean);for(let q of H)if(!j.includes(q))throw Error(`Unknown scope: ${q}. Allowed: ${j.join(", ")}`);return H}function f(F){let H=F.command("key").description("Show or manage VibeControls agent API keys");H.command("show",{isDefault:!0}).description("Show the default agent API key").option("--show-secret","Print the full API key",!1).option("--json","Emit JSON").option("--plain","Force plain text output").action(async function(q){let N={...F.opts(),...q};try{await L({mode:O(N),fetchData:async()=>{return{apiKey:await P()??null}},plain:(z)=>{if(E("Agent API Key"),I(),!z.apiKey){R("No API key found in AGENT_API_KEY or local agent config.");return}if(X("API Key",D.bold(q.showSecret?z.apiKey:_(z.apiKey))),!q.showSecret)X("Full key",D.dim("hidden; rerun with --show-secret"));I()},json:(z)=>({apiKey:z.apiKey?q.showSecret?z.apiKey:"[redacted]":null})})}catch(z){R(`Failed to get API key: ${U(z)}`)}}),H.command("list").description("List all scoped API keys (default + minted)").option("--json","Emit JSON").option("--plain","Force plain text output").option("--show-secret","Include full key values in JSON output",!1).action(async function(q){let N={...F.opts(),...q};try{await L({mode:O(N),fetchData:()=>w(),plain:(z)=>{let B=[],Q=z["static-api-key"];if(Q)B.push({ID:"default",Name:"default",Scopes:"admin",Expires:"never",Key:_(Q)});for(let G of z.apiKeys??[])B.push({ID:G.id??"(legacy)",Name:G.name,Scopes:G.scopes.join(","),Expires:G.expiresAt??"never",Key:_(G.key)});if(B.length===0){C("No keys configured.");return}E("Agent API Keys"),K(B)},json:(z)=>{let B=[],Q=z["static-api-key"];if(Q)B.push({id:"default",name:"default",scopes:["admin"],expiresAt:null,key:q.showSecret?Q:"[redacted]"});for(let G of z.apiKeys??[])B.push({id:G.id??"(legacy)",name:G.name,scopes:G.scopes,expiresAt:G.expiresAt??null,key:q.showSecret?G.key:"[redacted]"});return B}})}catch(z){R(U(z))}}),H.command("add").description("Mint a new scoped API key").requiredOption("--name <name>","Display name (logs only)").option("--scope <scope>",`Comma-separated scope list (default: read). Allowed: ${j.join(",")}`,"read").option("--expires-in <duration>","TTL (e.g. 7d, 12h, 30m). Omit for no expiry.").option("--not-before <iso>","ISO timestamp before which the key is rejected.").option("--json","Emit JSON").action(function(q){let N={...F.opts(),...q};try{let z=S(q.scope),B=A(q.expiresIn),Q=T(),G=b(),Z=x(),$={id:G,name:q.name,key:Z,scopes:z,expiresAt:B,notBefore:q.notBefore,createdAt:new Date().toISOString()},M=[...Q.apiKeys??[],$];if(V({apiKeys:M}),Y(N,{ok:!0,id:G,name:q.name,scopes:z,expiresAt:B??null,key:Z}))return;if(W(`Minted key ${G}`),X("Name",q.name),X("Scopes",z.join(",")),B)X("Expires",B);if(q.notBefore)X("Not before",q.notBefore);I(),X("Key (save now)",D.bold(Z))}catch(z){if(N.json){Y(N,{ok:!1,error:U(z)});return}R(U(z))}}),H.command("revoke <id>").description("Revoke a scoped key by ID").option("--json","Emit JSON").action(function(q,N){let z={...F.opts(),...N};try{let B=T(),Q=(B.apiKeys??[]).length,G=(B.apiKeys??[]).filter((Z)=>Z.id!==q);if(G.length===Q){if(z.json){Y(z,{ok:!1,error:`No key with id ${q}`});return}R(`No key with id ${q}`);return}if(V({apiKeys:G}),Y(z,{ok:!0,id:q}))return;W(`Revoked key ${q}`)}catch(B){if(z.json){Y(z,{ok:!1,error:U(B)});return}R(U(B))}}),H.command("rotate <id>").description("Rotate the secret of an existing scoped key (preserves scopes/expiry)").option("--json","Emit JSON").action(function(q,N){let z={...F.opts(),...N};try{let B=T();if(!(B.apiKeys??[]).find(($)=>$.id===q)){if(z.json){Y(z,{ok:!1,error:`No key with id ${q}`});return}R(`No key with id ${q}`);return}let G=x(),Z=(B.apiKeys??[]).map(($)=>$.id===q?{...$,key:G}:$);if(V({apiKeys:Z}),Y(z,{ok:!0,id:q,key:G}))return;W(`Rotated key ${q}`),X("New key (save now)",D.bold(G))}catch(B){if(z.json){Y(z,{ok:!1,error:U(B)});return}R(U(B))}})}
3
+ export{P as Wb,f as Xb};
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{$a as S,Za as h,_a as Z}from"./index-rc79x8fw.js";import{bb as K}from"./index-yrgm89r8.js";import"./index-52cp759f.js";import{Tb as X,Ub as R}from"./index-04n4qgvd.js";import{ic as N,jc as O,kc as D}from"./index-5mw3eshk.js";import{nc as W,oc as _,pc as F,qc as A,rc as G,tc as $,uc as I,vc as U,wc as j,xc as C}from"./index-z5a4yxzz.js";import"./index-ef95xr4z.js";import{Kc as V,Mc as M,Nc as q,Pc as E,Qc as J}from"./index-xjzmb1pn.js";import"./index-g2raeeh4.js";import"./index-9bqd8veb.js";import"./index-0cn9bv8z.js";import"./index-jw1k4vbk.js";import"./index-yy1mm8zs.js";function L(Q,w){if(Q==="telemetry.enabled")K.setEnabled(w==="true")}function v(Q){return Object.entries(Q).map(([w,x])=>({key:w,value:x}))}function T(Q){let{db:w}=Q;return new R().get("/",async()=>{let x=await w.getAllConfig(),B=S(x);return{config:B,configs:v(B)}}).get("/status",async()=>{return await w.getConfigStatus()}).get("/:key",async({params:x,set:B})=>{let H=await w.getConfig(x.key);if(H===void 0)return B.status=404,{error:"Configuration key not found"};return{key:x.key,value:Z(x.key,H)}}).put("/:key",async({params:x,body:B,set:H})=>{if(h(x.key))return H.status=403,{error:"Configuration key is managed by a dedicated endpoint"};try{return await w.setConfig(x.key,B.value),L(x.key,B.value),{success:!0}}catch(z){return H.status=500,{error:"Failed to set configuration",details:String(z)}}},{body:X.Object({value:X.String()})}).delete("/:key",async({params:x,set:B})=>{if(h(x.key))return B.status=403,{error:"Configuration key is managed by a dedicated endpoint"};if(await w.getConfig(x.key)===void 0)return B.status=404,{error:"Configuration key not found"};try{return await w.deleteConfig(x.key),{success:!0}}catch(z){return B.status=500,{error:"Failed to delete configuration",details:String(z)}}}).post("/",async({body:x,set:B})=>{if(h(x.key))return B.status=403,{error:"Configuration key is managed by a dedicated endpoint"};try{return await w.setConfig(x.key,x.value),L(x.key,x.value),{success:!0,key:x.key}}catch(H){return B.status=500,{error:"Failed to set configuration",details:String(H)}}},{body:X.Object({key:X.String(),value:X.String()})}).post("/bulk",async({body:x,set:B})=>{let H=Object.keys(x.configs).filter(h);if(H.length>0)return B.status=403,{error:"One or more configuration keys are managed by dedicated endpoints",keys:H};try{await w.bulkSetConfig(x.configs);for(let[z,P]of Object.entries(x.configs))L(z,P);return{success:!0}}catch(z){return B.status=500,{error:"Failed to set configuration",details:String(z)}}},{body:X.Object({configs:X.Record(X.String(),X.String())})})}var f="http://localhost:3005";function u(Q){Q.command("config").description("Manage VibeControls agent configuration").option("--set <key=value>","Set a configuration value").option("--get <key>","Get a configuration value").option("--delete <key>","Delete a configuration value").option("--list","List all configuration values",!1).option("--value <value>","Value used with `--set <key>` (alternative to `--set key=value`)").option("--agent-url <url>","Agent URL",f).option("--json","Emit JSON").option("--plain","Force plain text output").action(async function(w){let x={...Q.opts(),...w};try{let B=V(w),H=encodeURIComponent(M(x));if(w.set){let z=w.set.indexOf("="),P,Y;if(z===-1){if(w.value===void 0){if(x.json){D(x,{ok:!1,error:"Invalid format: use key=value or --set key --value v"});return}F(`Invalid format. Use ${W.bold("--set key=value")} or ${W.bold("--set key --value value")}`);return}P=w.set.trim(),Y=String(w.value).trim()}else P=w.set.slice(0,z).trim(),Y=w.set.slice(z+1).trim();if(!P){if(x.json){D(x,{ok:!1,error:"Configuration key cannot be empty"});return}F("Configuration key cannot be empty.");return}if(await E(B,`/api/profiles/${H}/config/${encodeURIComponent(P)}`,{value:Y}),D(x,{ok:!0,key:P}))return;G(`${_.success} Set ${W.bold(P)} = ${W.cyan(String(Z(P,Y)))}`)}else if(w.get)await O({mode:N(x),fetchData:()=>q(B,`/api/profiles/${H}/config/${encodeURIComponent(w.get)}`),plain:(z)=>{I("Configuration"),j(),U(z.key,W.bold(String(Z(z.key,z.value)))),j()},json:(z)=>({key:z.key,value:Z(z.key,z.value)})});else if(w.delete){if(await J(B,`/api/profiles/${H}/config/${encodeURIComponent(w.delete)}`),D(x,{ok:!0,key:w.delete}))return;G(`${_.success} Deleted configuration key: ${W.bold(w.delete)}`)}else if(w.list)await O({mode:N(x),fetchData:()=>q(B,`/api/profiles/${H}/config/`),plain:(z)=>{if(I("Agent Configuration"),j(),!z.configs||z.configs.length===0){$(`${_.info} No configuration entries found.`);return}let P=z.configs.map((Y)=>({Key:Y.key,Value:String(Z(Y.key,Y.value))}));C(P),j(),$(`${_.info} ${z.configs.length} configuration(s) found.`)},json:(z)=>(z.configs??[]).map((P)=>({key:P.key,value:Z(P.key,P.value)}))});else{if(x.json){D(x,{ok:!1,error:"No operation specified"});return}$(`${_.info} Usage:`),$(` ${W.bold("vibe config --list")} List all config values`),$(` ${W.bold("vibe config --get <key>")} Get a config value`),$(` ${W.bold("vibe config --set <key=value>")} Set a config value`),$(` ${W.bold("vibe config --delete <key>")} Delete a config value`)}}catch(B){if(x.json){D(x,{ok:!1,error:A(B)});return}F(`Config operation failed: ${A(B)}`)}})}function k(Q,w){u(Q)}function d(Q){return{name:"config",version:"2.2.0",description:"Agent configuration key-value store",capabilities:{storage:"rw",audit:!0},tags:["backend","cli"],cliCommand:"config",apiPrefix:"/api/config",createRoutes:(w)=>T(w),onCliSetup:async(w,x)=>{k(w,x)}}}export{d as createPlugin};
2
+ import{$a as S,Za as h,_a as Z}from"./index-rc79x8fw.js";import{bb as K}from"./index-ydc0tk17.js";import"./index-52cp759f.js";import{Ub as X,Vb as R}from"./index-pgew6sge.js";import{jc as N,kc as O,lc as D}from"./index-8nqp3a4d.js";import{oc as W,pc as _,qc as F,rc as A,sc as G,uc as $,vc as I,wc as U,xc as j,yc as C}from"./index-1mppacnx.js";import"./index-thammzct.js";import{Lc as V,Nc as M,Oc as q,Qc as E,Rc as J}from"./index-b6x6a4xp.js";import"./index-h74va4wd.js";import"./index-js1xn4sq.js";import"./index-a4854mwz.js";import"./index-4qq083yd.js";import"./index-c7554sg7.js";function L(Q,w){if(Q==="telemetry.enabled")K.setEnabled(w==="true")}function v(Q){return Object.entries(Q).map(([w,x])=>({key:w,value:x}))}function T(Q){let{db:w}=Q;return new R().get("/",async()=>{let x=await w.getAllConfig(),B=S(x);return{config:B,configs:v(B)}}).get("/status",async()=>{return await w.getConfigStatus()}).get("/:key",async({params:x,set:B})=>{let H=await w.getConfig(x.key);if(H===void 0)return B.status=404,{error:"Configuration key not found"};return{key:x.key,value:Z(x.key,H)}}).put("/:key",async({params:x,body:B,set:H})=>{if(h(x.key))return H.status=403,{error:"Configuration key is managed by a dedicated endpoint"};try{return await w.setConfig(x.key,B.value),L(x.key,B.value),{success:!0}}catch(z){return H.status=500,{error:"Failed to set configuration",details:String(z)}}},{body:X.Object({value:X.String()})}).delete("/:key",async({params:x,set:B})=>{if(h(x.key))return B.status=403,{error:"Configuration key is managed by a dedicated endpoint"};if(await w.getConfig(x.key)===void 0)return B.status=404,{error:"Configuration key not found"};try{return await w.deleteConfig(x.key),{success:!0}}catch(z){return B.status=500,{error:"Failed to delete configuration",details:String(z)}}}).post("/",async({body:x,set:B})=>{if(h(x.key))return B.status=403,{error:"Configuration key is managed by a dedicated endpoint"};try{return await w.setConfig(x.key,x.value),L(x.key,x.value),{success:!0,key:x.key}}catch(H){return B.status=500,{error:"Failed to set configuration",details:String(H)}}},{body:X.Object({key:X.String(),value:X.String()})}).post("/bulk",async({body:x,set:B})=>{let H=Object.keys(x.configs).filter(h);if(H.length>0)return B.status=403,{error:"One or more configuration keys are managed by dedicated endpoints",keys:H};try{await w.bulkSetConfig(x.configs);for(let[z,P]of Object.entries(x.configs))L(z,P);return{success:!0}}catch(z){return B.status=500,{error:"Failed to set configuration",details:String(z)}}},{body:X.Object({configs:X.Record(X.String(),X.String())})})}var f="http://localhost:3005";function u(Q){Q.command("config").description("Manage VibeControls agent configuration").option("--set <key=value>","Set a configuration value").option("--get <key>","Get a configuration value").option("--delete <key>","Delete a configuration value").option("--list","List all configuration values",!1).option("--value <value>","Value used with `--set <key>` (alternative to `--set key=value`)").option("--agent-url <url>","Agent URL",f).option("--json","Emit JSON").option("--plain","Force plain text output").action(async function(w){let x={...Q.opts(),...w};try{let B=V(w),H=encodeURIComponent(M(x));if(w.set){let z=w.set.indexOf("="),P,Y;if(z===-1){if(w.value===void 0){if(x.json){D(x,{ok:!1,error:"Invalid format: use key=value or --set key --value v"});return}F(`Invalid format. Use ${W.bold("--set key=value")} or ${W.bold("--set key --value value")}`);return}P=w.set.trim(),Y=String(w.value).trim()}else P=w.set.slice(0,z).trim(),Y=w.set.slice(z+1).trim();if(!P){if(x.json){D(x,{ok:!1,error:"Configuration key cannot be empty"});return}F("Configuration key cannot be empty.");return}if(await E(B,`/api/profiles/${H}/config/${encodeURIComponent(P)}`,{value:Y}),D(x,{ok:!0,key:P}))return;G(`${_.success} Set ${W.bold(P)} = ${W.cyan(String(Z(P,Y)))}`)}else if(w.get)await O({mode:N(x),fetchData:()=>q(B,`/api/profiles/${H}/config/${encodeURIComponent(w.get)}`),plain:(z)=>{I("Configuration"),j(),U(z.key,W.bold(String(Z(z.key,z.value)))),j()},json:(z)=>({key:z.key,value:Z(z.key,z.value)})});else if(w.delete){if(await J(B,`/api/profiles/${H}/config/${encodeURIComponent(w.delete)}`),D(x,{ok:!0,key:w.delete}))return;G(`${_.success} Deleted configuration key: ${W.bold(w.delete)}`)}else if(w.list)await O({mode:N(x),fetchData:()=>q(B,`/api/profiles/${H}/config/`),plain:(z)=>{if(I("Agent Configuration"),j(),!z.configs||z.configs.length===0){$(`${_.info} No configuration entries found.`);return}let P=z.configs.map((Y)=>({Key:Y.key,Value:String(Z(Y.key,Y.value))}));C(P),j(),$(`${_.info} ${z.configs.length} configuration(s) found.`)},json:(z)=>(z.configs??[]).map((P)=>({key:P.key,value:Z(P.key,P.value)}))});else{if(x.json){D(x,{ok:!1,error:"No operation specified"});return}$(`${_.info} Usage:`),$(` ${W.bold("vibe config --list")} List all config values`),$(` ${W.bold("vibe config --get <key>")} Get a config value`),$(` ${W.bold("vibe config --set <key=value>")} Set a config value`),$(` ${W.bold("vibe config --delete <key>")} Delete a config value`)}}catch(B){if(x.json){D(x,{ok:!1,error:A(B)});return}F(`Config operation failed: ${A(B)}`)}})}function k(Q,w){u(Q)}function d(Q){return{name:"config",version:"2.2.0",description:"Agent configuration key-value store",capabilities:{storage:"rw",audit:!0},tags:["backend","cli"],cliCommand:"config",apiPrefix:"/api/config",createRoutes:(w)=>T(w),onCliSetup:async(w,x)=>{k(w,x)}}}export{d as createPlugin};
@@ -1,9 +1,9 @@
1
1
  // @bun
2
- import{he as I}from"./index-yy1mm8zs.js";async function g(){return await import("./index-scsjyj4m.js")}var E=/\x1b\[[0-9;]*m/g;function P(z){return z.replace(E,"")}async function A(z){if(z.rows.length===0)return null;let J=await g(),{createCliRenderer:D,BoxRenderable:X,TextRenderable:U,SelectRenderable:V,SelectRenderableEvents:K}=J,F=await D({exitOnCtrlC:!0,targetFps:30}),G=F.root.ctx,H=new X(G,{width:"100%",height:"100%",flexDirection:"column",backgroundColor:"#0b0d12"}),M=new U(G,{content:` ${z.title}`,fg:"#8be9fd",height:1}),O=new U(G,{content:` ${z.footer??"\u2191/\u2193 navigate \xB7 Enter select \xB7 q quit"}`,fg:"#6c7086",height:1}),_=new X(G,{width:"100%",flexGrow:1,flexDirection:"row"}),L=new V(G,{width:z.listWidth??28,height:"100%",options:z.rows.map((j)=>({name:P(j.label),description:P(j.hint??""),value:j.id})),selectedIndex:0,showDescription:!0,backgroundColor:"#0b0d12",textColor:"#cdd6f4",focusedBackgroundColor:"#0b0d12",focusedTextColor:"#cdd6f4",selectedBackgroundColor:"#1f2335",selectedTextColor:"#a6e3a1",descriptionColor:"#6c7086",selectedDescriptionColor:"#9399b2",showScrollIndicator:!0,wrapSelection:!0}),W=new X(G,{flexGrow:1,height:"100%",flexDirection:"column",paddingLeft:2,paddingRight:2,backgroundColor:"#11141c"}),Y=new U(G,{content:"",fg:"#cdd6f4"});W.add(Y),_.add(L),_.add(W),H.add(M),H.add(_),H.add(O),F.root.add(H),L.focus();let Z=(j)=>{let $=z.rows[j];if(!$)return;Y.content=`
2
+ import{ie as I}from"./index-c7554sg7.js";async function g(){return await import("./index-x649afed.js")}var E=/\x1b\[[0-9;]*m/g;function P(z){return z.replace(E,"")}async function A(z){if(z.rows.length===0)return null;let J=await g(),{createCliRenderer:D,BoxRenderable:X,TextRenderable:U,SelectRenderable:V,SelectRenderableEvents:K}=J,F=await D({exitOnCtrlC:!0,targetFps:30}),G=F.root.ctx,H=new X(G,{width:"100%",height:"100%",flexDirection:"column",backgroundColor:"#0b0d12"}),M=new U(G,{content:` ${z.title}`,fg:"#8be9fd",height:1}),O=new U(G,{content:` ${z.footer??"\u2191/\u2193 navigate \xB7 Enter select \xB7 q quit"}`,fg:"#6c7086",height:1}),_=new X(G,{width:"100%",flexGrow:1,flexDirection:"row"}),L=new V(G,{width:z.listWidth??28,height:"100%",options:z.rows.map((j)=>({name:P(j.label),description:P(j.hint??""),value:j.id})),selectedIndex:0,showDescription:!0,backgroundColor:"#0b0d12",textColor:"#cdd6f4",focusedBackgroundColor:"#0b0d12",focusedTextColor:"#cdd6f4",selectedBackgroundColor:"#1f2335",selectedTextColor:"#a6e3a1",descriptionColor:"#6c7086",selectedDescriptionColor:"#9399b2",showScrollIndicator:!0,wrapSelection:!0}),W=new X(G,{flexGrow:1,height:"100%",flexDirection:"column",paddingLeft:2,paddingRight:2,backgroundColor:"#11141c"}),Y=new U(G,{content:"",fg:"#cdd6f4"});W.add(Y),_.add(L),_.add(W),H.add(M),H.add(_),H.add(O),F.root.add(H),L.focus();let Z=(j)=>{let $=z.rows[j];if(!$)return;Y.content=`
3
3
  ${P($.detail)}
4
4
  `};return Z(0),L.on(K.SELECTION_CHANGED,(j)=>{Z(j)}),await new Promise((j)=>{let $=(Q)=>{try{F.destroy()}catch{}j(Q)};L.on(K.ITEM_SELECTED,()=>{let Q=z.rows[L.getSelectedIndex()];$(Q??null)}),F.keyInput.on("keypress",(Q)=>{if(Q.name==="escape"||Q.name==="q")$(null)})}).then(async(j)=>{if(j&&z.onSelect)await z.onSelect(j);return j})}async function C(z){let J=await g(),{createCliRenderer:D,BoxRenderable:X,TextRenderable:U}=J,V=await D({exitOnCtrlC:!0,targetFps:30}),K=V.root.ctx,F=new X(K,{width:"100%",height:"100%",flexDirection:"column",backgroundColor:"#0b0d12"}),G=new U(K,{content:` ${z.title}`,fg:"#8be9fd",height:1}),H=new X(K,{width:"100%",flexGrow:1,paddingLeft:2,paddingRight:2,backgroundColor:"#11141c"}),M=new U(K,{content:`
5
5
  ${P(z.body)}
6
6
  `,fg:"#cdd6f4"}),O=new U(K,{content:` ${z.footer??"q to quit"}`,fg:"#6c7086",height:1});H.add(M),F.add(G),F.add(H),F.add(O),V.root.add(F),await new Promise((_)=>{let L=()=>{try{V.destroy()}catch{}_()};V.keyInput.on("keypress",(W)=>{if(W.name==="escape"||W.name==="q"||W.name==="return")L()})})}async function S(z,J,D=0){if(J.length===0)return null;let X=await g(),{createCliRenderer:U,BoxRenderable:V,TextRenderable:K,SelectRenderable:F,SelectRenderableEvents:G}=X,H=await U({exitOnCtrlC:!0,targetFps:30}),M=H.root.ctx,O=new V(M,{width:"100%",height:"100%",flexDirection:"column",backgroundColor:"#0b0d12"}),_=new K(M,{content:` ${z}`,fg:"#8be9fd",height:1}),L=new F(M,{width:"100%",flexGrow:1,options:J.map((Y)=>({name:P(Y.label),description:P(Y.hint??""),value:Y.value})),selectedIndex:D,showDescription:!0,backgroundColor:"#0b0d12",textColor:"#cdd6f4",focusedBackgroundColor:"#0b0d12",focusedTextColor:"#cdd6f4",selectedBackgroundColor:"#1f2335",selectedTextColor:"#a6e3a1",descriptionColor:"#6c7086",selectedDescriptionColor:"#9399b2",showScrollIndicator:!0,wrapSelection:!0}),W=new K(M,{content:" \u2191/\u2193 move \xB7 Enter select \xB7 q cancel",fg:"#6c7086",height:1});return O.add(_),O.add(L),O.add(W),H.root.add(O),L.focus(),await new Promise((Y)=>{let Z=(j)=>{try{H.destroy()}catch{}Y(j)};L.on(G.ITEM_SELECTED,()=>{let j=J[L.getSelectedIndex()];Z(j?.value??null)}),H.keyInput.on("keypress",(j)=>{if(j.name==="escape"||j.name==="q")Z(null)})})}async function f(z,J,D){let X=await g(),{createCliRenderer:U,BoxRenderable:V,TextRenderable:K}=X,F=new Set(D);for(let j of J)if(j.mandatory)F.add(j.key);let G=0,H=await U({exitOnCtrlC:!0,targetFps:30}),M=H.root.ctx,O=new V(M,{width:"100%",height:"100%",flexDirection:"column",backgroundColor:"#0b0d12"}),_=new K(M,{content:` ${z}`,fg:"#8be9fd",height:1}),L=new V(M,{width:"100%",flexGrow:1,paddingLeft:2,paddingTop:1,backgroundColor:"#0b0d12"}),W=new K(M,{content:"",fg:"#cdd6f4"}),Y=new K(M,{content:" \u2191/\u2193 move \xB7 space toggle \xB7 Enter confirm \xB7 q cancel",fg:"#6c7086",height:1});L.add(W),O.add(_),O.add(L),O.add(Y),H.root.add(O);let Z=()=>{W.content=J.map((j,$)=>{let q=j.mandatory||F.has(j.key)?"[x]":"[ ]",N=$===G?"\u203A":" ",w=j.mandatory?" (required)":"";return` ${N} ${q} ${j.label}${w}
7
7
  ${P(j.description)}`}).join(`
8
8
  `)};return Z(),await new Promise((j)=>{let $=(Q)=>{try{H.destroy()}catch{}j(Q)};H.keyInput.on("keypress",(Q)=>{let q=Q.name;if(q==="up"||q==="k")G=(G-1+J.length)%J.length,Z();else if(q==="down"||q==="j")G=(G+1)%J.length,Z();else if(q==="space"||Q.sequence===" "){let N=J[G];if(N&&!N.mandatory){if(F.has(N.key))F.delete(N.key);else F.add(N.key);Z()}}else if(q==="return"){for(let N of J)if(N.mandatory)F.add(N.key);$(F)}else if(q==="escape"||q==="q")$(null)})})}
9
- export{P as Ec,A as Fc,C as Gc,S as Hc,f as Ic};
9
+ export{P as Fc,A as Gc,C as Hc,S as Ic,f as Jc};
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{Sa as k}from"./index-g3ap3xpr.js";import{Eb as F,Fb as h,Gb as S,Hb as q,Jb as N,wb as f,zb as c}from"./index-01qzsnwd.js";import{Ub as P}from"./index-04n4qgvd.js";import{Nd as V}from"./index-9bqd8veb.js";var U=["tunnel","session","ai","plan","gitops","security"];class m{providers=new Map;providerOrder=new Map;defaults=new Map;services=new Map;db;constructor(z){this.db=z}getDb(){return this.db}setProviderDefault(z,J){this.defaults.set(z,J)}clearProviderDefault(z,J){if(!J||this.defaults.get(z)===J)this.defaults.delete(z)}async hydrateDefaultsFromDb(){if(!this.db)return;for(let z of U)try{let J=await this.db.getConfig(`provider:default:${z}`);if(J)this.defaults.set(z,J)}catch{}}registerProvider(z,J,Q){if(!this.providers.has(z))this.providers.set(z,new Map),this.providerOrder.set(z,[]);let W=this.providers.get(z),Z=this.providerOrder.get(z);if(W.has(Q))V().logger.info("service-registry",`Updating ${z} provider from plugin '${Q}'`);else V().logger.info("service-registry",`Registered ${z} provider from plugin '${Q}'`);if(W.set(Q,{provider:J,pluginName:Q,registeredAt:new Date}),!Z.includes(Q))Z.push(Q)}getProvider(z){let J=this.providers.get(z);if(!J||J.size===0)return;let Q=this.defaults.get(z);if(Q&&J.has(Q))return J.get(Q).provider;let W=this.providerOrder.get(z);if(W&&W.length>0){let Z=W[0];return J.get(Z)?.provider}return}getProviderByName(z,J){let Q=this.providers.get(z);if(!Q)return;return Q.get(J)?.provider}hasProvider(z){let J=this.providers.get(z);return!!J&&J.size>0}unregisterProvider(z,J){let Q=this.providers.get(z);if(!Q)return!1;let W=Q.delete(J);if(W){let Z=this.providerOrder.get(z);if(Z){let X=Z.indexOf(J);if(X!==-1)Z.splice(X,1)}this.clearProviderDefault(z,J),V().logger.info("service-registry",`Unregistered ${z} provider from plugin '${J}'`)}return W}unregisterPlugin(z){for(let J of U)this.unregisterProvider(J,z);this.unregisterServices(z)}listProvidersForType(z){let J=this.providers.get(z);if(!J)return[];let Q=this.defaults.get(z);if(!Q||!J.has(Q)){let W=this.providerOrder.get(z);Q=W&&W.length>0?W[0]:void 0}return Array.from(J.keys()).map((W)=>({pluginName:W,isDefault:W===Q}))}registerService(z,J,Q){let W=`${z}:${J}`;this.services.set(W,{service:Q,pluginName:z}),V().logger.debug("service-registry",`Registered service '${W}'`)}getService(z,J){let Q=`${z}:${J}`;return this.services.get(Q)?.service}unregisterServices(z){let J=[];for(let[Q,W]of this.services)if(W.pluginName===z)J.push(Q);for(let Q of J)this.services.delete(Q);if(J.length>0)V().logger.info("service-registry",`Unregistered ${J.length} services from ${z}`)}listProviders(){let z=[];for(let[J,Q]of this.providers)for(let[W,Z]of Q)z.push({type:J,name:W,pluginName:Z.pluginName});return z}listServices(){return Array.from(this.services.entries()).map(([z,J])=>({pluginName:J.pluginName,serviceName:z.split(":").slice(1).join(":")}))}clear(){this.providers.clear(),this.providerOrder.clear(),this.defaults.clear(),this.services.clear()}}import{extname as g,relative as o,resolve as u}from"path";import{realpath as E}from"fs/promises";var n=["'self'","http://localhost:*","http://127.0.0.1:*","https://localhost:*","https://127.0.0.1:*","https://*.local.burdenoff.com","https://vibecontrols.com","https://*.vibecontrols.com","https://burdenoff.com","https://app.burdenoff.com","https://alphaapp.burdenoff.com"],D=!1;function w(){let z=process.env.VIBE_UI_FRAME_ANCESTORS?.trim(),J=z?z.split(/[\s,]+/).filter(Boolean):n;if(z&&!D&&(J.includes("*")||!J.includes("'self'")))D=!0,console.warn(`[ui-server] VIBE_UI_FRAME_ANCESTORS override does not include "'self'" or contains "*". This significantly weakens CSP frame-ancestors and is almost never intended. Override: ${z}`);return`frame-ancestors ${J.join(" ")}`}var l={".html":"text/html",".js":"application/javascript",".mjs":"application/javascript",".css":"text/css",".json":"application/json",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".svg":"image/svg+xml",".ico":"image/x-icon",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".map":"application/json",".wasm":"application/wasm"};function s(z){return l[g(z).toLowerCase()]||"application/octet-stream"}var b=`<script>
2
+ import{Sa as k}from"./index-jdh30t6c.js";import{Eb as F,Fb as h,Gb as S,Hb as q,Jb as N,wb as f,zb as c}from"./index-rqq0k5fc.js";import{Vb as P}from"./index-pgew6sge.js";import{Od as V}from"./index-js1xn4sq.js";var U=["tunnel","session","ai","plan","gitops","security"];class m{providers=new Map;providerOrder=new Map;defaults=new Map;services=new Map;db;constructor(z){this.db=z}getDb(){return this.db}setProviderDefault(z,J){this.defaults.set(z,J)}clearProviderDefault(z,J){if(!J||this.defaults.get(z)===J)this.defaults.delete(z)}async hydrateDefaultsFromDb(){if(!this.db)return;for(let z of U)try{let J=await this.db.getConfig(`provider:default:${z}`);if(J)this.defaults.set(z,J)}catch{}}registerProvider(z,J,Q){if(!this.providers.has(z))this.providers.set(z,new Map),this.providerOrder.set(z,[]);let W=this.providers.get(z),Z=this.providerOrder.get(z);if(W.has(Q))V().logger.info("service-registry",`Updating ${z} provider from plugin '${Q}'`);else V().logger.info("service-registry",`Registered ${z} provider from plugin '${Q}'`);if(W.set(Q,{provider:J,pluginName:Q,registeredAt:new Date}),!Z.includes(Q))Z.push(Q)}getProvider(z){let J=this.providers.get(z);if(!J||J.size===0)return;let Q=this.defaults.get(z);if(Q&&J.has(Q))return J.get(Q).provider;let W=this.providerOrder.get(z);if(W&&W.length>0){let Z=W[0];return J.get(Z)?.provider}return}getProviderByName(z,J){let Q=this.providers.get(z);if(!Q)return;return Q.get(J)?.provider}hasProvider(z){let J=this.providers.get(z);return!!J&&J.size>0}unregisterProvider(z,J){let Q=this.providers.get(z);if(!Q)return!1;let W=Q.delete(J);if(W){let Z=this.providerOrder.get(z);if(Z){let X=Z.indexOf(J);if(X!==-1)Z.splice(X,1)}this.clearProviderDefault(z,J),V().logger.info("service-registry",`Unregistered ${z} provider from plugin '${J}'`)}return W}unregisterPlugin(z){for(let J of U)this.unregisterProvider(J,z);this.unregisterServices(z)}listProvidersForType(z){let J=this.providers.get(z);if(!J)return[];let Q=this.defaults.get(z);if(!Q||!J.has(Q)){let W=this.providerOrder.get(z);Q=W&&W.length>0?W[0]:void 0}return Array.from(J.keys()).map((W)=>({pluginName:W,isDefault:W===Q}))}registerService(z,J,Q){let W=`${z}:${J}`;this.services.set(W,{service:Q,pluginName:z}),V().logger.debug("service-registry",`Registered service '${W}'`)}getService(z,J){let Q=`${z}:${J}`;return this.services.get(Q)?.service}unregisterServices(z){let J=[];for(let[Q,W]of this.services)if(W.pluginName===z)J.push(Q);for(let Q of J)this.services.delete(Q);if(J.length>0)V().logger.info("service-registry",`Unregistered ${J.length} services from ${z}`)}listProviders(){let z=[];for(let[J,Q]of this.providers)for(let[W,Z]of Q)z.push({type:J,name:W,pluginName:Z.pluginName});return z}listServices(){return Array.from(this.services.entries()).map(([z,J])=>({pluginName:J.pluginName,serviceName:z.split(":").slice(1).join(":")}))}clear(){this.providers.clear(),this.providerOrder.clear(),this.defaults.clear(),this.services.clear()}}import{extname as g,relative as o,resolve as u}from"path";import{realpath as E}from"fs/promises";var n=["'self'","http://localhost:*","http://127.0.0.1:*","https://localhost:*","https://127.0.0.1:*","https://*.local.burdenoff.com","https://vibecontrols.com","https://*.vibecontrols.com","https://burdenoff.com","https://app.burdenoff.com","https://alphaapp.burdenoff.com"],D=!1;function w(){let z=process.env.VIBE_UI_FRAME_ANCESTORS?.trim(),J=z?z.split(/[\s,]+/).filter(Boolean):n;if(z&&!D&&(J.includes("*")||!J.includes("'self'")))D=!0,console.warn(`[ui-server] VIBE_UI_FRAME_ANCESTORS override does not include "'self'" or contains "*". This significantly weakens CSP frame-ancestors and is almost never intended. Override: ${z}`);return`frame-ancestors ${J.join(" ")}`}var l={".html":"text/html",".js":"application/javascript",".mjs":"application/javascript",".css":"text/css",".json":"application/json",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".svg":"image/svg+xml",".ico":"image/x-icon",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".map":"application/json",".wasm":"application/wasm"};function s(z){return l[g(z).toLowerCase()]||"application/octet-stream"}var b=`<script>
3
3
  window.__VIBE_AUTH__={apiKey:null};
4
4
  (function(){
5
5
  var p=new URLSearchParams(window.location.search);