@lensmcp/cluster 1.20.0 → 1.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/basic-ssl.js +1 -1
  2. package/build-scope-patterns.js +1 -1
  3. package/create-webpack-dev.js +1 -1
  4. package/create-webpack-prod.js +1 -1
  5. package/executors/build/build.impl.js +1 -1
  6. package/executors/gateway/gateway-errors.js +1 -1
  7. package/executors/gateway/gateway.impl.js +1 -1
  8. package/executors/gateway/gateway.lib.js +1 -1
  9. package/executors/gateway/health-check.js +1 -1
  10. package/executors/gateway/jwks-verify.js +1 -1
  11. package/executors/gateway/main.prod-gateway.js +2 -2
  12. package/executors/gateway/main.rollout.js +4 -4
  13. package/executors/gateway/manifest.js +1 -1
  14. package/executors/gateway/metrics.js +1 -1
  15. package/executors/gateway/otel-tracing.js +1 -1
  16. package/executors/gateway/prod-gateway.lib.js +1 -1
  17. package/executors/gateway/prod-runtime/access-log.js +1 -1
  18. package/executors/gateway/prod-runtime/app.js +1 -1
  19. package/executors/gateway/prod-runtime/auth.js +1 -1
  20. package/executors/gateway/prod-runtime/cors.js +1 -1
  21. package/executors/gateway/prod-runtime/edge.js +1 -1
  22. package/executors/gateway/prod-runtime/handler.js +1 -1
  23. package/executors/gateway/prod-runtime/hooks.js +1 -1
  24. package/executors/gateway/prod-runtime/observability.js +1 -1
  25. package/executors/gateway/prod-runtime/rollout.js +1 -1
  26. package/executors/gateway/prod-runtime/routing.js +1 -1
  27. package/executors/gateway/prod-runtime/server.js +1 -1
  28. package/executors/gateway/prod-runtime/trust.js +1 -1
  29. package/executors/gateway/prod-runtime/upgrade.js +2 -2
  30. package/executors/gateway/prod-runtime/upstream.js +1 -1
  31. package/executors/gateway/providers-prod.js +1 -1
  32. package/executors/gateway/rate-limit.js +2 -2
  33. package/executors/gateway/registry-source.js +1 -1
  34. package/executors/gateway/rollout-ops.js +2 -2
  35. package/executors/gateway/runtime/auth.js +1 -1
  36. package/executors/gateway/runtime/chooser.js +7 -7
  37. package/executors/gateway/runtime/control.d.ts +13 -0
  38. package/executors/gateway/runtime/control.js +1 -1
  39. package/executors/gateway/runtime/dev-auth.js +1 -1
  40. package/executors/gateway/runtime/discovery.js +1 -1
  41. package/executors/gateway/runtime/edge.js +1 -1
  42. package/executors/gateway/runtime/handler.js +1 -1
  43. package/executors/gateway/runtime/hmr-reload.js +1 -1
  44. package/executors/gateway/runtime/hooks.js +1 -1
  45. package/executors/gateway/runtime/lens-children.js +1 -1
  46. package/executors/gateway/runtime/lifecycle.js +3 -3
  47. package/executors/gateway/runtime/observability.js +2 -2
  48. package/executors/gateway/runtime/pod-env.js +2 -2
  49. package/executors/gateway/runtime/proxy.js +1 -1
  50. package/executors/gateway/runtime/route-registry.js +1 -1
  51. package/executors/gateway/runtime/scope.js +1 -1
  52. package/executors/gateway/runtime/server.js +2 -2
  53. package/executors/gateway/runtime/service-keys.js +1 -1
  54. package/executors/gateway/runtime/types.js +1 -1
  55. package/executors/gateway/runtime/upgrade.js +1 -1
  56. package/executors/gateway/runtime/workspace-registry.js +1 -1
  57. package/executors/gateway/ssrf-guard.js +1 -1
  58. package/executors/serve/serve.impl.js +1 -1
  59. package/executors/trust/trust.impl.js +3 -3
  60. package/gateway.js +1 -1
  61. package/index.js +1 -1
  62. package/main.devserver.js +5 -5
  63. package/package.json +4 -4
  64. package/tsgo-check-plugin.js +4 -4
  65. package/typecheck-bus.js +3 -3
@@ -1,3 +1,3 @@
1
- "use strict";var U=Object.defineProperty;var E=(t,o)=>U(t,"name",{value:o,configurable:!0});var q=Object.defineProperty,v=E((t,o)=>q(t,"name",{value:o,configurable:!0}),"v"),W=Object.defineProperty,a=v((t,o)=>W(t,"name",{value:o,configurable:!0}),"a");Object.defineProperty(exports,"__esModule",{value:!0}),exports.sourceSetSnapshot=sourceSetSnapshot,exports.sourceSetSignature=sourceSetSignature,exports.diffSourceSets=diffSourceSets,exports.sourceScopeDirs=sourceScopeDirs,exports.podRecycleReason=podRecycleReason,exports.lensFrontendStale=lensFrontendStale,exports.lensWatcherVerdict=lensWatcherVerdict,exports.lensChildWedged=lensChildWedged,exports.isPortConflictExit=isPortConflictExit,exports.createServiceLayer=createServiceLayer;const tslib_1=require("tslib"),node_child_process_1=require("node:child_process"),fs=tslib_1.__importStar(require("node:fs")),http=tslib_1.__importStar(require("node:http")),path=tslib_1.__importStar(require("node:path")),node_util_1=require("node:util"),discovery_1=require("./discovery"),scope_1=require("./scope"),pod_env_1=require("./pod-env"),types_1=require("./types");function eastWestEnv(t,o){const l={},i=t.serviceKeys[o];if(i&&(l.LENSMCP_SERVICE_KEY=i),t.https){const c=require("../../../basic-ssl").caCertPath();fs.existsSync(c)&&(l.NODE_EXTRA_CA_CERTS=c)}return l}E(eastWestEnv,"eastWestEnv"),v(eastWestEnv,"eastWestEnv"),a(eastWestEnv,"eastWestEnv");const sleep=a(t=>new Promise(o=>setTimeout(o,t)),"sleep"),SRC_EXCLUDE=new Set(["node_modules","dist","tmp","coverage","build","out","target"]),SRC_EXT=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".css",".scss",".sass",".less",".json",".html",".htm",".vue",".svelte",".mdx"]),SCAN_FILE_CAP=1e5;function fnv1a(t){let o=2166136261;for(let l=0;l<t.length;l+=1)o^=t.charCodeAt(l),o=Math.imul(o,16777619);return o>>>0}E(fnv1a,"fnv1a"),v(fnv1a,"fnv1a"),a(fnv1a,"fnv1a");const execFileP=(0,node_util_1.promisify)(node_child_process_1.execFile);async function gitIgnoredPaths(t){try{const{stdout:o}=await execFileP("git",["ls-files","--others","--directory","--ignored","--exclude-standard","-z"],{cwd:t,maxBuffer:33554432,timeout:1e4,windowsHide:!0});return new Set(o.split("\0").filter(Boolean))}catch{return new Set}}E(gitIgnoredPaths,"gitIgnoredPaths"),v(gitIgnoredPaths,"gitIgnoredPaths"),a(gitIgnoredPaths,"gitIgnoredPaths");async function sourceSetSnapshot(t,o,l){let i=0,c=0,w=!1;const u=new Set,j=await gitIgnoredPaths(t),g=a(A=>path.relative(t,A).split(path.sep).join("/"),"rel"),$=a(async(A,R=!0)=>{if(i>=SCAN_FILE_CAP){w=!0;return}let L;try{L=await fs.promises.readdir(A,{withFileTypes:!0})}catch{return}for(const T of L){if(i>=SCAN_FILE_CAP){w=!0;return}const _=T.name,M=path.join(A,_);if(T.isDirectory()){if(!R||_.startsWith(".")||SRC_EXCLUDE.has(_)||l?.has(_)||_.endsWith("-devserver")||j.has(`${g(M)}/`))continue;await $(M)}else if(T.isFile()){const x=_.lastIndexOf(".");if(x<=0||!SRC_EXT.has(_.slice(x))||j.has(g(M)))continue;const D=g(M);if(u.has(D))continue;u.add(D),i+=1,c^=fnv1a(D)}}},"walk");if(o&&o.length>0){await $(t,!1);for(const A of o)await $(A)}else await $(t);return{signature:`${i}:${(c>>>0).toString(36)}`,paths:u,truncated:w}}E(sourceSetSnapshot,"sourceSetSnapshot"),v(sourceSetSnapshot,"sourceSetSnapshot"),a(sourceSetSnapshot,"sourceSetSnapshot");async function sourceSetSignature(t,o,l){return(await sourceSetSnapshot(t,o,l)).signature}E(sourceSetSignature,"sourceSetSignature"),v(sourceSetSignature,"sourceSetSignature"),a(sourceSetSignature,"sourceSetSignature");const SOURCE_DIFF_PATH_CAP=128;function diffSourceSets(t,o,l){if(t.paths.size===o.paths.size){let u=!0;for(const j of t.paths)if(!o.paths.has(j)){u=!1;break}if(u)return null}const i=[],c=[];let w=t.truncated||o.truncated;for(const u of o.paths)t.paths.has(u)||(i.length+c.length<SOURCE_DIFF_PATH_CAP?i.push(u):w=!0);for(const u of t.paths)o.paths.has(u)||(i.length+c.length<SOURCE_DIFF_PATH_CAP?c.push(u):w=!0);return{changedAt:l,added:i,removed:c,truncated:w}}E(diffSourceSets,"diffSourceSets"),v(diffSourceSets,"diffSourceSets"),a(diffSourceSets,"diffSourceSets");function sourceScopeDirs(t,o,l,i,c){const w=a(g=>{const $=path.relative(t,g).split(path.sep).filter(Boolean);return $.length===0||$[0].startsWith("..")?"":$[0]},"bucketOf")(o);if(!w)return[];const u=new Set(l.filter(Boolean)),j=new Set([w]);for(const g of i)g.startsWith(".")||SRC_EXCLUDE.has(g)||c?.has(g)||g.endsWith("-devserver")||u.has(g)||j.add(g);return[...j].sort().map(g=>path.join(t,g))}E(sourceScopeDirs,"sourceScopeDirs"),v(sourceScopeDirs,"sourceScopeDirs"),a(sourceScopeDirs,"sourceScopeDirs");function podRecycleReason(t,o,l,i){return!t.proc||t.state!=="up"||t.spawnAt==null||t.inflight>0||o-t.lastUsed<i.settleMs||t.lastStaleRecycleAt!=null&&o-t.lastStaleRecycleAt<i.cooldownMs?null:l>0&&l-t.spawnAt>i.graceMs?"stale-source-set":i.maxAgeMs>0&&o-t.spawnAt>i.maxAgeMs?"max-age":null}E(podRecycleReason,"podRecycleReason"),v(podRecycleReason,"podRecycleReason"),a(podRecycleReason,"podRecycleReason");function lensFrontendStale(t,o,l,i,c){return!(i-o<c.cooldownMs||l<=0||l-t<=c.graceMs||i-l<c.settleMs)}E(lensFrontendStale,"lensFrontendStale"),v(lensFrontendStale,"lensFrontendStale"),a(lensFrontendStale,"lensFrontendStale");function lensWatcherVerdict(t,o,l,i=[]){if(!t)return"unknown";if("schemaVersion"in t&&t.schemaVersion>=2&&i.length>0){const c=o-l,w=new Set(t.recentEvents.filter(u=>u.at>=c).map(u=>path.resolve(u.path)));return i.every(u=>w.has(path.resolve(u)))?"heard":"missed"}return t.lastFsSetEventAt>=o-l?"heard":"missed"}E(lensWatcherVerdict,"lensWatcherVerdict"),v(lensWatcherVerdict,"lensWatcherVerdict"),a(lensWatcherVerdict,"lensWatcherVerdict");function lensChildWedged(t,o,l,i){const c=t.hasListened?i.graceMs:Math.max(i.graceMs,i.neverListenedGraceMs);return l-t.spawnedAt<c||l-o<i.cooldownMs||t.probeFails<Math.max(2,i.failureThreshold)?null:"wedged-no-listener"}E(lensChildWedged,"lensChildWedged"),v(lensChildWedged,"lensChildWedged"),a(lensChildWedged,"lensChildWedged");function isPortConflictExit(t,o){return t.signal||t.code===null||t.code===0||t.ranMs>o.fastFailMs?!1:t.portHeld}E(isPortConflictExit,"isPortConflictExit"),v(isPortConflictExit,"isPortConflictExit"),a(isPortConflictExit,"isPortConflictExit");function createServiceLayer(t,o){const{emit:l}=o,i=a(e=>e.wsKey===t.wsKey?void 0:path.join(e.root,".lensmcp","events.jsonl"),"serviceBus"),c=a((e,r,s,n,d)=>l(r,s,n,{wsKey:e.wsKey,...d},void 0,i(e)),"emitSvc"),w=a(e=>(e.scannedAt=0,(0,discovery_1.pickSock)(e,t.scanTtlMs)?e.socks.length:0),"scanNow"),u=a((e,r)=>{let s;try{s=(0,node_child_process_1.execFileSync)("ps",["ax","-ww","-o","pid=,pgid=,command="],{encoding:"utf8",timeout:5e3})}catch{return 0}const n=e.proc?.pid;let d=0;for(const h of s.split(`
2
- `)){const f=h.match(/^\s*(\d+)\s+(\d+)\s+(.*)$/);if(!f)continue;const k=Number(f[1]),S=Number(f[2]),p=f[3];if(p.includes(`run ${r}`)&&/\bnx(\.js)?\b/.test(p)&&!(p.includes("/node_modules/nx/")&&!p.includes(e.root))&&!(k===process.pid||k===n)&&!(n!==void 0&&S===n)){try{process.kill(-S,"SIGKILL")}catch{try{process.kill(k,"SIGKILL")}catch{}}d+=1}}return d>0&&(console.log(`[gateway] ${r}: reaped ${d} stale runner tree(s) \u2014 a foreign generation held the nx task lock`),c(e,"warning",`stale-runner reap: ${e.project} (${d} foreign tree(s))`,`cluster-service:${e.project}`,{kind:"stale-runner-reap",project:e.project,reaped:d})),d},"reapForeignRunners"),j=a(e=>{if(t.stopped())return;const r=`${e.project}:${e.decl.serveTarget??"serve-hmr"}`,s=Math.max(1,e.decl.minPods??1);u(e,r),e.lockBlockedAt=void 0,console.log(`[gateway] starting ${r} (pods=${s})\u2026`),c(e,"info",`service starting: ${e.project} (${s} pod${s>1?"s":""})`,`cluster-service:${e.project}`,{kind:"service-starting",project:e.project,pods:s}),e.state="starting",e.spawnAt=Date.now();const n=path.join(e.root,"node_modules","nx","dist","bin","nx.js"),[d,h]=fs.existsSync(n)?[process.execPath,[n,"run",r,`--childCount=${s}`]]:["yarn",["nx","run",r,`--childCount=${s}`]],f=(0,node_child_process_1.spawn)(d,h,{cwd:e.root,detached:!0,env:{...(0,pod_env_1.podBaseEnv)(process.env,t.root,e.root),NX_DAEMON:"false",NX_ISOLATE_PLUGINS:"false",...e.wsKey?{LENSMCP_WS_KEY:e.wsKey}:{},LENSMCP_EVENT_FILE:e.wsKey===t.wsKey?t.eventFile:path.join(e.root,".lensmcp","events.jsonl"),LENSMCP_GATEWAY_PID:String(process.pid),...eastWestEnv(t,e.project)},stdio:["ignore","pipe","pipe"]});e.lastErrors=[],e.buildFailed=!1;const k=a(S=>{const p=S.toString();for(const y of p.split(`
3
- `)){if(/ERROR in |error TS\d+|Found \d+ error|Unhandled 'error' event|EADDRINUSE/.test(y)){const m=y.replace(/\x1b\[[0-9;]*m/g,"").trim();e.lastErrors.push(m),e.lastErrors.length>12&&e.lastErrors.shift(),e.buildFailed=!0;const C=Date.now();(m!==e.lastErrorEmitSig||C-(e.lastErrorEmitAt??0)>=types_1.SERVICE_ERROR_THROTTLE_MS)&&(e.lastErrorEmitSig=m,e.lastErrorEmitAt=C,c(e,"error",`service error: ${e.project}`,`cluster-service:${e.project}`,{kind:"service-error",project:e.project,line:m}))}/No typescript errors found|webpack compiled successfully|Child#\d+ ready/.test(y)&&(e.buildFailed=!1),!e.lockBlockedAt&&/Waiting for .+ in another nx process/.test(y)&&(e.lockBlockedAt=Date.now(),console.log(`[gateway] ${r}: spawn blocked by a stale nx runner \u2014 breaking the lock + respawning`),c(e,"warning",`nx task lock: ${e.project} blocked by a stale runner \u2014 auto-breaking`,`cluster-service:${e.project}`,{kind:"nx-lock-break",project:e.project}),setTimeout(()=>{t.stopped()||!e.lockBlockedAt||(R(e,"parked on a foreign nx task lock \u2014 recycling",{announce:!1}),u(e,r),setTimeout(()=>{!t.stopped()&&!e.proc&&e.state==="down"&&j(e)},1500).unref?.())},250).unref?.())}},"sniff");f.stdout?.on("data",S=>{t.stopped()||(k(S),process.stdout.write(`[${e.project}] ${S}`))}),f.stderr?.on("data",S=>{t.stopped()||(k(S),process.stderr.write(`[${e.project}] ${S}`))}),f.on("exit",S=>{if(e.proc=void 0,e.state="down",t.stopped()||(console.log(`[gateway] ${r} exited (${S})`),c(e,S===0?"info":"warning",`service down: ${e.project} (exit ${S})`,`cluster-service:${e.project}`,{kind:"service-down",project:e.project,code:S}),S===0||e.buildFailed))return;const p=Date.now();if(e.restarts=(e.restarts??[]).filter(m=>p-m<types_1.SERVICE_RESTART_WINDOW_MS),e.restarts.length>=types_1.SERVICE_MAX_RESTARTS){c(e,"error",`service crash-looping: ${e.project} \u2014 ${types_1.SERVICE_MAX_RESTARTS}+ restarts/min, not auto-respawning (the next request retries)`,`cluster-service:${e.project}`,{kind:"service-crash-loop",project:e.project});return}e.restarts.push(p);const y=Math.min(8e3,500*2**(e.restarts.length-1));setTimeout(()=>{t.stopped()||e.proc||e.state!=="down"||(console.log(`[gateway] self-heal: respawning ${e.project} (restart ${e.restarts.length}/${types_1.SERVICE_MAX_RESTARTS})`),c(e,"info",`self-heal: respawning ${e.project}`,`cluster-service:${e.project}`,{kind:"service-respawn",project:e.project,attempt:e.restarts.length}),j(e))},y)}),e.proc=f},"spawnService"),g=a((e,r)=>{if(e.state==="up")return!1;e.state="up";const s=e.pool.socks.length;return c(e,"info",`service up: ${e.project} (${s} pods, ${r})`,`cluster-service:${e.project}`,{kind:"service-up",project:e.project,pods:s,adopted:r==="adopted"}),!0},"markUp"),$=a(async e=>{if(w(e.pool)>0)return g(e,"adopted"),!0;if(t.stopped())return!1;e.state!=="starting"&&!e.proc&&j(e);const r=Date.now()+t.startupTimeoutMs,s=Date.now()+12e3;for(;!t.stopped()&&Date.now()<r;){if(await sleep(Math.min(700,t.startupTimeoutMs/4)),e.buildFailed&&Date.now()>s)return!1;if(w(e.pool)>0){e.state="up",e.buildFailed=!1;const n=e.spawnAt?Date.now()-e.spawnAt:void 0;return console.log(`[gateway] ${e.project} up (${e.pool.socks.length} pods${n?`, cold start ${n}ms`:""})`),c(e,"info",`cold start: ${e.project} (${e.pool.socks.length} pods, ${n??"?"}ms)`,`cluster-service:${e.project}`,{kind:"cold-start",project:e.project,pods:e.pool.socks.length,durationMs:n}),!0}if(e.state==="down")return!1}return!1},"ensureUp"),A=a(e=>{const r=e.decl.maxPods??e.decl.minPods??1,s=e.pool.socks.length,n=e.decl.adminUrl??(e.decl.port?`http://localhost:${e.decl.port}`:void 0);if(!n||s===0||s>=r||e.inflight<=s||Date.now()-e.lastScaleAt<5e3)return;e.lastScaleAt=Date.now();const d=(n.startsWith("https")?require("node:https"):http).request(`${n}/webpack/scale`,{method:"POST",rejectUnauthorized:!1},h=>h.resume());d.on("error",()=>{}),d.end(JSON.stringify({pods:s+1})),console.log(`[gateway] autoscale ${e.project}: ${s} \u2192 ${s+1} pods (inflight ${e.inflight})`),c(e,"info",`autoscale: ${e.project} ${s} \u2192 ${s+1} pods`,`cluster-service:${e.project}`,{kind:"autoscale",project:e.project,from:s,to:s+1,inflight:e.inflight})},"scaleUp"),R=a((e,r,s)=>{if(!e.proc)return;console.log(`[gateway] ${e.project} ${r} \u2014 scaling to zero.`),s?.announce!==!1&&c(e,"info",`idle kill: ${e.project} (${r})`,`cluster-service:${e.project}`,{kind:"idle-kill",project:e.project,why:r});const n=e.proc;try{n.stdout?.removeAllListeners("data"),n.stderr?.removeAllListeners("data"),n.removeAllListeners("exit")}catch{}try{process.kill(-n.pid,"SIGTERM")}catch{try{n.kill("SIGTERM")}catch{}}e.proc=void 0,e.state="down",setTimeout(()=>{try{for(const d of fs.readdirSync(e.pool.dir)){if(!d.endsWith(".sock"))continue;const h=path.join(e.pool.dir,d);try{const f=Number(fs.readFileSync(`${h}.owner`,"utf8").trim());if(Number.isFinite(f)&&f>0)try{process.kill(f,0);continue}catch{}}catch{}try{fs.unlinkSync(h)}catch{}try{fs.unlinkSync(`${h}.owner`)}catch{}}}catch{}e.pool.socks=[],e.pool.scannedAt=0},1200).unref?.()},"killSpawned"),L=a(e=>{const r=Date.now();if(e.restarts=(e.restarts??[]).filter(s=>r-s<types_1.SERVICE_RESTART_WINDOW_MS),e.restarts.length>=types_1.SERVICE_MAX_RESTARTS){c(e,"error",`service crash-looping: ${e.project} \u2014 wedged ${types_1.SERVICE_MAX_RESTARTS}+\xD7/min, not auto-recycling (the next request retries)`,`cluster-service:${e.project}`,{kind:"service-crash-loop",project:e.project}),R(e,"wedged (crash-loop cap) \u2014 leaving down for the next request",{announce:!1});return}e.restarts.push(r),console.log(`[gateway] self-heal: recycling WEDGED ${e.project} (live parent, 0 live pods; ${e.restarts.length}/${types_1.SERVICE_MAX_RESTARTS})`),c(e,"warning",`self-heal: recycling wedged ${e.project} (0 live pods)`,`cluster-service:${e.project}`,{kind:"service-recycle",project:e.project,attempt:e.restarts.length}),R(e,"wedged: 0 live pods \u2014 recycling",{announce:!1}),setTimeout(()=>{!t.stopped()&&!e.proc&&e.state==="down"&&j(e)},1500).unref?.()},"recycleWedged"),T={maxAgeMs:types_1.POD_MAX_AGE_MS,graceMs:types_1.POD_STALE_GRACE_MS,settleMs:types_1.POD_RECYCLE_SETTLE_MS,cooldownMs:types_1.POD_STALE_RECYCLE_COOLDOWN_MS};let _;const M=new Map;let x=!1,D=0;const I=a(()=>{const e=t.projectRoots??{},r=new Set(t.services.map(n=>n.project));for(const n of t.routes)n.lens&&r.add(n.lens.project);const s=new Set;for(const n of r){const d=e[n];if(!d)continue;const h=path.relative(t.root,d).split(path.sep).filter(Boolean)[0];h&&!h.startsWith("..")&&s.add(h)}return[...s]},"managedBuckets"),N=a((e,r,s,n)=>{const d=t.projectSourceRoots?.[e];if(d?.length)return d;const h=t.projectRoots?.[e];if(!h)return;const f=sourceScopeDirs(t.root,h,s,r,n);return f.length>0?f:void 0},"scopeFor"),O=a(()=>{x||Date.now()-D<types_1.POD_STALE_SCAN_MS||(x=!0,D=Date.now(),(async()=>{const e=(0,scope_1.readSourceSetExclude)(t.root),r=await sourceSetSnapshot(t.root,void 0,e),s=Date.now(),n=_?diffSourceSets(_,r,s):null;if(n&&(t.sourceSetChangedAt=s,t.sourceSetChange=n,l("info","source file set changed \u2014 stale pods recycle when idle","cluster-gateway",{kind:"source-set-changed",added:n.added,removed:n.removed,truncated:n.truncated})),_=r,!t.projectRoots)return;let d;try{d=(await fs.promises.readdir(t.root,{withFileTypes:!0})).filter(p=>p.isDirectory()).map(p=>p.name)}catch{return}const h=I(),f=new Set(t.services.map(p=>p.project));for(const p of t.routes)p.lens&&f.add(p.lens.project);const k=new Map;for(const p of f){const y=N(p,d,h,e);if(!y)continue;const m=y.join("|"),C=k.get(m)??{dirs:y,projects:[]};C.projects.push(p),k.set(m,C)}const S=Date.now();for(const[p,{dirs:y,projects:m}]of k){const C=await sourceSetSnapshot(t.root,y,e),P=M.get(p);if(M.set(p,C),!P)continue;const b=diffSourceSets(P,C,S);if(b){t.sourceSetChangedFor??=new Map,t.sourceSetChangesFor??=new Map;for(const F of m)t.sourceSetChangedFor.set(F,S),t.sourceSetChangesFor.set(F,b);l("info",`source file set changed in ${m.join(", ")}'s scope`,"cluster-gateway",{kind:"source-set-changed",scoped:!0,projects:m,added:b.added,removed:b.removed,truncated:b.truncated})}}})().catch(()=>{}).finally(()=>{x=!1}))},"maybeScanSourceSet"),V=a((e,r)=>{e.lastStaleRecycleAt=Date.now(),console.log(`[gateway] zombie recycle: ${e.project} (${r}) \u2014 stale fs view; fresh pod incoming`),c(e,"warning",`zombie recycle: ${e.project} (${r})`,`cluster-service:${e.project}`,{kind:"pod-recycle",project:e.project,reason:r});const s=!!e.decl.eager;R(e,`${r} \u2014 recycling stale pod`,{announce:!1}),s&&setTimeout(()=>{!t.stopped()&&!e.proc&&e.state==="down"&&j(e)},1500).unref?.()},"recyclePod");return{scanNow:w,spawnService:j,ensureUp:$,scaleUp:A,killSpawned:R,markUp:g,startSweeper:a(()=>{const e=setInterval(()=>{if(!t.stopped()){types_1.POD_RECYCLE_ENABLED&&O();for(const r of t.services){if(t.stopped()||!r.proc){r.wedgedSince=void 0;continue}const s=r.decl.idleKillSec;if(s&&r.inflight===0&&Date.now()-r.lastUsed>s*1e3){R(r,`idle ${s}s`),r.wedgedSince=void 0;continue}const n=r.state==="starting"&&r.spawnAt!==void 0&&Date.now()-r.spawnAt<t.startupTimeoutMs,d=w(r.pool)>0;if(d||n){if(r.wedgedSince=void 0,d&&g(r,"observed"),d&&!n&&types_1.POD_RECYCLE_ENABLED){const h=t.sourceSetChangedFor?.get(r.project)??t.sourceSetChangedAt??0,f=podRecycleReason(r,Date.now(),h,T);f&&V(r,f)}continue}r.wedgedSince??=Date.now(),Date.now()-r.wedgedSince>types_1.WEDGE_RECYCLE_GRACE_MS&&(r.wedgedSince=void 0,L(r))}}},t.sweepMs);return e.unref(),e},"startSweeper")}}E(createServiceLayer,"createServiceLayer"),v(createServiceLayer,"createServiceLayer"),a(createServiceLayer,"createServiceLayer");
1
+ "use strict";var q=Object.defineProperty;var v=(t,s)=>q(t,"name",{value:s,configurable:!0});var W=Object.defineProperty,a=v((t,s)=>W(t,"name",{value:s,configurable:!0}),"a");Object.defineProperty(exports,"__esModule",{value:!0}),exports.sourceSetSnapshot=sourceSetSnapshot,exports.sourceSetSignature=sourceSetSignature,exports.diffSourceSets=diffSourceSets,exports.sourceScopeDirs=sourceScopeDirs,exports.podRecycleReason=podRecycleReason,exports.lensFrontendStale=lensFrontendStale,exports.lensWatcherVerdict=lensWatcherVerdict,exports.lensChildWedged=lensChildWedged,exports.isPortConflictExit=isPortConflictExit,exports.createServiceLayer=createServiceLayer;const tslib_1=require("tslib"),node_child_process_1=require("node:child_process"),fs=tslib_1.__importStar(require("node:fs")),http=tslib_1.__importStar(require("node:http")),path=tslib_1.__importStar(require("node:path")),node_util_1=require("node:util"),discovery_1=require("./discovery"),scope_1=require("./scope"),pod_env_1=require("./pod-env"),types_1=require("./types");function eastWestEnv(t,s){const l={},i=t.serviceKeys[s];if(i&&(l.LENSMCP_SERVICE_KEY=i),t.https){const c=require("../../../basic-ssl").caCertPath();fs.existsSync(c)&&(l.NODE_EXTRA_CA_CERTS=c)}return l}v(eastWestEnv,"eastWestEnv"),a(eastWestEnv,"eastWestEnv");const sleep=a(t=>new Promise(s=>setTimeout(s,t)),"sleep"),SRC_EXCLUDE=new Set(["node_modules","dist","tmp","coverage","build","out","target"]),SRC_EXT=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".css",".scss",".sass",".less",".json",".html",".htm",".vue",".svelte",".mdx"]),SCAN_FILE_CAP=1e5;function fnv1a(t){let s=2166136261;for(let l=0;l<t.length;l+=1)s^=t.charCodeAt(l),s=Math.imul(s,16777619);return s>>>0}v(fnv1a,"fnv1a"),a(fnv1a,"fnv1a");const execFileP=(0,node_util_1.promisify)(node_child_process_1.execFile);async function gitIgnoredPaths(t){try{const{stdout:s}=await execFileP("git",["ls-files","--others","--directory","--ignored","--exclude-standard","-z"],{cwd:t,maxBuffer:33554432,timeout:1e4,windowsHide:!0});return new Set(s.split("\0").filter(Boolean))}catch{return new Set}}v(gitIgnoredPaths,"gitIgnoredPaths"),a(gitIgnoredPaths,"gitIgnoredPaths");async function sourceSetSnapshot(t,s,l){let i=0,c=0,S=!1;const u=new Set,E=await gitIgnoredPaths(t),w=a(k=>path.relative(t,k).split(path.sep).join("/"),"rel"),_=a(async(k,A=!0)=>{if(i>=SCAN_FILE_CAP){S=!0;return}let b;try{b=await fs.promises.readdir(k,{withFileTypes:!0})}catch{return}for(const T of b){if(i>=SCAN_FILE_CAP){S=!0;return}const y=T.name,M=path.join(k,y);if(T.isDirectory()){if(!A||y.startsWith(".")||SRC_EXCLUDE.has(y)||l?.has(y)||y.endsWith("-devserver")||E.has(`${w(M)}/`))continue;await _(M)}else if(T.isFile()){const x=y.lastIndexOf(".");if(x<=0||!SRC_EXT.has(y.slice(x))||E.has(w(M)))continue;const C=w(M);if(u.has(C))continue;u.add(C),i+=1,c^=fnv1a(C)}}},"walk");if(s&&s.length>0){await _(t,!1);for(const k of s)await _(k)}else await _(t);return{signature:`${i}:${(c>>>0).toString(36)}`,paths:u,truncated:S}}v(sourceSetSnapshot,"sourceSetSnapshot"),a(sourceSetSnapshot,"sourceSetSnapshot");async function sourceSetSignature(t,s,l){return(await sourceSetSnapshot(t,s,l)).signature}v(sourceSetSignature,"sourceSetSignature"),a(sourceSetSignature,"sourceSetSignature");const SOURCE_DIFF_PATH_CAP=128;function diffSourceSets(t,s,l){if(t.paths.size===s.paths.size){let u=!0;for(const E of t.paths)if(!s.paths.has(E)){u=!1;break}if(u)return null}const i=[],c=[];let S=t.truncated||s.truncated;for(const u of s.paths)t.paths.has(u)||(i.length+c.length<SOURCE_DIFF_PATH_CAP?i.push(u):S=!0);for(const u of t.paths)s.paths.has(u)||(i.length+c.length<SOURCE_DIFF_PATH_CAP?c.push(u):S=!0);return{changedAt:l,added:i,removed:c,truncated:S}}v(diffSourceSets,"diffSourceSets"),a(diffSourceSets,"diffSourceSets");function sourceScopeDirs(t,s,l,i,c){const S=a(w=>{const _=path.relative(t,w).split(path.sep).filter(Boolean);return _.length===0||_[0].startsWith("..")?"":_[0]},"bucketOf")(s);if(!S)return[];const u=new Set(l.filter(Boolean)),E=new Set([S]);for(const w of i)w.startsWith(".")||SRC_EXCLUDE.has(w)||c?.has(w)||w.endsWith("-devserver")||u.has(w)||E.add(w);return[...E].sort().map(w=>path.join(t,w))}v(sourceScopeDirs,"sourceScopeDirs"),a(sourceScopeDirs,"sourceScopeDirs");function podRecycleReason(t,s,l,i){return!t.proc||t.state!=="up"||t.spawnAt==null||t.inflight>0||s-t.lastUsed<i.settleMs||t.lastStaleRecycleAt!=null&&s-t.lastStaleRecycleAt<i.cooldownMs?null:l>0&&l-t.spawnAt>i.graceMs?"stale-source-set":i.maxAgeMs>0&&s-t.spawnAt>i.maxAgeMs?"max-age":null}v(podRecycleReason,"podRecycleReason"),a(podRecycleReason,"podRecycleReason");function lensFrontendStale(t,s,l,i,c){return!(i-s<c.cooldownMs||l<=0||l-t<=c.graceMs||i-l<c.settleMs)}v(lensFrontendStale,"lensFrontendStale"),a(lensFrontendStale,"lensFrontendStale");function lensWatcherVerdict(t,s,l,i=[]){if(!t)return"unknown";if("schemaVersion"in t&&t.schemaVersion>=2&&i.length>0){const c=s-l,S=new Set(t.recentEvents.filter(u=>u.at>=c).map(u=>path.resolve(u.path)));return i.every(u=>S.has(path.resolve(u)))?"heard":"missed"}return t.lastFsSetEventAt>=s-l?"heard":"missed"}v(lensWatcherVerdict,"lensWatcherVerdict"),a(lensWatcherVerdict,"lensWatcherVerdict");function lensChildWedged(t,s,l,i){const c=t.hasListened?i.graceMs:Math.max(i.graceMs,i.neverListenedGraceMs);return l-t.spawnedAt<c||l-s<i.cooldownMs||t.probeFails<Math.max(2,i.failureThreshold)?null:"wedged-no-listener"}v(lensChildWedged,"lensChildWedged"),a(lensChildWedged,"lensChildWedged");function isPortConflictExit(t,s){return t.signal||t.code===null||t.code===0||t.ranMs>s.fastFailMs?!1:t.portHeld}v(isPortConflictExit,"isPortConflictExit"),a(isPortConflictExit,"isPortConflictExit");function createServiceLayer(t,s){const{emit:l}=s,i=a(e=>e.wsKey===t.wsKey?void 0:path.join(e.root,".lensmcp","events.jsonl"),"serviceBus"),c=a((e,o,r,n,d)=>l(o,r,n,{wsKey:e.wsKey,...d},void 0,i(e)),"emitSvc"),S=a(e=>(e.scannedAt=0,(0,discovery_1.pickSock)(e,t.scanTtlMs)?e.socks.length:0),"scanNow"),u=a((e,o)=>{let r;try{r=(0,node_child_process_1.execFileSync)("ps",["ax","-ww","-o","pid=,pgid=,command="],{encoding:"utf8",timeout:5e3})}catch{return 0}const n=e.proc?.pid;let d=0;for(const h of r.split(`
2
+ `)){const f=h.match(/^\s*(\d+)\s+(\d+)\s+(.*)$/);if(!f)continue;const $=Number(f[1]),g=Number(f[2]),p=f[3];if(p.includes(`run ${o}`)&&/\bnx(\.js)?\b/.test(p)&&!(p.includes("/node_modules/nx/")&&!p.includes(e.root))&&!($===process.pid||$===n)&&!(n!==void 0&&g===n)){try{process.kill(-g,"SIGKILL")}catch{try{process.kill($,"SIGKILL")}catch{}}d+=1}}return d>0&&(console.log(`[gateway] ${o}: reaped ${d} stale runner tree(s) \u2014 a foreign generation held the nx task lock`),c(e,"warning",`stale-runner reap: ${e.project} (${d} foreign tree(s))`,`cluster-service:${e.project}`,{kind:"stale-runner-reap",project:e.project,reaped:d})),d},"reapForeignRunners"),E=a(e=>{if(t.stopped())return;const o=`${e.project}:${e.decl.serveTarget??"serve-hmr"}`,r=Math.max(1,e.decl.minPods??1);u(e,o),e.lockBlockedAt=void 0,console.log(`[gateway] starting ${o} (pods=${r})\u2026`),c(e,"info",`service starting: ${e.project} (${r} pod${r>1?"s":""})`,`cluster-service:${e.project}`,{kind:"service-starting",project:e.project,pods:r}),e.state="starting",e.spawnAt=Date.now();const n=path.join(e.root,"node_modules","nx","dist","bin","nx.js"),[d,h]=fs.existsSync(n)?[process.execPath,[n,"run",o,`--childCount=${r}`]]:["yarn",["nx","run",o,`--childCount=${r}`]],f=(0,node_child_process_1.spawn)(d,h,{cwd:e.root,detached:!0,env:{...(0,pod_env_1.podBaseEnv)(process.env,t.root,e.root),NX_DAEMON:"false",NX_ISOLATE_PLUGINS:"false",...e.wsKey?{LENSMCP_WS_KEY:e.wsKey}:{},LENSMCP_EVENT_FILE:e.wsKey===t.wsKey?t.eventFile:path.join(e.root,".lensmcp","events.jsonl"),LENSMCP_GATEWAY_PID:String(process.pid),...eastWestEnv(t,e.project)},stdio:["ignore","pipe","pipe"]});e.lastErrors=[],e.buildFailed=!1;const $=a(g=>{const p=g.toString();for(const m of p.split(`
3
+ `)){if(/ERROR in |error TS\d+|Found \d+ error|Unhandled 'error' event|EADDRINUSE/.test(m)){const j=m.replace(/\x1b\[[0-9;]*m/g,"").trim();e.lastErrors.push(j),e.lastErrors.length>12&&e.lastErrors.shift(),e.buildFailed=!0;const R=Date.now();(j!==e.lastErrorEmitSig||R-(e.lastErrorEmitAt??0)>=types_1.SERVICE_ERROR_THROTTLE_MS)&&(e.lastErrorEmitSig=j,e.lastErrorEmitAt=R,c(e,"error",`service error: ${e.project}`,`cluster-service:${e.project}`,{kind:"service-error",project:e.project,line:j}))}/No typescript errors found|webpack compiled successfully|Child#\d+ ready/.test(m)&&(e.buildFailed=!1),!e.lockBlockedAt&&/Waiting for .+ in another nx process/.test(m)&&(e.lockBlockedAt=Date.now(),console.log(`[gateway] ${o}: spawn blocked by a stale nx runner \u2014 breaking the lock + respawning`),c(e,"warning",`nx task lock: ${e.project} blocked by a stale runner \u2014 auto-breaking`,`cluster-service:${e.project}`,{kind:"nx-lock-break",project:e.project}),setTimeout(()=>{t.stopped()||!e.lockBlockedAt||(A(e,"parked on a foreign nx task lock \u2014 recycling",{announce:!1}),u(e,o),setTimeout(()=>{!t.stopped()&&!e.proc&&e.state==="down"&&E(e)},1500).unref?.())},250).unref?.())}},"sniff");f.stdout?.on("data",g=>{t.stopped()||($(g),process.stdout.write(`[${e.project}] ${g}`))}),f.stderr?.on("data",g=>{t.stopped()||($(g),process.stderr.write(`[${e.project}] ${g}`))}),f.on("exit",g=>{if(e.proc=void 0,e.state="down",t.stopped()||(console.log(`[gateway] ${o} exited (${g})`),c(e,g===0?"info":"warning",`service down: ${e.project} (exit ${g})`,`cluster-service:${e.project}`,{kind:"service-down",project:e.project,code:g}),g===0||e.buildFailed))return;const p=Date.now();if(e.restarts=(e.restarts??[]).filter(j=>p-j<types_1.SERVICE_RESTART_WINDOW_MS),e.restarts.length>=types_1.SERVICE_MAX_RESTARTS){c(e,"error",`service crash-looping: ${e.project} \u2014 ${types_1.SERVICE_MAX_RESTARTS}+ restarts/min, not auto-respawning (the next request retries)`,`cluster-service:${e.project}`,{kind:"service-crash-loop",project:e.project});return}e.restarts.push(p);const m=Math.min(8e3,500*2**(e.restarts.length-1));setTimeout(()=>{t.stopped()||e.proc||e.state!=="down"||(console.log(`[gateway] self-heal: respawning ${e.project} (restart ${e.restarts.length}/${types_1.SERVICE_MAX_RESTARTS})`),c(e,"info",`self-heal: respawning ${e.project}`,`cluster-service:${e.project}`,{kind:"service-respawn",project:e.project,attempt:e.restarts.length}),E(e))},m)}),e.proc=f},"spawnService"),w=a((e,o)=>{if(e.state==="up")return!1;e.state="up";const r=e.pool.socks.length;return c(e,"info",`service up: ${e.project} (${r} pods, ${o})`,`cluster-service:${e.project}`,{kind:"service-up",project:e.project,pods:r,adopted:o==="adopted"}),!0},"markUp"),_=a(async e=>{if(S(e.pool)>0)return w(e,"adopted"),!0;if(t.stopped())return!1;e.state!=="starting"&&!e.proc&&E(e);const o=Date.now()+t.startupTimeoutMs,r=Date.now()+12e3;for(;!t.stopped()&&Date.now()<o;){if(await sleep(Math.min(700,t.startupTimeoutMs/4)),e.buildFailed&&Date.now()>r)return!1;if(S(e.pool)>0){e.state="up",e.buildFailed=!1;const n=e.spawnAt?Date.now()-e.spawnAt:void 0;return console.log(`[gateway] ${e.project} up (${e.pool.socks.length} pods${n?`, cold start ${n}ms`:""})`),c(e,"info",`cold start: ${e.project} (${e.pool.socks.length} pods, ${n??"?"}ms)`,`cluster-service:${e.project}`,{kind:"cold-start",project:e.project,pods:e.pool.socks.length,durationMs:n}),!0}if(e.state==="down")return!1}return!1},"ensureUp"),k=a(e=>{const o=e.decl.maxPods??e.decl.minPods??1,r=e.pool.socks.length,n=e.decl.adminUrl??(e.decl.port?`http://localhost:${e.decl.port}`:void 0);if(!n||r===0||r>=o||e.inflight<=r||Date.now()-e.lastScaleAt<5e3)return;e.lastScaleAt=Date.now();const d=(n.startsWith("https")?require("node:https"):http).request(`${n}/webpack/scale`,{method:"POST",rejectUnauthorized:!1},h=>h.resume());d.on("error",()=>{}),d.end(JSON.stringify({pods:r+1})),console.log(`[gateway] autoscale ${e.project}: ${r} \u2192 ${r+1} pods (inflight ${e.inflight})`),c(e,"info",`autoscale: ${e.project} ${r} \u2192 ${r+1} pods`,`cluster-service:${e.project}`,{kind:"autoscale",project:e.project,from:r,to:r+1,inflight:e.inflight})},"scaleUp"),A=a((e,o,r)=>{if(!e.proc)return;console.log(`[gateway] ${e.project} ${o} \u2014 scaling to zero.`),r?.announce!==!1&&c(e,"info",`idle kill: ${e.project} (${o})`,`cluster-service:${e.project}`,{kind:"idle-kill",project:e.project,why:o});const n=e.proc;try{n.stdout?.removeAllListeners("data"),n.stderr?.removeAllListeners("data"),n.removeAllListeners("exit")}catch{}try{process.kill(-n.pid,"SIGTERM")}catch{try{n.kill("SIGTERM")}catch{}}e.proc=void 0,e.state="down",setTimeout(()=>{try{for(const d of fs.readdirSync(e.pool.dir)){if(!d.endsWith(".sock"))continue;const h=path.join(e.pool.dir,d);try{const f=Number(fs.readFileSync(`${h}.owner`,"utf8").trim());if(Number.isFinite(f)&&f>0)try{process.kill(f,0);continue}catch{}}catch{}try{fs.unlinkSync(h)}catch{}try{fs.unlinkSync(`${h}.owner`)}catch{}}}catch{}e.pool.socks=[],e.pool.scannedAt=0},1200).unref?.()},"killSpawned"),b=a(e=>{const o=Date.now();if(e.restarts=(e.restarts??[]).filter(r=>o-r<types_1.SERVICE_RESTART_WINDOW_MS),e.restarts.length>=types_1.SERVICE_MAX_RESTARTS){c(e,"error",`service crash-looping: ${e.project} \u2014 wedged ${types_1.SERVICE_MAX_RESTARTS}+\xD7/min, not auto-recycling (the next request retries)`,`cluster-service:${e.project}`,{kind:"service-crash-loop",project:e.project}),A(e,"wedged (crash-loop cap) \u2014 leaving down for the next request",{announce:!1});return}e.restarts.push(o),console.log(`[gateway] self-heal: recycling WEDGED ${e.project} (live parent, 0 live pods; ${e.restarts.length}/${types_1.SERVICE_MAX_RESTARTS})`),c(e,"warning",`self-heal: recycling wedged ${e.project} (0 live pods)`,`cluster-service:${e.project}`,{kind:"service-recycle",project:e.project,attempt:e.restarts.length}),A(e,"wedged: 0 live pods \u2014 recycling",{announce:!1}),setTimeout(()=>{!t.stopped()&&!e.proc&&e.state==="down"&&E(e)},1500).unref?.()},"recycleWedged"),T={maxAgeMs:types_1.POD_MAX_AGE_MS,graceMs:types_1.POD_STALE_GRACE_MS,settleMs:types_1.POD_RECYCLE_SETTLE_MS,cooldownMs:types_1.POD_STALE_RECYCLE_COOLDOWN_MS};let y;const M=new Map;let x=!1,C=0;const P=a(()=>{const e=t.projectRoots??{},o=new Set(t.services.map(n=>n.project));for(const n of t.routes)n.lens&&o.add(n.lens.project);const r=new Set;for(const n of o){const d=e[n];if(!d)continue;const h=path.relative(t.root,d).split(path.sep).filter(Boolean)[0];h&&!h.startsWith("..")&&r.add(h)}return[...r]},"managedBuckets"),I=a((e,o,r,n)=>{const d=t.projectSourceRoots?.[e];if(d?.length)return d;const h=t.projectRoots?.[e];if(!h)return;const f=sourceScopeDirs(t.root,h,r,o,n);return f.length>0?f:void 0},"scopeFor"),N=a(()=>{x||Date.now()-C<types_1.POD_STALE_SCAN_MS||(x=!0,C=Date.now(),(async()=>{const e=(0,scope_1.readSourceSetExclude)(t.root),o=await sourceSetSnapshot(t.root,void 0,e),r=Date.now(),n=y?diffSourceSets(y,o,r):null;if(n&&(t.sourceSetChangedAt=r,t.sourceSetChange=n,l("info","source file set changed \u2014 stale pods recycle when idle","cluster-gateway",{kind:"source-set-changed",added:n.added,removed:n.removed,truncated:n.truncated})),y=o,!t.projectRoots)return;let d;try{d=(await fs.promises.readdir(t.root,{withFileTypes:!0})).filter(p=>p.isDirectory()).map(p=>p.name)}catch{return}const h=P(),f=new Set(t.services.map(p=>p.project));for(const p of t.routes)p.lens&&f.add(p.lens.project);const $=new Map;for(const p of f){const m=I(p,d,h,e);if(!m)continue;const j=m.join("|"),R=$.get(j)??{dirs:m,projects:[]};R.projects.push(p),$.set(j,R)}const g=Date.now();for(const[p,{dirs:m,projects:j}]of $){const R=await sourceSetSnapshot(t.root,m,e),L=M.get(p);if(M.set(p,R),!L)continue;const D=diffSourceSets(L,R,g);if(D){t.sourceSetChangedFor??=new Map,t.sourceSetChangesFor??=new Map;for(const F of j)t.sourceSetChangedFor.set(F,g),t.sourceSetChangesFor.set(F,D);l("info",`source file set changed in ${j.join(", ")}'s scope`,"cluster-gateway",{kind:"source-set-changed",scoped:!0,projects:j,added:D.added,removed:D.removed,truncated:D.truncated})}}})().catch(()=>{}).finally(()=>{x=!1}))},"maybeScanSourceSet"),O=a((e,o)=>{e.lastStaleRecycleAt=Date.now(),console.log(`[gateway] zombie recycle: ${e.project} (${o}) \u2014 stale fs view; fresh pod incoming`),c(e,"warning",`zombie recycle: ${e.project} (${o})`,`cluster-service:${e.project}`,{kind:"pod-recycle",project:e.project,reason:o});const r=!!e.decl.eager;A(e,`${o} \u2014 recycling stale pod`,{announce:!1}),r&&setTimeout(()=>{!t.stopped()&&!e.proc&&e.state==="down"&&E(e)},1500).unref?.()},"recyclePod");return{scanNow:S,spawnService:E,ensureUp:_,scaleUp:k,killSpawned:A,markUp:w,startSweeper:a(()=>{const e=setInterval(()=>{if(!t.stopped()){types_1.POD_RECYCLE_ENABLED&&N();for(const o of t.services){if(t.stopped()||!o.proc){o.wedgedSince=void 0;continue}const r=o.decl.idleKillSec;if(r&&o.inflight===0&&Date.now()-o.lastUsed>r*1e3){A(o,`idle ${r}s`),o.wedgedSince=void 0;continue}const n=o.state==="starting"&&o.spawnAt!==void 0&&Date.now()-o.spawnAt<t.startupTimeoutMs,d=S(o.pool)>0;if(d||n){if(o.wedgedSince=void 0,d&&w(o,"observed"),d&&!n&&types_1.POD_RECYCLE_ENABLED){const h=t.sourceSetChangedFor?.get(o.project)??t.sourceSetChangedAt??0,f=podRecycleReason(o,Date.now(),h,T);f&&O(o,f)}continue}o.wedgedSince??=Date.now(),Date.now()-o.wedgedSince>types_1.WEDGE_RECYCLE_GRACE_MS&&(o.wedgedSince=void 0,b(o))}}},t.sweepMs);return e.unref(),e},"startSweeper")}}v(createServiceLayer,"createServiceLayer"),a(createServiceLayer,"createServiceLayer");
@@ -1,2 +1,2 @@
1
- "use strict";var O=Object.defineProperty;var g=(o,i)=>O(o,"name",{value:i,configurable:!0});var v=Object.defineProperty,f=g((o,i)=>v(o,"name",{value:i,configurable:!0}),"f"),_=Object.defineProperty,s=f((o,i)=>_(o,"name",{value:i,configurable:!0}),"s");Object.defineProperty(exports,"__esModule",{value:!0}),exports.LENS_DASHBOARD_PROJECT=void 0,exports.createObservability=createObservability;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path")),redact_1=require("@lensmcp/core/redact"),busHygiene=(()=>{try{return require("@lensmcp/node-instrumentation")}catch{return}})();exports.LENS_DASHBOARD_PROJECT="(lens-dashboard)";const hdr=s(o=>typeof o=="string"&&o!==""?o:Array.isArray(o)?o[0]:void 0,"hdr");function createObservability(o,i){const p=s(()=>Date.now().toString(36)+Math.random().toString(36).slice(2,12),"eid"),m=busHygiene?.createEventFloodGuard({burst:30,perSec:5}),l=s((e,t,r,a,d,u)=>{const n=u??o;try{const h=m?m.admit(r):{ok:!0,suppressed:0};if(!h.ok)return;fs.mkdirSync(path.dirname(n),{recursive:!0});const y=a&&(0,redact_1.redactDeep)(a),b=JSON.stringify({id:p(),sessionId:"pending",timestamp:Date.now(),source:"gateway",category:"cluster",severity:e,context:(0,redact_1.redactDeep)({sessionId:"pending",...d}),fingerprint:r,title:(0,redact_1.safeTitle)(t),raw:h.suppressed>0?{...y,floodSuppressed:h.suppressed}:y})+`
2
- `;busHygiene?.maybeRotateEventFile(n,b.length),fs.appendFileSync(n,b)}catch{}},"emit"),w=s(e=>{const t=hdr(e.headers["x-lensmcp-flow-id"]);let r=hdr(e.headers["x-request-id"]);if(!(!t&&!r&&!hdr(e.headers.traceparent)))return r||(r=p(),e.headers["x-request-id"]=r),{startedAt:Date.now(),method:(e.method??"GET").toUpperCase(),host:(e.headers.host||"").split(":")[0],url:e.url??"/",steps:[],...t?{flowId:t}:{},...r?{requestId:r}:{},...hdr(e.headers["x-lensmcp-origin-node-id"])?{originNodeId:hdr(e.headers["x-lensmcp-origin-node-id"])}:{}}},"beginTrace"),S=s((e,t,r)=>{e&&e.steps.push({step:t,atMs:Date.now()-e.startedAt,...r})},"traceStep"),D=s((e,t,r,a)=>{if(!e||e.done||(e.done=!0,t===exports.LENS_DASHBOARD_PROJECT&&r<500))return;const d=Date.now()-e.startedAt;l(r>=500?"error":"info",`gateway ${e.method} ${e.host}${e.url} \u2192 ${r} (${d}ms)`,`gateway-request:${t}`,{kind:"gateway-request",project:t,host:e.host,method:e.method,url:e.url,status:r,durationMs:d,startedAt:e.startedAt,steps:e.steps,...a},{...e.flowId?{flowId:e.flowId}:{},...e.requestId?{requestId:e.requestId}:{},...e.originNodeId?{originNodeId:e.originNodeId}:{}})},"finishTrace"),c=new Map;return{emit:l,eid:p,beginTrace:w,traceStep:S,finishTrace:D,recordEdge:s((e,t,r,a)=>{if(e.project===exports.LENS_DASHBOARD_PROJECT&&r<500&&r!==0)return;const d=e.host??"(default)",u=(a?a+"\u21D2":"")+d+"\u2192"+e.project,n=c.get(u)??{host:d,project:e.project,caller:a,count:0,totalMs:0,errors:0};n.count+=1,n.totalMs+=t,(r>=500||r===0)&&(n.errors+=1),c.set(u,n)},"recordEdge"),startEdgeFlusher:s(()=>{const e=setInterval(()=>{for(const t of c.values()){const r=Math.round(t.totalMs/t.count);l(t.errors?"warning":"info",`traffic ${t.host} \u2192 ${t.project}: ${t.count} req, ~${r}ms${t.errors?`, ${t.errors} errors`:""}`,`gateway-traffic:${t.host}->${t.project}`,{kind:"gateway-traffic",host:t.host,project:t.project,caller:t.caller,count:t.count,avgMs:r,errors:t.errors})}c.clear()},i.trafficFlushMs);return e.unref(),e},"startEdgeFlusher")}}g(createObservability,"createObservability"),f(createObservability,"createObservability"),s(createObservability,"createObservability");
1
+ "use strict";var v=Object.defineProperty;var f=(o,d)=>v(o,"name",{value:d,configurable:!0});var _=Object.defineProperty,s=f((o,d)=>_(o,"name",{value:d,configurable:!0}),"s");Object.defineProperty(exports,"__esModule",{value:!0}),exports.LENS_DASHBOARD_PROJECT=void 0,exports.createObservability=createObservability;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path")),redact_1=require("@lensmcp/core/redact"),busHygiene=(()=>{try{return require("@lensmcp/node-instrumentation")}catch{return}})();exports.LENS_DASHBOARD_PROJECT="(lens-dashboard)";const hdr=s(o=>typeof o=="string"&&o!==""?o:Array.isArray(o)?o[0]:void 0,"hdr");function createObservability(o,d){const p=s(()=>Date.now().toString(36)+Math.random().toString(36).slice(2,12),"eid"),g=busHygiene?.createEventFloodGuard({burst:30,perSec:5}),l=s((e,t,r,a,i,u)=>{const n=u??o;try{const h=g?g.admit(r):{ok:!0,suppressed:0};if(!h.ok)return;fs.mkdirSync(path.dirname(n),{recursive:!0});const m=a&&(0,redact_1.redactDeep)(a),y=JSON.stringify({id:p(),sessionId:"pending",timestamp:Date.now(),source:"gateway",category:"cluster",severity:e,context:(0,redact_1.redactDeep)({sessionId:"pending",...i}),fingerprint:r,title:(0,redact_1.safeTitle)(t),raw:h.suppressed>0?{...m,floodSuppressed:h.suppressed}:m})+`
2
+ `;busHygiene?.maybeRotateEventFile(n,y.length),fs.appendFileSync(n,y)}catch{}},"emit"),w=s(e=>{const t=hdr(e.headers["x-lensmcp-flow-id"]);let r=hdr(e.headers["x-request-id"]);if(!(!t&&!r&&!hdr(e.headers.traceparent)))return r||(r=p(),e.headers["x-request-id"]=r),{startedAt:Date.now(),method:(e.method??"GET").toUpperCase(),host:(e.headers.host||"").split(":")[0],url:e.url??"/",steps:[],...t?{flowId:t}:{},...r?{requestId:r}:{},...hdr(e.headers["x-lensmcp-origin-node-id"])?{originNodeId:hdr(e.headers["x-lensmcp-origin-node-id"])}:{}}},"beginTrace"),S=s((e,t,r)=>{e&&e.steps.push({step:t,atMs:Date.now()-e.startedAt,...r})},"traceStep"),b=s((e,t,r,a)=>{if(!e||e.done||(e.done=!0,t===exports.LENS_DASHBOARD_PROJECT&&r<500))return;const i=Date.now()-e.startedAt;l(r>=500?"error":"info",`gateway ${e.method} ${e.host}${e.url} \u2192 ${r} (${i}ms)`,`gateway-request:${t}`,{kind:"gateway-request",project:t,host:e.host,method:e.method,url:e.url,status:r,durationMs:i,startedAt:e.startedAt,steps:e.steps,...a},{...e.flowId?{flowId:e.flowId}:{},...e.requestId?{requestId:e.requestId}:{},...e.originNodeId?{originNodeId:e.originNodeId}:{}})},"finishTrace"),c=new Map;return{emit:l,eid:p,beginTrace:w,traceStep:S,finishTrace:b,recordEdge:s((e,t,r,a)=>{if(e.project===exports.LENS_DASHBOARD_PROJECT&&r<500&&r!==0)return;const i=e.host??"(default)",u=(a?a+"\u21D2":"")+i+"\u2192"+e.project,n=c.get(u)??{host:i,project:e.project,caller:a,count:0,totalMs:0,errors:0};n.count+=1,n.totalMs+=t,(r>=500||r===0)&&(n.errors+=1),c.set(u,n)},"recordEdge"),startEdgeFlusher:s(()=>{const e=setInterval(()=>{for(const t of c.values()){const r=Math.round(t.totalMs/t.count);l(t.errors?"warning":"info",`traffic ${t.host} \u2192 ${t.project}: ${t.count} req, ~${r}ms${t.errors?`, ${t.errors} errors`:""}`,`gateway-traffic:${t.host}->${t.project}`,{kind:"gateway-traffic",host:t.host,project:t.project,caller:t.caller,count:t.count,avgMs:r,errors:t.errors})}c.clear()},d.trafficFlushMs);return e.unref(),e},"startEdgeFlusher")}}f(createObservability,"createObservability"),s(createObservability,"createObservability");
@@ -1,2 +1,2 @@
1
- "use strict";var i=Object.defineProperty;var E=(t,e)=>i(t,"name",{value:e,configurable:!0});var p=Object.defineProperty,a=E((t,e)=>p(t,"name",{value:e,configurable:!0}),"a"),c=Object.defineProperty,s=a((t,e)=>c(t,"name",{value:e,configurable:!0}),"s");Object.defineProperty(exports,"__esModule",{value:!0}),exports.FOREIGN_POD_ENV_DENYLIST=exports.WORKSPACE_DOTENV_FILES=void 0,exports.parseDotenvKeys=parseDotenvKeys,exports.workspaceDotenvKeys=workspaceDotenvKeys,exports.scrubEnv=scrubEnv,exports.podBaseEnv=podBaseEnv;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path"));exports.WORKSPACE_DOTENV_FILES=[".env",".env.local",".local.env"],exports.FOREIGN_POD_ENV_DENYLIST=["PG_URL","REDIS_URL","DATABASE_URL","POSTGRES_URL"];function parseDotenvKeys(t){const e=new Set;for(const o of t.split(`
2
- `)){const r=o.trim();if(!r||r.startsWith("#"))continue;const n=r.match(/^(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=/);n&&e.add(n[1])}return e}E(parseDotenvKeys,"parseDotenvKeys"),a(parseDotenvKeys,"parseDotenvKeys"),s(parseDotenvKeys,"parseDotenvKeys");function workspaceDotenvKeys(t){const e=new Set;for(const o of exports.WORKSPACE_DOTENV_FILES){let r;try{r=fs.readFileSync(path.join(t,o),"utf8")}catch{continue}for(const n of parseDotenvKeys(r))e.add(n)}return e}E(workspaceDotenvKeys,"workspaceDotenvKeys"),a(workspaceDotenvKeys,"workspaceDotenvKeys"),s(workspaceDotenvKeys,"workspaceDotenvKeys");function scrubEnv(t,e){const o={};for(const[r,n]of Object.entries(t))e.has(r)||exports.FOREIGN_POD_ENV_DENYLIST.includes(r)||(o[r]=n);return o}E(scrubEnv,"scrubEnv"),a(scrubEnv,"scrubEnv"),s(scrubEnv,"scrubEnv");function podBaseEnv(t,e,o){return path.resolve(o)===path.resolve(e)?t:scrubEnv(t,workspaceDotenvKeys(e))}E(podBaseEnv,"podBaseEnv"),a(podBaseEnv,"podBaseEnv"),s(podBaseEnv,"podBaseEnv");
1
+ "use strict";var p=Object.defineProperty;var a=(o,e)=>p(o,"name",{value:e,configurable:!0});var c=Object.defineProperty,s=a((o,e)=>c(o,"name",{value:e,configurable:!0}),"s");Object.defineProperty(exports,"__esModule",{value:!0}),exports.FOREIGN_POD_ENV_DENYLIST=exports.WORKSPACE_DOTENV_FILES=void 0,exports.parseDotenvKeys=parseDotenvKeys,exports.workspaceDotenvKeys=workspaceDotenvKeys,exports.scrubEnv=scrubEnv,exports.podBaseEnv=podBaseEnv;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path"));exports.WORKSPACE_DOTENV_FILES=[".env",".env.local",".local.env"],exports.FOREIGN_POD_ENV_DENYLIST=["PG_URL","REDIS_URL","DATABASE_URL","POSTGRES_URL"];function parseDotenvKeys(o){const e=new Set;for(const r of o.split(`
2
+ `)){const t=r.trim();if(!t||t.startsWith("#"))continue;const n=t.match(/^(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=/);n&&e.add(n[1])}return e}a(parseDotenvKeys,"parseDotenvKeys"),s(parseDotenvKeys,"parseDotenvKeys");function workspaceDotenvKeys(o){const e=new Set;for(const r of exports.WORKSPACE_DOTENV_FILES){let t;try{t=fs.readFileSync(path.join(o,r),"utf8")}catch{continue}for(const n of parseDotenvKeys(t))e.add(n)}return e}a(workspaceDotenvKeys,"workspaceDotenvKeys"),s(workspaceDotenvKeys,"workspaceDotenvKeys");function scrubEnv(o,e){const r={};for(const[t,n]of Object.entries(o))e.has(t)||exports.FOREIGN_POD_ENV_DENYLIST.includes(t)||(r[t]=n);return r}a(scrubEnv,"scrubEnv"),s(scrubEnv,"scrubEnv");function podBaseEnv(o,e,r){return path.resolve(r)===path.resolve(e)?o:scrubEnv(o,workspaceDotenvKeys(e))}a(podBaseEnv,"podBaseEnv"),s(podBaseEnv,"podBaseEnv");
@@ -1 +1 @@
1
- "use strict";var F=Object.defineProperty;var $=(u,E)=>F(u,"name",{value:E,configurable:!0});var L=Object.defineProperty,x=$((u,E)=>L(u,"name",{value:E,configurable:!0}),"x"),H=Object.defineProperty,c=x((u,E)=>H(u,"name",{value:E,configurable:!0}),"c");Object.defineProperty(exports,"__esModule",{value:!0}),exports.createProxy=createProxy;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),http=tslib_1.__importStar(require("node:http")),path=tslib_1.__importStar(require("node:path")),discovery_1=require("./discovery"),edge_1=require("./edge"),gateway_errors_1=require("../gateway-errors"),types_1=require("./types");function isConnError(u){const E=u.code??"";return E==="ECONNREFUSED"||E==="ECONNRESET"||E==="ETIMEDOUT"||E==="EPIPE"||E==="EHOSTUNREACH"||E==="ENOENT"||/ECONNREFUSED|ECONNRESET|socket hang up|EPIPE/i.test(u.message)}$(isConnError,"isConnError"),x(isConnError,"isConnError"),c(isConnError,"isConnError");const HOP_BY_HOP=new Set(["connection","keep-alive","proxy-connection","proxy-authenticate","proxy-authorization","te","trailer","transfer-encoding","upgrade"]),httpProxy=require("http-proxy");function createProxy(u,E,S){const{recordEdge:N,finishTrace:q,traceStep:T,emit:I}=E,M=c(async r=>{if(!r.lens||!u.lensSupervisor)return"unsupported";let o;const e=new Promise(l=>{o=setTimeout(()=>l("timeout"),types_1.LENS_REQUEST_RECOVERY_WAIT_MS),o.unref?.()}),p=u.lensSupervisor.recover(r.lens,"proxy-connection").then(l=>l?"ready":"failed").catch(()=>"failed"),i=await Promise.race([p,e]);o&&clearTimeout(o);const m=u.lensSupervisor.status(r.lens);return i==="failed"&&(!m||m.state==="ready")?"unsupported":i},"waitForManagedRecovery"),b=c((r,o,e,p,i,m)=>{if(e.headersSent||e.writableEnded||e.destroyed){e.destroyed||e.destroy();return}const l=r.lens?u.lensSupervisor?.status(r.lens):void 0,h=m==="timeout"||l?.state==="starting"||l?.state==="replacing",s=(0,gateway_errors_1.ensureRequestId)(o),t=r.lens?{project:r.project,reason:l?.reason??"connection-failure",generation:l?.generation??0,...h?{retryAfterMs:2e3}:{}}:void 0,a=h?503:502,d=h?"starting":"unavailable";console.error(`[gateway] ${new Date().toISOString()} upstream-error traceId=${s} project=${r.project} target=${String(p)} state=${l?.state??"unmanaged"} generation=${l?.generation??0}: ${i.message}`),I("warning",`upstream unavailable: ${r.project}`,`cluster-upstream:${r.project}`,{kind:"upstream-error",traceId:s,project:r.project,target:String(p),state:l?.state??"unmanaged",generation:l?.generation,error:i.message}),(0,edge_1.sendError)(e,o,a,d,h?`Upstream ${r.project} is restarting.`:`Upstream ${r.project} unavailable.`,t,h?{"retry-after":"2"}:void 0)},"sendTerminalUpstreamError"),O={keepAlive:!0,keepAliveMsecs:3e4,maxSockets:1024,maxFreeSockets:256},v=new http.Agent(O),j=new(require("node:https")).Agent(O),k=c(r=>typeof r=="string"&&r.startsWith("https:")?j:v,"agentForTarget"),w=httpProxy.createProxyServer({xfwd:!0,secure:!1,proxyTimeout:12e4,agent:v}),R=c((r,o,e)=>{const p=c(()=>{e()||r.destroyed||r.destroy()},"onEdgeClose");o.once("close",p),r.once("close",()=>o.removeListener("close",p))},"propagateEdgeCancel");w.on("proxyReq",(r,o,e)=>{R(r,e,()=>e.writableEnded)}),w.on("proxyRes",(r,o,e)=>{const p=o.__lensmcpPod;p&&(r.headers["x-lensmcp-pod"]=p),delete r.headers["x-powered-by"],r.headers.server="LensMCP",e&&R(r,e,()=>e.writableEnded)});const U=c((r,o,e,p)=>{const i={};for(const[n,_]of Object.entries(o.headers))_===void 0||n.startsWith(":")||HOP_BY_HOP.has(n)||(i[n]=_);const m=o.socket?.remoteAddress??"",l=o.headers["x-forwarded-for"];i["x-forwarded-for"]=l?`${String(l)}, ${m}`:m,i["x-forwarded-proto"]="https",i["x-forwarded-host"]||(i["x-forwarded-host"]=o.headers.host??"");let h=http,s;if(typeof r=="object")s={socketPath:r.socketPath,path:o.url,method:o.method,headers:i,agent:v};else{const n=new URL(r),_=n.protocol==="https:";h=_?require("node:https"):http,i.host=n.host,s={protocol:n.protocol,hostname:n.hostname,port:n.port||(_?443:80),path:o.url,method:o.method,headers:i,agent:k(r)}}const t=e;t.__lensmcpErrContained||(t.__lensmcpErrContained=!0,e.on("error",()=>{}));let a;const d=c(()=>{y.destroy()},"onReqError"),g=c(()=>{a&&!a.destroyed&&a.destroy()},"onEdgeClose"),f=c(()=>{o.removeListener("error",d),e.removeListener("close",g)},"detach"),y=h.request(s,n=>{if(a=n,p.onResponse(),e.headersSent||e.writableEnded||e.destroyed){n.destroy();return}const _={};for(const[P,C]of Object.entries(n.headers))C===void 0||HOP_BY_HOP.has(P)||(_[P]=C);delete _["x-powered-by"],_.server="LensMCP";const A=o.__lensmcpPod;A&&(_["x-lensmcp-pod"]=A);try{e.writeHead(n.statusCode??502,_)}catch(P){console.error("[gateway] h2 relay: bad response header, resetting stream:",P.message),n.destroy(),e.destroyed||e.destroy(P);return}n.pipe(e);const D=c(()=>{!e.writableEnded&&!e.destroyed&&e.destroy()},"abortEdge");n.once("error",D),n.once("close",D),e.on("close",g)});y.once("error",n=>p.onError(n)),y.once("close",f),o.on("error",d),o.method==="GET"||o.method==="HEAD"||o.method==="OPTIONS"?y.end():o.pipe(y)},"pipeUpstream"),W=c(async(r,o,e)=>{const p=o.__lensmcpTrace;if(r.pool){const s=r.svc;s&&(s.lastUsed=Date.now(),s.inflight+=1,e.on("close",()=>{s.inflight-=1,s.lastUsed=Date.now()}));let t=(0,discovery_1.pickSock)(r.pool,u.scanTtlMs);if(!t&&s&&(T(p,"cold-start",{project:r.project}),await S.ensureUp(s)&&(t=(0,discovery_1.pickSock)(r.pool,u.scanTtlMs))),s&&t&&S.markUp(s,"observed"),s&&S.scaleUp(s),!t){const y=s?.lastErrors?.length?` Service errors: ${s.lastErrors.join("; ")}`:"";(0,edge_1.sendError)(e,o,503,"unavailable",`Service ${r.project} is not reachable (no pods in ${r.pool.dir}).${y} The watcher recovers and the next request retries automatically.`);return}const a=path.basename(t,".sock");o.__lensmcpPod=a,T(p,"pod-select",{pod:a,pods:r.pool.socks.length,strategy:"round-robin"});let d=!1;const g=c(y=>{r.pool.socks=r.pool.socks.filter(n=>n!==t),r.pool.idx=-1;try{fs.unlinkSync(t)}catch{}console.error(`[gateway] pod ${a} of ${r.project}: ${y}`)},"evictPod"),f=setTimeout(()=>{d||e.headersSent||e.writableEnded||(d=!0,g(`no response within ${types_1.POD_RESPONSE_TIMEOUT_MS}ms (wedged socket) \u2014 evicted + respawning`),(0,edge_1.sendError)(e,o,502,"unavailable",`Pod ${a} of ${r.project} was unresponsive \u2014 evicted, retry.`))},types_1.POD_RESPONSE_TIMEOUT_MS);f.unref?.(),e.on("close",()=>clearTimeout(f)),U({socketPath:t},o,e,{onResponse:c(()=>{clearTimeout(f),d=!0},"onResponse"),onError:c(y=>{clearTimeout(f),!d&&(d=!0,g(y.message),(0,edge_1.sendError)(e,o,502,"unavailable",`Pod ${a} of ${r.project} unavailable \u2014 retry.`))},"onError")});return}const i=Date.now()+types_1.UPSTREAM_HEAL_WINDOW_MS;let m=0,l=!1;const h=c(()=>{const s=r.target;U(s,o,e,{onResponse:c(()=>{},"onResponse"),onError:c(t=>{if(isConnError(t)&&(m+=1),r.lens&&isConnError(t)&&m>=2&&!l&&!e.headersSent&&!e.writableEnded&&!e.destroyed){l=!0,M(r).then(a=>{if(!(e.headersSent||e.writableEnded||e.destroyed)){if(a==="ready"){h();return}if(a==="unsupported"&&Date.now()<i){setTimeout(h,types_1.UPSTREAM_HEAL_STEP_MS).unref?.();return}b(r,o,e,r.target,t,a)}});return}if(isConnError(t)&&Date.now()<i&&!e.headersSent&&!e.writableEnded&&!e.destroyed){setTimeout(h,types_1.UPSTREAM_HEAL_STEP_MS).unref?.();return}if(e.headersSent||e.writableEnded||e.destroyed){e.destroyed||e.destroy();return}b(r,o,e,s,t)},"onError")})},"tryTcp");h()},"forwardNative");return{proxy:w,forward:c(async(r,o,e)=>{const p=Date.now(),i=o.__lensmcpTrace;if(e.on("close",()=>{N(r,Date.now()-p,e.statusCode??0,o.__lensmcpCaller),q(i,r.project,e.statusCode??0,{...o.__lensmcpPod?{pod:o.__lensmcpPod}:{},...o.__lensmcpCaller?{caller:o.__lensmcpCaller}:{}})}),r.prependPrefix&&!o.url?.startsWith(r.prependPrefix)&&(o.url=r.prependPrefix+(o.url??"/")),(o.httpVersionMajor??1)>=2){await W(r,o,e);return}if(r.pool){const t=r.svc;t&&(t.lastUsed=Date.now(),t.inflight+=1,e.on("close",()=>{t.inflight-=1,t.lastUsed=Date.now()}));let a=(0,discovery_1.pickSock)(r.pool,u.scanTtlMs);if(!a&&t&&(T(i,"cold-start",{project:r.project}),await S.ensureUp(t)&&(a=(0,discovery_1.pickSock)(r.pool,u.scanTtlMs))),t&&a&&S.markUp(t,"observed"),t&&S.scaleUp(t),!a){const n=t?.lastErrors?.length?` Service errors: ${t.lastErrors.join("; ")}`:"";(0,edge_1.sendError)(e,o,503,"unavailable",`Service ${r.project} is not reachable (no pods in ${r.pool.dir}).${n} The watcher recovers and the next request retries automatically.`);return}const d=path.basename(a,".sock");o.__lensmcpPod=d,T(i,"pod-select",{pod:d,pods:r.pool.socks.length,strategy:"round-robin"});let g=!1;const f=c(n=>{r.pool.socks=r.pool.socks.filter(_=>_!==a),r.pool.idx=-1;try{fs.unlinkSync(a)}catch{}console.error(`[gateway] pod ${d} of ${r.project}: ${n}`)},"evictPod"),y=setTimeout(()=>{g||e.headersSent||e.writableEnded||(g=!0,f(`no response within ${types_1.POD_RESPONSE_TIMEOUT_MS}ms (wedged socket) \u2014 evicted + respawning`),(0,edge_1.sendError)(e,o,502,"unavailable",`Pod ${d} of ${r.project} was unresponsive \u2014 evicted, retry.`))},types_1.POD_RESPONSE_TIMEOUT_MS);y.unref?.(),e.on("close",()=>clearTimeout(y)),w.web(o,e,{target:{socketPath:a},agent:v},n=>{clearTimeout(y),!g&&(g=!0,f(n.message),(0,edge_1.sendError)(e,o,502,"unavailable",`Pod ${d} of ${r.project} unavailable \u2014 retry.`))});return}const m=Date.now()+types_1.UPSTREAM_HEAL_WINDOW_MS;let l=0,h=!1;const s=c(()=>{const t=r.target,a={target:t,autoRewrite:typeof t=="string",changeOrigin:!0,agent:k(t)};w.web(o,e,a,d=>{if(isConnError(d)&&(l+=1),r.lens&&isConnError(d)&&l>=2&&!h&&!e.headersSent&&!e.writableEnded&&!e.destroyed){h=!0,M(r).then(g=>{if(!(e.headersSent||e.writableEnded||e.destroyed)){if(g==="ready"){s();return}if(g==="unsupported"&&Date.now()<m){setTimeout(s,types_1.UPSTREAM_HEAL_STEP_MS).unref?.();return}b(r,o,e,r.target,d,g)}});return}if(isConnError(d)&&Date.now()<m&&!e.headersSent&&!e.writableEnded&&!e.destroyed){setTimeout(s,types_1.UPSTREAM_HEAL_STEP_MS).unref?.();return}e.destroyed||b(r,o,e,t,d)})},"tryTcp");s()},"forward"),agentForTarget:k,destroyAgents:c(()=>{v.destroy(),j.destroy()},"destroyAgents"),closeProxy:c(()=>{try{w.close?.()}catch{}},"closeProxy")}}$(createProxy,"createProxy"),x(createProxy,"createProxy"),c(createProxy,"createProxy");
1
+ "use strict";var L=Object.defineProperty;var x=(E,f)=>L(E,"name",{value:f,configurable:!0});var H=Object.defineProperty,c=x((E,f)=>H(E,"name",{value:f,configurable:!0}),"c");Object.defineProperty(exports,"__esModule",{value:!0}),exports.createProxy=createProxy;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),http=tslib_1.__importStar(require("node:http")),path=tslib_1.__importStar(require("node:path")),discovery_1=require("./discovery"),edge_1=require("./edge"),gateway_errors_1=require("../gateway-errors"),types_1=require("./types");function isConnError(E){const f=E.code??"";return f==="ECONNREFUSED"||f==="ECONNRESET"||f==="ETIMEDOUT"||f==="EPIPE"||f==="EHOSTUNREACH"||f==="ENOENT"||/ECONNREFUSED|ECONNRESET|socket hang up|EPIPE/i.test(E.message)}x(isConnError,"isConnError"),c(isConnError,"isConnError");const HOP_BY_HOP=new Set(["connection","keep-alive","proxy-connection","proxy-authenticate","proxy-authorization","te","trailer","transfer-encoding","upgrade"]),httpProxy=require("http-proxy");function createProxy(E,f,w){const{recordEdge:C,finishTrace:N,traceStep:T,emit:q}=f,k=c(async r=>{if(!r.lens||!E.lensSupervisor)return"unsupported";let t;const e=new Promise(l=>{t=setTimeout(()=>l("timeout"),types_1.LENS_REQUEST_RECOVERY_WAIT_MS),t.unref?.()}),p=E.lensSupervisor.recover(r.lens,"proxy-connection").then(l=>l?"ready":"failed").catch(()=>"failed"),i=await Promise.race([p,e]);t&&clearTimeout(t);const g=E.lensSupervisor.status(r.lens);return i==="failed"&&(!g||g.state==="ready")?"unsupported":i},"waitForManagedRecovery"),b=c((r,t,e,p,i,g)=>{if(e.headersSent||e.writableEnded||e.destroyed){e.destroyed||e.destroy();return}const l=r.lens?E.lensSupervisor?.status(r.lens):void 0,u=g==="timeout"||l?.state==="starting"||l?.state==="replacing",s=(0,gateway_errors_1.ensureRequestId)(t),o=r.lens?{project:r.project,reason:l?.reason??"connection-failure",generation:l?.generation??0,...u?{retryAfterMs:2e3}:{}}:void 0,a=u?503:502,d=u?"starting":"unavailable";console.error(`[gateway] ${new Date().toISOString()} upstream-error traceId=${s} project=${r.project} target=${String(p)} state=${l?.state??"unmanaged"} generation=${l?.generation??0}: ${i.message}`),q("warning",`upstream unavailable: ${r.project}`,`cluster-upstream:${r.project}`,{kind:"upstream-error",traceId:s,project:r.project,target:String(p),state:l?.state??"unmanaged",generation:l?.generation,error:i.message}),(0,edge_1.sendError)(e,t,a,d,u?`Upstream ${r.project} is restarting.`:`Upstream ${r.project} unavailable.`,o,u?{"retry-after":"2"}:void 0)},"sendTerminalUpstreamError"),M={keepAlive:!0,keepAliveMsecs:3e4,maxSockets:1024,maxFreeSockets:256},P=new http.Agent(M),O=new(require("node:https")).Agent(M),$=c(r=>typeof r=="string"&&r.startsWith("https:")?O:P,"agentForTarget"),S=httpProxy.createProxyServer({xfwd:!0,secure:!1,proxyTimeout:12e4,agent:P}),j=c((r,t,e)=>{const p=c(()=>{e()||r.destroyed||r.destroy()},"onEdgeClose");t.once("close",p),r.once("close",()=>t.removeListener("close",p))},"propagateEdgeCancel");S.on("proxyReq",(r,t,e)=>{j(r,e,()=>e.writableEnded)}),S.on("proxyRes",(r,t,e)=>{const p=t.__lensmcpPod;p&&(r.headers["x-lensmcp-pod"]=p),delete r.headers["x-powered-by"],r.headers.server="LensMCP",e&&j(r,e,()=>e.writableEnded)});const R=c((r,t,e,p)=>{const i={};for(const[n,m]of Object.entries(t.headers))m===void 0||n.startsWith(":")||HOP_BY_HOP.has(n)||(i[n]=m);const g=t.socket?.remoteAddress??"",l=t.headers["x-forwarded-for"];i["x-forwarded-for"]=l?`${String(l)}, ${g}`:g,i["x-forwarded-proto"]="https",i["x-forwarded-host"]||(i["x-forwarded-host"]=t.headers.host??"");let u=http,s;if(typeof r=="object")s={socketPath:r.socketPath,path:t.url,method:t.method,headers:i,agent:P};else{const n=new URL(r),m=n.protocol==="https:";u=m?require("node:https"):http,i.host=n.host,s={protocol:n.protocol,hostname:n.hostname,port:n.port||(m?443:80),path:t.url,method:t.method,headers:i,agent:$(r)}}const o=e;o.__lensmcpErrContained||(o.__lensmcpErrContained=!0,e.on("error",()=>{}));let a;const d=c(()=>{h.destroy()},"onReqError"),y=c(()=>{a&&!a.destroyed&&a.destroy()},"onEdgeClose"),_=c(()=>{t.removeListener("error",d),e.removeListener("close",y)},"detach"),h=u.request(s,n=>{if(a=n,p.onResponse(),e.headersSent||e.writableEnded||e.destroyed){n.destroy();return}const m={};for(const[v,D]of Object.entries(n.headers))D===void 0||HOP_BY_HOP.has(v)||(m[v]=D);delete m["x-powered-by"],m.server="LensMCP";const U=t.__lensmcpPod;U&&(m["x-lensmcp-pod"]=U);try{e.writeHead(n.statusCode??502,m)}catch(v){console.error("[gateway] h2 relay: bad response header, resetting stream:",v.message),n.destroy(),e.destroyed||e.destroy(v);return}n.pipe(e);const A=c(()=>{!e.writableEnded&&!e.destroyed&&e.destroy()},"abortEdge");n.once("error",A),n.once("close",A),e.on("close",y)});h.once("error",n=>p.onError(n)),h.once("close",_),t.on("error",d),t.method==="GET"||t.method==="HEAD"||t.method==="OPTIONS"?h.end():t.pipe(h)},"pipeUpstream"),I=c(async(r,t,e)=>{const p=t.__lensmcpTrace;if(r.pool){const s=r.svc;s&&(s.lastUsed=Date.now(),s.inflight+=1,e.on("close",()=>{s.inflight-=1,s.lastUsed=Date.now()}));let o=(0,discovery_1.pickSock)(r.pool,E.scanTtlMs);if(!o&&s&&(T(p,"cold-start",{project:r.project}),await w.ensureUp(s)&&(o=(0,discovery_1.pickSock)(r.pool,E.scanTtlMs))),s&&o&&w.markUp(s,"observed"),s&&w.scaleUp(s),!o){const h=s?.lastErrors?.length?` Service errors: ${s.lastErrors.join("; ")}`:"";(0,edge_1.sendError)(e,t,503,"unavailable",`Service ${r.project} is not reachable (no pods in ${r.pool.dir}).${h} The watcher recovers and the next request retries automatically.`);return}const a=path.basename(o,".sock");t.__lensmcpPod=a,T(p,"pod-select",{pod:a,pods:r.pool.socks.length,strategy:"round-robin"});let d=!1;const y=c(h=>{r.pool.socks=r.pool.socks.filter(n=>n!==o),r.pool.idx=-1;try{fs.unlinkSync(o)}catch{}console.error(`[gateway] pod ${a} of ${r.project}: ${h}`)},"evictPod"),_=setTimeout(()=>{d||e.headersSent||e.writableEnded||(d=!0,y(`no response within ${types_1.POD_RESPONSE_TIMEOUT_MS}ms (wedged socket) \u2014 evicted + respawning`),(0,edge_1.sendError)(e,t,502,"unavailable",`Pod ${a} of ${r.project} was unresponsive \u2014 evicted, retry.`))},types_1.POD_RESPONSE_TIMEOUT_MS);_.unref?.(),e.on("close",()=>clearTimeout(_)),R({socketPath:o},t,e,{onResponse:c(()=>{clearTimeout(_),d=!0},"onResponse"),onError:c(h=>{clearTimeout(_),!d&&(d=!0,y(h.message),(0,edge_1.sendError)(e,t,502,"unavailable",`Pod ${a} of ${r.project} unavailable \u2014 retry.`))},"onError")});return}const i=Date.now()+types_1.UPSTREAM_HEAL_WINDOW_MS;let g=0,l=!1;const u=c(()=>{const s=r.target;R(s,t,e,{onResponse:c(()=>{},"onResponse"),onError:c(o=>{if(isConnError(o)&&(g+=1),r.lens&&isConnError(o)&&g>=2&&!l&&!e.headersSent&&!e.writableEnded&&!e.destroyed){l=!0,k(r).then(a=>{if(!(e.headersSent||e.writableEnded||e.destroyed)){if(a==="ready"){u();return}if(a==="unsupported"&&Date.now()<i){setTimeout(u,types_1.UPSTREAM_HEAL_STEP_MS).unref?.();return}b(r,t,e,r.target,o,a)}});return}if(isConnError(o)&&Date.now()<i&&!e.headersSent&&!e.writableEnded&&!e.destroyed){setTimeout(u,types_1.UPSTREAM_HEAL_STEP_MS).unref?.();return}if(e.headersSent||e.writableEnded||e.destroyed){e.destroyed||e.destroy();return}b(r,t,e,s,o)},"onError")})},"tryTcp");u()},"forwardNative");return{proxy:S,forward:c(async(r,t,e)=>{const p=Date.now(),i=t.__lensmcpTrace;if(e.on("close",()=>{C(r,Date.now()-p,e.statusCode??0,t.__lensmcpCaller),N(i,r.project,e.statusCode??0,{...t.__lensmcpPod?{pod:t.__lensmcpPod}:{},...t.__lensmcpCaller?{caller:t.__lensmcpCaller}:{}})}),r.prependPrefix&&!t.url?.startsWith(r.prependPrefix)&&(t.url=r.prependPrefix+(t.url??"/")),(t.httpVersionMajor??1)>=2){await I(r,t,e);return}if(r.pool){const o=r.svc;o&&(o.lastUsed=Date.now(),o.inflight+=1,e.on("close",()=>{o.inflight-=1,o.lastUsed=Date.now()}));let a=(0,discovery_1.pickSock)(r.pool,E.scanTtlMs);if(!a&&o&&(T(i,"cold-start",{project:r.project}),await w.ensureUp(o)&&(a=(0,discovery_1.pickSock)(r.pool,E.scanTtlMs))),o&&a&&w.markUp(o,"observed"),o&&w.scaleUp(o),!a){const n=o?.lastErrors?.length?` Service errors: ${o.lastErrors.join("; ")}`:"";(0,edge_1.sendError)(e,t,503,"unavailable",`Service ${r.project} is not reachable (no pods in ${r.pool.dir}).${n} The watcher recovers and the next request retries automatically.`);return}const d=path.basename(a,".sock");t.__lensmcpPod=d,T(i,"pod-select",{pod:d,pods:r.pool.socks.length,strategy:"round-robin"});let y=!1;const _=c(n=>{r.pool.socks=r.pool.socks.filter(m=>m!==a),r.pool.idx=-1;try{fs.unlinkSync(a)}catch{}console.error(`[gateway] pod ${d} of ${r.project}: ${n}`)},"evictPod"),h=setTimeout(()=>{y||e.headersSent||e.writableEnded||(y=!0,_(`no response within ${types_1.POD_RESPONSE_TIMEOUT_MS}ms (wedged socket) \u2014 evicted + respawning`),(0,edge_1.sendError)(e,t,502,"unavailable",`Pod ${d} of ${r.project} was unresponsive \u2014 evicted, retry.`))},types_1.POD_RESPONSE_TIMEOUT_MS);h.unref?.(),e.on("close",()=>clearTimeout(h)),S.web(t,e,{target:{socketPath:a},agent:P},n=>{clearTimeout(h),!y&&(y=!0,_(n.message),(0,edge_1.sendError)(e,t,502,"unavailable",`Pod ${d} of ${r.project} unavailable \u2014 retry.`))});return}const g=Date.now()+types_1.UPSTREAM_HEAL_WINDOW_MS;let l=0,u=!1;const s=c(()=>{const o=r.target,a={target:o,autoRewrite:typeof o=="string",changeOrigin:!0,agent:$(o)};S.web(t,e,a,d=>{if(isConnError(d)&&(l+=1),r.lens&&isConnError(d)&&l>=2&&!u&&!e.headersSent&&!e.writableEnded&&!e.destroyed){u=!0,k(r).then(y=>{if(!(e.headersSent||e.writableEnded||e.destroyed)){if(y==="ready"){s();return}if(y==="unsupported"&&Date.now()<g){setTimeout(s,types_1.UPSTREAM_HEAL_STEP_MS).unref?.();return}b(r,t,e,r.target,d,y)}});return}if(isConnError(d)&&Date.now()<g&&!e.headersSent&&!e.writableEnded&&!e.destroyed){setTimeout(s,types_1.UPSTREAM_HEAL_STEP_MS).unref?.();return}e.destroyed||b(r,t,e,o,d)})},"tryTcp");s()},"forward"),agentForTarget:$,destroyAgents:c(()=>{P.destroy(),O.destroy()},"destroyAgents"),closeProxy:c(()=>{try{S.close?.()}catch{}},"closeProxy")}}x(createProxy,"createProxy"),c(createProxy,"createProxy");
@@ -1 +1 @@
1
- "use strict";var g=Object.defineProperty;var a=(t,e)=>g(t,"name",{value:e,configurable:!0});var u=Object.defineProperty,n=a((t,e)=>u(t,"name",{value:e,configurable:!0}),"n"),i=Object.defineProperty,r=n((t,e)=>i(t,"name",{value:e,configurable:!0}),"r");Object.defineProperty(exports,"__esModule",{value:!0}),exports.RouteRegistry=void 0,exports.rebuildRoutesInPlace=rebuildRoutesInPlace;const manifest_1=require("../manifest");class RouteRegistry{static{a(this,"RouteRegistry")}static{n(this,"RouteRegistry")}static{r(this,"RouteRegistry")}constructor(){this.fragments=new Map}register(e){this.fragments.set(e.wsKey,e)}unregister(e){const s=this.fragments.get(e);return this.fragments.delete(e),s}has(e){return this.fragments.has(e)}get(e){return this.fragments.get(e)}keys(){return[...this.fragments.keys()]}size(){return this.fragments.size}appendRoutes(e,s){const o=this.fragments.get(e);o&&o.routes.push(...s)}allServices(){return[...this.fragments.values()].flatMap(e=>e.services)}merged(){const e=[...this.fragments.values()].flatMap(s=>s.routes);return(0,manifest_1.sortBySpecificity)(e),e}}exports.RouteRegistry=RouteRegistry;function rebuildRoutesInPlace(t,e){const s=e.merged();t.length=0,t.push(...s)}a(rebuildRoutesInPlace,"rebuildRoutesInPlace"),n(rebuildRoutesInPlace,"rebuildRoutesInPlace"),r(rebuildRoutesInPlace,"rebuildRoutesInPlace");
1
+ "use strict";var u=Object.defineProperty;var n=(t,e)=>u(t,"name",{value:e,configurable:!0});var i=Object.defineProperty,r=n((t,e)=>i(t,"name",{value:e,configurable:!0}),"r");Object.defineProperty(exports,"__esModule",{value:!0}),exports.RouteRegistry=void 0,exports.rebuildRoutesInPlace=rebuildRoutesInPlace;const manifest_1=require("../manifest");class RouteRegistry{static{n(this,"RouteRegistry")}static{r(this,"RouteRegistry")}constructor(){this.fragments=new Map}register(e){this.fragments.set(e.wsKey,e)}unregister(e){const s=this.fragments.get(e);return this.fragments.delete(e),s}has(e){return this.fragments.has(e)}get(e){return this.fragments.get(e)}keys(){return[...this.fragments.keys()]}size(){return this.fragments.size}appendRoutes(e,s){const a=this.fragments.get(e);a&&a.routes.push(...s)}allServices(){return[...this.fragments.values()].flatMap(e=>e.services)}merged(){const e=[...this.fragments.values()].flatMap(s=>s.routes);return(0,manifest_1.sortBySpecificity)(e),e}}exports.RouteRegistry=RouteRegistry;function rebuildRoutesInPlace(t,e){const s=e.merged();t.length=0,t.push(...s)}n(rebuildRoutesInPlace,"rebuildRoutesInPlace"),r(rebuildRoutesInPlace,"rebuildRoutesInPlace");
@@ -1 +1 @@
1
- "use strict";var u=Object.defineProperty;var a=(e,t)=>u(e,"name",{value:t,configurable:!0});var p=Object.defineProperty,n=a((e,t)=>p(e,"name",{value:t,configurable:!0}),"n"),c=Object.defineProperty,s=n((e,t)=>c(e,"name",{value:t,configurable:!0}),"s");Object.defineProperty(exports,"__esModule",{value:!0}),exports.baseDomainOf=baseDomainOf,exports.readLensScope=readLensScope,exports.deriveMcpHttpPort=deriveMcpHttpPort,exports.readSourceSetExclude=readSourceSetExclude,exports.lensKeyFrom=lensKeyFrom,exports.lensSlug=lensSlug;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path"));function baseDomainOf(e){const t=e.filter(o=>!!o&&!o.startsWith("*."));if(t.length===0)return"local";const r=t.reduce((o,l)=>l.length<o.length?l:o);if(t.every(o=>o===r||o.endsWith("."+r)))return r;const i=r.split(".");return i.slice(-Math.min(i.length,3)).join(".")}a(baseDomainOf,"baseDomainOf"),n(baseDomainOf,"baseDomainOf"),s(baseDomainOf,"baseDomainOf");const BASE_PORTS={dashboard:4321,mcpHttp:4500};function hashToRange(e,t){let r=2166136261;for(let i=0;i<e.length;i++)r^=e.charCodeAt(i),r=Math.imul(r,16777619);return Math.abs(r|0)%t}a(hashToRange,"hashToRange"),n(hashToRange,"hashToRange"),s(hashToRange,"hashToRange");function readLensScope(e){try{const r=JSON.parse(fs.readFileSync(path.join(e,".lensmcp","config.json"),"utf8"));if(r&&typeof r.key=="string")return{key:r.key,dashboardPort:r.ports?.dashboard??BASE_PORTS.dashboard,mcpHttpPort:r.ports?.mcpHttp??deriveMcpHttpPort(r.key),basePath:r.dashboardBasePath??"/"+r.key}}catch{}const t=lensKeyFrom(e);return{key:t,dashboardPort:BASE_PORTS.dashboard,mcpHttpPort:deriveMcpHttpPort(t),basePath:"/"+t}}a(readLensScope,"readLensScope"),n(readLensScope,"readLensScope"),s(readLensScope,"readLensScope");function deriveMcpHttpPort(e){return BASE_PORTS.mcpHttp+hashToRange(e,200)}a(deriveMcpHttpPort,"deriveMcpHttpPort"),n(deriveMcpHttpPort,"deriveMcpHttpPort"),s(deriveMcpHttpPort,"deriveMcpHttpPort");function readSourceSetExclude(e){try{const t=JSON.parse(fs.readFileSync(path.join(e,".lensmcp","config.json"),"utf8"))?.sourceSet?.exclude;if(Array.isArray(t))return new Set(t.filter(r=>typeof r=="string"&&r.length>0&&!r.includes("/")))}catch{}return new Set}a(readSourceSetExclude,"readSourceSetExclude"),n(readSourceSetExclude,"readSourceSetExclude"),s(readSourceSetExclude,"readSourceSetExclude");function lensKeyFrom(e){try{const t=JSON.parse(fs.readFileSync(path.join(e,"package.json"),"utf8"));if(t?.name)return lensSlug(t.name)}catch{}return lensSlug(path.basename(e))}a(lensKeyFrom,"lensKeyFrom"),n(lensKeyFrom,"lensKeyFrom"),s(lensKeyFrom,"lensKeyFrom");function lensSlug(e){return e.toLowerCase().replace(/^@[^/]+\//,"").replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")||"workspace"}a(lensSlug,"lensSlug"),n(lensSlug,"lensSlug"),s(lensSlug,"lensSlug");
1
+ "use strict";var p=Object.defineProperty;var n=(t,r)=>p(t,"name",{value:r,configurable:!0});var c=Object.defineProperty,s=n((t,r)=>c(t,"name",{value:r,configurable:!0}),"s");Object.defineProperty(exports,"__esModule",{value:!0}),exports.baseDomainOf=baseDomainOf,exports.readLensScope=readLensScope,exports.deriveMcpHttpPort=deriveMcpHttpPort,exports.readSourceSetExclude=readSourceSetExclude,exports.lensKeyFrom=lensKeyFrom,exports.lensSlug=lensSlug;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path"));function baseDomainOf(t){const r=t.filter(o=>!!o&&!o.startsWith("*."));if(r.length===0)return"local";const e=r.reduce((o,i)=>i.length<o.length?i:o);if(r.every(o=>o===e||o.endsWith("."+e)))return e;const a=e.split(".");return a.slice(-Math.min(a.length,3)).join(".")}n(baseDomainOf,"baseDomainOf"),s(baseDomainOf,"baseDomainOf");const BASE_PORTS={dashboard:4321,mcpHttp:4500};function hashToRange(t,r){let e=2166136261;for(let a=0;a<t.length;a++)e^=t.charCodeAt(a),e=Math.imul(e,16777619);return Math.abs(e|0)%r}n(hashToRange,"hashToRange"),s(hashToRange,"hashToRange");function readLensScope(t){try{const e=JSON.parse(fs.readFileSync(path.join(t,".lensmcp","config.json"),"utf8"));if(e&&typeof e.key=="string")return{key:e.key,dashboardPort:e.ports?.dashboard??BASE_PORTS.dashboard,mcpHttpPort:e.ports?.mcpHttp??deriveMcpHttpPort(e.key),basePath:e.dashboardBasePath??"/"+e.key}}catch{}const r=lensKeyFrom(t);return{key:r,dashboardPort:BASE_PORTS.dashboard,mcpHttpPort:deriveMcpHttpPort(r),basePath:"/"+r}}n(readLensScope,"readLensScope"),s(readLensScope,"readLensScope");function deriveMcpHttpPort(t){return BASE_PORTS.mcpHttp+hashToRange(t,200)}n(deriveMcpHttpPort,"deriveMcpHttpPort"),s(deriveMcpHttpPort,"deriveMcpHttpPort");function readSourceSetExclude(t){try{const r=JSON.parse(fs.readFileSync(path.join(t,".lensmcp","config.json"),"utf8"))?.sourceSet?.exclude;if(Array.isArray(r))return new Set(r.filter(e=>typeof e=="string"&&e.length>0&&!e.includes("/")))}catch{}return new Set}n(readSourceSetExclude,"readSourceSetExclude"),s(readSourceSetExclude,"readSourceSetExclude");function lensKeyFrom(t){try{const r=JSON.parse(fs.readFileSync(path.join(t,"package.json"),"utf8"));if(r?.name)return lensSlug(r.name)}catch{}return lensSlug(path.basename(t))}n(lensKeyFrom,"lensKeyFrom"),s(lensKeyFrom,"lensKeyFrom");function lensSlug(t){return t.toLowerCase().replace(/^@[^/]+\//,"").replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")||"workspace"}n(lensSlug,"lensSlug"),s(lensSlug,"lensSlug");
@@ -1,3 +1,3 @@
1
- "use strict";var oe=Object.defineProperty;var m=(t,r)=>oe(t,"name",{value:r,configurable:!0});var re=Object.defineProperty,_=m((t,r)=>re(t,"name",{value:r,configurable:!0}),"_"),ee=Object.defineProperty,n=_((t,r)=>ee(t,"name",{value:r,configurable:!0}),"n");Object.defineProperty(exports,"__esModule",{value:!0}),exports.BENIGN_SOCKET_ERRNOS=void 0,exports.buildEdgeVerifierPool=buildEdgeVerifierPool,exports.classifyClientError=classifyClientError,exports.createClientErrorLogGate=createClientErrorLogGate,exports.startGateway=startGateway;const tslib_1=require("tslib"),http=tslib_1.__importStar(require("node:http")),path=tslib_1.__importStar(require("node:path")),discovery_1=require("./discovery"),scope_1=require("./scope"),route_registry_1=require("./route-registry"),control_1=require("./control"),workspace_registry_1=require("./workspace-registry"),service_keys_1=require("./service-keys"),observability_1=require("./observability"),lifecycle_1=require("./lifecycle"),lens_children_1=require("./lens-children"),proxy_1=require("./proxy"),auth_1=require("./auth"),hooks_1=require("./hooks"),handler_1=require("./handler"),upgrade_1=require("./upgrade"),jwks_verify_1=require("../jwks-verify"),types_1=require("./types");function insecureLocalFetch(t,r){return new Promise((g,y)=>{const h=(t.startsWith("https:")?require("node:https"):require("node:http")).request(t,{method:"GET",headers:r?.headers,rejectUnauthorized:!1},E=>{const l=[];E.on("data",u=>l.push(u)),E.on("end",()=>{const u=E.statusCode??0,a=Buffer.concat(l).toString("utf8");g({ok:u>=200&&u<300,status:u,json:n(async()=>JSON.parse(a),"json")})})});h.on("error",y),h.end()})}m(insecureLocalFetch,"insecureLocalFetch"),_(insecureLocalFetch,"insecureLocalFetch"),n(insecureLocalFetch,"insecureLocalFetch");function buildEdgeVerifierPool(t){const r=process.env.LENSMCP_GW_JWKS_URL,g=process.env.LENSMCP_GW_JWT_ISS,y=new Map;let h;const E=n((l,u)=>{console.log(`[gateway] edge JWT: verifying via JWKS ${l}${u}`);const a=(0,jwks_verify_1.createJwksVerifier)({jwksUrl:l,...g?{issuer:g}:{},fetchImpl:insecureLocalFetch});return a.refresh().catch(w=>console.warn("[gateway] edge JWKS warm failed (will retry):",w.message)),a},"make");return{for(l){if(r)return h??=E(r,"");const u=l.split(":")[0].toLowerCase();let a;for(const T of t()){const S=T.host;if(typeof S!="string"||!/^auth\./.test(S)||S.startsWith("internal."))continue;const v=S.slice(5);(u===v||u.endsWith(`.${v}`))&&(!a||v.length>a.length)&&(a=v)}if(!a)return;let w=y.get(a);return w||(w=E(`https://auth.${a}/jwks.json`,` (auto-derived for apex ${a})`),y.set(a,w)),w},stop(){h?.stop();for(const l of y.values())l.stop()}}}m(buildEdgeVerifierPool,"buildEdgeVerifierPool"),_(buildEdgeVerifierPool,"buildEdgeVerifierPool"),n(buildEdgeVerifierPool,"buildEdgeVerifierPool"),exports.BENIGN_SOCKET_ERRNOS=new Set(["ECONNRESET","EPIPE","ETIMEDOUT","ECONNABORTED","ECANCELED"]);function classifyClientError(t,r){return t&&exports.BENIGN_SOCKET_ERRNOS.has(t)?{status:null,report:!1,cause:"client-abort"}:t==="HPE_INVALID_EOF_STATE"?{status:null,report:!1,cause:"truncated-at-eof"}:t==="ERR_HTTP_REQUEST_TIMEOUT"?{status:408,report:!0,cause:"request-timeout"}:t==="HPE_HEADER_OVERFLOW"?{status:431,report:!0,cause:"header-overflow"}:t?.startsWith("HPE_")?{status:400,report:!0,cause:"parse-error"}:{status:400,report:!0,cause:t??r??"unknown"}}m(classifyClientError,"classifyClientError"),_(classifyClientError,"classifyClientError"),n(classifyClientError,"classifyClientError");const CLIENT_ERROR_REASON={400:"Bad Request",408:"Request Timeout",431:"Request Header Fields Too Large"};function createClientErrorLogGate(t=1e4){const r=new Map;return g=>{const y=Date.now(),h=r.get(g)??0;return y-h<t?!1:(r.set(g,y),!0)}}m(createClientErrorLogGate,"createClientErrorLogGate"),_(createClientErrorLogGate,"createClientErrorLogGate"),n(createClientErrorLogGate,"createClientErrorLogGate");function guardInboundSocket(t){t.on("error",r=>{exports.BENIGN_SOCKET_ERRNOS.has(r.code??"")||console.warn(`[gateway] inbound socket error (${r.code??r.message}) \u2014 dropping this connection only`),t.destroy()})}m(guardInboundSocket,"guardInboundSocket"),_(guardInboundSocket,"guardInboundSocket"),n(guardInboundSocket,"guardInboundSocket");async function startGateway(t,r){const g=t.https!==!1,y=t.ports?.length?t.ports:[443],h=t.scanTtlMs??1500,E=t.startupTimeoutMs??12e4,l=t.sweepMs??1e4,u=t.trafficFlushMs??5e3;let a=!1;const w=process.env.LENSMCP_EVENT_FILE??path.join(r.root,".lensmcp","events.jsonl"),T=(0,scope_1.readLensScope)(r.root).key,S=r.projectsConfigurations?.projects??{},v=(0,discovery_1.projectSourceRoots)(r.root,S,r.projectDependencies),{routes:L,services:b}=(0,discovery_1.discoverRoutes)(r.root,S,void 0,T,v);if(L.length===0)throw new Error("[gateway] no project declares a `cluster` field \u2014 nothing to route.");const A=new route_registry_1.RouteRegistry;A.register({wsKey:T,root:r.root,routes:L,services:b});const k=[];let N=n(()=>{},"refreshCert");const G=n(()=>{(0,route_registry_1.rebuildRoutesInPlace)(k,A),N()},"rebuildRoutes");G();const{serviceKeys:J,keyToProject:Y}=(0,service_keys_1.loadServiceKeys)(r.root,b),f={root:r.root,wsKey:T,eventFile:w,routes:k,registry:A,rebuildRoutes:G,services:b,serviceKeys:J,keyToProject:Y,scanTtlMs:h,startupTimeoutMs:E,sweepMs:l,trafficFlushMs:u,https:g,projectRoots:Object.fromEntries(Object.entries(r.projectsConfigurations?.projects??{}).map(([e,o])=>[e,path.resolve(r.root,o.root)])),projectSourceRoots:v,stopped:n(()=>a,"stopped")},p=(0,observability_1.createObservability)(w,{trafficFlushMs:u}),z=createClientErrorLogGate(),C=(0,lifecycle_1.createServiceLayer)(f,p),R=(0,lens_children_1.createLensChildren)(f,p,t),O=new Map;let W;try{W=(0,control_1.startControlServer)({rt:f,killService:n((e,o)=>C.killSpawned(e,o),"killService"),onRegister:n(async e=>{const o=await R.hostWorkspaceDashboard(e),i=await R.hostWorkspaceApps(e);O.set(e.wsKey,()=>{o?.(),i()})},"onRegister"),onUnregister:n(e=>{O.get(e.wsKey)?.(),O.delete(e.wsKey)},"onUnregister")})}catch(e){console.warn("[gateway] control plane failed to start (multi-workspace register disabled):",e.message)}const j=(0,proxy_1.createProxy)(f,p,C),K=buildEdgeVerifierPool(()=>f.routes),U=(0,auth_1.createEdgeAuth)(f,p,K);let M;if(t.middleware){const e=require(path.resolve(r.root,t.middleware));M=e.default??e}const Q=n(e=>{if(M)try{M(e.req)}catch(o){p.traceStep(e.trace,"auth",{mode:"middleware",ok:!1,reason:o.message}),e.route&&p.finishTrace(e.trace,e.route.project,401),e.sendError(401,"unauthorized",`Gateway middleware rejected the request: ${o.message}`)}},"builtinMiddleware"),F=t.hooks??{},H=(0,hooks_1.createHooks)({...F,afterAuth:[Q,...F.afterAuth??[]]}),V=(0,handler_1.createHandler)({rt:f,obs:p,auth:U,proxy:j,hooks:H}),X=(0,upgrade_1.createUpgrade)({rt:f,auth:U,proxy:j,hooks:H}),Z=p.startEdgeFlusher(),te=C.startSweeper();await R.bootSingletonsAndApps();for(const e of b)e.decl.eager&&C.ensureUp(e);let P,x,$;if(g){const e=require("../../../basic-ssl"),o=(0,service_keys_1.gatewayCacheDir)(r.root);$=n(()=>e.getCertificateSync(o,"gateway",f.routes.map(i=>i.host).filter(i=>!!i)),"mintCert"),P=$(),x=e.caCertPath()}const I=[],q=[];for(const e of y){const o=P?require("node:http2").createSecureServer({key:P,cert:P,allowHTTP1:!0,maxSessionMemory:512,settings:{maxConcurrentStreams:512},peerMaxConcurrentStreams:512},(i,s)=>V(i,s)):http.createServer(V);if(o.on("upgrade",X),o.on("error",i=>console.error(`[gateway] port ${e}: ${i.code}`)),o.on("connection",guardInboundSocket),o.on("secureConnection",guardInboundSocket),o.on("tlsClientError",(i,s)=>s.destroy()),o.on("clientError",(i,s)=>{const d=i,c=classifyClientError(d.code,d.message);if(c.report&&z(c.cause)){const D=s.remoteAddress??"unknown",B=c.status===null?"dropped":String(c.status);console.warn(`[gateway] inbound H1 clientError from ${D}: ${c.cause} (${d.code??d.message}${d.bytesParsed!==void 0?`, bytesParsed=${d.bytesParsed}`:""}) \u2192 ${B}. This status is the GATEWAY's, not the upstream service's.`),p.emit("warning",`inbound clientError: ${c.cause} \u2192 ${B}`,`gateway-client-error:${c.cause}`,{kind:"gateway-client-error",cause:c.cause,code:d.code??null,status:c.status,peer:D,bytesParsed:d.bytesParsed??null})}c.status!==null&&s.writable&&s.end(`HTTP/1.1 ${c.status} ${CLIENT_ERROR_REASON[c.status]}\r
1
+ "use strict";var re=Object.defineProperty;var _=(r,t)=>re(r,"name",{value:t,configurable:!0});var ee=Object.defineProperty,n=_((r,t)=>ee(r,"name",{value:t,configurable:!0}),"n");Object.defineProperty(exports,"__esModule",{value:!0}),exports.BENIGN_SOCKET_ERRNOS=void 0,exports.buildEdgeVerifierPool=buildEdgeVerifierPool,exports.classifyClientError=classifyClientError,exports.createClientErrorLogGate=createClientErrorLogGate,exports.startGateway=startGateway;const tslib_1=require("tslib"),http=tslib_1.__importStar(require("node:http")),path=tslib_1.__importStar(require("node:path")),discovery_1=require("./discovery"),scope_1=require("./scope"),route_registry_1=require("./route-registry"),control_1=require("./control"),workspace_registry_1=require("./workspace-registry"),service_keys_1=require("./service-keys"),observability_1=require("./observability"),lifecycle_1=require("./lifecycle"),lens_children_1=require("./lens-children"),proxy_1=require("./proxy"),auth_1=require("./auth"),hooks_1=require("./hooks"),handler_1=require("./handler"),upgrade_1=require("./upgrade"),jwks_verify_1=require("../jwks-verify"),types_1=require("./types");function insecureLocalFetch(r,t){return new Promise((y,g)=>{const h=(r.startsWith("https:")?require("node:https"):require("node:http")).request(r,{method:"GET",headers:t?.headers,rejectUnauthorized:!1},E=>{const l=[];E.on("data",u=>l.push(u)),E.on("end",()=>{const u=E.statusCode??0,a=Buffer.concat(l).toString("utf8");y({ok:u>=200&&u<300,status:u,json:n(async()=>JSON.parse(a),"json")})})});h.on("error",g),h.end()})}_(insecureLocalFetch,"insecureLocalFetch"),n(insecureLocalFetch,"insecureLocalFetch");function buildEdgeVerifierPool(r){const t=process.env.LENSMCP_GW_JWKS_URL,y=process.env.LENSMCP_GW_JWT_ISS,g=new Map;let h;const E=n((l,u)=>{console.log(`[gateway] edge JWT: verifying via JWKS ${l}${u}`);const a=(0,jwks_verify_1.createJwksVerifier)({jwksUrl:l,...y?{issuer:y}:{},fetchImpl:insecureLocalFetch});return a.refresh().catch(w=>console.warn("[gateway] edge JWKS warm failed (will retry):",w.message)),a},"make");return{for(l){if(t)return h??=E(t,"");const u=l.split(":")[0].toLowerCase();let a;for(const v of r()){const m=v.host;if(typeof m!="string"||!/^auth\./.test(m)||m.startsWith("internal."))continue;const S=m.slice(5);(u===S||u.endsWith(`.${S}`))&&(!a||S.length>a.length)&&(a=S)}if(!a)return;let w=g.get(a);return w||(w=E(`https://auth.${a}/jwks.json`,` (auto-derived for apex ${a})`),g.set(a,w)),w},stop(){h?.stop();for(const l of g.values())l.stop()}}}_(buildEdgeVerifierPool,"buildEdgeVerifierPool"),n(buildEdgeVerifierPool,"buildEdgeVerifierPool"),exports.BENIGN_SOCKET_ERRNOS=new Set(["ECONNRESET","EPIPE","ETIMEDOUT","ECONNABORTED","ECANCELED"]);function classifyClientError(r,t){return r&&exports.BENIGN_SOCKET_ERRNOS.has(r)?{status:null,report:!1,cause:"client-abort"}:r==="HPE_INVALID_EOF_STATE"?{status:null,report:!1,cause:"truncated-at-eof"}:r==="ERR_HTTP_REQUEST_TIMEOUT"?{status:408,report:!0,cause:"request-timeout"}:r==="HPE_HEADER_OVERFLOW"?{status:431,report:!0,cause:"header-overflow"}:r?.startsWith("HPE_")?{status:400,report:!0,cause:"parse-error"}:{status:400,report:!0,cause:r??t??"unknown"}}_(classifyClientError,"classifyClientError"),n(classifyClientError,"classifyClientError");const CLIENT_ERROR_REASON={400:"Bad Request",408:"Request Timeout",431:"Request Header Fields Too Large"};function createClientErrorLogGate(r=1e4){const t=new Map;return y=>{const g=Date.now(),h=t.get(y)??0;return g-h<r?!1:(t.set(y,g),!0)}}_(createClientErrorLogGate,"createClientErrorLogGate"),n(createClientErrorLogGate,"createClientErrorLogGate");function guardInboundSocket(r){r.on("error",t=>{exports.BENIGN_SOCKET_ERRNOS.has(t.code??"")||console.warn(`[gateway] inbound socket error (${t.code??t.message}) \u2014 dropping this connection only`),r.destroy()})}_(guardInboundSocket,"guardInboundSocket"),n(guardInboundSocket,"guardInboundSocket");async function startGateway(r,t){const y=r.https!==!1,g=r.ports?.length?r.ports:[443],h=r.scanTtlMs??1500,E=r.startupTimeoutMs??12e4,l=r.sweepMs??1e4,u=r.trafficFlushMs??5e3;let a=!1;const w=process.env.LENSMCP_EVENT_FILE??path.join(t.root,".lensmcp","events.jsonl"),v=(0,scope_1.readLensScope)(t.root).key,m=t.projectsConfigurations?.projects??{},S=(0,discovery_1.projectSourceRoots)(t.root,m,t.projectDependencies),{routes:N,services:T}=(0,discovery_1.discoverRoutes)(t.root,m,void 0,v,S);if(N.length===0)throw new Error("[gateway] no project declares a `cluster` field \u2014 nothing to route.");const q=new route_registry_1.RouteRegistry;q.register({wsKey:v,root:t.root,routes:N,services:T});const k=[];let I=n(()=>{},"refreshCert");const L=n(()=>{(0,route_registry_1.rebuildRoutesInPlace)(k,q),I()},"rebuildRoutes");L();const{serviceKeys:B,keyToProject:J}=(0,service_keys_1.loadServiceKeys)(t.root,T),f={root:t.root,wsKey:v,eventFile:w,routes:k,registry:q,rebuildRoutes:L,services:T,serviceKeys:B,keyToProject:J,scanTtlMs:h,startupTimeoutMs:E,sweepMs:l,trafficFlushMs:u,https:y,projectRoots:Object.fromEntries(Object.entries(t.projectsConfigurations?.projects??{}).map(([e,o])=>[e,path.resolve(t.root,o.root)])),projectSourceRoots:S,stopped:n(()=>a,"stopped")},p=(0,observability_1.createObservability)(w,{trafficFlushMs:u}),Y=createClientErrorLogGate(),b=(0,lifecycle_1.createServiceLayer)(f,p),C=(0,lens_children_1.createLensChildren)(f,p,r),A=new Map;let W;try{W=(0,control_1.startControlServer)({rt:f,killService:n((e,o)=>b.killSpawned(e,o),"killService"),onRegister:n(async e=>{const o=await C.hostWorkspaceDashboard(e),i=await C.hostWorkspaceApps(e);A.set(e.wsKey,()=>{o?.(),i()})},"onRegister"),onUnregister:n(e=>{A.get(e.wsKey)?.(),A.delete(e.wsKey)},"onUnregister")})}catch(e){console.warn("[gateway] control plane failed to start (multi-workspace register disabled):",e.message)}const R=(0,proxy_1.createProxy)(f,p,b),G=buildEdgeVerifierPool(()=>f.routes),K=(0,auth_1.createEdgeAuth)(f,p,G);let M;if(r.middleware){const e=require(path.resolve(t.root,r.middleware));M=e.default??e}const z=n(e=>{if(M)try{M(e.req)}catch(o){p.traceStep(e.trace,"auth",{mode:"middleware",ok:!1,reason:o.message}),e.route&&p.finishTrace(e.trace,e.route.project,401),e.sendError(401,"unauthorized",`Gateway middleware rejected the request: ${o.message}`)}},"builtinMiddleware"),U=r.hooks??{},F=(0,hooks_1.createHooks)({...U,afterAuth:[z,...U.afterAuth??[]]}),H=(0,handler_1.createHandler)({rt:f,obs:p,auth:K,proxy:R,hooks:F}),Q=(0,upgrade_1.createUpgrade)({rt:f,auth:K,proxy:R,hooks:F}),X=p.startEdgeFlusher(),Z=b.startSweeper();await C.bootSingletonsAndApps();for(const e of T)e.decl.eager&&b.ensureUp(e);let P,O,$;if(y){const e=require("../../../basic-ssl"),o=(0,service_keys_1.gatewayCacheDir)(t.root);$=n(()=>e.getCertificateSync(o,"gateway",f.routes.map(i=>i.host).filter(i=>!!i)),"mintCert"),P=$(),O=e.caCertPath()}const x=[],j=[];for(const e of g){const o=P?require("node:http2").createSecureServer({key:P,cert:P,allowHTTP1:!0,maxSessionMemory:512,settings:{maxConcurrentStreams:512},peerMaxConcurrentStreams:512},(i,s)=>H(i,s)):http.createServer(H);if(o.on("upgrade",Q),o.on("error",i=>console.error(`[gateway] port ${e}: ${i.code}`)),o.on("connection",guardInboundSocket),o.on("secureConnection",guardInboundSocket),o.on("tlsClientError",(i,s)=>s.destroy()),o.on("clientError",(i,s)=>{const d=i,c=classifyClientError(d.code,d.message);if(c.report&&Y(c.cause)){const V=s.remoteAddress??"unknown",D=c.status===null?"dropped":String(c.status);console.warn(`[gateway] inbound H1 clientError from ${V}: ${c.cause} (${d.code??d.message}${d.bytesParsed!==void 0?`, bytesParsed=${d.bytesParsed}`:""}) \u2192 ${D}. This status is the GATEWAY's, not the upstream service's.`),p.emit("warning",`inbound clientError: ${c.cause} \u2192 ${D}`,`gateway-client-error:${c.cause}`,{kind:"gateway-client-error",cause:c.cause,code:d.code??null,status:c.status,peer:V,bytesParsed:d.bytesParsed??null})}c.status!==null&&s.writable&&s.end(`HTTP/1.1 ${c.status} ${CLIENT_ERROR_REASON[c.status]}\r
2
2
  \r
3
- `),s.destroy()}),o.keepAliveTimeout=types_1.GATEWAY_KEEPALIVE_TIMEOUT_MS,o.headersTimeout<types_1.GATEWAY_KEEPALIVE_TIMEOUT_MS+5e3&&(o.headersTimeout=types_1.GATEWAY_KEEPALIVE_TIMEOUT_MS+5e3),P!=null){const i=o;i.on("session",s=>{s.on("error",d=>{const c=d.code??d.message;console.warn(`[gateway] h2 session error (${c}) \u2014 dropping this session only`),s.destroyed||s.destroy()})}),i.on("sessionError",s=>{console.warn(`[gateway] h2 sessionError: ${s.code??s.message}`)})}await new Promise(i=>{o.listen(e,()=>{const s=o.address()?.port??e;q.push(s),console.log(`[gateway] Listening on ${P?"https":"http"}://localhost:${s}`),i()})}),I.push(o)}$&&(N=n(()=>{const e=$();for(const o of I)o.setSecureContext?.({key:e,cert:e})},"refreshCert")),console.log("[gateway] Routes:");for(const e of k){const o=e.pool?`pods@${e.pool.dir}`:e.target;console.log(`[gateway] ${e.host??"(default)"} \u2192 ${o}${e.prependPrefix?` (+${e.prependPrefix})`:""}${e.internal?" [internal: no middleware]":""} [${e.project}]`)}return x&&console.log(`[gateway] CA: ${x} \u2014 one-time setup via the trust executor.`),p.emit("info",`gateway up: ${k.length} routes on ${q.join("/")}`,"cluster-gateway",{kind:"gateway-up",project:"gateway",ports:q,routes:k.map(e=>({host:e.host??"(default)",project:e.project,mode:e.pool?"pods":"tcp",internal:!!e.internal,prependPrefix:e.prependPrefix}))}),{ports:q,routes:k,services:b,stop:n(async()=>{if(!a){a=!0,clearInterval(Z),clearInterval(te),p.emit("info","gateway down","cluster-gateway",{kind:"gateway-down",project:"gateway"}),K.stop(),W?.close(),(0,workspace_registry_1.unregisterWorkspace)(T);for(const e of b)C.killSpawned(e,"gateway shutdown");await R.reapAll(),await Promise.all(I.map(e=>new Promise(o=>e.close(()=>o())))),j.closeProxy(),j.destroyAgents()}},"stop")}}m(startGateway,"startGateway"),_(startGateway,"startGateway"),n(startGateway,"startGateway");
3
+ `),s.destroy()}),o.keepAliveTimeout=types_1.GATEWAY_KEEPALIVE_TIMEOUT_MS,o.headersTimeout<types_1.GATEWAY_KEEPALIVE_TIMEOUT_MS+5e3&&(o.headersTimeout=types_1.GATEWAY_KEEPALIVE_TIMEOUT_MS+5e3),P!=null){const i=o;i.on("session",s=>{s.on("error",d=>{const c=d.code??d.message;console.warn(`[gateway] h2 session error (${c}) \u2014 dropping this session only`),s.destroyed||s.destroy()})}),i.on("sessionError",s=>{console.warn(`[gateway] h2 sessionError: ${s.code??s.message}`)})}await new Promise(i=>{o.listen(e,()=>{const s=o.address()?.port??e;j.push(s),console.log(`[gateway] Listening on ${P?"https":"http"}://localhost:${s}`),i()})}),x.push(o)}$&&(I=n(()=>{const e=$();for(const o of x)o.setSecureContext?.({key:e,cert:e})},"refreshCert")),console.log("[gateway] Routes:");for(const e of k){const o=e.pool?`pods@${e.pool.dir}`:e.target;console.log(`[gateway] ${e.host??"(default)"} \u2192 ${o}${e.prependPrefix?` (+${e.prependPrefix})`:""}${e.internal?" [internal: no middleware]":""} [${e.project}]`)}return O&&console.log(`[gateway] CA: ${O} \u2014 one-time setup via the trust executor.`),p.emit("info",`gateway up: ${k.length} routes on ${j.join("/")}`,"cluster-gateway",{kind:"gateway-up",project:"gateway",ports:j,routes:k.map(e=>({host:e.host??"(default)",project:e.project,mode:e.pool?"pods":"tcp",internal:!!e.internal,prependPrefix:e.prependPrefix}))}),{ports:j,routes:k,services:T,stop:n(async()=>{if(!a){a=!0,clearInterval(X),clearInterval(Z),p.emit("info","gateway down","cluster-gateway",{kind:"gateway-down",project:"gateway"}),G.stop(),W?.close(),(0,workspace_registry_1.unregisterWorkspace)(v);for(const e of T)b.killSpawned(e,"gateway shutdown");await C.reapAll(),await Promise.all(x.map(e=>new Promise(o=>e.close(()=>o())))),R.closeProxy(),R.destroyAgents()}},"stop")}}_(startGateway,"startGateway"),n(startGateway,"startGateway");
@@ -1 +1 @@
1
- "use strict";var f=Object.defineProperty;var o=(e,r)=>f(e,"name",{value:r,configurable:!0});var d=Object.defineProperty,i=o((e,r)=>d(e,"name",{value:r,configurable:!0}),"i"),u=Object.defineProperty,c=i((e,r)=>u(e,"name",{value:r,configurable:!0}),"c");Object.defineProperty(exports,"__esModule",{value:!0}),exports.gatewayCacheDir=gatewayCacheDir,exports.loadServiceKeys=loadServiceKeys;const tslib_1=require("tslib"),node_crypto_1=require("node:crypto"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path"));function gatewayCacheDir(e){return path.join(e,"node_modules",".cache","davnx-webpack")}o(gatewayCacheDir,"gatewayCacheDir"),i(gatewayCacheDir,"gatewayCacheDir"),c(gatewayCacheDir,"gatewayCacheDir");function loadServiceKeys(e,r){const n=gatewayCacheDir(e),s=path.join(n,"service-keys.json");let t={};try{t=JSON.parse(fs.readFileSync(s,"utf8"))}catch{}let y=!1;for(const a of r)t[a.project]||(t[a.project]=(0,node_crypto_1.randomBytes)(16).toString("hex"),y=!0);if(y)try{fs.mkdirSync(n,{recursive:!0}),fs.writeFileSync(s,JSON.stringify(t,null,2))}catch{}const l=new Map(Object.entries(t).map(([a,p])=>[p,a]));return{serviceKeys:t,keyToProject:l}}o(loadServiceKeys,"loadServiceKeys"),i(loadServiceKeys,"loadServiceKeys"),c(loadServiceKeys,"loadServiceKeys");
1
+ "use strict";var d=Object.defineProperty;var i=(e,t)=>d(e,"name",{value:t,configurable:!0});var u=Object.defineProperty,c=i((e,t)=>u(e,"name",{value:t,configurable:!0}),"c");Object.defineProperty(exports,"__esModule",{value:!0}),exports.gatewayCacheDir=gatewayCacheDir,exports.loadServiceKeys=loadServiceKeys;const tslib_1=require("tslib"),node_crypto_1=require("node:crypto"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path"));function gatewayCacheDir(e){return path.join(e,"node_modules",".cache","davnx-webpack")}i(gatewayCacheDir,"gatewayCacheDir"),c(gatewayCacheDir,"gatewayCacheDir");function loadServiceKeys(e,t){const a=gatewayCacheDir(e),n=path.join(a,"service-keys.json");let r={};try{r=JSON.parse(fs.readFileSync(n,"utf8"))}catch{}let s=!1;for(const o of t)r[o.project]||(r[o.project]=(0,node_crypto_1.randomBytes)(16).toString("hex"),s=!0);if(s)try{fs.mkdirSync(a,{recursive:!0}),fs.writeFileSync(n,JSON.stringify(r,null,2))}catch{}const y=new Map(Object.entries(r).map(([o,p])=>[p,o]));return{serviceKeys:r,keyToProject:y}}i(loadServiceKeys,"loadServiceKeys"),c(loadServiceKeys,"loadServiceKeys");
@@ -1 +1 @@
1
- "use strict";var C=Object.defineProperty;var e=(E,_)=>C(E,"name",{value:_,configurable:!0});var O=Object.defineProperty,L=e((E,_)=>O(E,"name",{value:_,configurable:!0}),"L"),M=Object.defineProperty,R=L((E,_)=>M(E,"name",{value:_,configurable:!0}),"R");Object.defineProperty(exports,"__esModule",{value:!0}),exports.GATEWAY_KEEPALIVE_TIMEOUT_MS=exports.LENS_REQUEST_RECOVERY_WAIT_MS=exports.LENS_REPLACEMENT_DRAIN_MS=exports.LENS_REPLACEMENT_READY_MS=exports.LENS_RESTART_MODE=exports.LENS_RECYCLE_KILL_GRACE_MS=exports.LENS_PARKED_PORT_REPROBE_MS=exports.MAX_PORT_CONFLICT_RETRIES=exports.CHILD_START_FAIL_MS=exports.PORT_FREE_POLL_MS=exports.PORT_FREE_WAIT_MS=exports.LENS_PROBE_BOOT_GRACE_MS=exports.LENS_PROBE_COOLDOWN_MS=exports.LENS_PROBE_TIMEOUT_MS=exports.LENS_PROBE_FAILS=exports.LENS_PROBE_GRACE_MS=exports.LENS_WATCHER_PROBE_ENABLED=exports.LENS_PROBE_ENABLED=exports.POD_STALE_RECYCLE_COOLDOWN_MS=exports.POD_STALE_SCAN_MS=exports.POD_RECYCLE_SETTLE_MS=exports.POD_STALE_GRACE_MS=exports.POD_MAX_AGE_MS=exports.POD_RECYCLE_ENABLED=exports.WEDGE_RECYCLE_GRACE_MS=exports.POD_RESPONSE_TIMEOUT_MS=exports.UPSTREAM_HEAL_STEP_MS=exports.UPSTREAM_HEAL_WINDOW_MS=exports.SERVICE_RESTART_WINDOW_MS=exports.SERVICE_MAX_RESTARTS=exports.SERVICE_ERROR_THROTTLE_MS=void 0;function envInt(E,_,P=!1){const S=Number(process.env[E]);return!Number.isFinite(S)||S<0?_:S===0?P?0:_:S}e(envInt,"envInt"),L(envInt,"envInt"),R(envInt,"envInt"),exports.SERVICE_ERROR_THROTTLE_MS=5e3,exports.SERVICE_MAX_RESTARTS=5,exports.SERVICE_RESTART_WINDOW_MS=6e4,exports.UPSTREAM_HEAL_WINDOW_MS=8e3,exports.UPSTREAM_HEAL_STEP_MS=300,exports.POD_RESPONSE_TIMEOUT_MS=(()=>{const E=Number(process.env.LENSMCP_POD_RESPONSE_TIMEOUT_MS);return Number.isFinite(E)&&E>0?E:3e4})(),exports.WEDGE_RECYCLE_GRACE_MS=(()=>{const E=Number(process.env.LENSMCP_WEDGE_RECYCLE_GRACE_MS);return Number.isFinite(E)&&E>0?E:15e3})(),exports.POD_RECYCLE_ENABLED=process.env.LENSMCP_POD_RECYCLE!=="0",exports.POD_MAX_AGE_MS=envInt("LENSMCP_POD_MAX_AGE_MS",240*6e4,!0),exports.POD_STALE_GRACE_MS=envInt("LENSMCP_POD_STALE_GRACE_MS",1e4),exports.POD_RECYCLE_SETTLE_MS=envInt("LENSMCP_POD_RECYCLE_SETTLE_MS",8e3),exports.POD_STALE_SCAN_MS=envInt("LENSMCP_POD_STALE_SCAN_MS",3e4),exports.POD_STALE_RECYCLE_COOLDOWN_MS=envInt("LENSMCP_POD_STALE_RECYCLE_COOLDOWN_MS",6e4),exports.LENS_PROBE_ENABLED=process.env.LENSMCP_LENS_PROBE!=="0",exports.LENS_WATCHER_PROBE_ENABLED=process.env.LENSMCP_LENS_WATCHER_PROBE!=="0",exports.LENS_PROBE_GRACE_MS=envInt("LENSMCP_LENS_PROBE_GRACE_MS",45e3),exports.LENS_PROBE_FAILS=envInt("LENSMCP_LENS_PROBE_FAILS",2),exports.LENS_PROBE_TIMEOUT_MS=envInt("LENSMCP_LENS_PROBE_TIMEOUT_MS",1e3),exports.LENS_PROBE_COOLDOWN_MS=envInt("LENSMCP_LENS_PROBE_COOLDOWN_MS",3e4),exports.LENS_PROBE_BOOT_GRACE_MS=envInt("LENSMCP_LENS_PROBE_BOOT_GRACE_MS",24e4),exports.PORT_FREE_WAIT_MS=envInt("LENSMCP_PORT_FREE_WAIT_MS",1e4),exports.PORT_FREE_POLL_MS=envInt("LENSMCP_PORT_FREE_POLL_MS",250),exports.CHILD_START_FAIL_MS=envInt("LENSMCP_CHILD_START_FAIL_MS",1e4),exports.MAX_PORT_CONFLICT_RETRIES=envInt("LENSMCP_MAX_PORT_CONFLICT_RETRIES",5),exports.LENS_PARKED_PORT_REPROBE_MS=envInt("LENSMCP_PARKED_PORT_REPROBE_MS",3e5),exports.LENS_RECYCLE_KILL_GRACE_MS=envInt("LENSMCP_RECYCLE_KILL_GRACE_MS",5e3),exports.LENS_RESTART_MODE=process.env.LENSMCP_LENS_RESTART_MODE==="in-place"?"in-place":"rolling",exports.LENS_REPLACEMENT_READY_MS=envInt("LENSMCP_LENS_REPLACEMENT_READY_MS",3e4),exports.LENS_REPLACEMENT_DRAIN_MS=envInt("LENSMCP_LENS_REPLACEMENT_DRAIN_MS",2e3,!0),exports.LENS_REQUEST_RECOVERY_WAIT_MS=envInt("LENSMCP_LENS_REQUEST_RECOVERY_WAIT_MS",15e3),exports.GATEWAY_KEEPALIVE_TIMEOUT_MS=envInt("LENSMCP_KEEPALIVE_TIMEOUT_MS",76e3);
1
+ "use strict";var O=Object.defineProperty;var L=(E,_)=>O(E,"name",{value:_,configurable:!0});var M=Object.defineProperty,R=L((E,_)=>M(E,"name",{value:_,configurable:!0}),"R");Object.defineProperty(exports,"__esModule",{value:!0}),exports.GATEWAY_KEEPALIVE_TIMEOUT_MS=exports.LENS_REQUEST_RECOVERY_WAIT_MS=exports.LENS_REPLACEMENT_DRAIN_MS=exports.LENS_REPLACEMENT_READY_MS=exports.LENS_RESTART_MODE=exports.LENS_RECYCLE_KILL_GRACE_MS=exports.LENS_PARKED_PORT_REPROBE_MS=exports.MAX_PORT_CONFLICT_RETRIES=exports.CHILD_START_FAIL_MS=exports.PORT_FREE_POLL_MS=exports.PORT_FREE_WAIT_MS=exports.LENS_PROBE_BOOT_GRACE_MS=exports.LENS_PROBE_COOLDOWN_MS=exports.LENS_PROBE_TIMEOUT_MS=exports.LENS_PROBE_FAILS=exports.LENS_PROBE_GRACE_MS=exports.LENS_WATCHER_PROBE_ENABLED=exports.LENS_PROBE_ENABLED=exports.POD_STALE_RECYCLE_COOLDOWN_MS=exports.POD_STALE_SCAN_MS=exports.POD_RECYCLE_SETTLE_MS=exports.POD_STALE_GRACE_MS=exports.POD_MAX_AGE_MS=exports.POD_RECYCLE_ENABLED=exports.WEDGE_RECYCLE_GRACE_MS=exports.POD_RESPONSE_TIMEOUT_MS=exports.UPSTREAM_HEAL_STEP_MS=exports.UPSTREAM_HEAL_WINDOW_MS=exports.SERVICE_RESTART_WINDOW_MS=exports.SERVICE_MAX_RESTARTS=exports.SERVICE_ERROR_THROTTLE_MS=void 0;function envInt(E,_,e=!1){const S=Number(process.env[E]);return!Number.isFinite(S)||S<0?_:S===0?e?0:_:S}L(envInt,"envInt"),R(envInt,"envInt"),exports.SERVICE_ERROR_THROTTLE_MS=5e3,exports.SERVICE_MAX_RESTARTS=5,exports.SERVICE_RESTART_WINDOW_MS=6e4,exports.UPSTREAM_HEAL_WINDOW_MS=8e3,exports.UPSTREAM_HEAL_STEP_MS=300,exports.POD_RESPONSE_TIMEOUT_MS=(()=>{const E=Number(process.env.LENSMCP_POD_RESPONSE_TIMEOUT_MS);return Number.isFinite(E)&&E>0?E:3e4})(),exports.WEDGE_RECYCLE_GRACE_MS=(()=>{const E=Number(process.env.LENSMCP_WEDGE_RECYCLE_GRACE_MS);return Number.isFinite(E)&&E>0?E:15e3})(),exports.POD_RECYCLE_ENABLED=process.env.LENSMCP_POD_RECYCLE!=="0",exports.POD_MAX_AGE_MS=envInt("LENSMCP_POD_MAX_AGE_MS",240*6e4,!0),exports.POD_STALE_GRACE_MS=envInt("LENSMCP_POD_STALE_GRACE_MS",1e4),exports.POD_RECYCLE_SETTLE_MS=envInt("LENSMCP_POD_RECYCLE_SETTLE_MS",8e3),exports.POD_STALE_SCAN_MS=envInt("LENSMCP_POD_STALE_SCAN_MS",3e4),exports.POD_STALE_RECYCLE_COOLDOWN_MS=envInt("LENSMCP_POD_STALE_RECYCLE_COOLDOWN_MS",6e4),exports.LENS_PROBE_ENABLED=process.env.LENSMCP_LENS_PROBE!=="0",exports.LENS_WATCHER_PROBE_ENABLED=process.env.LENSMCP_LENS_WATCHER_PROBE!=="0",exports.LENS_PROBE_GRACE_MS=envInt("LENSMCP_LENS_PROBE_GRACE_MS",45e3),exports.LENS_PROBE_FAILS=envInt("LENSMCP_LENS_PROBE_FAILS",2),exports.LENS_PROBE_TIMEOUT_MS=envInt("LENSMCP_LENS_PROBE_TIMEOUT_MS",1e3),exports.LENS_PROBE_COOLDOWN_MS=envInt("LENSMCP_LENS_PROBE_COOLDOWN_MS",3e4),exports.LENS_PROBE_BOOT_GRACE_MS=envInt("LENSMCP_LENS_PROBE_BOOT_GRACE_MS",24e4),exports.PORT_FREE_WAIT_MS=envInt("LENSMCP_PORT_FREE_WAIT_MS",1e4),exports.PORT_FREE_POLL_MS=envInt("LENSMCP_PORT_FREE_POLL_MS",250),exports.CHILD_START_FAIL_MS=envInt("LENSMCP_CHILD_START_FAIL_MS",1e4),exports.MAX_PORT_CONFLICT_RETRIES=envInt("LENSMCP_MAX_PORT_CONFLICT_RETRIES",5),exports.LENS_PARKED_PORT_REPROBE_MS=envInt("LENSMCP_PARKED_PORT_REPROBE_MS",3e5),exports.LENS_RECYCLE_KILL_GRACE_MS=envInt("LENSMCP_RECYCLE_KILL_GRACE_MS",5e3),exports.LENS_RESTART_MODE=process.env.LENSMCP_LENS_RESTART_MODE==="in-place"?"in-place":"rolling",exports.LENS_REPLACEMENT_READY_MS=envInt("LENSMCP_LENS_REPLACEMENT_READY_MS",3e4),exports.LENS_REPLACEMENT_DRAIN_MS=envInt("LENSMCP_LENS_REPLACEMENT_DRAIN_MS",2e3,!0),exports.LENS_REQUEST_RECOVERY_WAIT_MS=envInt("LENSMCP_LENS_REQUEST_RECOVERY_WAIT_MS",15e3),exports.GATEWAY_KEEPALIVE_TIMEOUT_MS=envInt("LENSMCP_KEEPALIVE_TIMEOUT_MS",76e3);
@@ -1 +1 @@
1
- "use strict";var x=Object.defineProperty;var f=(n,s)=>x(n,"name",{value:s,configurable:!0});var m=Object.defineProperty,u=f((n,s)=>m(n,"name",{value:s,configurable:!0}),"u"),g=Object.defineProperty,d=u((n,s)=>g(n,"name",{value:s,configurable:!0}),"d");Object.defineProperty(exports,"__esModule",{value:!0}),exports.createUpgrade=createUpgrade;const manifest_1=require("../manifest"),discovery_1=require("./discovery"),edge_1=require("./edge"),hmr_reload_1=require("./hmr-reload");function createUpgrade(n){const{rt:s,auth:h,proxy:y,hooks:i}=n,v=d(r=>(0,manifest_1.matchRoute)(s.routes,(r.headers.host||"").split(":")[0],r.url??"/"),"match"),k=d(async(r,o,l)=>{for(const t of edge_1.GATEWAY_OWNED_HEADERS)delete r.headers[t];const e=v(r);if(!e){o.destroy();return}const a=i.upgradeContext(r,o,void 0);if(a.route=e,e.internal){const t=h.internal(r,e,void 0);if(!t.ok){o.destroy();return}a.caller=t.caller}else{const t=h.public(r,e,void 0);if(!t.ok){o.destroy();return}if(a.claims=t.claims,i.has("afterAuth")&&(await i.run("afterAuth",a),a.responded()))return}if(e.pool&&s.serviceKeys[e.project]&&(r.headers["x-internal-token"]=s.serviceKeys[e.project]),e.prependPrefix&&!r.url?.startsWith(e.prependPrefix)&&(r.url=e.prependPrefix+(r.url??"/")),i.has("onUpgrade")&&(await i.run("onUpgrade",a),a.responded()))return;const p=e.pool?(()=>{const t=(0,discovery_1.pickSock)(e.pool,s.scanTtlMs);return t?{socketPath:t}:void 0})():e.target;if(!p){o.destroy();return}if(e.lens){const t=String(r.headers["sec-websocket-protocol"]??"").split(",").map(c=>c.trim());if(t.length===0||t.includes("vite-hmr")||t.every(c=>c==="")){const c=e.lens.workspaceKey?`${e.lens.workspaceKey}:${e.lens.project}`:e.lens.project;(0,hmr_reload_1.registerHmrClient)(s,c,o)}}y.proxy.ws(r,o,l,{target:p,changeOrigin:!e.pool,agent:y.agentForTarget(p)},()=>o.destroy())},"run");return(r,o,l)=>{o.on("error",()=>o.destroy()),k(r,o,l).catch(()=>o.destroy())}}f(createUpgrade,"createUpgrade"),u(createUpgrade,"createUpgrade"),d(createUpgrade,"createUpgrade");
1
+ "use strict";var m=Object.defineProperty;var u=(i,s)=>m(i,"name",{value:s,configurable:!0});var g=Object.defineProperty,d=u((i,s)=>g(i,"name",{value:s,configurable:!0}),"d");Object.defineProperty(exports,"__esModule",{value:!0}),exports.createUpgrade=createUpgrade;const manifest_1=require("../manifest"),discovery_1=require("./discovery"),edge_1=require("./edge"),hmr_reload_1=require("./hmr-reload");function createUpgrade(i){const{rt:s,auth:f,proxy:h,hooks:n}=i,y=d(r=>(0,manifest_1.matchRoute)(s.routes,(r.headers.host||"").split(":")[0],r.url??"/"),"match"),v=d(async(r,o,l)=>{for(const t of edge_1.GATEWAY_OWNED_HEADERS)delete r.headers[t];const e=y(r);if(!e){o.destroy();return}const a=n.upgradeContext(r,o,void 0);if(a.route=e,e.internal){const t=f.internal(r,e,void 0);if(!t.ok){o.destroy();return}a.caller=t.caller}else{const t=f.public(r,e,void 0);if(!t.ok){o.destroy();return}if(a.claims=t.claims,n.has("afterAuth")&&(await n.run("afterAuth",a),a.responded()))return}if(e.pool&&s.serviceKeys[e.project]&&(r.headers["x-internal-token"]=s.serviceKeys[e.project]),e.prependPrefix&&!r.url?.startsWith(e.prependPrefix)&&(r.url=e.prependPrefix+(r.url??"/")),n.has("onUpgrade")&&(await n.run("onUpgrade",a),a.responded()))return;const p=e.pool?(()=>{const t=(0,discovery_1.pickSock)(e.pool,s.scanTtlMs);return t?{socketPath:t}:void 0})():e.target;if(!p){o.destroy();return}if(e.lens){const t=String(r.headers["sec-websocket-protocol"]??"").split(",").map(c=>c.trim());if(t.length===0||t.includes("vite-hmr")||t.every(c=>c==="")){const c=e.lens.workspaceKey?`${e.lens.workspaceKey}:${e.lens.project}`:e.lens.project;(0,hmr_reload_1.registerHmrClient)(s,c,o)}}h.proxy.ws(r,o,l,{target:p,changeOrigin:!e.pool,agent:h.agentForTarget(p)},()=>o.destroy())},"run");return(r,o,l)=>{o.on("error",()=>o.destroy()),v(r,o,l).catch(()=>o.destroy())}}u(createUpgrade,"createUpgrade"),d(createUpgrade,"createUpgrade");
@@ -1 +1 @@
1
- "use strict";var u=Object.defineProperty;var o=(r,e)=>u(r,"name",{value:e,configurable:!0});var p=Object.defineProperty,i=o((r,e)=>p(r,"name",{value:e,configurable:!0}),"i"),c=Object.defineProperty,s=i((r,e)=>c(r,"name",{value:e,configurable:!0}),"s");Object.defineProperty(exports,"__esModule",{value:!0}),exports.processStamp=processStamp,exports.registryPath=registryPath,exports.readWorkspaces=readWorkspaces,exports.registerWorkspace=registerWorkspace,exports.unregisterWorkspace=unregisterWorkspace,exports.isWorkspaceLive=isWorkspaceLive;const tslib_1=require("tslib"),node_child_process_1=require("node:child_process"),fs=tslib_1.__importStar(require("node:fs")),os=tslib_1.__importStar(require("node:os")),path=tslib_1.__importStar(require("node:path"));function processStamp(r){if(!r||r<=0||process.platform==="win32")return"";try{return(0,node_child_process_1.execFileSync)("ps",["-p",String(r),"-o","lstart="],{encoding:"utf8",timeout:2e3,stdio:["ignore","pipe","ignore"]}).trim()}catch{return""}}o(processStamp,"processStamp"),i(processStamp,"processStamp"),s(processStamp,"processStamp");function registryPath(){const r=process.env.LENSMCP_HOME||os.homedir();return path.join(r,".lensmcp","workspaces.json")}o(registryPath,"registryPath"),i(registryPath,"registryPath"),s(registryPath,"registryPath");function readWorkspaces(r=registryPath()){try{const e=JSON.parse(fs.readFileSync(r,"utf8"));return Array.isArray(e)?e.filter(t=>!!t&&typeof t.key=="string"&&typeof t.base=="string"):[]}catch{return[]}}o(readWorkspaces,"readWorkspaces"),i(readWorkspaces,"readWorkspaces"),s(readWorkspaces,"readWorkspaces");function writeWorkspaces(r,e=registryPath()){try{fs.mkdirSync(path.dirname(e),{recursive:!0}),fs.writeFileSync(e,JSON.stringify(r,null,2))}catch{}}o(writeWorkspaces,"writeWorkspaces"),i(writeWorkspaces,"writeWorkspaces"),s(writeWorkspaces,"writeWorkspaces");function registerWorkspace(r,e=registryPath()){const t=readWorkspaces(e).filter(n=>n.key!==r.key);t.push(r),t.sort((n,a)=>n.key.localeCompare(a.key)),writeWorkspaces(t,e)}o(registerWorkspace,"registerWorkspace"),i(registerWorkspace,"registerWorkspace"),s(registerWorkspace,"registerWorkspace");function unregisterWorkspace(r,e=registryPath()){writeWorkspaces(readWorkspaces(e).filter(t=>t.key!==r),e)}o(unregisterWorkspace,"unregisterWorkspace"),i(unregisterWorkspace,"unregisterWorkspace"),s(unregisterWorkspace,"unregisterWorkspace");function isWorkspaceLive(r){if(!r.pid||r.pid<=0)return!1;try{process.kill(r.pid,0)}catch(t){if(t.code!=="EPERM")return!1}if(!r.procStamp)return!0;const e=processStamp(r.pid);return e===""?!0:e===r.procStamp}o(isWorkspaceLive,"isWorkspaceLive"),i(isWorkspaceLive,"isWorkspaceLive"),s(isWorkspaceLive,"isWorkspaceLive");
1
+ "use strict";var p=Object.defineProperty;var i=(e,r)=>p(e,"name",{value:r,configurable:!0});var c=Object.defineProperty,s=i((e,r)=>c(e,"name",{value:r,configurable:!0}),"s");Object.defineProperty(exports,"__esModule",{value:!0}),exports.processStamp=processStamp,exports.registryPath=registryPath,exports.readWorkspaces=readWorkspaces,exports.registerWorkspace=registerWorkspace,exports.unregisterWorkspace=unregisterWorkspace,exports.isWorkspaceLive=isWorkspaceLive;const tslib_1=require("tslib"),node_child_process_1=require("node:child_process"),fs=tslib_1.__importStar(require("node:fs")),os=tslib_1.__importStar(require("node:os")),path=tslib_1.__importStar(require("node:path"));function processStamp(e){if(!e||e<=0||process.platform==="win32")return"";try{return(0,node_child_process_1.execFileSync)("ps",["-p",String(e),"-o","lstart="],{encoding:"utf8",timeout:2e3,stdio:["ignore","pipe","ignore"]}).trim()}catch{return""}}i(processStamp,"processStamp"),s(processStamp,"processStamp");function registryPath(){const e=process.env.LENSMCP_HOME||os.homedir();return path.join(e,".lensmcp","workspaces.json")}i(registryPath,"registryPath"),s(registryPath,"registryPath");function readWorkspaces(e=registryPath()){try{const r=JSON.parse(fs.readFileSync(e,"utf8"));return Array.isArray(r)?r.filter(t=>!!t&&typeof t.key=="string"&&typeof t.base=="string"):[]}catch{return[]}}i(readWorkspaces,"readWorkspaces"),s(readWorkspaces,"readWorkspaces");function writeWorkspaces(e,r=registryPath()){try{fs.mkdirSync(path.dirname(r),{recursive:!0}),fs.writeFileSync(r,JSON.stringify(e,null,2))}catch{}}i(writeWorkspaces,"writeWorkspaces"),s(writeWorkspaces,"writeWorkspaces");function registerWorkspace(e,r=registryPath()){const t=readWorkspaces(r).filter(o=>o.key!==e.key);t.push(e),t.sort((o,n)=>o.key.localeCompare(n.key)),writeWorkspaces(t,r)}i(registerWorkspace,"registerWorkspace"),s(registerWorkspace,"registerWorkspace");function unregisterWorkspace(e,r=registryPath()){writeWorkspaces(readWorkspaces(r).filter(t=>t.key!==e),r)}i(unregisterWorkspace,"unregisterWorkspace"),s(unregisterWorkspace,"unregisterWorkspace");function isWorkspaceLive(e){if(!e.pid||e.pid<=0)return!1;try{process.kill(e.pid,0)}catch(t){if(t.code!=="EPERM")return!1}if(!e.procStamp)return!0;const r=processStamp(e.pid);return r===""?!0:r===e.procStamp}i(isWorkspaceLive,"isWorkspaceLive"),s(isWorkspaceLive,"isWorkspaceLive");
@@ -1 +1 @@
1
- "use strict";var b=Object.defineProperty;var c=(e,t)=>b(e,"name",{value:t,configurable:!0});var h=Object.defineProperty,l=c((e,t)=>h(e,"name",{value:t,configurable:!0}),"l"),u=Object.defineProperty,i=l((e,t)=>u(e,"name",{value:t,configurable:!0}),"i");Object.defineProperty(exports,"__esModule",{value:!0}),exports.SsrfBlockedError=void 0,exports.isBlockedAddress=isBlockedAddress,exports.assertFetchableUrl=assertFetchableUrl,exports.safeFetch=safeFetch,exports.pinnedLookup=pinnedLookup;const node_net_1=require("node:net"),promises_1=require("node:dns/promises");class SsrfBlockedError extends Error{static{c(this,"SsrfBlockedError")}static{l(this,"SsrfBlockedError")}static{i(this,"SsrfBlockedError")}constructor(t,o,r,s){super(`SSRF guard blocked ${o??"request"}: ${t}${r?` (${r})`:""}`,s!==void 0?{cause:s}:void 0),this.name="SsrfBlockedError",this.reason=t,this.url=o,this.address=r}}exports.SsrfBlockedError=SsrfBlockedError;function buildDefaultBlockList(){const e=new node_net_1.BlockList;return e.addSubnet("0.0.0.0",8,"ipv4"),e.addSubnet("10.0.0.0",8,"ipv4"),e.addSubnet("100.64.0.0",10,"ipv4"),e.addSubnet("127.0.0.0",8,"ipv4"),e.addSubnet("169.254.0.0",16,"ipv4"),e.addSubnet("172.16.0.0",12,"ipv4"),e.addSubnet("192.0.0.0",24,"ipv4"),e.addSubnet("192.168.0.0",16,"ipv4"),e.addSubnet("198.18.0.0",15,"ipv4"),e.addSubnet("240.0.0.0",4,"ipv4"),e.addAddress("::","ipv6"),e.addAddress("::1","ipv6"),e.addSubnet("fc00::",7,"ipv6"),e.addSubnet("fe80::",10,"ipv6"),e}c(buildDefaultBlockList,"buildDefaultBlockList"),l(buildDefaultBlockList,"buildDefaultBlockList"),i(buildDefaultBlockList,"buildDefaultBlockList");const DEFAULT_BLOCK_LIST=buildDefaultBlockList();function isBlockedAddress(e,t=DEFAULT_BLOCK_LIST){const o=(0,node_net_1.isIP)(e);return o===0?!0:t.check(e,o===6?"ipv6":"ipv4")}c(isBlockedAddress,"isBlockedAddress"),l(isBlockedAddress,"isBlockedAddress"),i(isBlockedAddress,"isBlockedAddress");const stripBrackets=i(e=>e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e,"stripBrackets"),defaultResolve=i(async e=>(await(0,promises_1.lookup)(e,{all:!0,verbatim:!0})).map(t=>t.address),"defaultResolve");async function assertFetchableUrl(e,t={}){const o=t.allowedProtocols??["http:","https:"];let r;try{r=new URL(e)}catch{throw new SsrfBlockedError("malformed-url",String(e))}if(!o.includes(r.protocol))throw new SsrfBlockedError(`scheme-not-allowed:${r.protocol}`,r.href);if(r.username!==""||r.password!=="")throw new SsrfBlockedError("embedded-credentials",r.href);const s=stripBrackets(r.hostname);if(s==="")throw new SsrfBlockedError("missing-host",r.href);if(t.allowPrivate)return{url:r,hostname:s,addresses:(0,node_net_1.isIP)(s)?[s]:[]};const d=t.blockList??DEFAULT_BLOCK_LIST;if((0,node_net_1.isIP)(s)!==0){if(isBlockedAddress(s,d))throw new SsrfBlockedError("blocked-address",r.href,s);return{url:r,hostname:s,addresses:[s]}}const f=t.resolve??defaultResolve;let a;try{a=await f(s)}catch(n){throw new SsrfBlockedError("dns-resolution-failed",r.href,void 0,n)}if(a.length===0)throw new SsrfBlockedError("dns-no-records",r.href);for(const n of a)if(isBlockedAddress(n,d))throw new SsrfBlockedError("blocked-resolved-address",r.href,n);return{url:r,hostname:s,addresses:a}}c(assertFetchableUrl,"assertFetchableUrl"),l(assertFetchableUrl,"assertFetchableUrl"),i(assertFetchableUrl,"assertFetchableUrl");async function safeFetch(e,t={},o={}){const r=o.fetchImpl??globalThis.fetch,s=o.maxRedirects??5;let d=e;for(let f=0;;f++){const{url:a}=await assertFetchableUrl(d,o),n=await r(a,{...t,redirect:"manual"}),p=n.headers.get("location");if(n.status>=300&&n.status<400&&p){if(f>=s)throw new SsrfBlockedError("too-many-redirects",a.href);d=new URL(p,a).href;continue}return n}}c(safeFetch,"safeFetch"),l(safeFetch,"safeFetch"),i(safeFetch,"safeFetch");function pinnedLookup(e){const t=e.map(o=>({address:o,family:(0,node_net_1.isIP)(o)===6?6:4}));return(o,r,s)=>{const d=typeof r=="function"?r:s,f=typeof r=="object"&&r!==null&&r.all===!0;if(t.length===0){d(new Error(`SSRF guard: no pinned address for ${o}`));return}f?d(null,t):d(null,t[0].address,t[0].family)}}c(pinnedLookup,"pinnedLookup"),l(pinnedLookup,"pinnedLookup"),i(pinnedLookup,"pinnedLookup");
1
+ "use strict";var h=Object.defineProperty;var l=(e,t)=>h(e,"name",{value:t,configurable:!0});var u=Object.defineProperty,i=l((e,t)=>u(e,"name",{value:t,configurable:!0}),"i");Object.defineProperty(exports,"__esModule",{value:!0}),exports.SsrfBlockedError=void 0,exports.isBlockedAddress=isBlockedAddress,exports.assertFetchableUrl=assertFetchableUrl,exports.safeFetch=safeFetch,exports.pinnedLookup=pinnedLookup;const node_net_1=require("node:net"),promises_1=require("node:dns/promises");class SsrfBlockedError extends Error{static{l(this,"SsrfBlockedError")}static{i(this,"SsrfBlockedError")}constructor(t,o,s,r){super(`SSRF guard blocked ${o??"request"}: ${t}${s?` (${s})`:""}`,r!==void 0?{cause:r}:void 0),this.name="SsrfBlockedError",this.reason=t,this.url=o,this.address=s}}exports.SsrfBlockedError=SsrfBlockedError;function buildDefaultBlockList(){const e=new node_net_1.BlockList;return e.addSubnet("0.0.0.0",8,"ipv4"),e.addSubnet("10.0.0.0",8,"ipv4"),e.addSubnet("100.64.0.0",10,"ipv4"),e.addSubnet("127.0.0.0",8,"ipv4"),e.addSubnet("169.254.0.0",16,"ipv4"),e.addSubnet("172.16.0.0",12,"ipv4"),e.addSubnet("192.0.0.0",24,"ipv4"),e.addSubnet("192.168.0.0",16,"ipv4"),e.addSubnet("198.18.0.0",15,"ipv4"),e.addSubnet("240.0.0.0",4,"ipv4"),e.addAddress("::","ipv6"),e.addAddress("::1","ipv6"),e.addSubnet("fc00::",7,"ipv6"),e.addSubnet("fe80::",10,"ipv6"),e}l(buildDefaultBlockList,"buildDefaultBlockList"),i(buildDefaultBlockList,"buildDefaultBlockList");const DEFAULT_BLOCK_LIST=buildDefaultBlockList();function isBlockedAddress(e,t=DEFAULT_BLOCK_LIST){const o=(0,node_net_1.isIP)(e);return o===0?!0:t.check(e,o===6?"ipv6":"ipv4")}l(isBlockedAddress,"isBlockedAddress"),i(isBlockedAddress,"isBlockedAddress");const stripBrackets=i(e=>e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e,"stripBrackets"),defaultResolve=i(async e=>(await(0,promises_1.lookup)(e,{all:!0,verbatim:!0})).map(t=>t.address),"defaultResolve");async function assertFetchableUrl(e,t={}){const o=t.allowedProtocols??["http:","https:"];let s;try{s=new URL(e)}catch{throw new SsrfBlockedError("malformed-url",String(e))}if(!o.includes(s.protocol))throw new SsrfBlockedError(`scheme-not-allowed:${s.protocol}`,s.href);if(s.username!==""||s.password!=="")throw new SsrfBlockedError("embedded-credentials",s.href);const r=stripBrackets(s.hostname);if(r==="")throw new SsrfBlockedError("missing-host",s.href);if(t.allowPrivate)return{url:s,hostname:r,addresses:(0,node_net_1.isIP)(r)?[r]:[]};const d=t.blockList??DEFAULT_BLOCK_LIST;if((0,node_net_1.isIP)(r)!==0){if(isBlockedAddress(r,d))throw new SsrfBlockedError("blocked-address",s.href,r);return{url:s,hostname:r,addresses:[r]}}const c=t.resolve??defaultResolve;let a;try{a=await c(r)}catch(n){throw new SsrfBlockedError("dns-resolution-failed",s.href,void 0,n)}if(a.length===0)throw new SsrfBlockedError("dns-no-records",s.href);for(const n of a)if(isBlockedAddress(n,d))throw new SsrfBlockedError("blocked-resolved-address",s.href,n);return{url:s,hostname:r,addresses:a}}l(assertFetchableUrl,"assertFetchableUrl"),i(assertFetchableUrl,"assertFetchableUrl");async function safeFetch(e,t={},o={}){const s=o.fetchImpl??globalThis.fetch,r=o.maxRedirects??5;let d=e;for(let c=0;;c++){const{url:a}=await assertFetchableUrl(d,o),n=await s(a,{...t,redirect:"manual"}),f=n.headers.get("location");if(n.status>=300&&n.status<400&&f){if(c>=r)throw new SsrfBlockedError("too-many-redirects",a.href);d=new URL(f,a).href;continue}return n}}l(safeFetch,"safeFetch"),i(safeFetch,"safeFetch");function pinnedLookup(e){const t=e.map(o=>({address:o,family:(0,node_net_1.isIP)(o)===6?6:4}));return(o,s,r)=>{const d=typeof s=="function"?s:r,c=typeof s=="object"&&s!==null&&s.all===!0;if(t.length===0){d(new Error(`SSRF guard: no pinned address for ${o}`));return}c?d(null,t):d(null,t[0].address,t[0].family)}}l(pinnedLookup,"pinnedLookup"),i(pinnedLookup,"pinnedLookup");
@@ -1 +1 @@
1
- "use strict";var X=Object.defineProperty;var l=(e,t)=>X(e,"name",{value:t,configurable:!0});var Y=Object.defineProperty,a=l((e,t)=>Y(e,"name",{value:t,configurable:!0}),"a"),J=Object.defineProperty,c=a((e,t)=>J(e,"name",{value:t,configurable:!0}),"c");Object.defineProperty(exports,"__esModule",{value:!0});const tslib_1=require("tslib"),path=tslib_1.__importStar(require("node:path")),fs=tslib_1.__importStar(require("node:fs")),node_child_process_1=require("node:child_process"),yaml=tslib_1.__importStar(require("js-yaml")),create_webpack_dev_1=require("../../create-webpack-dev"),webpack=require("webpack");async function*serveExecutor(e,t){process.env.NODE_ENV="development";const L=t.projectsConfigurations.projects[t.projectName],n=t.root,g=path.join(n,L.root),k=e.outputPath?path.join(n,e.outputPath):path.join(n,"dist",L.root),O=e.configEnv||"development",_=path.join(n,"config",`config.${O}.yaml`),y=3050;let i=y,p=t.projectName,h={};fs.existsSync(_)?(h=yaml.load(fs.readFileSync(_,"utf8")),i=Number(h.port)||i,p=h.serviceName||p):console.warn(`[serve] ${t.projectName}: no config file at ${_} \u2014 public devserver port defaults to ${y}. If another service also lacks its config, both bind ${y} \u2192 EADDRINUSE. Add config/config.${O}.yaml with a distinct \`port:\` (matching this project's cluster.port).`),e.serviceName&&(p=e.serviceName);const b=e.servePrefix??"",m=e.debugPort??(Number(process.env.LENSMCP_DEBUG_PORT)||void 0),u=e.logFile?path.resolve(n,e.logFile):process.env.LENSMCP_LOG_FILE||void 0;u&&(fs.mkdirSync(path.dirname(u),{recursive:!0}),fs.writeFileSync(u,""));let N,P;e.gateway?.middleware&&(N=path.resolve(g,e.gateway.middleware),P=JSON.stringify(h));const $=e.entryFile||"./src/deployments/service/main.ts",F=e.tsConfigFile||"./tsconfig.app.json",G=path.resolve(g,$),M=path.resolve(g,F),W=(e.workers||[]).map(r=>({entryName:r.name,entryPath:path.resolve(g,r.entryPath)})),R=(0,create_webpack_dev_1.createDevWebpackConfig)({appName:t.projectName,appRoot:g,outputDir:k,main:G,tsConfig:M,assets:e.assets||[],additionalEntryPoints:W,port:i,serviceName:p,memoryLimit:e.memoryLimit||8192,buildLibsFromSource:e.buildLibsFromSource!==!1,workspaceRoot:n,orgScopes:e.orgScopes||[],bundlePackages:e.bundlePackages||[],nodeExternalsConfig:e.nodeExternalsConfig,webpackConfigPath:e.webpackConfigPath,httpsReload:e.gateway?.https===!0});let s=null,w=!1;const x=path.join(__dirname,"../../main.devserver.js"),D=path.join(__dirname,"../../main.devserver.ts"),I=!fs.existsSync(x)&&fs.existsSync(D),T=I?D:x,U=path.join(k,"main.js");function d(){s&&!s.killed&&(s.kill("SIGTERM"),s=null)}l(d,"v"),a(d,"f"),c(d,"cleanup");const q=["SIGINT","SIGTERM","SIGHUP","SIGQUIT"].map(r=>{const o=c(()=>d(),"handler");return process.on(r,o),{sig:r,handler:o}});process.on("exit",d);function v(){if(!fs.existsSync(T)){console.error(`[serve] devserver script not found at ${T}`);return}const r=["--enable-source-maps"];I&&r.unshift("--require","@swc-node/register"),s=(0,node_child_process_1.fork)(T,{cwd:n,env:{...process.env,PORT:String(i),SERVICE_NAME:p,SERVE_PREFIX:b,LENSMCP_PROJECT:process.env.LENSMCP_PROJECT||t.projectName||p,LENSMCP_EVENT_FILE:process.env.LENSMCP_EVENT_FILE||path.join(n,".lensmcp","events.jsonl"),CHILD_COUNT:String(e.childCount||process.env.CHILD_COUNT||1),BUNDLE_PATH:U,...N&&{GATEWAY_MIDDLEWARE:N},...P&&{GATEWAY_CONFIG:P},...e.gateway?.routes?.length&&{GATEWAY_ROUTES:JSON.stringify(e.gateway.routes)},...e.gateway?.https&&{GATEWAY_HTTPS:"1"},...e.gateway?.extraPorts?.length&&{GATEWAY_EXTRA_PORTS:JSON.stringify(e.gateway.extraPorts)},...e.internalPort&&{INTERNAL_PORT:String(e.internalPort)},...m&&{LENSMCP_DEBUG_PORT:String(m)},...u&&{LENSMCP_LOG_FILE:u},...e.workers?.length&&{WORKERS:JSON.stringify(e.workers.map(o=>o.name))}},stdio:["inherit","inherit","inherit","ipc"],execArgv:r}),s.on("exit",(o,S)=>{s=null,!S&&(console.error(`[serve] devserver exited unexpectedly (code=${o}, signal=${S}) \u2014 respawning in 1.5s`),setTimeout(()=>{!s&&w&&v()},1500).unref?.())}),console.log(`[serve] Devserver started on port ${i} (service: ${p}${b?`, prefix: /${b}`:""})`),console.log(m?`[serve] Debug: pod inspectors on 127.0.0.1:${m}+ \u2014 click the "Debugger listening" link in the console, or attach WebStorm (Attach to Node.js/Chrome) to port ${m}`:`[serve] Debug on demand: POST http://localhost:${i}/webpack/debug (optionally ?port=<base>) opens pod inspectors without a restart`),u&&console.log(`[serve] Logs teed to ${u} \u2014 tail it in WebStorm via Run/Debug configuration \u2192 Logs tab`)}l(v,"g"),a(v,"v"),c(v,"startDevServer");function A(){if(!s||s.killed){console.log("[serve] Devserver not running, restarting..."),v();return}fetch(`http://localhost:${i}/webpack/reload`,{method:"POST",headers:{"content-type":"application/json"},body:"{}"}).then(()=>console.log("[serve] Notified devserver to reload")).catch(r=>{console.warn("[serve] Failed to notify devserver, restarting...",r.message),d(),v()})}l(A,"U"),a(A,"B"),c(A,"_notifyDevServerReload");const{watch:K,...H}=R,V=webpack(H);let E=null;const j=[];function f(r){if(E){const o=E;E=null,o(r)}else j.push(r)}l(f,"h"),a(f,"b"),c(f,"pushResult");function C(){return j.length>0?Promise.resolve(j.shift()):new Promise(r=>{E=r})}l(C,"D"),a(C,"W"),c(C,"waitForNext");const B=V.watch(R.watchOptions||{},(r,o)=>{if(r){console.error("[serve] Webpack error:",r),f({success:!1});return}const S=o.hasErrors();if(console.info(o.toString({colors:!0,chunks:!1,assets:!0})),S){f({success:!1});return}(!w||!s)&&(w=!0,v()),f({success:!0,baseUrl:`http://localhost:${i}`})});try{for(;;)yield await C()}finally{B.close(()=>{}),d(),q.forEach(({sig:r,handler:o})=>process.removeListener(r,o))}}l(serveExecutor,"serveExecutor"),a(serveExecutor,"serveExecutor"),c(serveExecutor,"serveExecutor"),exports.default=serveExecutor,module.exports=serveExecutor,module.exports.default=serveExecutor;
1
+ "use strict";var Y=Object.defineProperty;var a=(e,o)=>Y(e,"name",{value:o,configurable:!0});var J=Object.defineProperty,c=a((e,o)=>J(e,"name",{value:o,configurable:!0}),"c");Object.defineProperty(exports,"__esModule",{value:!0});const tslib_1=require("tslib"),path=tslib_1.__importStar(require("node:path")),fs=tslib_1.__importStar(require("node:fs")),node_child_process_1=require("node:child_process"),yaml=tslib_1.__importStar(require("js-yaml")),create_webpack_dev_1=require("../../create-webpack-dev"),webpack=require("webpack");async function*serveExecutor(e,o){process.env.NODE_ENV="development";const C=o.projectsConfigurations.projects[o.projectName],n=o.root,u=path.join(n,C.root),L=e.outputPath?path.join(n,e.outputPath):path.join(n,"dist",C.root),j=e.configEnv||"development",S=path.join(n,"config",`config.${j}.yaml`),_=3050;let i=_,l=o.projectName,m={};fs.existsSync(S)?(m=yaml.load(fs.readFileSync(S,"utf8")),i=Number(m.port)||i,l=m.serviceName||l):console.warn(`[serve] ${o.projectName}: no config file at ${S} \u2014 public devserver port defaults to ${_}. If another service also lacks its config, both bind ${_} \u2192 EADDRINUSE. Add config/config.${j}.yaml with a distinct \`port:\` (matching this project's cluster.port).`),e.serviceName&&(l=e.serviceName);const y=e.servePrefix??"",d=e.debugPort??(Number(process.env.LENSMCP_DEBUG_PORT)||void 0),p=e.logFile?path.resolve(n,e.logFile):process.env.LENSMCP_LOG_FILE||void 0;p&&(fs.mkdirSync(path.dirname(p),{recursive:!0}),fs.writeFileSync(p,""));let N,P;e.gateway?.middleware&&(N=path.resolve(u,e.gateway.middleware),P=JSON.stringify(m));const I=e.entryFile||"./src/deployments/service/main.ts",A=e.tsConfigFile||"./tsconfig.app.json",$=path.resolve(u,I),F=path.resolve(u,A),G=(e.workers||[]).map(t=>({entryName:t.name,entryPath:path.resolve(u,t.entryPath)})),k=(0,create_webpack_dev_1.createDevWebpackConfig)({appName:o.projectName,appRoot:u,outputDir:L,main:$,tsConfig:F,assets:e.assets||[],additionalEntryPoints:G,port:i,serviceName:l,memoryLimit:e.memoryLimit||8192,buildLibsFromSource:e.buildLibsFromSource!==!1,workspaceRoot:n,orgScopes:e.orgScopes||[],bundlePackages:e.bundlePackages||[],nodeExternalsConfig:e.nodeExternalsConfig,webpackConfigPath:e.webpackConfigPath,httpsReload:e.gateway?.https===!0});let s=null,b=!1;const R=path.join(__dirname,"../../main.devserver.js"),O=path.join(__dirname,"../../main.devserver.ts"),x=!fs.existsSync(R)&&fs.existsSync(O),w=x?O:R,M=path.join(L,"main.js");function v(){s&&!s.killed&&(s.kill("SIGTERM"),s=null)}a(v,"f"),c(v,"cleanup");const W=["SIGINT","SIGTERM","SIGHUP","SIGQUIT"].map(t=>{const r=c(()=>v(),"handler");return process.on(t,r),{sig:t,handler:r}});process.on("exit",v);function g(){if(!fs.existsSync(w)){console.error(`[serve] devserver script not found at ${w}`);return}const t=["--enable-source-maps"];x&&t.unshift("--require","@swc-node/register"),s=(0,node_child_process_1.fork)(w,{cwd:n,env:{...process.env,PORT:String(i),SERVICE_NAME:l,SERVE_PREFIX:y,LENSMCP_PROJECT:process.env.LENSMCP_PROJECT||o.projectName||l,LENSMCP_EVENT_FILE:process.env.LENSMCP_EVENT_FILE||path.join(n,".lensmcp","events.jsonl"),CHILD_COUNT:String(e.childCount||process.env.CHILD_COUNT||1),BUNDLE_PATH:M,...N&&{GATEWAY_MIDDLEWARE:N},...P&&{GATEWAY_CONFIG:P},...e.gateway?.routes?.length&&{GATEWAY_ROUTES:JSON.stringify(e.gateway.routes)},...e.gateway?.https&&{GATEWAY_HTTPS:"1"},...e.gateway?.extraPorts?.length&&{GATEWAY_EXTRA_PORTS:JSON.stringify(e.gateway.extraPorts)},...e.internalPort&&{INTERNAL_PORT:String(e.internalPort)},...d&&{LENSMCP_DEBUG_PORT:String(d)},...p&&{LENSMCP_LOG_FILE:p},...e.workers?.length&&{WORKERS:JSON.stringify(e.workers.map(r=>r.name))}},stdio:["inherit","inherit","inherit","ipc"],execArgv:t}),s.on("exit",(r,E)=>{s=null,!E&&(console.error(`[serve] devserver exited unexpectedly (code=${r}, signal=${E}) \u2014 respawning in 1.5s`),setTimeout(()=>{!s&&b&&g()},1500).unref?.())}),console.log(`[serve] Devserver started on port ${i} (service: ${l}${y?`, prefix: /${y}`:""})`),console.log(d?`[serve] Debug: pod inspectors on 127.0.0.1:${d}+ \u2014 click the "Debugger listening" link in the console, or attach WebStorm (Attach to Node.js/Chrome) to port ${d}`:`[serve] Debug on demand: POST http://localhost:${i}/webpack/debug (optionally ?port=<base>) opens pod inspectors without a restart`),p&&console.log(`[serve] Logs teed to ${p} \u2014 tail it in WebStorm via Run/Debug configuration \u2192 Logs tab`)}a(g,"v"),c(g,"startDevServer");function U(){if(!s||s.killed){console.log("[serve] Devserver not running, restarting..."),g();return}fetch(`http://localhost:${i}/webpack/reload`,{method:"POST",headers:{"content-type":"application/json"},body:"{}"}).then(()=>console.log("[serve] Notified devserver to reload")).catch(t=>{console.warn("[serve] Failed to notify devserver, restarting...",t.message),v(),g()})}a(U,"B"),c(U,"_notifyDevServerReload");const{watch:B,...q}=k,V=webpack(q);let f=null;const T=[];function h(t){if(f){const r=f;f=null,r(t)}else T.push(t)}a(h,"b"),c(h,"pushResult");function D(){return T.length>0?Promise.resolve(T.shift()):new Promise(t=>{f=t})}a(D,"W"),c(D,"waitForNext");const H=V.watch(k.watchOptions||{},(t,r)=>{if(t){console.error("[serve] Webpack error:",t),h({success:!1});return}const E=r.hasErrors();if(console.info(r.toString({colors:!0,chunks:!1,assets:!0})),E){h({success:!1});return}(!b||!s)&&(b=!0,g()),h({success:!0,baseUrl:`http://localhost:${i}`})});try{for(;;)yield await D()}finally{H.close(()=>{}),v(),W.forEach(({sig:t,handler:r})=>process.removeListener(t,r))}}a(serveExecutor,"serveExecutor"),c(serveExecutor,"serveExecutor"),exports.default=serveExecutor,module.exports=serveExecutor,module.exports.default=serveExecutor;
@@ -1,4 +1,4 @@
1
- "use strict";var w=Object.defineProperty;var h=(e,t)=>w(e,"name",{value:t,configurable:!0});var v=Object.defineProperty,p=h((e,t)=>v(e,"name",{value:t,configurable:!0}),"p"),m=Object.defineProperty,d=p((e,t)=>m(e,"name",{value:t,configurable:!0}),"d");Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=trustExecutor,exports.collectHosts=collectHosts;const tslib_1=require("tslib"),node_child_process_1=require("node:child_process"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path")),basic_ssl_1=require("../../basic-ssl");async function trustExecutor(e,t){const o=path.join(t.root,"node_modules",".cache","davnx-webpack"),n=(0,basic_ssl_1.ensureCaSync)(o),u=process.env.LENSMCP_TRUST_HOSTS_ONLY==="1",a=collectHosts(e,t);if(a.length===0&&console.log("[trust] no concrete hostnames found (only wildcards?) \u2014 keychain step only."),process.platform!=="darwin"){console.log("[trust] non-macOS platform \u2014 do these manually:"),console.log(` \u2022 trust ${n} in your OS/browser store (Linux: update-ca-certificates / certutil)`);for(const s of a)console.log(` \u2022 /etc/hosts: "127.0.0.1 ${s}" and "::1 ${s}"`);return{success:!0}}const r=caSha256Fingerprint(n),f=u||r!==void 0&&(0,node_child_process_1.spawnSync)("security",["find-certificate","-a","-c","lensmcp local dev CA","-Z","/Library/Keychains/System.keychain"],{encoding:"utf8"}).stdout?.includes(r)===!0;if(u)console.log("[trust] hosts-only: a shared daemon serves TLS with its own CA \u2014 skipping the keychain step.");else if(f)console.log("[trust] CA already in the System keychain \u2014 skipping.");else{if(console.log(`[trust] adding CA to the System keychain (sudo will prompt): ${n}`),(0,node_child_process_1.spawnSync)("sudo",["security","add-trusted-cert","-d","-r","trustRoot","-k","/Library/Keychains/System.keychain",n],{stdio:"inherit"}).status!==0)return console.error("[trust] add-trusted-cert failed \u2014 rerun in a terminal so sudo can prompt."),{success:!1};console.log("[trust] CA trusted. Restart your browser once (it caches certificate verdicts).")}const c=fs.readFileSync("/etc/hosts","utf8"),i=d((s,y)=>c.split(`
2
- `).some(b=>{const g=b.trim();if(g.startsWith("#"))return!1;const S=g.split(/\s+/);return S[0]===s&&S.slice(1).includes(y)}),"hasEntry"),l=[];for(const s of a)i("127.0.0.1",s)||l.push(`127.0.0.1 ${s}`),i("::1",s)||l.push(`::1 ${s}`);if(l.length===0)console.log("[trust] /etc/hosts already complete (both families for every hostname).");else{console.log(`[trust] appending to /etc/hosts (sudo):
1
+ "use strict";var v=Object.defineProperty;var p=(e,t)=>v(e,"name",{value:t,configurable:!0});var m=Object.defineProperty,d=p((e,t)=>m(e,"name",{value:t,configurable:!0}),"d");Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=trustExecutor,exports.collectHosts=collectHosts;const tslib_1=require("tslib"),node_child_process_1=require("node:child_process"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path")),basic_ssl_1=require("../../basic-ssl");async function trustExecutor(e,t){const o=path.join(t.root,"node_modules",".cache","davnx-webpack"),n=(0,basic_ssl_1.ensureCaSync)(o),u=process.env.LENSMCP_TRUST_HOSTS_ONLY==="1",a=collectHosts(e,t);if(a.length===0&&console.log("[trust] no concrete hostnames found (only wildcards?) \u2014 keychain step only."),process.platform!=="darwin"){console.log("[trust] non-macOS platform \u2014 do these manually:"),console.log(` \u2022 trust ${n} in your OS/browser store (Linux: update-ca-certificates / certutil)`);for(const s of a)console.log(` \u2022 /etc/hosts: "127.0.0.1 ${s}" and "::1 ${s}"`);return{success:!0}}const r=caSha256Fingerprint(n),h=u||r!==void 0&&(0,node_child_process_1.spawnSync)("security",["find-certificate","-a","-c","lensmcp local dev CA","-Z","/Library/Keychains/System.keychain"],{encoding:"utf8"}).stdout?.includes(r)===!0;if(u)console.log("[trust] hosts-only: a shared daemon serves TLS with its own CA \u2014 skipping the keychain step.");else if(h)console.log("[trust] CA already in the System keychain \u2014 skipping.");else{if(console.log(`[trust] adding CA to the System keychain (sudo will prompt): ${n}`),(0,node_child_process_1.spawnSync)("sudo",["security","add-trusted-cert","-d","-r","trustRoot","-k","/Library/Keychains/System.keychain",n],{stdio:"inherit"}).status!==0)return console.error("[trust] add-trusted-cert failed \u2014 rerun in a terminal so sudo can prompt."),{success:!1};console.log("[trust] CA trusted. Restart your browser once (it caches certificate verdicts).")}const c=fs.readFileSync("/etc/hosts","utf8"),i=d((s,f)=>c.split(`
2
+ `).some(S=>{const y=S.trim();if(y.startsWith("#"))return!1;const g=y.split(/\s+/);return g[0]===s&&g.slice(1).includes(f)}),"hasEntry"),l=[];for(const s of a)i("127.0.0.1",s)||l.push(`127.0.0.1 ${s}`),i("::1",s)||l.push(`::1 ${s}`);if(l.length===0)console.log("[trust] /etc/hosts already complete (both families for every hostname).");else{console.log(`[trust] appending to /etc/hosts (sudo):
3
3
  ${l.join(`
4
- `)}`);const s=`printf '%s\\n' ${l.map(y=>`'${y}'`).join(" ")} >> /etc/hosts`;if((0,node_child_process_1.spawnSync)("sudo",["sh","-c",s],{stdio:"inherit"}).status!==0)return console.error("[trust] /etc/hosts update failed."),{success:!1};(0,node_child_process_1.spawnSync)("sudo",["sh","-c","dscacheutil -flushcache; killall -HUP mDNSResponder"],{stdio:"inherit"})}if(!u){const s=(0,node_child_process_1.spawnSync)("security",["verify-cert","-c",n,"-p","basic"],{stdio:"ignore"});console.log(`[trust] CA trust check: ${s.status===0?"OK":"NOT TRUSTED YET (browser restart may be needed)"}`)}for(const s of a)console.log(`[trust] ${s} \u2192 https ready (hosts + cert SAN ride the gateway config)`);return{success:!0}}h(trustExecutor,"trustExecutor"),p(trustExecutor,"trustExecutor"),d(trustExecutor,"trustExecutor");function caSha256Fingerprint(e){const t=(0,node_child_process_1.spawnSync)("openssl",["x509","-in",e,"-noout","-fingerprint","-sha256"],{encoding:"utf8"});if(t.status!==0||!t.stdout)return;const o=t.stdout.split("=")[1]?.replaceAll(":","").trim().toUpperCase();return o&&/^[0-9A-F]{64}$/.test(o)?o:void 0}h(caSha256Fingerprint,"caSha256Fingerprint"),p(caSha256Fingerprint,"caSha256Fingerprint"),d(caSha256Fingerprint,"caSha256Fingerprint");function collectHosts(e,t){const o=[],n=t.projectName?t.projectsConfigurations?.projects[t.projectName]:void 0,u=e.serveTarget??"serve-hmr",a=n?.targets?.[u]?.options?.gateway?.routes??[];for(const r of a)r.host&&!r.host.includes("*")&&o.push(r.host);for(const r of Object.values(t.projectsConfigurations?.projects??{}))try{const f=JSON.parse(fs.readFileSync(path.join(t.root,r.root,"project.json"),"utf8")),c=f.cluster??f.davnx,i=c?.host;i&&!i.includes("*")&&(o.push(i),c?.service&&c.internalHost!==!1&&o.push(typeof c.internalHost=="string"?c.internalHost:`internal.${i}`))}catch{}return[...new Set([...o,"lensmcp.local",...e.hosts??[]])]}h(collectHosts,"collectHosts"),p(collectHosts,"collectHosts"),d(collectHosts,"collectHosts");
4
+ `)}`);const s=`printf '%s\\n' ${l.map(f=>`'${f}'`).join(" ")} >> /etc/hosts`;if((0,node_child_process_1.spawnSync)("sudo",["sh","-c",s],{stdio:"inherit"}).status!==0)return console.error("[trust] /etc/hosts update failed."),{success:!1};(0,node_child_process_1.spawnSync)("sudo",["sh","-c","dscacheutil -flushcache; killall -HUP mDNSResponder"],{stdio:"inherit"})}if(!u){const s=(0,node_child_process_1.spawnSync)("security",["verify-cert","-c",n,"-p","basic"],{stdio:"ignore"});console.log(`[trust] CA trust check: ${s.status===0?"OK":"NOT TRUSTED YET (browser restart may be needed)"}`)}for(const s of a)console.log(`[trust] ${s} \u2192 https ready (hosts + cert SAN ride the gateway config)`);return{success:!0}}p(trustExecutor,"trustExecutor"),d(trustExecutor,"trustExecutor");function caSha256Fingerprint(e){const t=(0,node_child_process_1.spawnSync)("openssl",["x509","-in",e,"-noout","-fingerprint","-sha256"],{encoding:"utf8"});if(t.status!==0||!t.stdout)return;const o=t.stdout.split("=")[1]?.replaceAll(":","").trim().toUpperCase();return o&&/^[0-9A-F]{64}$/.test(o)?o:void 0}p(caSha256Fingerprint,"caSha256Fingerprint"),d(caSha256Fingerprint,"caSha256Fingerprint");function collectHosts(e,t){const o=[],n=t.projectName?t.projectsConfigurations?.projects[t.projectName]:void 0,u=e.serveTarget??"serve-hmr",a=n?.targets?.[u]?.options?.gateway?.routes??[];for(const r of a)r.host&&!r.host.includes("*")&&o.push(r.host);for(const r of Object.values(t.projectsConfigurations?.projects??{}))try{const h=JSON.parse(fs.readFileSync(path.join(t.root,r.root,"project.json"),"utf8")),c=h.cluster??h.davnx,i=c?.host;i&&!i.includes("*")&&(o.push(i),c?.service&&c.internalHost!==!1&&o.push(typeof c.internalHost=="string"?c.internalHost:`internal.${i}`))}catch{}return[...new Set([...o,"lensmcp.local",...e.hosts??[]])]}p(collectHosts,"collectHosts"),d(collectHosts,"collectHosts");
package/gateway.js CHANGED
@@ -1 +1 @@
1
- "use strict";var n=Object.defineProperty;var a=(r,t)=>n(r,"name",{value:t,configurable:!0});var s=Object.defineProperty,i=a((r,t)=>s(r,"name",{value:t,configurable:!0}),"i"),o=Object.defineProperty,e=i((r,t)=>o(r,"name",{value:t,configurable:!0}),"e");Object.defineProperty(exports,"__esModule",{value:!0}),exports.manifestFromClusterDecl=exports.DEFAULT_REGISTRY_PREFIX=exports.redisRegistrySource=exports.createRegistryProviders=exports.endpointsPodProvider=exports.staticManifestProvider=exports.startProdGateway=void 0;var prod_gateway_lib_1=require("./executors/gateway/prod-gateway.lib");Object.defineProperty(exports,"startProdGateway",{enumerable:!0,get:e(function(){return prod_gateway_lib_1.startProdGateway},"get")});var providers_prod_1=require("./executors/gateway/providers-prod");Object.defineProperty(exports,"staticManifestProvider",{enumerable:!0,get:e(function(){return providers_prod_1.staticManifestProvider},"get")}),Object.defineProperty(exports,"endpointsPodProvider",{enumerable:!0,get:e(function(){return providers_prod_1.endpointsPodProvider},"get")});var registry_source_1=require("./executors/gateway/registry-source");Object.defineProperty(exports,"createRegistryProviders",{enumerable:!0,get:e(function(){return registry_source_1.createRegistryProviders},"get")}),Object.defineProperty(exports,"redisRegistrySource",{enumerable:!0,get:e(function(){return registry_source_1.redisRegistrySource},"get")}),Object.defineProperty(exports,"DEFAULT_REGISTRY_PREFIX",{enumerable:!0,get:e(function(){return registry_source_1.DEFAULT_REGISTRY_PREFIX},"get")});var manifest_1=require("./executors/gateway/manifest");Object.defineProperty(exports,"manifestFromClusterDecl",{enumerable:!0,get:e(function(){return manifest_1.manifestFromClusterDecl},"get")});
1
+ "use strict";var s=Object.defineProperty;var i=(r,t)=>s(r,"name",{value:t,configurable:!0});var o=Object.defineProperty,e=i((r,t)=>o(r,"name",{value:t,configurable:!0}),"e");Object.defineProperty(exports,"__esModule",{value:!0}),exports.manifestFromClusterDecl=exports.DEFAULT_REGISTRY_PREFIX=exports.redisRegistrySource=exports.createRegistryProviders=exports.endpointsPodProvider=exports.staticManifestProvider=exports.startProdGateway=void 0;var prod_gateway_lib_1=require("./executors/gateway/prod-gateway.lib");Object.defineProperty(exports,"startProdGateway",{enumerable:!0,get:e(function(){return prod_gateway_lib_1.startProdGateway},"get")});var providers_prod_1=require("./executors/gateway/providers-prod");Object.defineProperty(exports,"staticManifestProvider",{enumerable:!0,get:e(function(){return providers_prod_1.staticManifestProvider},"get")}),Object.defineProperty(exports,"endpointsPodProvider",{enumerable:!0,get:e(function(){return providers_prod_1.endpointsPodProvider},"get")});var registry_source_1=require("./executors/gateway/registry-source");Object.defineProperty(exports,"createRegistryProviders",{enumerable:!0,get:e(function(){return registry_source_1.createRegistryProviders},"get")}),Object.defineProperty(exports,"redisRegistrySource",{enumerable:!0,get:e(function(){return registry_source_1.redisRegistrySource},"get")}),Object.defineProperty(exports,"DEFAULT_REGISTRY_PREFIX",{enumerable:!0,get:e(function(){return registry_source_1.DEFAULT_REGISTRY_PREFIX},"get")});var manifest_1=require("./executors/gateway/manifest");Object.defineProperty(exports,"manifestFromClusterDecl",{enumerable:!0,get:e(function(){return manifest_1.manifestFromClusterDecl},"get")});
package/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var u=Object.defineProperty;var o=(t,r)=>u(t,"name",{value:r,configurable:!0});var p=Object.defineProperty,c=o((t,r)=>p(t,"name",{value:r,configurable:!0}),"c"),n=Object.defineProperty,e=c((t,r)=>n(t,"name",{value:r,configurable:!0}),"e");Object.defineProperty(exports,"__esModule",{value:!0}),exports.resolveEventFile=exports.publishTypecheckRun=exports.parseTscOutput=exports.parseTscDiagnosticLine=exports.buildTypecheckRunEvents=exports.appendTypecheckEvents=exports.createProdWebpackConfig=exports.createDevWebpackConfig=exports.buildScopePatterns=void 0;var build_scope_patterns_1=require("./build-scope-patterns");Object.defineProperty(exports,"buildScopePatterns",{enumerable:!0,get:e(function(){return build_scope_patterns_1.buildScopePatterns},"get")});var create_webpack_dev_1=require("./create-webpack-dev");Object.defineProperty(exports,"createDevWebpackConfig",{enumerable:!0,get:e(function(){return create_webpack_dev_1.createDevWebpackConfig},"get")});var create_webpack_prod_1=require("./create-webpack-prod");Object.defineProperty(exports,"createProdWebpackConfig",{enumerable:!0,get:e(function(){return create_webpack_prod_1.createProdWebpackConfig},"get")});var typecheck_bus_1=require("./typecheck-bus");Object.defineProperty(exports,"appendTypecheckEvents",{enumerable:!0,get:e(function(){return typecheck_bus_1.appendTypecheckEvents},"get")}),Object.defineProperty(exports,"buildTypecheckRunEvents",{enumerable:!0,get:e(function(){return typecheck_bus_1.buildTypecheckRunEvents},"get")}),Object.defineProperty(exports,"parseTscDiagnosticLine",{enumerable:!0,get:e(function(){return typecheck_bus_1.parseTscDiagnosticLine},"get")}),Object.defineProperty(exports,"parseTscOutput",{enumerable:!0,get:e(function(){return typecheck_bus_1.parseTscOutput},"get")}),Object.defineProperty(exports,"publishTypecheckRun",{enumerable:!0,get:e(function(){return typecheck_bus_1.publishTypecheckRun},"get")}),Object.defineProperty(exports,"resolveEventFile",{enumerable:!0,get:e(function(){return typecheck_bus_1.resolveEventFile},"get")});
1
+ "use strict";var p=Object.defineProperty;var c=(t,r)=>p(t,"name",{value:r,configurable:!0});var n=Object.defineProperty,e=c((t,r)=>n(t,"name",{value:r,configurable:!0}),"e");Object.defineProperty(exports,"__esModule",{value:!0}),exports.resolveEventFile=exports.publishTypecheckRun=exports.parseTscOutput=exports.parseTscDiagnosticLine=exports.buildTypecheckRunEvents=exports.appendTypecheckEvents=exports.createProdWebpackConfig=exports.createDevWebpackConfig=exports.buildScopePatterns=void 0;var build_scope_patterns_1=require("./build-scope-patterns");Object.defineProperty(exports,"buildScopePatterns",{enumerable:!0,get:e(function(){return build_scope_patterns_1.buildScopePatterns},"get")});var create_webpack_dev_1=require("./create-webpack-dev");Object.defineProperty(exports,"createDevWebpackConfig",{enumerable:!0,get:e(function(){return create_webpack_dev_1.createDevWebpackConfig},"get")});var create_webpack_prod_1=require("./create-webpack-prod");Object.defineProperty(exports,"createProdWebpackConfig",{enumerable:!0,get:e(function(){return create_webpack_prod_1.createProdWebpackConfig},"get")});var typecheck_bus_1=require("./typecheck-bus");Object.defineProperty(exports,"appendTypecheckEvents",{enumerable:!0,get:e(function(){return typecheck_bus_1.appendTypecheckEvents},"get")}),Object.defineProperty(exports,"buildTypecheckRunEvents",{enumerable:!0,get:e(function(){return typecheck_bus_1.buildTypecheckRunEvents},"get")}),Object.defineProperty(exports,"parseTscDiagnosticLine",{enumerable:!0,get:e(function(){return typecheck_bus_1.parseTscDiagnosticLine},"get")}),Object.defineProperty(exports,"parseTscOutput",{enumerable:!0,get:e(function(){return typecheck_bus_1.parseTscOutput},"get")}),Object.defineProperty(exports,"publishTypecheckRun",{enumerable:!0,get:e(function(){return typecheck_bus_1.publishTypecheckRun},"get")}),Object.defineProperty(exports,"resolveEventFile",{enumerable:!0,get:e(function(){return typecheck_bus_1.resolveEventFile},"get")});