@lensmcp/cluster 1.25.37 → 1.25.39

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 (146) hide show
  1. package/basic-ssl.js +1 -1
  2. package/build-host.js +1 -1
  3. package/build-scope-patterns.js +1 -1
  4. package/bundle-parent.js +1 -1
  5. package/checkout-cache.js +1 -1
  6. package/child-process-env.js +1 -1
  7. package/compile-retry.js +1 -1
  8. package/config-files.js +1 -1
  9. package/create-webpack-dev.js +1 -1
  10. package/create-webpack-prod.js +1 -1
  11. package/dev-devtool.js +1 -1
  12. package/devserver-host.js +1 -1
  13. package/devserver-notifier.js +1 -1
  14. package/devserver-transport.js +1 -1
  15. package/error-stack-release.js +1 -1
  16. package/executors/build/build.impl.js +1 -1
  17. package/executors/gateway/body-stall.js +1 -1
  18. package/executors/gateway/canonical-path.js +1 -1
  19. package/executors/gateway/client-ip.js +1 -1
  20. package/executors/gateway/gateway-errors.js +1 -1
  21. package/executors/gateway/gateway.impl.js +1 -1
  22. package/executors/gateway/gateway.lib.js +1 -1
  23. package/executors/gateway/health-check.js +1 -1
  24. package/executors/gateway/jwks-verify.js +1 -1
  25. package/executors/gateway/jwt-claims.js +1 -1
  26. package/executors/gateway/main.prod-gateway.js +2 -2
  27. package/executors/gateway/main.rollout.js +4 -4
  28. package/executors/gateway/manifest.js +1 -1
  29. package/executors/gateway/metrics.js +1 -1
  30. package/executors/gateway/otel-tracing.js +1 -1
  31. package/executors/gateway/prod-config.js +1 -1
  32. package/executors/gateway/prod-gateway.lib.js +1 -1
  33. package/executors/gateway/prod-runtime/access-log.js +1 -1
  34. package/executors/gateway/prod-runtime/app.js +1 -1
  35. package/executors/gateway/prod-runtime/auth.js +1 -1
  36. package/executors/gateway/prod-runtime/body-stall.js +1 -1
  37. package/executors/gateway/prod-runtime/cors.js +1 -1
  38. package/executors/gateway/prod-runtime/edge.js +1 -1
  39. package/executors/gateway/prod-runtime/handler.js +1 -1
  40. package/executors/gateway/prod-runtime/hooks.js +1 -1
  41. package/executors/gateway/prod-runtime/observability.d.ts +4 -2
  42. package/executors/gateway/prod-runtime/observability.js +1 -1
  43. package/executors/gateway/prod-runtime/rollout.js +1 -1
  44. package/executors/gateway/prod-runtime/routing.js +1 -1
  45. package/executors/gateway/prod-runtime/server.js +1 -1
  46. package/executors/gateway/prod-runtime/trust.js +1 -1
  47. package/executors/gateway/prod-runtime/upgrade.js +6 -6
  48. package/executors/gateway/prod-runtime/upstream.js +1 -1
  49. package/executors/gateway/providers-prod.js +1 -1
  50. package/executors/gateway/rate-limit.js +2 -2
  51. package/executors/gateway/registry-source.js +1 -1
  52. package/executors/gateway/rollout-ops.js +2 -2
  53. package/executors/gateway/runtime/act.js +1 -1
  54. package/executors/gateway/runtime/auth.js +1 -1
  55. package/executors/gateway/runtime/awake.d.ts +42 -0
  56. package/executors/gateway/runtime/awake.js +1 -0
  57. package/executors/gateway/runtime/chooser.js +12 -12
  58. package/executors/gateway/runtime/control.d.ts +11 -1
  59. package/executors/gateway/runtime/control.js +2 -2
  60. package/executors/gateway/runtime/dev-auth.js +1 -1
  61. package/executors/gateway/runtime/discovery.js +1 -1
  62. package/executors/gateway/runtime/edge.js +1 -1
  63. package/executors/gateway/runtime/guest-graph.js +2 -2
  64. package/executors/gateway/runtime/guest-replay.js +2 -2
  65. package/executors/gateway/runtime/handler.js +1 -1
  66. package/executors/gateway/runtime/hmr-reload.js +1 -1
  67. package/executors/gateway/runtime/hooks.js +1 -1
  68. package/executors/gateway/runtime/hosted-dashboard.js +1 -1
  69. package/executors/gateway/runtime/instance.js +2 -2
  70. package/executors/gateway/runtime/lens-children.js +1 -1
  71. package/executors/gateway/runtime/lifecycle.d.ts +4 -1
  72. package/executors/gateway/runtime/lifecycle.js +3 -3
  73. package/executors/gateway/runtime/observability.d.ts +8 -3
  74. package/executors/gateway/runtime/observability.js +3 -3
  75. package/executors/gateway/runtime/orphan-reaper.js +2 -2
  76. package/executors/gateway/runtime/own-log.js +6 -6
  77. package/executors/gateway/runtime/pod-env.js +2 -2
  78. package/executors/gateway/runtime/pod-output.js +1 -1
  79. package/executors/gateway/runtime/pod-probe.js +1 -1
  80. package/executors/gateway/runtime/process-names.js +1 -1
  81. package/executors/gateway/runtime/project-graph-store.js +1 -1
  82. package/executors/gateway/runtime/proxy.js +1 -1
  83. package/executors/gateway/runtime/registration-guards.js +1 -1
  84. package/executors/gateway/runtime/route-registry.js +1 -1
  85. package/executors/gateway/runtime/scope.js +1 -1
  86. package/executors/gateway/runtime/serve-launch.js +3 -3
  87. package/executors/gateway/runtime/server.js +2 -2
  88. package/executors/gateway/runtime/service-keys.js +1 -1
  89. package/executors/gateway/runtime/shared-build.js +3 -3
  90. package/executors/gateway/runtime/source-poller.js +1 -1
  91. package/executors/gateway/runtime/types.d.ts +24 -0
  92. package/executors/gateway/runtime/types.js +1 -1
  93. package/executors/gateway/runtime/upgrade.js +1 -1
  94. package/executors/gateway/runtime/warm-start.d.ts +18 -0
  95. package/executors/gateway/runtime/warm-start.js +1 -1
  96. package/executors/gateway/runtime/workspace-log.js +1 -1
  97. package/executors/gateway/runtime/workspace-middleware.js +1 -1
  98. package/executors/gateway/runtime/workspace-registry.js +1 -1
  99. package/executors/gateway/ssrf-guard.js +1 -1
  100. package/executors/serve/serve.impl.js +1 -1
  101. package/executors/serve/stop-on-signal.js +1 -1
  102. package/executors/trust/hostname.js +1 -1
  103. package/executors/trust/trust.impl.js +3 -3
  104. package/exit-reason.js +2 -2
  105. package/fork-ts-check-reporter.js +1 -1
  106. package/gateway.js +1 -1
  107. package/gc-notice.js +1 -1
  108. package/graph-snapshot.js +1 -1
  109. package/handoff-retire.js +1 -1
  110. package/heap-snapshot.js +1 -1
  111. package/hot-swap-registries.js +1 -1
  112. package/index.js +1 -1
  113. package/inspector-secret.js +1 -1
  114. package/main.devserver.js +11 -11
  115. package/notice-generation.js +1 -1
  116. package/package.json +4 -4
  117. package/perf/heavy-barrel-import.js +1 -1
  118. package/perf/perf-config.js +1 -1
  119. package/perf/perf-rule-events.js +2 -2
  120. package/perf/perf-rules-analysis.js +1 -1
  121. package/perf/perf-rules-plugin.js +1 -1
  122. package/perf/source-scan.js +5 -5
  123. package/perf/workspace-libraries.js +2 -2
  124. package/pod-memory-events.js +2 -2
  125. package/pod-memory.js +1 -1
  126. package/pod-sock.js +1 -1
  127. package/process-name.js +1 -1
  128. package/redis-disconnect-fix.js +1 -1
  129. package/schema-first-instance.js +1 -1
  130. package/serve-runner.js +1 -1
  131. package/service-build-events.js +2 -2
  132. package/shared-build/attach.js +2 -2
  133. package/shared-build/host.js +3 -3
  134. package/shared-build/protocol.js +1 -1
  135. package/shared-build/shared-compilation.js +3 -3
  136. package/shared-build/signature.js +1 -1
  137. package/stdio-guard.js +1 -1
  138. package/swap-mode.js +1 -1
  139. package/swap-recycle.js +1 -1
  140. package/tsgo-check-plugin.js +4 -4
  141. package/typecheck-bus.js +3 -3
  142. package/typecheck-queue.js +1 -1
  143. package/worker-guard.js +1 -1
  144. package/worker-retire.js +1 -1
  145. package/worker-supervisor.js +2 -2
  146. package/workspace-paths.js +1 -1
@@ -1 +1 @@
1
- "use strict";var k=Object.defineProperty;var b=(e,t)=>k(e,"name",{value:t,configurable:!0});var C=Object.defineProperty,g=b((e,t)=>C(e,"name",{value:t,configurable:!0}),"g"),U=Object.defineProperty,u=g((e,t)=>U(e,"name",{value:t,configurable:!0}),"u");Object.defineProperty(exports,"__esModule",{value:!0}),exports.sourceSame=exports.sourceFull=exports.sourceStaleAfterMs=exports.SOURCE_BACKOFF_MAX_MS=exports.SOURCE_DECLARATION_REPORT_MS=exports.SOURCE_NOT_RUNNING_REPORT_MS=exports.SOURCE_MAX_PER_SERVICE=exports.SOURCE_MAX_GROUPS=exports.SOURCE_MAX_BYTES=exports.SOURCE_ERROR_MAX=exports.LOOP_MAX_INTERVAL_SEC=exports.SOURCE_FULL_REPORT_MS=exports.TRAFFIC_DEFAULT_RATE_LIMITED=exports.TRAFFIC_DEFAULT_P95_MS=exports.TRAFFIC_DEFAULT_FAILURE_PCT=exports.STORE_DEFAULT_ORPHAN_MIN=exports.STORE_DEFAULT_ERROR_RATE_PCT=exports.STORE_DEFAULT_QUOTA_PCT=exports.LOOP_DEFAULT_IDLE_MIN=exports.QUEUE_DEFAULT_STALLED_MIN=exports.QUEUE_DEFAULT_OLDEST_WAIT_MIN=exports.SOURCE_MIN_INTERVAL_SEC=exports.SOURCE_DEFAULT_INTERVAL_SEC=exports.TRAFFIC_DIRECTIONS=exports.LOOP_OUTCOMES=exports.SOURCE_SNAPSHOT_FIELD=exports.TRAFFIC_WIRE_SCHEMA=exports.STORE_WIRE_SCHEMA=exports.LOOP_WIRE_SCHEMA=exports.QUEUE_WIRE_SCHEMA=exports.SOURCE_KINDS_READ=exports.SOURCE_KINDS=exports.sourcesConcurrency=exports.sourcesTimeoutMs=exports.sourcesEnabled=void 0,exports.sourceBackoffMs=sourceBackoffMs,exports.parseSourceDecls=parseSourceDecls,exports.parseQueueSnapshot=parseQueueSnapshot,exports.parseLoopSnapshot=parseLoopSnapshot,exports.parseStoreSnapshot=parseStoreSnapshot,exports.parseTrafficSnapshot=parseTrafficSnapshot,exports.sourceDigest=sourceDigest,exports.keepQueueSnapshot=keepQueueSnapshot,exports.keepLoopSnapshot=keepLoopSnapshot,exports.keepStoreSnapshot=keepStoreSnapshot,exports.keepTrafficSnapshot=keepTrafficSnapshot,exports.buildSourcePollRaw=buildSourcePollRaw,exports.buildSourceDeclarationRaw=buildSourceDeclarationRaw,exports.sourcePollTitle=sourcePollTitle,exports.requestOverSocket=requestOverSocket,exports.createSourcePoller=createSourcePoller;const tslib_1=require("tslib"),node_crypto_1=require("node:crypto"),http=tslib_1.__importStar(require("node:http")),discovery_1=require("./discovery"),readEnv=u(e=>process.env[e],"readEnv"),envInt=u((e,t,s)=>{const n=Number(readEnv(e));return Number.isInteger(n)&&n>=s?n:t},"envInt"),sourcesEnabled=u(()=>readEnv("LENSMCP_SOURCES")!=="0","sourcesEnabled");exports.sourcesEnabled=sourcesEnabled;const sourcesTimeoutMs=u(()=>envInt("LENSMCP_SOURCES_TIMEOUT_MS",3e3,100),"sourcesTimeoutMs");exports.sourcesTimeoutMs=sourcesTimeoutMs;const sourcesConcurrency=u(()=>envInt("LENSMCP_SOURCES_CONCURRENCY",4,1),"sourcesConcurrency");exports.sourcesConcurrency=sourcesConcurrency,exports.SOURCE_KINDS=["queue","loop","store","traffic"],exports.SOURCE_KINDS_READ=["queue","loop","store","traffic"],exports.QUEUE_WIRE_SCHEMA="lensmcp.queue/v1",exports.LOOP_WIRE_SCHEMA="lensmcp.loop/v1",exports.STORE_WIRE_SCHEMA="lensmcp.store/v1",exports.TRAFFIC_WIRE_SCHEMA="lensmcp.traffic/v1",exports.SOURCE_SNAPSHOT_FIELD={queue:"snapshot",loop:"loop",store:"store",traffic:"traffic"},exports.LOOP_OUTCOMES=["ok","failed","skipped"],exports.TRAFFIC_DIRECTIONS=["inbound","outbound"],exports.SOURCE_DEFAULT_INTERVAL_SEC=10,exports.SOURCE_MIN_INTERVAL_SEC=2,exports.QUEUE_DEFAULT_OLDEST_WAIT_MIN=10,exports.QUEUE_DEFAULT_STALLED_MIN=15,exports.LOOP_DEFAULT_IDLE_MIN=10,exports.STORE_DEFAULT_QUOTA_PCT=90,exports.STORE_DEFAULT_ERROR_RATE_PCT=5,exports.STORE_DEFAULT_ORPHAN_MIN=60,exports.TRAFFIC_DEFAULT_FAILURE_PCT=5,exports.TRAFFIC_DEFAULT_P95_MS=2e3,exports.TRAFFIC_DEFAULT_RATE_LIMITED=1,exports.SOURCE_FULL_REPORT_MS=6e4,exports.LOOP_MAX_INTERVAL_SEC=86400,exports.SOURCE_ERROR_MAX=500,exports.SOURCE_MAX_BYTES=256*1024,exports.SOURCE_MAX_GROUPS=500,exports.SOURCE_MAX_PER_SERVICE=16,exports.SOURCE_NOT_RUNNING_REPORT_MS=6e4,exports.SOURCE_DECLARATION_REPORT_MS=5*6e4,exports.SOURCE_BACKOFF_MAX_MS=6e4;const sourceStaleAfterMs=u(e=>Math.max(3e4,3*Math.max(0,e)),"sourceStaleAfterMs");exports.sourceStaleAfterMs=sourceStaleAfterMs;function sourceBackoffMs(e,t){return t<=1?e:Math.min(e*2**Math.min(t-1,10),Math.max(e,exports.SOURCE_BACKOFF_MAX_MS))}b(sourceBackoffMs,"sourceBackoffMs"),g(sourceBackoffMs,"sourceBackoffMs"),u(sourceBackoffMs,"sourceBackoffMs");const isPolled=u(e=>e.path!==void 0,"isPolled"),ENTRY_KEYS={queue:["kind","name","path","intervalSec","thresholds"],loop:["kind","name","path","intervalSec","thresholds","feeds"],store:["kind","name","path","intervalSec","thresholds"],traffic:["kind","name","path","intervalSec","thresholds"]},finite=u(e=>typeof e=="number"&&Number.isFinite(e),"finite"),MINUTES={ok:u(e=>finite(e)&&e>0&&e<=10080,"ok"),must:"must be minutes, more than 0 and at most 10080"},PERCENT={ok:u(e=>finite(e)&&e>0&&e<=100,"ok"),must:"must be a percent, more than 0 and at most 100"},MILLISECONDS={ok:u(e=>finite(e)&&e>0&&e<=6e5,"ok"),must:"must be milliseconds, more than 0 and at most 600000"},COUNT={ok:u(e=>Number.isInteger(e)&&e>=1&&e<=1e6,"ok"),must:"must be a count, a whole number from 1 to 1000000"},THRESHOLDS={queue:{oldestWaitMin:{def:exports.QUEUE_DEFAULT_OLDEST_WAIT_MIN,...MINUTES},stalledMin:{def:exports.QUEUE_DEFAULT_STALLED_MIN,...MINUTES}},loop:{idleMin:{def:exports.LOOP_DEFAULT_IDLE_MIN,...MINUTES}},store:{quotaPct:{def:exports.STORE_DEFAULT_QUOTA_PCT,...PERCENT},errorRatePct:{def:exports.STORE_DEFAULT_ERROR_RATE_PCT,...PERCENT},orphanMin:{def:exports.STORE_DEFAULT_ORPHAN_MIN,...MINUTES}},traffic:{failurePct:{def:exports.TRAFFIC_DEFAULT_FAILURE_PCT,...PERCENT},p95Ms:{def:exports.TRAFFIC_DEFAULT_P95_MS,...MILLISECONDS},rateLimited:{def:exports.TRAFFIC_DEFAULT_RATE_LIMITED,...COUNT}}},PATH_RE=/^\/(?!\/)[^\s#\u0000-\u001f\u007f]{0,511}$/,NAME_RE=/^[^\u0000-\u001f\u007f]{1,100}$/,isObj=u(e=>typeof e=="object"&&e!==null&&!Array.isArray(e),"isObj");function parseSourceDecls(e){const t=[],s=[],n=[];if(e===void 0)return{sources:t,problems:s};if(!Array.isArray(e))return{sources:t,problems:["`sources` is not a list of { kind, name, path } entries \u2014 no source is read"]};e.forEach((i,l)=>{const S=`sources[${l}]`;if(!isObj(i)){s.push(`${S} is not an object \u2014 not read`);return}const d=typeof i.name=="string"&&i.name.trim()?`${S} "${i.name}"`:S,r=i.kind;if(typeof r!="string"||!exports.SOURCE_KINDS_READ.includes(r)){s.push(`${d}: kind ${JSON.stringify(r??null)} is not a source kind (${exports.SOURCE_KINDS.join(", ")}) \u2014 not read`);return}const a=r,p=Object.keys(i).filter(_=>!ENTRY_KEYS[a].includes(_));if(p.length){s.push(`${d}: unknown key${p.length===1?"":"s"} ${p.map(_=>JSON.stringify(_)).join(", ")} for a ${a} source (known: ${ENTRY_KEYS[a].join(", ")}) \u2014 not read`);return}const R=i.name;if(typeof R!="string"||!R.trim()||!NAME_RE.test(R)){s.push(`${S}: name ${JSON.stringify(R??null)} must be 1\u2013100 characters, not blank \u2014 not read`);return}if(t.some(_=>_.name===R)){s.push(`${d}: the name is declared twice on this service \u2014 read once`);return}const h=i.path;if(h===void 0&&a!=="traffic"&&a!=="loop"){s.push(`${d}: a ${a} source needs a path \u2014 the route on the service that answers "lensmcp.${a}/v1" (only a loop or a traffic source may go without one, as push-only) \u2014 not read`);return}if(h!==void 0&&(typeof h!="string"||!PATH_RE.test(h)||h.split("?")[0].split("/").includes(".."))){s.push(`${d}: path ${JSON.stringify(h)} must be a route on the service, starting with "/" (e.g. "/api/dev/lens/backlog") \u2014 not read`);return}const m=i.intervalSec;if(m!==void 0&&!(typeof m=="number"&&Number.isInteger(m)&&m>=exports.SOURCE_MIN_INTERVAL_SEC&&m<=3600)){s.push(`${d}: intervalSec ${JSON.stringify(m)} must be a whole number of seconds from ${exports.SOURCE_MIN_INTERVAL_SEC} to 3600 \u2014 not read`);return}const A=i.thresholds;if(A!==void 0&&!isObj(A)){s.push(`${d}: thresholds must be an object \u2014 not read`);return}const I=isObj(A)?A:{},x=THRESHOLDS[a],o=Object.keys(x),c=Object.keys(I).filter(_=>!o.includes(_));if(c.length){s.push(`${d}: unknown threshold${c.length===1?"":"s"} ${c.map(_=>JSON.stringify(_)).join(", ")} for a ${a} source (known: ${o.join(", ")}) \u2014 not read`);return}const f=o.find(_=>I[_]!==void 0&&!x[_].ok(I[_]));if(f){s.push(`${d}: thresholds.${f} ${JSON.stringify(I[f])} ${x[f].must} \u2014 not read`);return}if(t.length>=exports.SOURCE_MAX_PER_SERVICE){s.push(`${d}: more than ${exports.SOURCE_MAX_PER_SERVICE} sources on one service \u2014 not read`);return}const O={};for(const _ of o)O[_]=I[_]??x[_].def;const E={kind:a,name:R,...h!==void 0?{path:h}:{},intervalSec:m??exports.SOURCE_DEFAULT_INTERVAL_SEC,thresholds:O};t.push(E),a==="loop"&&i.feeds!==void 0&&n.push({decl:E,label:d,feeds:i.feeds})});for(const{decl:i,label:l,feeds:S}of n)typeof S!="string"||!S.trim()?s.push(`${l}: feeds ${JSON.stringify(S)} must be the name of a queue source on this service \u2014 read without it`):t.some(d=>d.kind==="queue"&&d.name===S)?i.feeds=S:s.push(`${l}: feeds ${JSON.stringify(S)} names no queue source on this service \u2014 read without it`);return{sources:t,problems:s}}b(parseSourceDecls,"parseSourceDecls"),g(parseSourceDecls,"parseSourceDecls"),u(parseSourceDecls,"parseSourceDecls");const ISO_RE=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(?::\d{2}(?:\.\d{1,9})?)?(?:Z|[+-]\d{2}:?\d{2})$/,isIso=u(e=>typeof e=="string"&&ISO_RE.test(e)&&!Number.isNaN(Date.parse(e)),"isIso"),isCount=u(e=>typeof e=="number"&&Number.isSafeInteger(e)&&e>=0,"isCount"),notSchema=u((e,t)=>`schema is ${e===void 0?"absent":JSON.stringify(e).slice(0,60)}, not "${t}"`,"notSchema"),keyWrong=u((e,t,s)=>{if(typeof e!="string"||e.length===0||e.length>200)return`${t}.key must be a string of 1\u2013200 characters`;if(s.has(e))return`${t}.key ${JSON.stringify(e)} appears twice`;s.add(e)},"keyWrong"),labelsWrong=u((e,t)=>{if(e===void 0)return;if(!isObj(e))return`${t}.labels must be an object of strings`;const s=Object.entries(e);if(s.length>16)return`${t}.labels has more than 16 entries`;for(const[n,i]of s)if(n.length===0||n.length>64||typeof i!="string"||i.length>200)return`${t}.labels.${n.slice(0,64)} must be a string of at most 200 characters`},"labelsWrong"),overCap=u((e,t)=>`${e} ${t} \u2014 at most ${exports.SOURCE_MAX_GROUPS}; cap them and say \`truncated: { ${t}: <dropped> }\``,"overCap");function parseQueueSnapshot(e){const t=u(d=>({ok:!1,reason:d}),"fail");if(!isObj(e))return t("the snapshot is not a JSON object");if(e.schema!==exports.QUEUE_WIRE_SCHEMA)return t(notSchema(e.schema,exports.QUEUE_WIRE_SCHEMA));const s=e.at;if(!isIso(s))return t("`at` is not an ISO time");const n=e.truncated;if(n!==void 0&&!(isObj(n)&&isCount(n.groups)))return t("`truncated` must be { groups: <how many were dropped> }, or absent");const i=e.groups;if(!Array.isArray(i))return t("`groups` is not a list");if(i.length>exports.SOURCE_MAX_GROUPS)return t(overCap(i.length,"groups"));const l=new Set,S=[];for(let d=0;d<i.length;d++){const r=i[d],a=`groups[${d}]`;if(!isObj(r))return t(`${a} is not an object`);const p=keyWrong(r.key,a,l);if(p)return t(p);if(!isCount(r.pending))return t(`${a}.pending must be a whole number \u2265 0`);for(const A of["inFlight","failed","completedInWindow"])if(r[A]!==void 0&&!isCount(r[A]))return t(`${a}.${A} must be a whole number \u2265 0, or absent`);const R=r.oldestPendingAt;if(R!=null&&!isIso(R))return t(`${a}.oldestPendingAt must be an ISO time, null, or absent`);const h=r.labels,m=labelsWrong(h,a);if(m)return t(m);S.push({key:r.key,...h!==void 0?{labels:h}:{},pending:r.pending,...r.inFlight!==void 0?{inFlight:r.inFlight}:{},...r.failed!==void 0?{failed:r.failed}:{},...R!==void 0?{oldestPendingAt:R}:{},...r.completedInWindow!==void 0?{completedInWindow:r.completedInWindow}:{}})}return{ok:!0,at:s,groups:S,...n!==void 0?{truncated:{groups:n.groups}}:{}}}b(parseQueueSnapshot,"parseQueueSnapshot"),g(parseQueueSnapshot,"parseQueueSnapshot"),u(parseQueueSnapshot,"parseQueueSnapshot");const LOOP_COUNTS=["lastDurationMs","lastItems","runsInWindow","itemsInWindow","failuresInWindow","windowSec"],cutText=u((e,t)=>{if(e.length<=t)return e;const s=t-1,n=e.charCodeAt(s-1);return`${e.slice(0,n>=55296&&n<=56319?s-1:s)}\u2026`},"cutText");function parseLoopSnapshot(e){const t=u(a=>({ok:!1,reason:a}),"fail");if(!isObj(e))return t("the snapshot is not a JSON object");if(e.schema!==exports.LOOP_WIRE_SCHEMA)return t(notSchema(e.schema,exports.LOOP_WIRE_SCHEMA));const s=e.at;if(!isIso(s))return t("`at` is not an ISO time");const n=e.intervalSec;if(!(typeof n=="number"&&Number.isFinite(n)&&n>0&&n<=exports.LOOP_MAX_INTERVAL_SEC))return t(`\`intervalSec\` must be the loop's own period in seconds, more than 0 and at most ${exports.LOOP_MAX_INTERVAL_SEC}`);const i=e.lastRunAt;if(i===void 0)return t("`lastRunAt` is absent \u2014 say null if the loop has not run since the service started");if(i!==null&&!isIso(i))return t("`lastRunAt` must be an ISO time, or null if the loop has not run since the service started");for(const a of LOOP_COUNTS)if(e[a]!==void 0&&!isCount(e[a]))return t(`\`${a}\` must be a whole number \u2265 0, or absent`);const l=e.lastOutcome;if(l!==void 0&&!exports.LOOP_OUTCOMES.includes(l))return t(`\`lastOutcome\` must be ${exports.LOOP_OUTCOMES.join(", ")}, or absent`);const S=e.nextRunAt;if(S!=null&&!isIso(S))return t("`nextRunAt` must be an ISO time, null, or absent");const d=e.lastError;if(d!==void 0&&typeof d!="string")return t("`lastError` must be a string, or absent");const r=u(a=>e[a]!==void 0?{[a]:e[a]}:{},"count");return{ok:!0,loop:{at:s,intervalSec:n,lastRunAt:i,...r("lastDurationMs"),...l!==void 0?{lastOutcome:l}:{},...r("lastItems"),...S!==void 0?{nextRunAt:S}:{},...r("runsInWindow"),...r("itemsInWindow"),...r("failuresInWindow"),...r("windowSec"),...d!==void 0?{lastError:cutText(d,exports.SOURCE_ERROR_MAX)}:{}}}}b(parseLoopSnapshot,"parseLoopSnapshot"),g(parseLoopSnapshot,"parseLoopSnapshot"),u(parseLoopSnapshot,"parseLoopSnapshot");const STORE_COUNTS=["opsInWindow","writesInWindow","deletesInWindow","errorsInWindow","windowSec"];function parseStoreSnapshot(e){const t=u(p=>({ok:!1,reason:p}),"fail");if(!isObj(e))return t("the snapshot is not a JSON object");if(e.schema!==exports.STORE_WIRE_SCHEMA)return t(notSchema(e.schema,exports.STORE_WIRE_SCHEMA));const s=e.at;if(!isIso(s))return t("`at` is not an ISO time");for(const p of["objects","bytes"])if(!isCount(e[p]))return t(`\`${p}\` must be a whole number \u2265 0`);const n=e.quotaBytes;if(n!=null&&!isCount(n))return t("`quotaBytes` must be a whole number \u2265 0, null when it has no quota, or absent");for(const p of STORE_COUNTS)if(e[p]!==void 0&&!isCount(e[p]))return t(`\`${p}\` must be a whole number \u2265 0, or absent`);const i=e.lastWriteAt;if(i!=null&&!isIso(i))return t("`lastWriteAt` must be an ISO time, null, or absent");const l=e.lastError;if(l!==void 0&&typeof l!="string")return t("`lastError` must be a string, or absent");const S=e.truncated;if(S!==void 0&&!(isObj(S)&&isCount(S.groups)))return t("`truncated` must be { groups: <how many were dropped> }, or absent");const d=e.groups;let r;if(d!==void 0){if(!Array.isArray(d))return t("`groups` must be a list, or absent");if(d.length>exports.SOURCE_MAX_GROUPS)return t(overCap(d.length,"groups"));const p=new Set;r=[];for(let R=0;R<d.length;R++){const h=d[R],m=`groups[${R}]`;if(!isObj(h))return t(`${m} is not an object`);const A=keyWrong(h.key,m,p);if(A)return t(A);for(const o of["objects","bytes"])if(!isCount(h[o]))return t(`${m}.${o} must be a whole number \u2265 0`);const I=h.labels,x=labelsWrong(I,m);if(x)return t(x);r.push({key:h.key,...I!==void 0?{labels:I}:{},objects:h.objects,bytes:h.bytes})}}const a=u(p=>e[p]!==void 0?{[p]:e[p]}:{},"count");return{ok:!0,store:{at:s,objects:e.objects,bytes:e.bytes,...n!==void 0?{quotaBytes:n}:{},...a("opsInWindow"),...a("writesInWindow"),...a("deletesInWindow"),...a("errorsInWindow"),...a("windowSec"),...i!==void 0?{lastWriteAt:i}:{},...l!==void 0?{lastError:cutText(l,exports.SOURCE_ERROR_MAX)}:{},...r?{groups:r}:{},...S!==void 0?{truncated:{groups:S.groups}}:{}}}}b(parseStoreSnapshot,"parseStoreSnapshot"),g(parseStoreSnapshot,"parseStoreSnapshot"),u(parseStoreSnapshot,"parseStoreSnapshot");const TRAFFIC_COUNTS=["messagesInWindow","failuresInWindow","rateLimitedInWindow"];function parseTrafficSnapshot(e){const t=u(r=>({ok:!1,reason:r}),"fail");if(!isObj(e))return t("the snapshot is not a JSON object");if(e.schema!==exports.TRAFFIC_WIRE_SCHEMA)return t(notSchema(e.schema,exports.TRAFFIC_WIRE_SCHEMA));const s=e.at;if(!isIso(s))return t("`at` is not an ISO time");const n=e.windowSec;if(n!==void 0&&!isCount(n))return t("`windowSec` must be a whole number \u2265 0, or absent");const i=e.truncated;if(i!==void 0&&!(isObj(i)&&isCount(i.channels)))return t("`truncated` must be { channels: <how many were dropped> }, or absent");const l=e.channels;if(!Array.isArray(l))return t("`channels` is not a list");if(l.length>exports.SOURCE_MAX_GROUPS)return t(overCap(l.length,"channels"));const S=new Set,d=[];for(let r=0;r<l.length;r++){const a=l[r],p=`channels[${r}]`;if(!isObj(a))return t(`${p} is not an object`);const R=keyWrong(a.key,p,S);if(R)return t(R);const h=a.direction;if(h!==void 0&&!exports.TRAFFIC_DIRECTIONS.includes(h))return t(`${p}.direction must be ${exports.TRAFFIC_DIRECTIONS.join(", ")}, or absent`);const m=a.counterpart;if(m!==void 0&&!(typeof m=="string"&&m.length>0&&m.length<=200))return t(`${p}.counterpart must be a string of 1\u2013200 characters, or absent`);for(const O of TRAFFIC_COUNTS)if(a[O]!==void 0&&!isCount(a[O]))return t(`${p}.${O} must be a whole number \u2265 0, or absent`);const A=a.p95Ms;if(A!==void 0&&!(finite(A)&&A>=0))return t(`${p}.p95Ms must be milliseconds \u2265 0, or absent`);const I=a.lastAt;if(I!=null&&!isIso(I))return t(`${p}.lastAt must be an ISO time, null, or absent`);const x=a.lastError;if(x!==void 0&&typeof x!="string")return t(`${p}.lastError must be a string, or absent`);const o=a.labels,c=labelsWrong(o,p);if(c)return t(c);const f=u(O=>a[O]!==void 0?{[O]:a[O]}:{},"count");d.push({key:a.key,...o!==void 0?{labels:o}:{},...h!==void 0?{direction:h}:{},...m!==void 0?{counterpart:m}:{},...f("messagesInWindow"),...f("failuresInWindow"),...f("rateLimitedInWindow"),...A!==void 0?{p95Ms:A}:{},...I!==void 0?{lastAt:I}:{},...x!==void 0?{lastError:cutText(x,exports.SOURCE_ERROR_MAX)}:{}})}return{ok:!0,traffic:{at:s,...n!==void 0?{windowSec:n}:{},channels:d,...i!==void 0?{truncated:{channels:i.channels}}:{}}}}b(parseTrafficSnapshot,"parseTrafficSnapshot"),g(parseTrafficSnapshot,"parseTrafficSnapshot"),u(parseTrafficSnapshot,"parseTrafficSnapshot");const sourceFull=u((e,t)=>({[exports.SOURCE_SNAPSHOT_FIELD[e]]:t}),"sourceFull");exports.sourceFull=sourceFull;const declRaw=u(e=>({sourceKind:e.kind,name:e.name,...e.path!==void 0?{path:e.path}:{},intervalSec:e.intervalSec,thresholds:{...e.thresholds},...e.feeds!==void 0?{feeds:e.feeds}:{}}),"declRaw"),canonical=u(e=>{if(Array.isArray(e))return e.map(canonical);if(!isObj(e))return e;const t={};for(const s of Object.keys(e).sort())t[s]=canonical(e[s]);return t},"canonical");function sourceDigest(e){return(0,node_crypto_1.createHash)("sha1").update(JSON.stringify(canonical(e))??"null").digest("hex").slice(0,16)}b(sourceDigest,"sourceDigest"),g(sourceDigest,"sourceDigest"),u(sourceDigest,"sourceDigest");const oldestOf=u(e=>e.pending>0&&e.oldestPendingAt?Date.parse(e.oldestPendingAt):Number.POSITIVE_INFINITY,"oldestOf");function keepQueueSnapshot(e,t,s,n){const i={groups:t.length,pending:0,inFlight:0,failed:0};let l;for(const r of t)i.pending+=r.pending,i.inFlight+=r.inFlight??0,i.failed+=r.failed??0,r.completedInWindow!==void 0&&(l=(l??0)+r.completedInWindow);l!==void 0&&(i.completedInWindow=l);const S=[...t].sort((r,a)=>oldestOf(r)-oldestOf(a)||a.pending-r.pending||(r.key<a.key?-1:r.key>a.key?1:0)).map(({key:r,...a})=>({group:r,...a})),d=n?{groups:n.groups}:void 0;return{at:e,receivedAt:s,totals:i,groups:S,...d?{truncated:d}:{},digest:sourceDigest({groups:S,truncated:d??null})}}b(keepQueueSnapshot,"keepQueueSnapshot"),g(keepQueueSnapshot,"keepQueueSnapshot"),u(keepQueueSnapshot,"keepQueueSnapshot");function keepLoopSnapshot(e,t){const{at:s,...n}=e;return{at:s,receivedAt:t,digest:sourceDigest(n),...n}}b(keepLoopSnapshot,"keepLoopSnapshot"),g(keepLoopSnapshot,"keepLoopSnapshot"),u(keepLoopSnapshot,"keepLoopSnapshot");const byKey=u((e,t)=>e<t?-1:e>t?1:0,"byKey");function keepStoreSnapshot(e,t){const{at:s,groups:n,truncated:i,...l}=e,S=n?[...n].sort((r,a)=>a.bytes-r.bytes||a.objects-r.objects||byKey(r.key,a.key)).map(({key:r,...a})=>({group:r,...a})):void 0,d={...l,...S?{groups:S}:{},...i?{truncated:{groups:i.groups}}:{}};return{at:s,receivedAt:t,digest:sourceDigest(d),...d}}b(keepStoreSnapshot,"keepStoreSnapshot"),g(keepStoreSnapshot,"keepStoreSnapshot"),u(keepStoreSnapshot,"keepStoreSnapshot");const messagesOf=u(e=>e.messagesInWindow??-1,"messagesOf");function keepTrafficSnapshot(e,t){const{at:s,channels:n,truncated:i,...l}=e,S=[...n].sort((r,a)=>messagesOf(a)-messagesOf(r)||byKey(r.key,a.key)).map(({key:r,...a})=>({channel:r,...a})),d={...l,channels:S,...i?{truncated:{channels:i.channels}}:{}};return{at:s,receivedAt:t,digest:sourceDigest(d),...d}}b(keepTrafficSnapshot,"keepTrafficSnapshot"),g(keepTrafficSnapshot,"keepTrafficSnapshot"),u(keepTrafficSnapshot,"keepTrafficSnapshot");const sourceSame=u(e=>({digest:e.digest,at:e.at,receivedAt:e.receivedAt}),"sourceSame");exports.sourceSame=sourceSame;function buildSourcePollRaw(e,t,s,n,i,l){return{kind:"source-poll",provenance:"reported",project:e,...declRaw(t),state:s.state,...s.detail!==void 0?{detail:s.detail}:{},...s.status!==void 0?{status:s.status}:{},polledAt:s.polledAt,...s.durationMs!==void 0?{durationMs:s.durationMs}:{},reportEveryMs:n,...i>0?{failures:i}:{},...l??{}}}b(buildSourcePollRaw,"buildSourcePollRaw"),g(buildSourcePollRaw,"buildSourcePollRaw"),u(buildSourcePollRaw,"buildSourcePollRaw");function buildSourceDeclarationRaw(e,t){return{kind:"source-declaration",project:e,sources:t.sources.map(declRaw),problems:[...t.problems]}}b(buildSourceDeclarationRaw,"buildSourceDeclarationRaw"),g(buildSourceDeclarationRaw,"buildSourceDeclarationRaw"),u(buildSourceDeclarationRaw,"buildSourceDeclarationRaw");const span=u(e=>{const t=Math.round(e/6e4);return e<6e4?`${Math.max(0,Math.round(e/1e3))}s`:t<120?`${t}m`:`${Math.floor(t/60)}h${t%60?` ${t%60}m`:""}`},"span"),loopWords=u(e=>`${e.lastRunAt===null?"has not run since the service started":`last run ${span(Math.max(0,Date.parse(e.at)-Date.parse(e.lastRunAt)))} before it was measured`}${e.lastOutcome?`, ${e.lastOutcome}`:""}${e.lastItems!==void 0?`, ${e.lastItems} item${e.lastItems===1?"":"s"}`:""}`,"loopWords"),plural=u((e,t)=>`${e} ${t}${e===1?"":"s"}`,"plural"),byteSize=u(e=>{const t=["B","kB","MB","GB","TB","PB"];let s=e,n=0;for(;s>=999.5&&n<t.length-1;)s/=1e3,n+=1;return n===0?`${e} B`:`${s<9.95?s.toFixed(1):Math.round(s)} ${t[n]}`},"byteSize"),storeWords=u(e=>{const t=typeof e.quotaBytes=="number"&&e.quotaBytes>0?` of ${byteSize(e.quotaBytes)} (${Math.round(e.bytes/e.quotaBytes*1e3)/10}%)`:"",s=e.errorsInWindow?`, ${plural(e.errorsInWindow,"error")}${e.windowSec?` in ${span(e.windowSec*1e3)}`:""}`:"";return`${plural(e.objects,"object")}, ${byteSize(e.bytes)}${t}${s}`},"storeWords"),trafficWords=u(e=>{let t,s=0,n=0;for(const l of e.channels)l.messagesInWindow!==void 0&&(t=(t??0)+l.messagesInWindow),s+=l.failuresInWindow??0,n+=l.rateLimitedInWindow??0;const i=t!==void 0?`, ${plural(t,"message")}${e.windowSec?` in ${span(e.windowSec*1e3)}`:""}`:"";return`${plural(e.channels.length,"channel")}${i}${s?`, ${s} failed`:""}${n?`, ${n} rate-limited`:""}`},"trafficWords");function sourcePollTitle(e,t){const s=`${e.sourceKind} ${e.project}/${e.name} (reported)`,n=t??e[exports.SOURCE_SNAPSHOT_FIELD[e.sourceKind]];if(e.state!=="current"||!n)return`${s}: ${e.state}${e.detail?` \u2014 ${e.detail}`:""}`;if(e.sourceKind==="loop")return`${s}: ${loopWords(n)}`;if(e.sourceKind==="store")return`${s}: ${storeWords(n)}`;if(e.sourceKind==="traffic")return`${s}: ${trafficWords(n)}`;const i=n,l=i.groups.find(d=>d.pending>0&&d.oldestPendingAt),S=l?.oldestPendingAt?Date.parse(i.at)-Date.parse(l.oldestPendingAt):void 0;return`${s}: ${i.totals.pending} pending in ${i.totals.groups} group${i.totals.groups===1?"":"s"}${S!==void 0?`, oldest waiting ${span(Math.max(0,S))}`:""}`}b(sourcePollTitle,"sourcePollTitle"),g(sourcePollTitle,"sourcePollTitle"),u(sourcePollTitle,"sourcePollTitle");function requestOverSocket(e,t,s,n,i=exports.SOURCE_MAX_BYTES){return new Promise(l=>{let S=!1,d;const r=u(p=>{S||(S=!0,clearTimeout(a),l(p))},"finish"),a=setTimeout(()=>{r({ok:!1,code:"ETIMEDOUT",message:`no answer within ${n} ms`}),d?.destroy()},n);a.unref?.();try{d=http.request({socketPath:e,path:t,method:"GET",agent:!1,headers:s},p=>{const R=[];let h=0;p.on("data",m=>{if(!S){if(h+=m.length,h>i){r({ok:!0,status:p.statusCode??0,body:"",truncated:!0}),p.destroy();return}R.push(m)}}),p.on("end",()=>r({ok:!0,status:p.statusCode??0,body:Buffer.concat(R).toString("utf8"),truncated:!1})),p.on("error",m=>r({ok:!1,code:m.code??"ERESPONSE",message:m.message}))}),d.on("error",p=>r({ok:!1,code:p.code??"EREQUEST",message:p.message})),d.end()}catch(p){r({ok:!1,code:p.code??"EREQUEST",message:p.message})}})}b(requestOverSocket,"requestOverSocket"),g(requestOverSocket,"requestOverSocket"),u(requestOverSocket,"requestOverSocket");const snippet=u(e=>e.replace(/\s+/g," ").trim().slice(0,160),"snippet");function readSnapshot(e,t,s){let n;try{n=JSON.parse(t)}catch{return{ok:!1,reason:`not JSON: ${snippet(t)||"(an empty body)"}`}}if(e==="loop"){const l=parseLoopSnapshot(n);return l.ok===!0?{ok:!0,kept:keepLoopSnapshot(l.loop,s)}:l}if(e==="store"){const l=parseStoreSnapshot(n);return l.ok===!0?{ok:!0,kept:keepStoreSnapshot(l.store,s)}:l}if(e==="traffic"){const l=parseTrafficSnapshot(n);return l.ok===!0?{ok:!0,kept:keepTrafficSnapshot(l.traffic,s)}:l}const i=parseQueueSnapshot(n);return i.ok===!0?{ok:!0,kept:keepQueueSnapshot(i.at,i.groups,s,i.truncated)}:i}b(readSnapshot,"readSnapshot"),g(readSnapshot,"readSnapshot"),u(readSnapshot,"readSnapshot");function createSourcePoller(e){const t=e.now??Date.now,s=e.timeoutMs??(0,exports.sourcesTimeoutMs)(),n=Math.max(1,e.maxConcurrent??(0,exports.sourcesConcurrency)()),i=e.socketOf??(o=>(0,discovery_1.pickSock)(o.pool,e.scanTtlMs??1500)),l=e.request??requestOverSocket,S=e.log??(o=>console.warn(o)),d=new WeakMap,r=new Map;let a=0,p;const R=u(o=>{const c=o.decl;let f=d.get(c);if(!f){f=parseSourceDecls(o.decl.sources),d.set(c,f);for(const E of f.problems)S(`[gateway] ${o.project}: cluster.sources \u2014 ${E}`)}const O=t();return(f.reportedAt===void 0||O-f.reportedAt>=exports.SOURCE_DECLARATION_REPORT_MS)&&(f.reportedAt=O,e.emit(o,f.problems.length?"warning":"info",f.problems.length?`sources ${o.project}: ${f.problems.length} cluster.sources entr${f.problems.length===1?"y":"ies"} not read \u2014 ${f.problems[0]}`:`sources ${o.project}: reads ${f.sources.map(E=>`${E.kind} "${E.name}"${isPolled(E)?"":" (push-only)"}`).join(", ")}`,`source-declaration:${o.wsKey}:${o.project}`,buildSourceDeclarationRaw(o.project,f))),f},"declarationOf"),h=u(o=>{if(o.state==="starting")return{notRunning:"it is starting \u2014 read once it is up"};const c=i(o);return c?{socket:c}:{notRunning:o.state==="up"?"it has no live pod socket \u2014 no pod runs it now":"it is scaled to zero \u2014 the lens does not start a service to read a source"}},"reach"),m=u((o,c)=>{const f=o.good;if(f)return o.full&&o.full.digest===f.digest&&c-o.full.at<exports.SOURCE_FULL_REPORT_MS?{same:(0,exports.sourceSame)(f)}:(o.full={digest:f.digest,at:c},(0,exports.sourceFull)(o.decl.kind,f))},"carried"),A=u((o,c)=>{const f=o.last;if(!f)return;const O=t();if(!c&&o.reportedAt!==void 0&&O-o.reportedAt<o.reportEveryMs)return;o.reportedAt=O;const E=buildSourcePollRaw(o.svc.project,o.decl,f,o.reportEveryMs,o.failures,m(o,O)),_=f.state==="unreachable"||f.state==="refused"||f.state==="malformed";e.emit(o.svc,_?"warning":"info",sourcePollTitle(E,o.good),`source:${o.svc.wsKey}:${o.svc.project}:${o.decl.name}`,E)},"report"),I=u(async o=>{const c=t(),f=o.decl.intervalSec*1e3;o.inFlight=!0,a+=1;const O=o.last?.state;try{const E=h(o.svc);if("notRunning"in E){o.last={state:"not-running",detail:E.notRunning,polledAt:c},o.failures=0,o.nextAt=c+f,o.reportEveryMs=exports.SOURCE_NOT_RUNNING_REPORT_MS,A(o,O!=="not-running");return}const _=e.serviceKey(o.svc),T=await l(E.socket,o.decl.path,{accept:"application/json","x-lensmcp-probe":`source:${o.decl.kind}`,..._?{"x-internal-token":_}:{}},s,exports.SOURCE_MAX_BYTES),$=Math.max(0,t()-c);if(T.ok===!1){const v=T.code==="ECONNREFUSED"||T.code==="ENOENT";o.last=v&&o.svc.state!=="up"?{state:"not-running",detail:`nothing listens on its pod socket \u2014 the service is ${o.svc.state}`,polledAt:c,durationMs:$}:{state:"unreachable",detail:T.code==="ETIMEDOUT"?T.message:`${T.code}: ${snippet(T.message)}`,polledAt:c,durationMs:$}}else if(T.status<200||T.status>299){const v=snippet(T.body);o.last={state:"refused",status:T.status,detail:`HTTP ${T.status}${v?`: ${v}`:""}`,polledAt:c,durationMs:$}}else if(T.truncated)o.last={state:"malformed",detail:`the snapshot is larger than ${exports.SOURCE_MAX_BYTES/1024} KiB`,polledAt:c,durationMs:$};else{const v=readSnapshot(o.decl.kind,T.body,t());v.ok===!0?(o.good=v.kept,o.last={state:"current",polledAt:c,durationMs:$}):o.last={state:"malformed",detail:v.reason,polledAt:c,durationMs:$}}const M=o.last.state==="unreachable"||o.last.state==="refused"||o.last.state==="malformed";o.failures=M?o.failures+1:0;const y=M?sourceBackoffMs(f,o.failures):f;o.nextAt=c+y,o.reportEveryMs=o.last.state==="not-running"?exports.SOURCE_NOT_RUNNING_REPORT_MS:y,A(o,o.last.state!=="not-running"||O!=="not-running")}catch(E){o.last={state:"unreachable",detail:`the poll failed: ${snippet(E?.message??String(E))}`,polledAt:c},o.failures+=1,o.nextAt=c+sourceBackoffMs(f,o.failures),o.reportEveryMs=o.nextAt-c,A(o,!0)}finally{o.inFlight=!1,a-=1}},"pollOne"),x=u(async()=>{if(e.stopped?.())return;const o=new Set;for(const E of e.services())if(E.decl.sources!==void 0)for(const _ of R(E).sources){if(!isPolled(_))continue;const T=`${E.wsKey} ${E.project} ${_.kind} ${_.name}`;o.add(T);const $=r.get(T);$?($.svc!==E||$.decl!==_)&&($.svc=E,$.decl=_):r.set(T,{svc:E,decl:_,nextAt:0,inFlight:!1,failures:0,reportEveryMs:_.intervalSec*1e3})}for(const[E,_]of[...r.entries()])!o.has(E)&&!_.inFlight&&r.delete(E);const c=t(),f=[...r.values()].filter(E=>!E.inFlight&&c>=E.nextAt).sort((E,_)=>E.nextAt-_.nextAt),O=[];for(const E of f){if(a>=n)break;O.push(I(E))}await Promise.all(O)},"tick");return{tick:x,start(o=1e3){return p&&clearInterval(p),p=setInterval(()=>{x().catch(c=>console.error("[gateway] source poll error:",c))},o),p.unref(),p},stop(){p&&clearInterval(p),p=void 0},snapshot(){const o=t();return[...r.values()].map(c=>{const f=c.last!==void 0&&o-c.last.polledAt>(0,exports.sourceStaleAfterMs)(c.reportEveryMs);return{wsKey:c.svc.wsKey,project:c.svc.project,name:c.decl.name,kind:c.decl.kind,path:c.decl.path,state:c.last?f?"stale":c.last.state:"never-polled",...c.last?.detail!==void 0?{detail:c.last.detail}:{},...c.last?.status!==void 0?{status:c.last.status}:{},...c.last?{polledAt:c.last.polledAt}:{},failures:c.failures,nextAt:c.nextAt,...c.good?{...(0,exports.sourceFull)(c.decl.kind,c.good),ageMs:Math.max(0,o-c.good.receivedAt)}:{}}})}}}b(createSourcePoller,"createSourcePoller"),g(createSourcePoller,"createSourcePoller"),u(createSourcePoller,"createSourcePoller");
1
+ "use strict";var C=Object.defineProperty;var g=(e,t)=>C(e,"name",{value:t,configurable:!0});var U=Object.defineProperty,u=g((e,t)=>U(e,"name",{value:t,configurable:!0}),"u");Object.defineProperty(exports,"__esModule",{value:!0}),exports.sourceSame=exports.sourceFull=exports.sourceStaleAfterMs=exports.SOURCE_BACKOFF_MAX_MS=exports.SOURCE_DECLARATION_REPORT_MS=exports.SOURCE_NOT_RUNNING_REPORT_MS=exports.SOURCE_MAX_PER_SERVICE=exports.SOURCE_MAX_GROUPS=exports.SOURCE_MAX_BYTES=exports.SOURCE_ERROR_MAX=exports.LOOP_MAX_INTERVAL_SEC=exports.SOURCE_FULL_REPORT_MS=exports.TRAFFIC_DEFAULT_RATE_LIMITED=exports.TRAFFIC_DEFAULT_P95_MS=exports.TRAFFIC_DEFAULT_FAILURE_PCT=exports.STORE_DEFAULT_ORPHAN_MIN=exports.STORE_DEFAULT_ERROR_RATE_PCT=exports.STORE_DEFAULT_QUOTA_PCT=exports.LOOP_DEFAULT_IDLE_MIN=exports.QUEUE_DEFAULT_STALLED_MIN=exports.QUEUE_DEFAULT_OLDEST_WAIT_MIN=exports.SOURCE_MIN_INTERVAL_SEC=exports.SOURCE_DEFAULT_INTERVAL_SEC=exports.TRAFFIC_DIRECTIONS=exports.LOOP_OUTCOMES=exports.SOURCE_SNAPSHOT_FIELD=exports.TRAFFIC_WIRE_SCHEMA=exports.STORE_WIRE_SCHEMA=exports.LOOP_WIRE_SCHEMA=exports.QUEUE_WIRE_SCHEMA=exports.SOURCE_KINDS_READ=exports.SOURCE_KINDS=exports.sourcesConcurrency=exports.sourcesTimeoutMs=exports.sourcesEnabled=void 0,exports.sourceBackoffMs=sourceBackoffMs,exports.parseSourceDecls=parseSourceDecls,exports.parseQueueSnapshot=parseQueueSnapshot,exports.parseLoopSnapshot=parseLoopSnapshot,exports.parseStoreSnapshot=parseStoreSnapshot,exports.parseTrafficSnapshot=parseTrafficSnapshot,exports.sourceDigest=sourceDigest,exports.keepQueueSnapshot=keepQueueSnapshot,exports.keepLoopSnapshot=keepLoopSnapshot,exports.keepStoreSnapshot=keepStoreSnapshot,exports.keepTrafficSnapshot=keepTrafficSnapshot,exports.buildSourcePollRaw=buildSourcePollRaw,exports.buildSourceDeclarationRaw=buildSourceDeclarationRaw,exports.sourcePollTitle=sourcePollTitle,exports.requestOverSocket=requestOverSocket,exports.createSourcePoller=createSourcePoller;const tslib_1=require("tslib"),node_crypto_1=require("node:crypto"),http=tslib_1.__importStar(require("node:http")),discovery_1=require("./discovery"),readEnv=u(e=>process.env[e],"readEnv"),envInt=u((e,t,o)=>{const n=Number(readEnv(e));return Number.isInteger(n)&&n>=o?n:t},"envInt"),sourcesEnabled=u(()=>readEnv("LENSMCP_SOURCES")!=="0","sourcesEnabled");exports.sourcesEnabled=sourcesEnabled;const sourcesTimeoutMs=u(()=>envInt("LENSMCP_SOURCES_TIMEOUT_MS",3e3,100),"sourcesTimeoutMs");exports.sourcesTimeoutMs=sourcesTimeoutMs;const sourcesConcurrency=u(()=>envInt("LENSMCP_SOURCES_CONCURRENCY",4,1),"sourcesConcurrency");exports.sourcesConcurrency=sourcesConcurrency,exports.SOURCE_KINDS=["queue","loop","store","traffic"],exports.SOURCE_KINDS_READ=["queue","loop","store","traffic"],exports.QUEUE_WIRE_SCHEMA="lensmcp.queue/v1",exports.LOOP_WIRE_SCHEMA="lensmcp.loop/v1",exports.STORE_WIRE_SCHEMA="lensmcp.store/v1",exports.TRAFFIC_WIRE_SCHEMA="lensmcp.traffic/v1",exports.SOURCE_SNAPSHOT_FIELD={queue:"snapshot",loop:"loop",store:"store",traffic:"traffic"},exports.LOOP_OUTCOMES=["ok","failed","skipped"],exports.TRAFFIC_DIRECTIONS=["inbound","outbound"],exports.SOURCE_DEFAULT_INTERVAL_SEC=10,exports.SOURCE_MIN_INTERVAL_SEC=2,exports.QUEUE_DEFAULT_OLDEST_WAIT_MIN=10,exports.QUEUE_DEFAULT_STALLED_MIN=15,exports.LOOP_DEFAULT_IDLE_MIN=10,exports.STORE_DEFAULT_QUOTA_PCT=90,exports.STORE_DEFAULT_ERROR_RATE_PCT=5,exports.STORE_DEFAULT_ORPHAN_MIN=60,exports.TRAFFIC_DEFAULT_FAILURE_PCT=5,exports.TRAFFIC_DEFAULT_P95_MS=2e3,exports.TRAFFIC_DEFAULT_RATE_LIMITED=1,exports.SOURCE_FULL_REPORT_MS=6e4,exports.LOOP_MAX_INTERVAL_SEC=86400,exports.SOURCE_ERROR_MAX=500,exports.SOURCE_MAX_BYTES=256*1024,exports.SOURCE_MAX_GROUPS=500,exports.SOURCE_MAX_PER_SERVICE=16,exports.SOURCE_NOT_RUNNING_REPORT_MS=6e4,exports.SOURCE_DECLARATION_REPORT_MS=5*6e4,exports.SOURCE_BACKOFF_MAX_MS=6e4;const sourceStaleAfterMs=u(e=>Math.max(3e4,3*Math.max(0,e)),"sourceStaleAfterMs");exports.sourceStaleAfterMs=sourceStaleAfterMs;function sourceBackoffMs(e,t){return t<=1?e:Math.min(e*2**Math.min(t-1,10),Math.max(e,exports.SOURCE_BACKOFF_MAX_MS))}g(sourceBackoffMs,"sourceBackoffMs"),u(sourceBackoffMs,"sourceBackoffMs");const isPolled=u(e=>e.path!==void 0,"isPolled"),ENTRY_KEYS={queue:["kind","name","path","intervalSec","thresholds"],loop:["kind","name","path","intervalSec","thresholds","feeds"],store:["kind","name","path","intervalSec","thresholds"],traffic:["kind","name","path","intervalSec","thresholds"]},finite=u(e=>typeof e=="number"&&Number.isFinite(e),"finite"),MINUTES={ok:u(e=>finite(e)&&e>0&&e<=10080,"ok"),must:"must be minutes, more than 0 and at most 10080"},PERCENT={ok:u(e=>finite(e)&&e>0&&e<=100,"ok"),must:"must be a percent, more than 0 and at most 100"},MILLISECONDS={ok:u(e=>finite(e)&&e>0&&e<=6e5,"ok"),must:"must be milliseconds, more than 0 and at most 600000"},COUNT={ok:u(e=>Number.isInteger(e)&&e>=1&&e<=1e6,"ok"),must:"must be a count, a whole number from 1 to 1000000"},THRESHOLDS={queue:{oldestWaitMin:{def:exports.QUEUE_DEFAULT_OLDEST_WAIT_MIN,...MINUTES},stalledMin:{def:exports.QUEUE_DEFAULT_STALLED_MIN,...MINUTES}},loop:{idleMin:{def:exports.LOOP_DEFAULT_IDLE_MIN,...MINUTES}},store:{quotaPct:{def:exports.STORE_DEFAULT_QUOTA_PCT,...PERCENT},errorRatePct:{def:exports.STORE_DEFAULT_ERROR_RATE_PCT,...PERCENT},orphanMin:{def:exports.STORE_DEFAULT_ORPHAN_MIN,...MINUTES}},traffic:{failurePct:{def:exports.TRAFFIC_DEFAULT_FAILURE_PCT,...PERCENT},p95Ms:{def:exports.TRAFFIC_DEFAULT_P95_MS,...MILLISECONDS},rateLimited:{def:exports.TRAFFIC_DEFAULT_RATE_LIMITED,...COUNT}}},PATH_RE=/^\/(?!\/)[^\s#\u0000-\u001f\u007f]{0,511}$/,NAME_RE=/^[^\u0000-\u001f\u007f]{1,100}$/,isObj=u(e=>typeof e=="object"&&e!==null&&!Array.isArray(e),"isObj");function parseSourceDecls(e){const t=[],o=[],n=[];if(e===void 0)return{sources:t,problems:o};if(!Array.isArray(e))return{sources:t,problems:["`sources` is not a list of { kind, name, path } entries \u2014 no source is read"]};e.forEach((i,l)=>{const E=`sources[${l}]`;if(!isObj(i)){o.push(`${E} is not an object \u2014 not read`);return}const d=typeof i.name=="string"&&i.name.trim()?`${E} "${i.name}"`:E,r=i.kind;if(typeof r!="string"||!exports.SOURCE_KINDS_READ.includes(r)){o.push(`${d}: kind ${JSON.stringify(r??null)} is not a source kind (${exports.SOURCE_KINDS.join(", ")}) \u2014 not read`);return}const a=r,p=Object.keys(i).filter(_=>!ENTRY_KEYS[a].includes(_));if(p.length){o.push(`${d}: unknown key${p.length===1?"":"s"} ${p.map(_=>JSON.stringify(_)).join(", ")} for a ${a} source (known: ${ENTRY_KEYS[a].join(", ")}) \u2014 not read`);return}const R=i.name;if(typeof R!="string"||!R.trim()||!NAME_RE.test(R)){o.push(`${E}: name ${JSON.stringify(R??null)} must be 1\u2013100 characters, not blank \u2014 not read`);return}if(t.some(_=>_.name===R)){o.push(`${d}: the name is declared twice on this service \u2014 read once`);return}const h=i.path;if(h===void 0&&a!=="traffic"&&a!=="loop"){o.push(`${d}: a ${a} source needs a path \u2014 the route on the service that answers "lensmcp.${a}/v1" (only a loop or a traffic source may go without one, as push-only) \u2014 not read`);return}if(h!==void 0&&(typeof h!="string"||!PATH_RE.test(h)||h.split("?")[0].split("/").includes(".."))){o.push(`${d}: path ${JSON.stringify(h)} must be a route on the service, starting with "/" (e.g. "/api/dev/lens/backlog") \u2014 not read`);return}const m=i.intervalSec;if(m!==void 0&&!(typeof m=="number"&&Number.isInteger(m)&&m>=exports.SOURCE_MIN_INTERVAL_SEC&&m<=3600)){o.push(`${d}: intervalSec ${JSON.stringify(m)} must be a whole number of seconds from ${exports.SOURCE_MIN_INTERVAL_SEC} to 3600 \u2014 not read`);return}const A=i.thresholds;if(A!==void 0&&!isObj(A)){o.push(`${d}: thresholds must be an object \u2014 not read`);return}const b=isObj(A)?A:{},I=THRESHOLDS[a],s=Object.keys(I),c=Object.keys(b).filter(_=>!s.includes(_));if(c.length){o.push(`${d}: unknown threshold${c.length===1?"":"s"} ${c.map(_=>JSON.stringify(_)).join(", ")} for a ${a} source (known: ${s.join(", ")}) \u2014 not read`);return}const f=s.find(_=>b[_]!==void 0&&!I[_].ok(b[_]));if(f){o.push(`${d}: thresholds.${f} ${JSON.stringify(b[f])} ${I[f].must} \u2014 not read`);return}if(t.length>=exports.SOURCE_MAX_PER_SERVICE){o.push(`${d}: more than ${exports.SOURCE_MAX_PER_SERVICE} sources on one service \u2014 not read`);return}const O={};for(const _ of s)O[_]=b[_]??I[_].def;const S={kind:a,name:R,...h!==void 0?{path:h}:{},intervalSec:m??exports.SOURCE_DEFAULT_INTERVAL_SEC,thresholds:O};t.push(S),a==="loop"&&i.feeds!==void 0&&n.push({decl:S,label:d,feeds:i.feeds})});for(const{decl:i,label:l,feeds:E}of n)typeof E!="string"||!E.trim()?o.push(`${l}: feeds ${JSON.stringify(E)} must be the name of a queue source on this service \u2014 read without it`):t.some(d=>d.kind==="queue"&&d.name===E)?i.feeds=E:o.push(`${l}: feeds ${JSON.stringify(E)} names no queue source on this service \u2014 read without it`);return{sources:t,problems:o}}g(parseSourceDecls,"parseSourceDecls"),u(parseSourceDecls,"parseSourceDecls");const ISO_RE=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(?::\d{2}(?:\.\d{1,9})?)?(?:Z|[+-]\d{2}:?\d{2})$/,isIso=u(e=>typeof e=="string"&&ISO_RE.test(e)&&!Number.isNaN(Date.parse(e)),"isIso"),isCount=u(e=>typeof e=="number"&&Number.isSafeInteger(e)&&e>=0,"isCount"),notSchema=u((e,t)=>`schema is ${e===void 0?"absent":JSON.stringify(e).slice(0,60)}, not "${t}"`,"notSchema"),keyWrong=u((e,t,o)=>{if(typeof e!="string"||e.length===0||e.length>200)return`${t}.key must be a string of 1\u2013200 characters`;if(o.has(e))return`${t}.key ${JSON.stringify(e)} appears twice`;o.add(e)},"keyWrong"),labelsWrong=u((e,t)=>{if(e===void 0)return;if(!isObj(e))return`${t}.labels must be an object of strings`;const o=Object.entries(e);if(o.length>16)return`${t}.labels has more than 16 entries`;for(const[n,i]of o)if(n.length===0||n.length>64||typeof i!="string"||i.length>200)return`${t}.labels.${n.slice(0,64)} must be a string of at most 200 characters`},"labelsWrong"),overCap=u((e,t)=>`${e} ${t} \u2014 at most ${exports.SOURCE_MAX_GROUPS}; cap them and say \`truncated: { ${t}: <dropped> }\``,"overCap");function parseQueueSnapshot(e){const t=u(d=>({ok:!1,reason:d}),"fail");if(!isObj(e))return t("the snapshot is not a JSON object");if(e.schema!==exports.QUEUE_WIRE_SCHEMA)return t(notSchema(e.schema,exports.QUEUE_WIRE_SCHEMA));const o=e.at;if(!isIso(o))return t("`at` is not an ISO time");const n=e.truncated;if(n!==void 0&&!(isObj(n)&&isCount(n.groups)))return t("`truncated` must be { groups: <how many were dropped> }, or absent");const i=e.groups;if(!Array.isArray(i))return t("`groups` is not a list");if(i.length>exports.SOURCE_MAX_GROUPS)return t(overCap(i.length,"groups"));const l=new Set,E=[];for(let d=0;d<i.length;d++){const r=i[d],a=`groups[${d}]`;if(!isObj(r))return t(`${a} is not an object`);const p=keyWrong(r.key,a,l);if(p)return t(p);if(!isCount(r.pending))return t(`${a}.pending must be a whole number \u2265 0`);for(const A of["inFlight","failed","completedInWindow"])if(r[A]!==void 0&&!isCount(r[A]))return t(`${a}.${A} must be a whole number \u2265 0, or absent`);const R=r.oldestPendingAt;if(R!=null&&!isIso(R))return t(`${a}.oldestPendingAt must be an ISO time, null, or absent`);const h=r.labels,m=labelsWrong(h,a);if(m)return t(m);E.push({key:r.key,...h!==void 0?{labels:h}:{},pending:r.pending,...r.inFlight!==void 0?{inFlight:r.inFlight}:{},...r.failed!==void 0?{failed:r.failed}:{},...R!==void 0?{oldestPendingAt:R}:{},...r.completedInWindow!==void 0?{completedInWindow:r.completedInWindow}:{}})}return{ok:!0,at:o,groups:E,...n!==void 0?{truncated:{groups:n.groups}}:{}}}g(parseQueueSnapshot,"parseQueueSnapshot"),u(parseQueueSnapshot,"parseQueueSnapshot");const LOOP_COUNTS=["lastDurationMs","lastItems","runsInWindow","itemsInWindow","failuresInWindow","windowSec"],cutText=u((e,t)=>{if(e.length<=t)return e;const o=t-1,n=e.charCodeAt(o-1);return`${e.slice(0,n>=55296&&n<=56319?o-1:o)}\u2026`},"cutText");function parseLoopSnapshot(e){const t=u(a=>({ok:!1,reason:a}),"fail");if(!isObj(e))return t("the snapshot is not a JSON object");if(e.schema!==exports.LOOP_WIRE_SCHEMA)return t(notSchema(e.schema,exports.LOOP_WIRE_SCHEMA));const o=e.at;if(!isIso(o))return t("`at` is not an ISO time");const n=e.intervalSec;if(!(typeof n=="number"&&Number.isFinite(n)&&n>0&&n<=exports.LOOP_MAX_INTERVAL_SEC))return t(`\`intervalSec\` must be the loop's own period in seconds, more than 0 and at most ${exports.LOOP_MAX_INTERVAL_SEC}`);const i=e.lastRunAt;if(i===void 0)return t("`lastRunAt` is absent \u2014 say null if the loop has not run since the service started");if(i!==null&&!isIso(i))return t("`lastRunAt` must be an ISO time, or null if the loop has not run since the service started");for(const a of LOOP_COUNTS)if(e[a]!==void 0&&!isCount(e[a]))return t(`\`${a}\` must be a whole number \u2265 0, or absent`);const l=e.lastOutcome;if(l!==void 0&&!exports.LOOP_OUTCOMES.includes(l))return t(`\`lastOutcome\` must be ${exports.LOOP_OUTCOMES.join(", ")}, or absent`);const E=e.nextRunAt;if(E!=null&&!isIso(E))return t("`nextRunAt` must be an ISO time, null, or absent");const d=e.lastError;if(d!==void 0&&typeof d!="string")return t("`lastError` must be a string, or absent");const r=u(a=>e[a]!==void 0?{[a]:e[a]}:{},"count");return{ok:!0,loop:{at:o,intervalSec:n,lastRunAt:i,...r("lastDurationMs"),...l!==void 0?{lastOutcome:l}:{},...r("lastItems"),...E!==void 0?{nextRunAt:E}:{},...r("runsInWindow"),...r("itemsInWindow"),...r("failuresInWindow"),...r("windowSec"),...d!==void 0?{lastError:cutText(d,exports.SOURCE_ERROR_MAX)}:{}}}}g(parseLoopSnapshot,"parseLoopSnapshot"),u(parseLoopSnapshot,"parseLoopSnapshot");const STORE_COUNTS=["opsInWindow","writesInWindow","deletesInWindow","errorsInWindow","windowSec"];function parseStoreSnapshot(e){const t=u(p=>({ok:!1,reason:p}),"fail");if(!isObj(e))return t("the snapshot is not a JSON object");if(e.schema!==exports.STORE_WIRE_SCHEMA)return t(notSchema(e.schema,exports.STORE_WIRE_SCHEMA));const o=e.at;if(!isIso(o))return t("`at` is not an ISO time");for(const p of["objects","bytes"])if(!isCount(e[p]))return t(`\`${p}\` must be a whole number \u2265 0`);const n=e.quotaBytes;if(n!=null&&!isCount(n))return t("`quotaBytes` must be a whole number \u2265 0, null when it has no quota, or absent");for(const p of STORE_COUNTS)if(e[p]!==void 0&&!isCount(e[p]))return t(`\`${p}\` must be a whole number \u2265 0, or absent`);const i=e.lastWriteAt;if(i!=null&&!isIso(i))return t("`lastWriteAt` must be an ISO time, null, or absent");const l=e.lastError;if(l!==void 0&&typeof l!="string")return t("`lastError` must be a string, or absent");const E=e.truncated;if(E!==void 0&&!(isObj(E)&&isCount(E.groups)))return t("`truncated` must be { groups: <how many were dropped> }, or absent");const d=e.groups;let r;if(d!==void 0){if(!Array.isArray(d))return t("`groups` must be a list, or absent");if(d.length>exports.SOURCE_MAX_GROUPS)return t(overCap(d.length,"groups"));const p=new Set;r=[];for(let R=0;R<d.length;R++){const h=d[R],m=`groups[${R}]`;if(!isObj(h))return t(`${m} is not an object`);const A=keyWrong(h.key,m,p);if(A)return t(A);for(const s of["objects","bytes"])if(!isCount(h[s]))return t(`${m}.${s} must be a whole number \u2265 0`);const b=h.labels,I=labelsWrong(b,m);if(I)return t(I);r.push({key:h.key,...b!==void 0?{labels:b}:{},objects:h.objects,bytes:h.bytes})}}const a=u(p=>e[p]!==void 0?{[p]:e[p]}:{},"count");return{ok:!0,store:{at:o,objects:e.objects,bytes:e.bytes,...n!==void 0?{quotaBytes:n}:{},...a("opsInWindow"),...a("writesInWindow"),...a("deletesInWindow"),...a("errorsInWindow"),...a("windowSec"),...i!==void 0?{lastWriteAt:i}:{},...l!==void 0?{lastError:cutText(l,exports.SOURCE_ERROR_MAX)}:{},...r?{groups:r}:{},...E!==void 0?{truncated:{groups:E.groups}}:{}}}}g(parseStoreSnapshot,"parseStoreSnapshot"),u(parseStoreSnapshot,"parseStoreSnapshot");const TRAFFIC_COUNTS=["messagesInWindow","failuresInWindow","rateLimitedInWindow"];function parseTrafficSnapshot(e){const t=u(r=>({ok:!1,reason:r}),"fail");if(!isObj(e))return t("the snapshot is not a JSON object");if(e.schema!==exports.TRAFFIC_WIRE_SCHEMA)return t(notSchema(e.schema,exports.TRAFFIC_WIRE_SCHEMA));const o=e.at;if(!isIso(o))return t("`at` is not an ISO time");const n=e.windowSec;if(n!==void 0&&!isCount(n))return t("`windowSec` must be a whole number \u2265 0, or absent");const i=e.truncated;if(i!==void 0&&!(isObj(i)&&isCount(i.channels)))return t("`truncated` must be { channels: <how many were dropped> }, or absent");const l=e.channels;if(!Array.isArray(l))return t("`channels` is not a list");if(l.length>exports.SOURCE_MAX_GROUPS)return t(overCap(l.length,"channels"));const E=new Set,d=[];for(let r=0;r<l.length;r++){const a=l[r],p=`channels[${r}]`;if(!isObj(a))return t(`${p} is not an object`);const R=keyWrong(a.key,p,E);if(R)return t(R);const h=a.direction;if(h!==void 0&&!exports.TRAFFIC_DIRECTIONS.includes(h))return t(`${p}.direction must be ${exports.TRAFFIC_DIRECTIONS.join(", ")}, or absent`);const m=a.counterpart;if(m!==void 0&&!(typeof m=="string"&&m.length>0&&m.length<=200))return t(`${p}.counterpart must be a string of 1\u2013200 characters, or absent`);for(const O of TRAFFIC_COUNTS)if(a[O]!==void 0&&!isCount(a[O]))return t(`${p}.${O} must be a whole number \u2265 0, or absent`);const A=a.p95Ms;if(A!==void 0&&!(finite(A)&&A>=0))return t(`${p}.p95Ms must be milliseconds \u2265 0, or absent`);const b=a.lastAt;if(b!=null&&!isIso(b))return t(`${p}.lastAt must be an ISO time, null, or absent`);const I=a.lastError;if(I!==void 0&&typeof I!="string")return t(`${p}.lastError must be a string, or absent`);const s=a.labels,c=labelsWrong(s,p);if(c)return t(c);const f=u(O=>a[O]!==void 0?{[O]:a[O]}:{},"count");d.push({key:a.key,...s!==void 0?{labels:s}:{},...h!==void 0?{direction:h}:{},...m!==void 0?{counterpart:m}:{},...f("messagesInWindow"),...f("failuresInWindow"),...f("rateLimitedInWindow"),...A!==void 0?{p95Ms:A}:{},...b!==void 0?{lastAt:b}:{},...I!==void 0?{lastError:cutText(I,exports.SOURCE_ERROR_MAX)}:{}})}return{ok:!0,traffic:{at:o,...n!==void 0?{windowSec:n}:{},channels:d,...i!==void 0?{truncated:{channels:i.channels}}:{}}}}g(parseTrafficSnapshot,"parseTrafficSnapshot"),u(parseTrafficSnapshot,"parseTrafficSnapshot");const sourceFull=u((e,t)=>({[exports.SOURCE_SNAPSHOT_FIELD[e]]:t}),"sourceFull");exports.sourceFull=sourceFull;const declRaw=u(e=>({sourceKind:e.kind,name:e.name,...e.path!==void 0?{path:e.path}:{},intervalSec:e.intervalSec,thresholds:{...e.thresholds},...e.feeds!==void 0?{feeds:e.feeds}:{}}),"declRaw"),canonical=u(e=>{if(Array.isArray(e))return e.map(canonical);if(!isObj(e))return e;const t={};for(const o of Object.keys(e).sort())t[o]=canonical(e[o]);return t},"canonical");function sourceDigest(e){return(0,node_crypto_1.createHash)("sha1").update(JSON.stringify(canonical(e))??"null").digest("hex").slice(0,16)}g(sourceDigest,"sourceDigest"),u(sourceDigest,"sourceDigest");const oldestOf=u(e=>e.pending>0&&e.oldestPendingAt?Date.parse(e.oldestPendingAt):Number.POSITIVE_INFINITY,"oldestOf");function keepQueueSnapshot(e,t,o,n){const i={groups:t.length,pending:0,inFlight:0,failed:0};let l;for(const r of t)i.pending+=r.pending,i.inFlight+=r.inFlight??0,i.failed+=r.failed??0,r.completedInWindow!==void 0&&(l=(l??0)+r.completedInWindow);l!==void 0&&(i.completedInWindow=l);const E=[...t].sort((r,a)=>oldestOf(r)-oldestOf(a)||a.pending-r.pending||(r.key<a.key?-1:r.key>a.key?1:0)).map(({key:r,...a})=>({group:r,...a})),d=n?{groups:n.groups}:void 0;return{at:e,receivedAt:o,totals:i,groups:E,...d?{truncated:d}:{},digest:sourceDigest({groups:E,truncated:d??null})}}g(keepQueueSnapshot,"keepQueueSnapshot"),u(keepQueueSnapshot,"keepQueueSnapshot");function keepLoopSnapshot(e,t){const{at:o,...n}=e;return{at:o,receivedAt:t,digest:sourceDigest(n),...n}}g(keepLoopSnapshot,"keepLoopSnapshot"),u(keepLoopSnapshot,"keepLoopSnapshot");const byKey=u((e,t)=>e<t?-1:e>t?1:0,"byKey");function keepStoreSnapshot(e,t){const{at:o,groups:n,truncated:i,...l}=e,E=n?[...n].sort((r,a)=>a.bytes-r.bytes||a.objects-r.objects||byKey(r.key,a.key)).map(({key:r,...a})=>({group:r,...a})):void 0,d={...l,...E?{groups:E}:{},...i?{truncated:{groups:i.groups}}:{}};return{at:o,receivedAt:t,digest:sourceDigest(d),...d}}g(keepStoreSnapshot,"keepStoreSnapshot"),u(keepStoreSnapshot,"keepStoreSnapshot");const messagesOf=u(e=>e.messagesInWindow??-1,"messagesOf");function keepTrafficSnapshot(e,t){const{at:o,channels:n,truncated:i,...l}=e,E=[...n].sort((r,a)=>messagesOf(a)-messagesOf(r)||byKey(r.key,a.key)).map(({key:r,...a})=>({channel:r,...a})),d={...l,channels:E,...i?{truncated:{channels:i.channels}}:{}};return{at:o,receivedAt:t,digest:sourceDigest(d),...d}}g(keepTrafficSnapshot,"keepTrafficSnapshot"),u(keepTrafficSnapshot,"keepTrafficSnapshot");const sourceSame=u(e=>({digest:e.digest,at:e.at,receivedAt:e.receivedAt}),"sourceSame");exports.sourceSame=sourceSame;function buildSourcePollRaw(e,t,o,n,i,l){return{kind:"source-poll",provenance:"reported",project:e,...declRaw(t),state:o.state,...o.detail!==void 0?{detail:o.detail}:{},...o.status!==void 0?{status:o.status}:{},polledAt:o.polledAt,...o.durationMs!==void 0?{durationMs:o.durationMs}:{},reportEveryMs:n,...i>0?{failures:i}:{},...l??{}}}g(buildSourcePollRaw,"buildSourcePollRaw"),u(buildSourcePollRaw,"buildSourcePollRaw");function buildSourceDeclarationRaw(e,t){return{kind:"source-declaration",project:e,sources:t.sources.map(declRaw),problems:[...t.problems]}}g(buildSourceDeclarationRaw,"buildSourceDeclarationRaw"),u(buildSourceDeclarationRaw,"buildSourceDeclarationRaw");const span=u(e=>{const t=Math.round(e/6e4);return e<6e4?`${Math.max(0,Math.round(e/1e3))}s`:t<120?`${t}m`:`${Math.floor(t/60)}h${t%60?` ${t%60}m`:""}`},"span"),loopWords=u(e=>`${e.lastRunAt===null?"has not run since the service started":`last run ${span(Math.max(0,Date.parse(e.at)-Date.parse(e.lastRunAt)))} before it was measured`}${e.lastOutcome?`, ${e.lastOutcome}`:""}${e.lastItems!==void 0?`, ${e.lastItems} item${e.lastItems===1?"":"s"}`:""}`,"loopWords"),plural=u((e,t)=>`${e} ${t}${e===1?"":"s"}`,"plural"),byteSize=u(e=>{const t=["B","kB","MB","GB","TB","PB"];let o=e,n=0;for(;o>=999.5&&n<t.length-1;)o/=1e3,n+=1;return n===0?`${e} B`:`${o<9.95?o.toFixed(1):Math.round(o)} ${t[n]}`},"byteSize"),storeWords=u(e=>{const t=typeof e.quotaBytes=="number"&&e.quotaBytes>0?` of ${byteSize(e.quotaBytes)} (${Math.round(e.bytes/e.quotaBytes*1e3)/10}%)`:"",o=e.errorsInWindow?`, ${plural(e.errorsInWindow,"error")}${e.windowSec?` in ${span(e.windowSec*1e3)}`:""}`:"";return`${plural(e.objects,"object")}, ${byteSize(e.bytes)}${t}${o}`},"storeWords"),trafficWords=u(e=>{let t,o=0,n=0;for(const l of e.channels)l.messagesInWindow!==void 0&&(t=(t??0)+l.messagesInWindow),o+=l.failuresInWindow??0,n+=l.rateLimitedInWindow??0;const i=t!==void 0?`, ${plural(t,"message")}${e.windowSec?` in ${span(e.windowSec*1e3)}`:""}`:"";return`${plural(e.channels.length,"channel")}${i}${o?`, ${o} failed`:""}${n?`, ${n} rate-limited`:""}`},"trafficWords");function sourcePollTitle(e,t){const o=`${e.sourceKind} ${e.project}/${e.name} (reported)`,n=t??e[exports.SOURCE_SNAPSHOT_FIELD[e.sourceKind]];if(e.state!=="current"||!n)return`${o}: ${e.state}${e.detail?` \u2014 ${e.detail}`:""}`;if(e.sourceKind==="loop")return`${o}: ${loopWords(n)}`;if(e.sourceKind==="store")return`${o}: ${storeWords(n)}`;if(e.sourceKind==="traffic")return`${o}: ${trafficWords(n)}`;const i=n,l=i.groups.find(d=>d.pending>0&&d.oldestPendingAt),E=l?.oldestPendingAt?Date.parse(i.at)-Date.parse(l.oldestPendingAt):void 0;return`${o}: ${i.totals.pending} pending in ${i.totals.groups} group${i.totals.groups===1?"":"s"}${E!==void 0?`, oldest waiting ${span(Math.max(0,E))}`:""}`}g(sourcePollTitle,"sourcePollTitle"),u(sourcePollTitle,"sourcePollTitle");function requestOverSocket(e,t,o,n,i=exports.SOURCE_MAX_BYTES){return new Promise(l=>{let E=!1,d;const r=u(p=>{E||(E=!0,clearTimeout(a),l(p))},"finish"),a=setTimeout(()=>{r({ok:!1,code:"ETIMEDOUT",message:`no answer within ${n} ms`}),d?.destroy()},n);a.unref?.();try{d=http.request({socketPath:e,path:t,method:"GET",agent:!1,headers:o},p=>{const R=[];let h=0;p.on("data",m=>{if(!E){if(h+=m.length,h>i){r({ok:!0,status:p.statusCode??0,body:"",truncated:!0}),p.destroy();return}R.push(m)}}),p.on("end",()=>r({ok:!0,status:p.statusCode??0,body:Buffer.concat(R).toString("utf8"),truncated:!1})),p.on("error",m=>r({ok:!1,code:m.code??"ERESPONSE",message:m.message}))}),d.on("error",p=>r({ok:!1,code:p.code??"EREQUEST",message:p.message})),d.end()}catch(p){r({ok:!1,code:p.code??"EREQUEST",message:p.message})}})}g(requestOverSocket,"requestOverSocket"),u(requestOverSocket,"requestOverSocket");const snippet=u(e=>e.replace(/\s+/g," ").trim().slice(0,160),"snippet");function readSnapshot(e,t,o){let n;try{n=JSON.parse(t)}catch{return{ok:!1,reason:`not JSON: ${snippet(t)||"(an empty body)"}`}}if(e==="loop"){const l=parseLoopSnapshot(n);return l.ok===!0?{ok:!0,kept:keepLoopSnapshot(l.loop,o)}:l}if(e==="store"){const l=parseStoreSnapshot(n);return l.ok===!0?{ok:!0,kept:keepStoreSnapshot(l.store,o)}:l}if(e==="traffic"){const l=parseTrafficSnapshot(n);return l.ok===!0?{ok:!0,kept:keepTrafficSnapshot(l.traffic,o)}:l}const i=parseQueueSnapshot(n);return i.ok===!0?{ok:!0,kept:keepQueueSnapshot(i.at,i.groups,o,i.truncated)}:i}g(readSnapshot,"readSnapshot"),u(readSnapshot,"readSnapshot");function createSourcePoller(e){const t=e.now??Date.now,o=e.timeoutMs??(0,exports.sourcesTimeoutMs)(),n=Math.max(1,e.maxConcurrent??(0,exports.sourcesConcurrency)()),i=e.socketOf??(s=>(0,discovery_1.pickSock)(s.pool,e.scanTtlMs??1500)),l=e.request??requestOverSocket,E=e.log??(s=>console.warn(s)),d=new WeakMap,r=new Map;let a=0,p;const R=u(s=>{const c=s.decl;let f=d.get(c);if(!f){f=parseSourceDecls(s.decl.sources),d.set(c,f);for(const S of f.problems)E(`[gateway] ${s.project}: cluster.sources \u2014 ${S}`)}const O=t();return(f.reportedAt===void 0||O-f.reportedAt>=exports.SOURCE_DECLARATION_REPORT_MS)&&(f.reportedAt=O,e.emit(s,f.problems.length?"warning":"info",f.problems.length?`sources ${s.project}: ${f.problems.length} cluster.sources entr${f.problems.length===1?"y":"ies"} not read \u2014 ${f.problems[0]}`:`sources ${s.project}: reads ${f.sources.map(S=>`${S.kind} "${S.name}"${isPolled(S)?"":" (push-only)"}`).join(", ")}`,`source-declaration:${s.wsKey}:${s.project}`,buildSourceDeclarationRaw(s.project,f))),f},"declarationOf"),h=u(s=>{if(s.state==="starting")return{notRunning:"it is starting \u2014 read once it is up"};const c=i(s);return c?{socket:c}:{notRunning:s.state==="up"?"it has no live pod socket \u2014 no pod runs it now":"it is scaled to zero \u2014 the lens does not start a service to read a source"}},"reach"),m=u((s,c)=>{const f=s.good;if(f)return s.full&&s.full.digest===f.digest&&c-s.full.at<exports.SOURCE_FULL_REPORT_MS?{same:(0,exports.sourceSame)(f)}:(s.full={digest:f.digest,at:c},(0,exports.sourceFull)(s.decl.kind,f))},"carried"),A=u((s,c)=>{const f=s.last;if(!f)return;const O=t();if(!c&&s.reportedAt!==void 0&&O-s.reportedAt<s.reportEveryMs)return;s.reportedAt=O;const S=buildSourcePollRaw(s.svc.project,s.decl,f,s.reportEveryMs,s.failures,m(s,O)),_=f.state==="unreachable"||f.state==="refused"||f.state==="malformed";e.emit(s.svc,_?"warning":"info",sourcePollTitle(S,s.good),`source:${s.svc.wsKey}:${s.svc.project}:${s.decl.name}`,S)},"report"),b=u(async s=>{const c=t(),f=s.decl.intervalSec*1e3;s.inFlight=!0,a+=1;const O=s.last?.state;try{const S=h(s.svc);if("notRunning"in S){s.last={state:"not-running",detail:S.notRunning,polledAt:c},s.failures=0,s.nextAt=c+f,s.reportEveryMs=exports.SOURCE_NOT_RUNNING_REPORT_MS,A(s,O!=="not-running");return}const _=e.serviceKey(s.svc),T=await l(S.socket,s.decl.path,{accept:"application/json","x-lensmcp-probe":`source:${s.decl.kind}`,..._?{"x-internal-token":_}:{}},o,exports.SOURCE_MAX_BYTES),x=Math.max(0,t()-c);if(T.ok===!1){const $=T.code==="ECONNREFUSED"||T.code==="ENOENT";s.last=$&&s.svc.state!=="up"?{state:"not-running",detail:`nothing listens on its pod socket \u2014 the service is ${s.svc.state}`,polledAt:c,durationMs:x}:{state:"unreachable",detail:T.code==="ETIMEDOUT"?T.message:`${T.code}: ${snippet(T.message)}`,polledAt:c,durationMs:x}}else if(T.status<200||T.status>299){const $=snippet(T.body);s.last={state:"refused",status:T.status,detail:`HTTP ${T.status}${$?`: ${$}`:""}`,polledAt:c,durationMs:x}}else if(T.truncated)s.last={state:"malformed",detail:`the snapshot is larger than ${exports.SOURCE_MAX_BYTES/1024} KiB`,polledAt:c,durationMs:x};else{const $=readSnapshot(s.decl.kind,T.body,t());$.ok===!0?(s.good=$.kept,s.last={state:"current",polledAt:c,durationMs:x}):s.last={state:"malformed",detail:$.reason,polledAt:c,durationMs:x}}const v=s.last.state==="unreachable"||s.last.state==="refused"||s.last.state==="malformed";s.failures=v?s.failures+1:0;const M=v?sourceBackoffMs(f,s.failures):f;s.nextAt=c+M,s.reportEveryMs=s.last.state==="not-running"?exports.SOURCE_NOT_RUNNING_REPORT_MS:M,A(s,s.last.state!=="not-running"||O!=="not-running")}catch(S){s.last={state:"unreachable",detail:`the poll failed: ${snippet(S?.message??String(S))}`,polledAt:c},s.failures+=1,s.nextAt=c+sourceBackoffMs(f,s.failures),s.reportEveryMs=s.nextAt-c,A(s,!0)}finally{s.inFlight=!1,a-=1}},"pollOne"),I=u(async()=>{if(e.stopped?.())return;const s=new Set;for(const S of e.services())if(S.decl.sources!==void 0)for(const _ of R(S).sources){if(!isPolled(_))continue;const T=`${S.wsKey} ${S.project} ${_.kind} ${_.name}`;s.add(T);const x=r.get(T);x?(x.svc!==S||x.decl!==_)&&(x.svc=S,x.decl=_):r.set(T,{svc:S,decl:_,nextAt:0,inFlight:!1,failures:0,reportEveryMs:_.intervalSec*1e3})}for(const[S,_]of[...r.entries()])!s.has(S)&&!_.inFlight&&r.delete(S);const c=t(),f=[...r.values()].filter(S=>!S.inFlight&&c>=S.nextAt).sort((S,_)=>S.nextAt-_.nextAt),O=[];for(const S of f){if(a>=n)break;O.push(b(S))}await Promise.all(O)},"tick");return{tick:I,start(s=1e3){return p&&clearInterval(p),p=setInterval(()=>{I().catch(c=>console.error("[gateway] source poll error:",c))},s),p.unref(),p},stop(){p&&clearInterval(p),p=void 0},snapshot(){const s=t();return[...r.values()].map(c=>{const f=c.last!==void 0&&s-c.last.polledAt>(0,exports.sourceStaleAfterMs)(c.reportEveryMs);return{wsKey:c.svc.wsKey,project:c.svc.project,name:c.decl.name,kind:c.decl.kind,path:c.decl.path,state:c.last?f?"stale":c.last.state:"never-polled",...c.last?.detail!==void 0?{detail:c.last.detail}:{},...c.last?.status!==void 0?{status:c.last.status}:{},...c.last?{polledAt:c.last.polledAt}:{},failures:c.failures,nextAt:c.nextAt,...c.good?{...(0,exports.sourceFull)(c.decl.kind,c.good),ageMs:Math.max(0,s-c.good.receivedAt)}:{}}})}}}g(createSourcePoller,"createSourcePoller"),u(createSourcePoller,"createSourcePoller");
@@ -270,6 +270,17 @@ export interface LensFrontendSupervisor {
270
270
  /** Ensure a replacement is running and resolve when its route is ready. */
271
271
  recover(frontend: LensFrontend, reason: string): Promise<boolean>;
272
272
  }
273
+ /**
274
+ * What a `POST /awake` did with one service (awake.ts): it was `up` already; it is `queued` behind the machine's one
275
+ * start at a time, or `starting`; it `started`; the memory floor `deferred` it; it `failed` to come up; or it was
276
+ * `skipped` (stopped by hand and not named, or a stop/start/restart of it under way). `reason` says why for the last three.
277
+ */
278
+ export interface ServiceWake {
279
+ /** When it was asked for (ms). */
280
+ at: number;
281
+ outcome: 'up' | 'queued' | 'starting' | 'started' | 'deferred' | 'failed' | 'skipped';
282
+ reason?: string;
283
+ }
273
284
  /**
274
285
  * A restart someone asked for — an agent's `service_restart`, `lensmcp restart <service>` — of ONE service of one
275
286
  * workspace or worktree. A fresh tree re-reads what the service reads when it starts: its config files, its env, its
@@ -339,6 +350,19 @@ export interface ServiceCtl {
339
350
  rollFailure?: string;
340
351
  /** The latest restart someone ASKED for (control.ts `POST /restart`, lifecycle.ts `restartService`) — settled or not. */
341
352
  restart?: ServiceRestart;
353
+ /**
354
+ * Kept awake until then (ms): the idle sweep stops it no sooner, and its idle window counts from then rather than from
355
+ * a request long ago (control.ts `POST /awake`, awake.ts). A queue worker's work arrives with no request, and stops
356
+ * with its service (issues/closed/foodguard-123).
357
+ */
358
+ awakeUntil?: number;
359
+ /** When the idle sweep last stopped it, and why — what a preflight says of a required service it finds down. */
360
+ lastIdleStop?: {
361
+ at: number;
362
+ why: string;
363
+ };
364
+ /** The latest `POST /awake` of it, and how its start went ({@link ServiceWake}). */
365
+ wake?: ServiceWake;
342
366
  /** The pod GENERATION the current `proc` was spawned as (`LENSMCP_POD_GENERATION`, echoed in `/__lensmcp/alive`). */
343
367
  generation?: number;
344
368
  /** How the current `proc` was started: the gateway's serve runner, or `nx run` (serve-launch.ts). An `nx run`
@@ -1 +1 @@
1
- "use strict";var C=Object.defineProperty;var L=(_,E)=>C(_,"name",{value:E,configurable:!0});var O=Object.defineProperty,e=L((_,E)=>O(_,"name",{value:E,configurable:!0}),"e"),M=Object.defineProperty,R=e((_,E)=>M(_,"name",{value:E,configurable:!0}),"R");Object.defineProperty(exports,"__esModule",{value:!0}),exports.BODY_STALL_MS=exports.GATEWAY_CONN_CHECK_MS=exports.GATEWAY_MAX_CONNECTIONS=exports.GATEWAY_STOP_GRACE_MS=exports.GATEWAY_HEADERS_TIMEOUT_MS=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.MAX_COLD_STARTS=exports.ORPHAN_REAP_EVERY_MS=exports.TREE_KILL_GRACE_MS=exports.POD_MAX_CONCURRENT_ROLLS=exports.POD_ROLL_READY_MS=exports.POD_RECYCLE_MODE=exports.POD_WATCHER_SILENT=exports.POD_WATCHER_UNVERIFIED=exports.LENS_WATCH_SCOPE_ENABLED=exports.LENS_WATCHER_UNVERIFIED=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_ALIVE_PATH=exports.POD_WEDGE_CONFIRM_MS=exports.POD_ALIVE_PROBE_TIMEOUT_MS=exports.POD_SLOW_FIRST_BYTE_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,exports.GATEWAY_H2_RESET_RATE=exports.GATEWAY_H2_RESET_BURST=void 0;const tslib_1=require("tslib"),os=tslib_1.__importStar(require("node:os"));function envInt(_,E,T=!1){const S=Number(process.env[_]);return!Number.isFinite(S)||S<0?E:S===0?T?0:E:S}L(envInt,"envInt"),e(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 _=Number(process.env.LENSMCP_POD_RESPONSE_TIMEOUT_MS);return Number.isFinite(_)&&_>0?_:3e4})(),exports.POD_SLOW_FIRST_BYTE_MS=envInt("LENSMCP_POD_SLOW_FIRST_BYTE_MS",10*6e4,!0),exports.POD_ALIVE_PROBE_TIMEOUT_MS=envInt("LENSMCP_POD_ALIVE_PROBE_TIMEOUT_MS",1e3),exports.POD_WEDGE_CONFIRM_MS=envInt("LENSMCP_POD_WEDGE_CONFIRM_MS",1e4,!0),exports.POD_ALIVE_PATH="/__lensmcp/alive",exports.WEDGE_RECYCLE_GRACE_MS=(()=>{const _=Number(process.env.LENSMCP_WEDGE_RECYCLE_GRACE_MS);return Number.isFinite(_)&&_>0?_: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_WATCHER_UNVERIFIED=process.env.LENSMCP_LENS_WATCHER_UNVERIFIED==="keep"?"keep":"recycle",exports.LENS_WATCH_SCOPE_ENABLED=process.env.LENSMCP_LENS_WATCH_SCOPE!=="0",exports.POD_WATCHER_UNVERIFIED=process.env.LENSMCP_POD_WATCHER_UNVERIFIED==="keep"?"keep":"recycle",exports.POD_WATCHER_SILENT=process.env.LENSMCP_POD_WATCHER_SILENT==="recycle"?"recycle":"keep",exports.POD_RECYCLE_MODE=process.env.LENSMCP_POD_RECYCLE_MODE==="in-place"?"in-place":"rolling",exports.POD_ROLL_READY_MS=envInt("LENSMCP_POD_ROLL_READY_MS",18e4),exports.POD_MAX_CONCURRENT_ROLLS=envInt("LENSMCP_POD_MAX_CONCURRENT_ROLLS",2,!0),exports.TREE_KILL_GRACE_MS=envInt("LENSMCP_TREE_KILL_GRACE_MS",1e4,!0),exports.ORPHAN_REAP_EVERY_MS=envInt("LENSMCP_ORPHAN_REAP_MS",3e5,!0),exports.MAX_COLD_STARTS=envInt("LENSMCP_MAX_COLD_STARTS",Math.max(2,Math.floor(os.availableParallelism()/2)),!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),exports.GATEWAY_HEADERS_TIMEOUT_MS=envInt("LENSMCP_HEADERS_TIMEOUT_MS",6e4),exports.GATEWAY_STOP_GRACE_MS=envInt("LENSMCP_STOP_GRACE_MS",3e3),exports.GATEWAY_MAX_CONNECTIONS=envInt("LENSMCP_MAX_CONNECTIONS",0,!0),exports.GATEWAY_CONN_CHECK_MS=envInt("LENSMCP_CONN_CHECK_MS",0,!0),exports.BODY_STALL_MS=envInt("LENSMCP_BODY_STALL_MS",6e4,!0),exports.GATEWAY_H2_RESET_BURST=envInt("LENSMCP_H2_RESET_BURST",1e5),exports.GATEWAY_H2_RESET_RATE=envInt("LENSMCP_H2_RESET_RATE",1e4);
1
+ "use strict";var O=Object.defineProperty;var e=(_,E)=>O(_,"name",{value:E,configurable:!0});var M=Object.defineProperty,R=e((_,E)=>M(_,"name",{value:E,configurable:!0}),"R");Object.defineProperty(exports,"__esModule",{value:!0}),exports.BODY_STALL_MS=exports.GATEWAY_CONN_CHECK_MS=exports.GATEWAY_MAX_CONNECTIONS=exports.GATEWAY_STOP_GRACE_MS=exports.GATEWAY_HEADERS_TIMEOUT_MS=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.MAX_COLD_STARTS=exports.ORPHAN_REAP_EVERY_MS=exports.TREE_KILL_GRACE_MS=exports.POD_MAX_CONCURRENT_ROLLS=exports.POD_ROLL_READY_MS=exports.POD_RECYCLE_MODE=exports.POD_WATCHER_SILENT=exports.POD_WATCHER_UNVERIFIED=exports.LENS_WATCH_SCOPE_ENABLED=exports.LENS_WATCHER_UNVERIFIED=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_ALIVE_PATH=exports.POD_WEDGE_CONFIRM_MS=exports.POD_ALIVE_PROBE_TIMEOUT_MS=exports.POD_SLOW_FIRST_BYTE_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,exports.GATEWAY_H2_RESET_RATE=exports.GATEWAY_H2_RESET_BURST=void 0;const tslib_1=require("tslib"),os=tslib_1.__importStar(require("node:os"));function envInt(_,E,L=!1){const S=Number(process.env[_]);return!Number.isFinite(S)||S<0?E:S===0?L?0:E:S}e(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 _=Number(process.env.LENSMCP_POD_RESPONSE_TIMEOUT_MS);return Number.isFinite(_)&&_>0?_:3e4})(),exports.POD_SLOW_FIRST_BYTE_MS=envInt("LENSMCP_POD_SLOW_FIRST_BYTE_MS",10*6e4,!0),exports.POD_ALIVE_PROBE_TIMEOUT_MS=envInt("LENSMCP_POD_ALIVE_PROBE_TIMEOUT_MS",1e3),exports.POD_WEDGE_CONFIRM_MS=envInt("LENSMCP_POD_WEDGE_CONFIRM_MS",1e4,!0),exports.POD_ALIVE_PATH="/__lensmcp/alive",exports.WEDGE_RECYCLE_GRACE_MS=(()=>{const _=Number(process.env.LENSMCP_WEDGE_RECYCLE_GRACE_MS);return Number.isFinite(_)&&_>0?_: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_WATCHER_UNVERIFIED=process.env.LENSMCP_LENS_WATCHER_UNVERIFIED==="keep"?"keep":"recycle",exports.LENS_WATCH_SCOPE_ENABLED=process.env.LENSMCP_LENS_WATCH_SCOPE!=="0",exports.POD_WATCHER_UNVERIFIED=process.env.LENSMCP_POD_WATCHER_UNVERIFIED==="keep"?"keep":"recycle",exports.POD_WATCHER_SILENT=process.env.LENSMCP_POD_WATCHER_SILENT==="recycle"?"recycle":"keep",exports.POD_RECYCLE_MODE=process.env.LENSMCP_POD_RECYCLE_MODE==="in-place"?"in-place":"rolling",exports.POD_ROLL_READY_MS=envInt("LENSMCP_POD_ROLL_READY_MS",18e4),exports.POD_MAX_CONCURRENT_ROLLS=envInt("LENSMCP_POD_MAX_CONCURRENT_ROLLS",2,!0),exports.TREE_KILL_GRACE_MS=envInt("LENSMCP_TREE_KILL_GRACE_MS",1e4,!0),exports.ORPHAN_REAP_EVERY_MS=envInt("LENSMCP_ORPHAN_REAP_MS",3e5,!0),exports.MAX_COLD_STARTS=envInt("LENSMCP_MAX_COLD_STARTS",Math.max(2,Math.floor(os.availableParallelism()/2)),!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),exports.GATEWAY_HEADERS_TIMEOUT_MS=envInt("LENSMCP_HEADERS_TIMEOUT_MS",6e4),exports.GATEWAY_STOP_GRACE_MS=envInt("LENSMCP_STOP_GRACE_MS",3e3),exports.GATEWAY_MAX_CONNECTIONS=envInt("LENSMCP_MAX_CONNECTIONS",0,!0),exports.GATEWAY_CONN_CHECK_MS=envInt("LENSMCP_CONN_CHECK_MS",0,!0),exports.BODY_STALL_MS=envInt("LENSMCP_BODY_STALL_MS",6e4,!0),exports.GATEWAY_H2_RESET_BURST=envInt("LENSMCP_H2_RESET_BURST",1e5),exports.GATEWAY_H2_RESET_RATE=envInt("LENSMCP_H2_RESET_RATE",1e4);
@@ -1 +1 @@
1
- "use strict";var P=Object.defineProperty;var v=(a,o)=>P(a,"name",{value:o,configurable:!0});var K=Object.defineProperty,w=v((a,o)=>K(a,"name",{value:o,configurable:!0}),"w"),M=Object.defineProperty,u=w((a,o)=>M(a,"name",{value:o,configurable:!0}),"u");Object.defineProperty(exports,"__esModule",{value:!0}),exports.LENS_HMR_REFUSAL_REPORT_MS=void 0,exports.createUpgrade=createUpgrade;const tslib_1=require("tslib"),path=tslib_1.__importStar(require("node:path")),manifest_1=require("../manifest"),discovery_1=require("./discovery"),edge_1=require("./edge"),hmr_reload_1=require("./hmr-reload"),service_keys_1=require("./service-keys");exports.LENS_HMR_REFUSAL_REPORT_MS=1e4;function accountUpgrade(a,o){const i=a.svc;if(!i||o.destroyed)return;i.inflight+=1,i.lastUsed=Date.now();let d=!1;o.once("close",()=>{d||(d=!0,i.inflight-=1,i.lastUsed=Date.now())})}v(accountUpgrade,"accountUpgrade"),w(accountUpgrade,"accountUpgrade"),u(accountUpgrade,"accountUpgrade");function createUpgrade(a){const{rt:o,auth:i,proxy:d,hooks:p,obs:S}=a,y=new Set,k=u(e=>{e.destroyed||(y.add(e),e.once("close",()=>y.delete(e)))},"track");d.proxy.on?.("open",k);const _=new WeakMap,m=new Map,R=u((e,r)=>{const s=Date.now();s-(m.get(e.frontendKey)??0)<exports.LENS_HMR_REFUSAL_REPORT_MS||(m.set(e.frontendKey,s),console.warn(`[gateway] lens HMR socket refused: ${e.frontendKey} at ${e.target} answered ${r} for a tab on ${e.host} \u2014 that tab loads but gets no hot updates; the lens runtime reloads it once if it had a socket before.`),S?.emit("warning",`lens HMR socket refused: ${e.frontendKey} (${r})`,`cluster-lens-hmr-refused:${e.frontendKey}`,{kind:"lens-hmr-refused",frontendKey:e.frontendKey,host:e.host,target:e.target,answer:r},void 0,e.busFile))},"reportRefusal");d.proxy.on?.("proxyReqWs",(e,r)=>{const s=_.get(r);if(!s)return;const c=e;c.once("upgrade",()=>{s.answered=!0}),c.once("response",g=>{s.answered=!0,R(s,`HTTP ${g.statusCode??"?"}`)})});const U=u(async(e,r,s)=>{(0,edge_1.stripOwnedHeaders)(e);const c=(0,edge_1.canonicalize)(e.url??"/");if(c===void 0){r.destroy();return}e.url=c.path+c.query;const g=(e.headers.host||"").split(":")[0],t=(0,manifest_1.matchRoute)(o.routes,g,c.policy+c.query);if(!t){r.destroy();return}(0,edge_1.resolveClientIp)(o,e);const l=p.upgradeContext(e,r,void 0);if(l.route=t,t.internal){const n=i.internal(e,t,void 0);if(!n.ok){r.destroy();return}l.caller=n.caller}else{const n=i.public(e,t,void 0,c.policy);if(!n.ok){r.destroy();return}if(l.claims=n.claims,p.has("afterAuth")&&(await p.run("afterAuth",l),l.responded()))return}const x=t.pool?o.serviceKeys[(0,service_keys_1.serviceKeyId)(t.svc?.wsKey,t.project)]:void 0;if(x&&(e.headers["x-internal-token"]=x),t.prependPrefix&&!e.url?.startsWith(t.prependPrefix)&&(e.url=t.prependPrefix+(e.url??"/")),(0,edge_1.stampForwardingHeaders)(o,e),p.has("onUpgrade")&&(await p.run("onUpgrade",l),l.responded()))return;const h=t.pool?(()=>{const n=(0,discovery_1.pickSock)(t.pool,o.scanTtlMs);return n?{socketPath:n}:void 0})():t.target;if(!h){r.destroy();return}if(t.lens&&String(e.headers["sec-websocket-protocol"]??"").split(",").map(n=>n.trim()).includes("vite-hmr")){const n=t.lens.workspaceKey?`${t.lens.workspaceKey}:${t.lens.project}`:t.lens.project;(0,hmr_reload_1.registerHmrClient)(o,n,r);const f=!t.lens.workspaceRoot||path.resolve(t.lens.workspaceRoot)===path.resolve(o.root??"");_.set(e,{frontendKey:n,host:g,target:String(h),answered:!1,...f?{}:{busFile:path.join(t.lens.workspaceRoot,".lensmcp","events.jsonl")}})}accountUpgrade(t,r),d.proxy.ws(e,r,s,{target:h,changeOrigin:!t.pool,agent:d.agentForTarget(h)},n=>{const f=_.get(e);f&&!f.answered&&R(f,n?.code??n?.message??"an error"),r.destroy()})},"run"),b=u(((e,r,s)=>{r.on("error",()=>r.destroy()),k(r),U(e,r,s).catch(()=>r.destroy())}),"listener");return b.closeTunnels=()=>{const e=[...y];for(const r of e)r.destroy();return y.clear(),e.length},b}v(createUpgrade,"createUpgrade"),w(createUpgrade,"createUpgrade"),u(createUpgrade,"createUpgrade");
1
+ "use strict";var K=Object.defineProperty;var w=(c,s)=>K(c,"name",{value:s,configurable:!0});var M=Object.defineProperty,u=w((c,s)=>M(c,"name",{value:s,configurable:!0}),"u");Object.defineProperty(exports,"__esModule",{value:!0}),exports.LENS_HMR_REFUSAL_REPORT_MS=void 0,exports.createUpgrade=createUpgrade;const tslib_1=require("tslib"),path=tslib_1.__importStar(require("node:path")),manifest_1=require("../manifest"),discovery_1=require("./discovery"),edge_1=require("./edge"),hmr_reload_1=require("./hmr-reload"),service_keys_1=require("./service-keys");exports.LENS_HMR_REFUSAL_REPORT_MS=1e4;function accountUpgrade(c,s){const i=c.svc;if(!i||s.destroyed)return;i.inflight+=1,i.lastUsed=Date.now();let d=!1;s.once("close",()=>{d||(d=!0,i.inflight-=1,i.lastUsed=Date.now())})}w(accountUpgrade,"accountUpgrade"),u(accountUpgrade,"accountUpgrade");function createUpgrade(c){const{rt:s,auth:i,proxy:d,hooks:p,obs:b}=c,y=new Set,_=u(e=>{e.destroyed||(y.add(e),e.once("close",()=>y.delete(e)))},"track");d.proxy.on?.("open",_);const v=new WeakMap,k=new Map,m=u((e,r)=>{const n=Date.now();n-(k.get(e.frontendKey)??0)<exports.LENS_HMR_REFUSAL_REPORT_MS||(k.set(e.frontendKey,n),console.warn(`[gateway] lens HMR socket refused: ${e.frontendKey} at ${e.target} answered ${r} for a tab on ${e.host} \u2014 that tab loads but gets no hot updates; the lens runtime reloads it once if it had a socket before.`),b?.emit("warning",`lens HMR socket refused: ${e.frontendKey} (${r})`,`cluster-lens-hmr-refused:${e.frontendKey}`,{kind:"lens-hmr-refused",frontendKey:e.frontendKey,host:e.host,target:e.target,answer:r},void 0,e.busFile))},"reportRefusal");d.proxy.on?.("proxyReqWs",(e,r)=>{const n=v.get(r);if(!n)return;const a=e;a.once("upgrade",()=>{n.answered=!0}),a.once("response",g=>{n.answered=!0,m(n,`HTTP ${g.statusCode??"?"}`)})});const S=u(async(e,r,n)=>{(0,edge_1.stripOwnedHeaders)(e);const a=(0,edge_1.canonicalize)(e.url??"/");if(a===void 0){r.destroy();return}e.url=a.path+a.query;const g=(e.headers.host||"").split(":")[0],t=(0,manifest_1.matchRoute)(s.routes,g,a.policy+a.query);if(!t){r.destroy();return}(0,edge_1.resolveClientIp)(s,e);const l=p.upgradeContext(e,r,void 0);if(l.route=t,t.internal){const o=i.internal(e,t,void 0);if(!o.ok){r.destroy();return}l.caller=o.caller}else{const o=i.public(e,t,void 0,a.policy);if(!o.ok){r.destroy();return}if(l.claims=o.claims,p.has("afterAuth")&&(await p.run("afterAuth",l),l.responded()))return}const x=t.pool?s.serviceKeys[(0,service_keys_1.serviceKeyId)(t.svc?.wsKey,t.project)]:void 0;if(x&&(e.headers["x-internal-token"]=x),t.prependPrefix&&!e.url?.startsWith(t.prependPrefix)&&(e.url=t.prependPrefix+(e.url??"/")),(0,edge_1.stampForwardingHeaders)(s,e),p.has("onUpgrade")&&(await p.run("onUpgrade",l),l.responded()))return;const h=t.pool?(()=>{const o=(0,discovery_1.pickSock)(t.pool,s.scanTtlMs);return o?{socketPath:o}:void 0})():t.target;if(!h){r.destroy();return}if(t.lens&&String(e.headers["sec-websocket-protocol"]??"").split(",").map(o=>o.trim()).includes("vite-hmr")){const o=t.lens.workspaceKey?`${t.lens.workspaceKey}:${t.lens.project}`:t.lens.project;(0,hmr_reload_1.registerHmrClient)(s,o,r);const f=!t.lens.workspaceRoot||path.resolve(t.lens.workspaceRoot)===path.resolve(s.root??"");v.set(e,{frontendKey:o,host:g,target:String(h),answered:!1,...f?{}:{busFile:path.join(t.lens.workspaceRoot,".lensmcp","events.jsonl")}})}accountUpgrade(t,r),d.proxy.ws(e,r,n,{target:h,changeOrigin:!t.pool,agent:d.agentForTarget(h)},o=>{const f=v.get(e);f&&!f.answered&&m(f,o?.code??o?.message??"an error"),r.destroy()})},"run"),R=u(((e,r,n)=>{r.on("error",()=>r.destroy()),_(r),S(e,r,n).catch(()=>r.destroy())}),"listener");return R.closeTunnels=()=>{const e=[...y];for(const r of e)r.destroy();return y.clear(),e.length},R}w(createUpgrade,"createUpgrade"),u(createUpgrade,"createUpgrade");
@@ -12,6 +12,16 @@ export declare function warmMinFreeBytes(env?: NodeJS.ProcessEnv): number;
12
12
  * `undefined` — never idle-stopped — for the daemon's own and other registered workspaces' services, as before.
13
13
  */
14
14
  export declare function instanceIdleSec(svc: Pick<ServiceCtl, 'decl'>, isInstance: boolean, env?: NodeJS.ProcessEnv): number | undefined;
15
+ /**
16
+ * The idle window the sweep gives `svc` (lifecycle.ts `sweepOnce`) — {@link instanceIdleSec}, an instance being a
17
+ * registered worktree's service, never the daemon's own. One rule for the sweep and for what `/status` says of it.
18
+ */
19
+ export declare function serviceIdleSec(rt: {
20
+ readonly root?: string;
21
+ readonly registry?: {
22
+ get(wsKey: string): WorkspaceFragment | undefined;
23
+ };
24
+ }, svc: Pick<ServiceCtl, 'decl' | 'root' | 'wsKey'>, env?: NodeJS.ProcessEnv): number | undefined;
15
25
  export interface MemoryProbe {
16
26
  platform?: NodeJS.Platform;
17
27
  /** `sysctl -n <name>`. */
@@ -39,6 +49,8 @@ export interface WarmOutcome {
39
49
  outcome: 'up' | 'failed' | 'deferred' | 'already';
40
50
  reason?: string;
41
51
  }
52
+ /** Why a start waits, when the memory the system can still give out is under the floor; nothing when it is not (or unread). */
53
+ export declare function belowFloor(free: number | undefined, minFreeBytes: number): string | undefined;
42
54
  /** Start `services`' always-warm ones, one at a time, while the floor holds. Never throws. */
43
55
  export declare function warmStart(services: readonly ServiceCtl[], deps: WarmStartDeps): Promise<WarmOutcome[]>;
44
56
  export interface WorktreeWarmerDeps {
@@ -61,4 +73,10 @@ export interface WorktreeWarmerDeps {
61
73
  export declare function createWorktreeWarmer(deps: WorktreeWarmerDeps): {
62
74
  onRegister(fragment: WorkspaceFragment): Promise<WarmOutcome[]> | undefined;
63
75
  onUnregister(wsKey: string): void;
76
+ /**
77
+ * Run `job` in the machine's one turn — after every warm start before it, and before any after it. A worktree's
78
+ * services woken for a milestone (control.ts `POST /awake`, awake.ts) start here too, so a wake and a registration
79
+ * never start two compilers at once (issues/closed/foodguard-123).
80
+ */
81
+ take<T>(job: () => Promise<T>): Promise<T>;
64
82
  };
@@ -1 +1 @@
1
- "use strict";var E=Object.defineProperty;var m=(e,r)=>E(e,"name",{value:r,configurable:!0});var _=Object.defineProperty,p=m((e,r)=>_(e,"name",{value:r,configurable:!0}),"p"),f=Object.defineProperty,u=p((e,r)=>f(e,"name",{value:r,configurable:!0}),"u");Object.defineProperty(exports,"__esModule",{value:!0}),exports.DEFAULT_WORKTREE_IDLE_SEC=exports.WORKTREE_IDLE_ENV=exports.DEFAULT_WARM_MIN_FREE_MB=exports.WARM_MIN_FREE_ENV=void 0,exports.warmMinFreeBytes=warmMinFreeBytes,exports.instanceIdleSec=instanceIdleSec,exports.availableMemory=availableMemory,exports.warmStart=warmStart,exports.createWorktreeWarmer=createWorktreeWarmer;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"));exports.WARM_MIN_FREE_ENV="LENSMCP_WARM_MIN_FREE_MB",exports.DEFAULT_WARM_MIN_FREE_MB=4096,exports.WORKTREE_IDLE_ENV="LENSMCP_WORKTREE_IDLE_SEC",exports.DEFAULT_WORKTREE_IDLE_SEC=1800;function warmMinFreeBytes(e=process.env){const r=Number(e[exports.WARM_MIN_FREE_ENV]);return(Number.isFinite(r)&&r>=0?r:exports.DEFAULT_WARM_MIN_FREE_MB)*1024*1024}m(warmMinFreeBytes,"warmMinFreeBytes"),p(warmMinFreeBytes,"warmMinFreeBytes"),u(warmMinFreeBytes,"warmMinFreeBytes");function instanceIdleSec(e,r,i=process.env){if(e.decl.idleKillSec)return e.decl.idleKillSec;if(!r)return;const o=Number(i[exports.WORKTREE_IDLE_ENV]?.trim()||NaN);return!Number.isFinite(o)||o<0?exports.DEFAULT_WORKTREE_IDLE_SEC:o>0?o:void 0}m(instanceIdleSec,"instanceIdleSec"),p(instanceIdleSec,"instanceIdleSec"),u(instanceIdleSec,"instanceIdleSec");function availableMemory(e={}){const r=e.platform??process.platform;try{if(r==="darwin"){const i=e.sysctl??(t=>(0,node_child_process_1.execFileSync)("sysctl",["-n",t],{encoding:"utf8",timeout:2e3})),o=Number(i("kern.memorystatus_level").trim());return!Number.isFinite(o)||o<0||o>100?void 0:Math.round(o/100*(e.totalmem??os.totalmem)())}if(r==="linux"){const i=(e.readFile??(t=>fs.readFileSync(t,"utf8")))("/proc/meminfo"),o=/^MemAvailable:\s+(\d+)\s+kB/m.exec(i)?.[1];return o===void 0?void 0:Number(o)*1024}}catch{}}m(availableMemory,"availableMemory"),p(availableMemory,"availableMemory"),u(availableMemory,"availableMemory");const gb=u(e=>`${(e/1024**3).toFixed(1)} GB`,"gb");async function warmStart(e,r){const i=[],o=e.filter(t=>t.decl.eager&&!t.frozen);for(let t=0;t<o.length;t++){const c=o[t];if(!r.current(c))break;if(c.proc||c.state!=="down"){i.push({project:c.project,outcome:"already"});continue}const l=r.available();if(l!==void 0&&l<r.minFreeBytes){const a=`${gb(l)} of memory free, under the ${gb(r.minFreeBytes)} a warm start keeps (${exports.WARM_MIN_FREE_ENV})`,d=o.slice(t).filter(n=>!n.proc&&n.state==="down");r.log(`[gateway] warm start stopped for ${c.wsKey}: ${a} \u2014 ${d.map(n=>n.project).join(", ")} start on their first request.`);for(const n of d)r.emit(n,"info",`warm start deferred: ${n.project} \u2014 ${a}`,{kind:"service-warm-deferred",project:n.project,reason:a,availableBytes:l,minFreeBytes:r.minFreeBytes}),i.push({project:n.project,outcome:"deferred",reason:a});return i}const s=await r.ensureUp(c).catch(()=>!1);s&&(c.lastUsed=Date.now()),i.push({project:c.project,outcome:s?"up":"failed"})}return i}m(warmStart,"warmStart"),p(warmStart,"warmStart"),u(warmStart,"warmStart");function createWorktreeWarmer(e){const r=new Map,i=e.log??(t=>console.log(t));let o=(e.ready??Promise.resolve()).catch(()=>{});return{onRegister(t){if(!t.instance||t.instance.frozen)return;const c=Symbol(t.wsKey);r.set(t.wsKey,c);const l=o.then(()=>new Promise(s=>setTimeout(s,e.delayMs??1e3).unref?.())).then(()=>warmStart(t.services,{ensureUp:e.ensureUp,available:e.available??(()=>availableMemory()),minFreeBytes:warmMinFreeBytes(e.env),current:u(s=>!e.rt.stopped()&&r.get(s.wsKey)===c&&!!e.rt.registry.get(s.wsKey)?.services.includes(s),"current"),emit:u((s,a,d,n)=>e.obs.emit(a,d,`cluster-service:${s.project}`,{wsKey:s.wsKey,...n},void 0,path.join(s.root,".lensmcp","events.jsonl")),"emit"),log:i})).then(s=>{const a=u(d=>s.filter(n=>n.outcome===d).map(n=>n.project),"by");return s.length&&i(`[gateway] warm start of ${t.wsKey}: up ${a("up").join(", ")||"\u2014"}${a("failed").length?`; failed ${a("failed").join(", ")}`:""}${a("deferred").length?`; on first request ${a("deferred").join(", ")}`:""}`),s});return o=l.catch(()=>{}),l},onUnregister(t){r.delete(t)}}}m(createWorktreeWarmer,"createWorktreeWarmer"),p(createWorktreeWarmer,"createWorktreeWarmer"),u(createWorktreeWarmer,"createWorktreeWarmer");
1
+ "use strict";var m=Object.defineProperty;var u=(e,r)=>m(e,"name",{value:r,configurable:!0});var f=Object.defineProperty,a=u((e,r)=>f(e,"name",{value:r,configurable:!0}),"a");Object.defineProperty(exports,"__esModule",{value:!0}),exports.DEFAULT_WORKTREE_IDLE_SEC=exports.WORKTREE_IDLE_ENV=exports.DEFAULT_WARM_MIN_FREE_MB=exports.WARM_MIN_FREE_ENV=void 0,exports.warmMinFreeBytes=warmMinFreeBytes,exports.instanceIdleSec=instanceIdleSec,exports.serviceIdleSec=serviceIdleSec,exports.availableMemory=availableMemory,exports.belowFloor=belowFloor,exports.warmStart=warmStart,exports.createWorktreeWarmer=createWorktreeWarmer;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"));exports.WARM_MIN_FREE_ENV="LENSMCP_WARM_MIN_FREE_MB",exports.DEFAULT_WARM_MIN_FREE_MB=4096,exports.WORKTREE_IDLE_ENV="LENSMCP_WORKTREE_IDLE_SEC",exports.DEFAULT_WORKTREE_IDLE_SEC=1800;function warmMinFreeBytes(e=process.env){const r=Number(e[exports.WARM_MIN_FREE_ENV]);return(Number.isFinite(r)&&r>=0?r:exports.DEFAULT_WARM_MIN_FREE_MB)*1024*1024}u(warmMinFreeBytes,"warmMinFreeBytes"),a(warmMinFreeBytes,"warmMinFreeBytes");function instanceIdleSec(e,r,n=process.env){if(e.decl.idleKillSec)return e.decl.idleKillSec;if(!r)return;const o=Number(n[exports.WORKTREE_IDLE_ENV]?.trim()||NaN);return!Number.isFinite(o)||o<0?exports.DEFAULT_WORKTREE_IDLE_SEC:o>0?o:void 0}u(instanceIdleSec,"instanceIdleSec"),a(instanceIdleSec,"instanceIdleSec");function serviceIdleSec(e,r,n=process.env){const o=e.root!==void 0&&r.root!==void 0&&path.resolve(r.root)===path.resolve(e.root);return instanceIdleSec(r,!o&&!!e.registry?.get(r.wsKey)?.instance,n)}u(serviceIdleSec,"serviceIdleSec"),a(serviceIdleSec,"serviceIdleSec");function availableMemory(e={}){const r=e.platform??process.platform;try{if(r==="darwin"){const n=e.sysctl??(t=>(0,node_child_process_1.execFileSync)("sysctl",["-n",t],{encoding:"utf8",timeout:2e3})),o=Number(n("kern.memorystatus_level").trim());return!Number.isFinite(o)||o<0||o>100?void 0:Math.round(o/100*(e.totalmem??os.totalmem)())}if(r==="linux"){const n=(e.readFile??(t=>fs.readFileSync(t,"utf8")))("/proc/meminfo"),o=/^MemAvailable:\s+(\d+)\s+kB/m.exec(n)?.[1];return o===void 0?void 0:Number(o)*1024}}catch{}}u(availableMemory,"availableMemory"),a(availableMemory,"availableMemory");const gb=a(e=>`${(e/1024**3).toFixed(1)} GB`,"gb");function belowFloor(e,r){return e!==void 0&&e<r?`${gb(e)} of memory free, under the ${gb(r)} a warm start keeps (${exports.WARM_MIN_FREE_ENV})`:void 0}u(belowFloor,"belowFloor"),a(belowFloor,"belowFloor");async function warmStart(e,r){const n=[],o=e.filter(t=>t.decl.eager&&!t.frozen);for(let t=0;t<o.length;t++){const c=o[t];if(!r.current(c))break;if(c.proc||c.state!=="down"){n.push({project:c.project,outcome:"already"});continue}const d=r.available(),s=belowFloor(d,r.minFreeBytes);if(s){const p=o.slice(t).filter(i=>!i.proc&&i.state==="down");r.log(`[gateway] warm start stopped for ${c.wsKey}: ${s} \u2014 ${p.map(i=>i.project).join(", ")} start on their first request.`);for(const i of p)r.emit(i,"info",`warm start deferred: ${i.project} \u2014 ${s}`,{kind:"service-warm-deferred",project:i.project,reason:s,availableBytes:d,minFreeBytes:r.minFreeBytes}),n.push({project:i.project,outcome:"deferred",reason:s});return n}const l=await r.ensureUp(c).catch(()=>!1);l&&(c.lastUsed=Date.now()),n.push({project:c.project,outcome:l?"up":"failed"})}return n}u(warmStart,"warmStart"),a(warmStart,"warmStart");function createWorktreeWarmer(e){const r=new Map,n=e.log??(t=>console.log(t));let o=(e.ready??Promise.resolve()).catch(()=>{});return{onRegister(t){if(!t.instance||t.instance.frozen)return;const c=Symbol(t.wsKey);r.set(t.wsKey,c);const d=o.then(()=>new Promise(s=>setTimeout(s,e.delayMs??1e3).unref?.())).then(()=>warmStart(t.services,{ensureUp:e.ensureUp,available:e.available??(()=>availableMemory()),minFreeBytes:warmMinFreeBytes(e.env),current:a(s=>!e.rt.stopped()&&r.get(s.wsKey)===c&&!!e.rt.registry.get(s.wsKey)?.services.includes(s),"current"),emit:a((s,l,p,i)=>e.obs.emit(l,p,`cluster-service:${s.project}`,{wsKey:s.wsKey,...i},void 0,path.join(s.root,".lensmcp","events.jsonl")),"emit"),log:n})).then(s=>{const l=a(p=>s.filter(i=>i.outcome===p).map(i=>i.project),"by");return s.length&&n(`[gateway] warm start of ${t.wsKey}: up ${l("up").join(", ")||"\u2014"}${l("failed").length?`; failed ${l("failed").join(", ")}`:""}${l("deferred").length?`; on first request ${l("deferred").join(", ")}`:""}`),s});return o=d.catch(()=>{}),d},onUnregister(t){r.delete(t)},take(t){const c=o.then(t);return o=c.catch(()=>{}),c}}}u(createWorktreeWarmer,"createWorktreeWarmer"),a(createWorktreeWarmer,"createWorktreeWarmer");
@@ -1 +1 @@
1
- "use strict";var d=Object.defineProperty;var o=(e,t)=>d(e,"name",{value:t,configurable:!0});var a=Object.defineProperty,r=o((e,t)=>a(e,"name",{value:t,configurable:!0}),"r"),s=Object.defineProperty,n=r((e,t)=>s(e,"name",{value:t,configurable:!0}),"n");Object.defineProperty(exports,"__esModule",{value:!0}),exports.workspaceLogWriter=workspaceLogWriter,exports.closeWorkspaceLogs=closeWorkspaceLogs;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path")),inspector_secret_1=require("../../../inspector-secret"),fds=new Map,written=new Map,MAX_BYTES=50*1024*1024,CHECK_EVERY=1024*1024;function ensurePrivateDir(e){fs.mkdirSync(e,{recursive:!0,mode:448});try{const t=fs.statSync(e);(t.mode&63)!==0&&(typeof process.getuid!="function"||t.uid===process.getuid())&&fs.chmodSync(e,448)}catch{}}o(ensurePrivateDir,"ensurePrivateDir"),r(ensurePrivateDir,"ensurePrivateDir"),n(ensurePrivateDir,"ensurePrivateDir");function ownerOnly(e){try{fs.chmodSync(e,384)}catch{}}o(ownerOnly,"ownerOnly"),r(ownerOnly,"ownerOnly"),n(ownerOnly,"ownerOnly");function ensureFd(e){const t=fds.get(e);if(t!==void 0)return t;try{ensurePrivateDir(path.dirname(e));const c=fs.openSync(e,"a",384);return ownerOnly(e),fds.set(e,c),written.set(e,0),c}catch{return}}o(ensureFd,"ensureFd"),r(ensureFd,"ensureFd"),n(ensureFd,"ensureFd");function closeFd(e){const t=fds.get(e);if(fds.delete(e),written.delete(e),t!==void 0)try{fs.closeSync(t)}catch{}}o(closeFd,"closeFd"),r(closeFd,"closeFd"),n(closeFd,"closeFd");function rotateIfHuge(e){try{if(fs.statSync(e).size<=MAX_BYTES)return}catch{return}closeFd(e);try{fs.renameSync(e,`${e}.1`)}catch{}ownerOnly(`${e}.1`)}o(rotateIfHuge,"rotateIfHuge"),r(rotateIfHuge,"rotateIfHuge"),n(rotateIfHuge,"rotateIfHuge");function workspaceLogWriter(e){const t=path.join(e,".lensmcp","gateway.log");if(ensureFd(t)!==void 0)return c=>{const i=ensureFd(t);if(i===void 0)return;try{fs.writeSync(i,(0,inspector_secret_1.redactInspectorUrls)(c))}catch{closeFd(t);return}const u=(written.get(t)??0)+c.length;u>=CHECK_EVERY?(written.set(t,0),rotateIfHuge(t)):written.set(t,u)}}o(workspaceLogWriter,"workspaceLogWriter"),r(workspaceLogWriter,"workspaceLogWriter"),n(workspaceLogWriter,"workspaceLogWriter");function closeWorkspaceLogs(){for(const e of[...fds.keys()])closeFd(e)}o(closeWorkspaceLogs,"closeWorkspaceLogs"),r(closeWorkspaceLogs,"closeWorkspaceLogs"),n(closeWorkspaceLogs,"closeWorkspaceLogs");
1
+ "use strict";var a=Object.defineProperty;var r=(e,t)=>a(e,"name",{value:t,configurable:!0});var s=Object.defineProperty,n=r((e,t)=>s(e,"name",{value:t,configurable:!0}),"n");Object.defineProperty(exports,"__esModule",{value:!0}),exports.workspaceLogWriter=workspaceLogWriter,exports.closeWorkspaceLogs=closeWorkspaceLogs;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path")),inspector_secret_1=require("../../../inspector-secret"),fds=new Map,written=new Map,MAX_BYTES=50*1024*1024,CHECK_EVERY=1024*1024;function ensurePrivateDir(e){fs.mkdirSync(e,{recursive:!0,mode:448});try{const t=fs.statSync(e);(t.mode&63)!==0&&(typeof process.getuid!="function"||t.uid===process.getuid())&&fs.chmodSync(e,448)}catch{}}r(ensurePrivateDir,"ensurePrivateDir"),n(ensurePrivateDir,"ensurePrivateDir");function ownerOnly(e){try{fs.chmodSync(e,384)}catch{}}r(ownerOnly,"ownerOnly"),n(ownerOnly,"ownerOnly");function ensureFd(e){const t=fds.get(e);if(t!==void 0)return t;try{ensurePrivateDir(path.dirname(e));const o=fs.openSync(e,"a",384);return ownerOnly(e),fds.set(e,o),written.set(e,0),o}catch{return}}r(ensureFd,"ensureFd"),n(ensureFd,"ensureFd");function closeFd(e){const t=fds.get(e);if(fds.delete(e),written.delete(e),t!==void 0)try{fs.closeSync(t)}catch{}}r(closeFd,"closeFd"),n(closeFd,"closeFd");function rotateIfHuge(e){try{if(fs.statSync(e).size<=MAX_BYTES)return}catch{return}closeFd(e);try{fs.renameSync(e,`${e}.1`)}catch{}ownerOnly(`${e}.1`)}r(rotateIfHuge,"rotateIfHuge"),n(rotateIfHuge,"rotateIfHuge");function workspaceLogWriter(e){const t=path.join(e,".lensmcp","gateway.log");if(ensureFd(t)!==void 0)return o=>{const c=ensureFd(t);if(c===void 0)return;try{fs.writeSync(c,(0,inspector_secret_1.redactInspectorUrls)(o))}catch{closeFd(t);return}const i=(written.get(t)??0)+o.length;i>=CHECK_EVERY?(written.set(t,0),rotateIfHuge(t)):written.set(t,i)}}r(workspaceLogWriter,"workspaceLogWriter"),n(workspaceLogWriter,"workspaceLogWriter");function closeWorkspaceLogs(){for(const e of[...fds.keys()])closeFd(e)}r(closeWorkspaceLogs,"closeWorkspaceLogs"),n(closeWorkspaceLogs,"closeWorkspaceLogs");
@@ -1 +1 @@
1
- "use strict";var p=Object.defineProperty;var d=(e,r)=>p(e,"name",{value:r,configurable:!0});var w=Object.defineProperty,a=d((e,r)=>w(e,"name",{value:r,configurable:!0}),"a"),c=Object.defineProperty,i=a((e,r)=>c(e,"name",{value:r,configurable:!0}),"i");Object.defineProperty(exports,"__esModule",{value:!0}),exports.guestMiddlewarePolicy=guestMiddlewarePolicy,exports.findGatewayMiddleware=findGatewayMiddleware,exports.loadMiddleware=loadMiddleware,exports.createWorkspaceMiddleware=createWorkspaceMiddleware;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path"));function guestMiddlewarePolicy(e=process.env){const r=e.LENSMCP_GUEST_MIDDLEWARE;return r==="owner"||r==="none"?r:"own"}d(guestMiddlewarePolicy,"guestMiddlewarePolicy"),a(guestMiddlewarePolicy,"guestMiddlewarePolicy"),i(guestMiddlewarePolicy,"guestMiddlewarePolicy");function findGatewayMiddleware(e,r){for(const n of Object.values(r)){let o;try{o=JSON.parse(fs.readFileSync(path.join(e,n.root,"project.json"),"utf8"))}catch{continue}for(const t of Object.values(o.targets??{}))if(t?.executor==="@lensmcp/cluster:gateway"&&typeof t.options?.middleware=="string"&&t.options.middleware)return t.options.middleware}}d(findGatewayMiddleware,"findGatewayMiddleware"),a(findGatewayMiddleware,"findGatewayMiddleware"),i(findGatewayMiddleware,"findGatewayMiddleware");function loadMiddleware(e){const r=require.resolve(e);delete require.cache[r];const n=require(r),o=n.default??n;if(typeof o!="function")throw new Error(`${e} exports no function`);return o}d(loadMiddleware,"loadMiddleware"),a(loadMiddleware,"loadMiddleware"),i(loadMiddleware,"loadMiddleware");function createWorkspaceMiddleware(e){const r=e.policy??"own",n=e.load??loadMiddleware,o=new Map;return{set(t,u,l){if(t===e.ownerKey)return;if(!l){o.set(t,void 0);return}const s=path.resolve(u,l);try{o.set(t,n(s)),r==="own"&&console.log(`[gateway] '${t}' routes run its own middleware: ${s}`)}catch(f){o.set(t,void 0),console.warn(`[gateway] could not load '${t}''s middleware ${s} (${f.message}) \u2014 its routes run with NO middleware until it registers again`)}},drop(t){o.delete(t)},for(t){if(t===void 0||t===e.ownerKey||r==="owner")return e.owner;if(r!=="none")return o.get(t)}}}d(createWorkspaceMiddleware,"createWorkspaceMiddleware"),a(createWorkspaceMiddleware,"createWorkspaceMiddleware"),i(createWorkspaceMiddleware,"createWorkspaceMiddleware");
1
+ "use strict";var w=Object.defineProperty;var a=(r,t)=>w(r,"name",{value:t,configurable:!0});var c=Object.defineProperty,i=a((r,t)=>c(r,"name",{value:t,configurable:!0}),"i");Object.defineProperty(exports,"__esModule",{value:!0}),exports.guestMiddlewarePolicy=guestMiddlewarePolicy,exports.findGatewayMiddleware=findGatewayMiddleware,exports.loadMiddleware=loadMiddleware,exports.createWorkspaceMiddleware=createWorkspaceMiddleware;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path"));function guestMiddlewarePolicy(r=process.env){const t=r.LENSMCP_GUEST_MIDDLEWARE;return t==="owner"||t==="none"?t:"own"}a(guestMiddlewarePolicy,"guestMiddlewarePolicy"),i(guestMiddlewarePolicy,"guestMiddlewarePolicy");function findGatewayMiddleware(r,t){for(const n of Object.values(t)){let o;try{o=JSON.parse(fs.readFileSync(path.join(r,n.root,"project.json"),"utf8"))}catch{continue}for(const e of Object.values(o.targets??{}))if(e?.executor==="@lensmcp/cluster:gateway"&&typeof e.options?.middleware=="string"&&e.options.middleware)return e.options.middleware}}a(findGatewayMiddleware,"findGatewayMiddleware"),i(findGatewayMiddleware,"findGatewayMiddleware");function loadMiddleware(r){const t=require.resolve(r);delete require.cache[t];const n=require(t),o=n.default??n;if(typeof o!="function")throw new Error(`${r} exports no function`);return o}a(loadMiddleware,"loadMiddleware"),i(loadMiddleware,"loadMiddleware");function createWorkspaceMiddleware(r){const t=r.policy??"own",n=r.load??loadMiddleware,o=new Map;return{set(e,l,s){if(e===r.ownerKey)return;if(!s){o.set(e,void 0);return}const d=path.resolve(l,s);try{o.set(e,n(d)),t==="own"&&console.log(`[gateway] '${e}' routes run its own middleware: ${d}`)}catch(u){o.set(e,void 0),console.warn(`[gateway] could not load '${e}''s middleware ${d} (${u.message}) \u2014 its routes run with NO middleware until it registers again`)}},drop(e){o.delete(e)},for(e){if(e===void 0||e===r.ownerKey||t==="owner")return r.owner;if(t!=="none")return o.get(e)}}}a(createWorkspaceMiddleware,"createWorkspaceMiddleware"),i(createWorkspaceMiddleware,"createWorkspaceMiddleware");
@@ -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 Ee=Object.defineProperty;var c=(e,r)=>Ee(e,"name",{value:r,configurable:!0});var me=Object.defineProperty,i=c((e,r)=>me(e,"name",{value:r,configurable:!0}),"i"),pe=Object.defineProperty,s=i((e,r)=>pe(e,"name",{value:r,configurable:!0}),"s");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")),child_process_env_1=require("../../child-process-env"),dev_devtool_1=require("../../dev-devtool"),devserver_host_1=require("../../devserver-host"),devserver_notifier_1=require("../../devserver-notifier"),process_name_1=require("../../process-name"),worker_supervisor_1=require("../../worker-supervisor"),attach_1=require("../../shared-build/attach"),stop_on_signal_1=require("./stop-on-signal"),compile_retry_1=require("../../compile-retry"),config_files_1=require("../../config-files"),signature_1=require("../../shared-build/signature");function definedEnv(e){const r={};for(const[C,n]of Object.entries(e))typeof n=="string"&&(r[C]=n);return r}c(definedEnv,"definedEnv"),i(definedEnv,"definedEnv"),s(definedEnv,"definedEnv");const frozen=s(()=>process.env.LENSMCP_FREEZE==="1","frozen");async function*serveExecutor(e,r){process.env.NODE_ENV="development";const C=r.projectsConfigurations.projects[r.projectName],n=r.root,P=path.join(n,C.root),ee=e.outputPath?path.join(n,e.outputPath):path.join(n,"dist",C.root),re=e.configEnv||"development",q=path.join(n,"config",`config.${re}.yaml`),F=3050;let p=F,l=r.projectName,O={};fs.existsSync(q)?(O=yaml.load(fs.readFileSync(q,"utf8")),p=Number(O.port)||p,l=O.serviceName||l):console.warn(`[serve] ${r.projectName}: no config file at ${q} \u2014 public devserver port defaults to ${F}. If another service also lacks its config, both bind ${F} \u2192 EADDRINUSE. Add config/config.${re}.yaml with a distinct \`port:\` (matching this project's cluster.port).`),e.serviceName&&(l=e.serviceName);const M=e.servePrefix??"",N=e.debugPort??(Number(process.env.LENSMCP_DEBUG_PORT)||void 0),ce=/^(1|true|yes|on)$/i.test((process.env.LENSMCP_DEBUG_FIXED_PORTS??"").trim()),g=e.logFile?path.resolve(n,e.logFile):process.env.LENSMCP_LOG_FILE||void 0;if(g){fs.mkdirSync(path.dirname(g),{recursive:!0}),fs.writeFileSync(g,"",{mode:384});try{fs.chmodSync(g,384)}catch{}}let U,G;e.gateway?.middleware&&(U=path.resolve(P,e.gateway.middleware),G=JSON.stringify(O));const ae=e.entryFile||"./src/deployments/service/main.ts",le=e.tsConfigFile||"./tsconfig.app.json",ue=path.resolve(P,ae),oe=path.resolve(P,le),de=(e.workers||[]).map(o=>({entryName:o.name,entryPath:path.resolve(P,o.entryPath)})),y={appName:r.projectName,appRoot:P,outputDir:ee,main:ue,tsConfig:oe,assets:e.assets||[],additionalEntryPoints:de,port:p,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,...e.devtool!==void 0&&{devtool:e.devtool}};let u=null,B=!1,W=!1,J=!1,v=!1;const te=path.join(__dirname,"../../main.devserver.js"),se=path.join(__dirname,"../../main.devserver.ts"),V=!fs.existsSync(te)&&fs.existsSync(se),k=V?se:te,ve=path.join(ee,"main.js");function R(){u&&!u.killed&&(u.kill("SIGTERM"),u=null)}c(R,"B"),i(R,"K"),s(R,"cleanup");function $(){v=!0,R()}c($,"O"),i($,"U"),s($,"stop");const fe=(0,stop_on_signal_1.stopOnSignal)({stop:$,close:s(()=>j(),"close")});process.on("exit",$);function S(){if(v||B)return;if(!fs.existsSync(k)){console.error(`[serve] devserver script not found at ${k}`);return}const o=(0,child_process_env_1.childProcessEnv)({...process.env,PORT:String(p),SERVICE_NAME:l,SERVE_PREFIX:M,LENSMCP_PROJECT:process.env.LENSMCP_PROJECT||r.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:ve,...U&&{GATEWAY_MIDDLEWARE:U},...G&&{GATEWAY_CONFIG:G},...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)},...N&&{LENSMCP_DEBUG_PORT:String(N)},...g&&{LENSMCP_LOG_FILE:g},...e.workers?.length&&{WORKERS:(0,worker_supervisor_1.serializeWorkerSpecs)(e.workers)},[dev_devtool_1.DEV_SOURCE_MAPS_ENV]:J?"1":"0"});if((0,devserver_host_1.devserverInProcessOffered)()&&(!V||require.extensions[".ts"])){B=!0;for(const[d,h]of Object.entries(o))h!==void 0&&(process.env[d]=h);(0,devserver_host_1.markDevserverInProcess)(),require(k),L("in this process");return}const f=["--enable-source-maps"];V&&f.unshift("--require","@swc-node/register");const a=(0,node_child_process_1.fork)(k,{cwd:n,env:o,stdio:["inherit","inherit","inherit","ipc"],execArgv:f,execPath:(0,process_name_1.namedExecPath)((0,process_name_1.processName)(process.env.LENSMCP_WS_KEY||path.basename(n),l,"dev"))});u=a,a.on("exit",(d,h)=>{u===a&&(u=null),!(h||d===0||v)&&(console.error(`[serve] devserver exited unexpectedly (code=${d}, signal=${h}) \u2014 respawning in 1.5s`),setTimeout(()=>{!v&&!u&&W&&S()},1500).unref?.())}),L()}c(S,"S"),i(S,"C"),s(S,"startDevServer");function L(o){console.log(`[serve] Devserver started on port ${p} (service: ${l}${M?`, prefix: /${M}`:""}${o?`, ${o}`:""})`),N?(console.warn(`[serve] DEBUGGER ENABLED for ${l}. Node's inspector has NO authentication \u2014 the ws:// UUID is the whole credential, and any account on this host that obtains it runs code as you. Do not enable this on a shared machine.`),ce?console.warn(`[serve] LENSMCP_DEBUG_FIXED_PORTS=1 \u2014 pod inspectors bind PREDICTABLE ports 127.0.0.1:${N}+slot (workers ${N}+20+i), reachable by any account on this host. Attach WebStorm (Attach to Node.js/Chrome) to ${N}. Unset it to bind ephemeral ports instead.`):console.log(`[serve] Debug: pod inspectors bind an EPHEMERAL 127.0.0.1 port. Get the ws:// URLs with \`lensmcp debug ${l}\` (the owner-only control socket); a devserver run in your own terminal also prints them there. Set LENSMCP_DEBUG_FIXED_PORTS=1 if your IDE needs a fixed attach port.`)):console.log(`[serve] Debug on demand: \`lensmcp debug ${l}\` opens pod inspectors without a restart`),g&&console.log(`[serve] Logs teed to ${g} \u2014 tail it in WebStorm via Run/Debug configuration \u2192 Logs tab`)}c(L,"G"),i(L,"Z"),s(L,"announceDevServer");function ne(){if(!u||u.killed){console.log("[serve] Devserver not running, restarting..."),S();return}fetch(`http://localhost:${p}/webpack/reload`,{method:"POST",headers:{"content-type":"application/json"},body:"{}"}).then(()=>console.log("[serve] Notified devserver to reload")).catch(o=>{console.warn("[serve] Failed to notify devserver, restarting...",o.message),R(),S()})}c(ne,"ve"),i(ne,"he"),s(ne,"_notifyDevServerReload");let D=null;const Y=[];function E(o){if(D){const f=D;D=null,f(o)}else Y.push(o)}c(E,"_"),i(E,"w"),s(E,"pushResult");function z(){return Y.length>0?Promise.resolve(Y.shift()):new Promise(o=>{D=o})}c(z,"re"),i(z,"le"),s(z,"waitForNext");let j=s(()=>{},"closeBuild");function T(){return!W||!u&&!B?(W=!0,S(),!0):!1}c(T,"V"),i(T,"Q"),s(T,"builtOk");function x(){try{return JSON.stringify((0,signature_1.transpileCompilerOptions)(y.tsConfig,n))}catch{return}}c(x,"H"),i(x,"ee"),s(x,"compileShape");function b(){if(v)return;const{createDevWebpackConfig:o}=require("../../create-webpack-dev"),f=require("webpack"),a=y.webpackConfigPath?path.resolve(y.appRoot,y.webpackConfigPath):void 0;if(a)try{delete require.cache[require.resolve(a)]}catch{}const d=o(y),{watch:h,...t}=d,X=(0,config_files_1.configFilesOf)(y),K=x();let Z;t.plugins=[...t.plugins??[],new config_files_1.ConfigFilesPlugin({files:s(()=>X,"files"),changed:s(w=>{if(!a||!w.includes(a)){const m=x();if(m===void 0||m===K)return}Z=w.map(m=>path.relative(n,m)).sort().join(", ")},"changed")})];const A=f(t);J=(0,dev_devtool_1.bundleCarriesSourceMaps)(A.options.devtool);let _;const I=(0,compile_retry_1.createFailureRetry)(()=>{v||!_||(console.log(`[serve] ${r.projectName}: compiling again after the failure`),_.invalidate())}),ie=s((w,m)=>{if(Z!==void 0&&_&&!v){console.log(`[serve] ${r.projectName}: ${Z} changed what it compiles with \u2014 compiling again with a new compiler`),I.dispose();const Q=_;_=void 0,setImmediate(()=>Q.close(()=>b()));return}if(w){if(console.error("[serve] Webpack error:",w),_&&!v){const{delayMs:Q,retry:ge}=I.failed();console.log(`[serve] ${r.projectName}: compiling again in ${Math.round(Q/1e3)} s (retry ${ge}) \u2014 webpack does not after a failure like this`)}E({success:!1});return}I.succeeded();const he=m.hasErrors();if(console.info(m.toString({colors:!0,chunks:!1,assets:!0})),he){E({success:!1});return}T(),E({success:!0,baseUrl:`http://localhost:${p}`})},"onBuild");if(frozen()){console.log(`[serve] ${r.projectName}: frozen \u2014 compiling once, no file watcher`),A.run((w,m)=>{ie(w,m),A.close(()=>{})});return}_=A.watch(d.watchOptions||{},ie),j=s(()=>{I.dispose(),_?.close(()=>{})},"closeBuild")}c(b,"P"),i(b,"$"),s(b,"compileOnItsOwn");function H(o){const f=o.accepted.projects.filter(t=>t!==r.projectName);console.log(`[serve] ${r.projectName}: compiled by the workspace's shared compilation ${o.accepted.group.slice(0,8)}${f.length?` with ${f.join(", ")}`:""} \u2014 no webpack in this process`);const a=new devserver_notifier_1.DevserverNotifier(p,e.gateway?.https===!0,(0,devserver_notifier_1.devserverControlSock)(l)),d=(0,attach_1.createAttachedTypecheck)({appName:r.projectName,tsConfig:oe,workspaceRoot:n,memoryLimit:e.memoryLimit||8192});let h;j=s(()=>{o.close(),d.dispose()},"closeBuild"),o.listen(t=>{if(!v)switch(t.type){case"watch-run":a.watchRun(t.paths);return;case"watch-closed":a.degrade("watch closed");return;case"failed":console.error(`[serve] the shared compiler failed: ${t.message}`),a.failed(`the shared compiler failed: ${t.message}`),E({success:!1});return;case"refused":console.log(`[serve] ${r.projectName}: compiling on its own from now on \u2014 ${t.reason}`),j(),b();return;case"built":{if(console.info(t.text),J=t.sourceMaps,d.built(t),!t.ok){a.failed(),E({success:!1});return}const X=t.hash!==h;h=t.hash;const K=T();a.built(X&&!K),E({success:!0,baseUrl:`http://localhost:${p}`});return}default:return}})}if(c(H,"te"),i(H,"ue"),s(H,"attachToSharedBuild"),(0,attach_1.sharedBuildOffered)()&&!frozen()){const o=await(0,attach_1.joinSharedBuild)({project:r.projectName,target:r.targetName??"serve-hmr",...r.configurationName?{configuration:r.configurationName}:{},options:y,targetOptions:{...e},env:definedEnv(process.env)});o.kind==="attached"?H(o.session):(console.log(`[serve] ${r.projectName}: compiling on its own \u2014 ${o.reason}`),b())}else b();try{for(;;)yield await z()}finally{$(),j(),fe()}}c(serveExecutor,"serveExecutor"),i(serveExecutor,"serveExecutor"),s(serveExecutor,"serveExecutor"),exports.default=serveExecutor,module.exports=serveExecutor,module.exports.default=serveExecutor;
1
+ "use strict";var me=Object.defineProperty;var i=(e,o)=>me(e,"name",{value:o,configurable:!0});var pe=Object.defineProperty,s=i((e,o)=>pe(e,"name",{value:o,configurable:!0}),"s");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")),child_process_env_1=require("../../child-process-env"),dev_devtool_1=require("../../dev-devtool"),devserver_host_1=require("../../devserver-host"),devserver_notifier_1=require("../../devserver-notifier"),process_name_1=require("../../process-name"),worker_supervisor_1=require("../../worker-supervisor"),attach_1=require("../../shared-build/attach"),stop_on_signal_1=require("./stop-on-signal"),compile_retry_1=require("../../compile-retry"),config_files_1=require("../../config-files"),signature_1=require("../../shared-build/signature");function definedEnv(e){const o={};for(const[$,n]of Object.entries(e))typeof n=="string"&&(o[$]=n);return o}i(definedEnv,"definedEnv"),s(definedEnv,"definedEnv");const frozen=s(()=>process.env.LENSMCP_FREEZE==="1","frozen");async function*serveExecutor(e,o){process.env.NODE_ENV="development";const $=o.projectsConfigurations.projects[o.projectName],n=o.root,N=path.join(n,$.root),K=e.outputPath?path.join(n,e.outputPath):path.join(n,"dist",$.root),Z=e.configEnv||"development",D=path.join(n,"config",`config.${Z}.yaml`),T=3050;let d=T,a=o.projectName,j={};fs.existsSync(D)?(j=yaml.load(fs.readFileSync(D,"utf8")),d=Number(j.port)||d,a=j.serviceName||a):console.warn(`[serve] ${o.projectName}: no config file at ${D} \u2014 public devserver port defaults to ${T}. If another service also lacks its config, both bind ${T} \u2192 EADDRINUSE. Add config/config.${Z}.yaml with a distinct \`port:\` (matching this project's cluster.port).`),e.serviceName&&(a=e.serviceName);const x=e.servePrefix??"",y=e.debugPort??(Number(process.env.LENSMCP_DEBUG_PORT)||void 0),ne=/^(1|true|yes|on)$/i.test((process.env.LENSMCP_DEBUG_FIXED_PORTS??"").trim()),m=e.logFile?path.resolve(n,e.logFile):process.env.LENSMCP_LOG_FILE||void 0;if(m){fs.mkdirSync(path.dirname(m),{recursive:!0}),fs.writeFileSync(m,"",{mode:384});try{fs.chmodSync(m,384)}catch{}}let A,I;e.gateway?.middleware&&(A=path.resolve(N,e.gateway.middleware),I=JSON.stringify(j));const ie=e.entryFile||"./src/deployments/service/main.ts",ce=e.tsConfigFile||"./tsconfig.app.json",ae=path.resolve(N,ie),Q=path.resolve(N,ce),le=(e.workers||[]).map(r=>({entryName:r.name,entryPath:path.resolve(N,r.entryPath)})),E={appName:o.projectName,appRoot:N,outputDir:K,main:ae,tsConfig:Q,assets:e.assets||[],additionalEntryPoints:le,port:d,serviceName:a,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,...e.devtool!==void 0&&{devtool:e.devtool}};let l=null,q=!1,F=!1,M=!1,p=!1;const ee=path.join(__dirname,"../../main.devserver.js"),oe=path.join(__dirname,"../../main.devserver.ts"),U=!fs.existsSync(ee)&&fs.existsSync(oe),C=U?oe:ee,ue=path.join(K,"main.js");function B(){l&&!l.killed&&(l.kill("SIGTERM"),l=null)}i(B,"K"),s(B,"cleanup");function O(){p=!0,B()}i(O,"U"),s(O,"stop");const de=(0,stop_on_signal_1.stopOnSignal)({stop:O,close:s(()=>b(),"close")});process.on("exit",O);function S(){if(p||q)return;if(!fs.existsSync(C)){console.error(`[serve] devserver script not found at ${C}`);return}const r=(0,child_process_env_1.childProcessEnv)({...process.env,PORT:String(d),SERVICE_NAME:a,SERVE_PREFIX:x,LENSMCP_PROJECT:process.env.LENSMCP_PROJECT||o.projectName||a,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:ue,...A&&{GATEWAY_MIDDLEWARE:A},...I&&{GATEWAY_CONFIG:I},...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)},...y&&{LENSMCP_DEBUG_PORT:String(y)},...m&&{LENSMCP_LOG_FILE:m},...e.workers?.length&&{WORKERS:(0,worker_supervisor_1.serializeWorkerSpecs)(e.workers)},[dev_devtool_1.DEV_SOURCE_MAPS_ENV]:M?"1":"0"});if((0,devserver_host_1.devserverInProcessOffered)()&&(!U||require.extensions[".ts"])){q=!0;for(const[u,f]of Object.entries(r))f!==void 0&&(process.env[u]=f);(0,devserver_host_1.markDevserverInProcess)(),require(C),G("in this process");return}const v=["--enable-source-maps"];U&&v.unshift("--require","@swc-node/register");const c=(0,node_child_process_1.fork)(C,{cwd:n,env:r,stdio:["inherit","inherit","inherit","ipc"],execArgv:v,execPath:(0,process_name_1.namedExecPath)((0,process_name_1.processName)(process.env.LENSMCP_WS_KEY||path.basename(n),a,"dev"))});l=c,c.on("exit",(u,f)=>{l===c&&(l=null),!(f||u===0||p)&&(console.error(`[serve] devserver exited unexpectedly (code=${u}, signal=${f}) \u2014 respawning in 1.5s`),setTimeout(()=>{!p&&!l&&F&&S()},1500).unref?.())}),G()}i(S,"C"),s(S,"startDevServer");function G(r){console.log(`[serve] Devserver started on port ${d} (service: ${a}${x?`, prefix: /${x}`:""}${r?`, ${r}`:""})`),y?(console.warn(`[serve] DEBUGGER ENABLED for ${a}. Node's inspector has NO authentication \u2014 the ws:// UUID is the whole credential, and any account on this host that obtains it runs code as you. Do not enable this on a shared machine.`),ne?console.warn(`[serve] LENSMCP_DEBUG_FIXED_PORTS=1 \u2014 pod inspectors bind PREDICTABLE ports 127.0.0.1:${y}+slot (workers ${y}+20+i), reachable by any account on this host. Attach WebStorm (Attach to Node.js/Chrome) to ${y}. Unset it to bind ephemeral ports instead.`):console.log(`[serve] Debug: pod inspectors bind an EPHEMERAL 127.0.0.1 port. Get the ws:// URLs with \`lensmcp debug ${a}\` (the owner-only control socket); a devserver run in your own terminal also prints them there. Set LENSMCP_DEBUG_FIXED_PORTS=1 if your IDE needs a fixed attach port.`)):console.log(`[serve] Debug on demand: \`lensmcp debug ${a}\` opens pod inspectors without a restart`),m&&console.log(`[serve] Logs teed to ${m} \u2014 tail it in WebStorm via Run/Debug configuration \u2192 Logs tab`)}i(G,"Z"),s(G,"announceDevServer");function ve(){if(!l||l.killed){console.log("[serve] Devserver not running, restarting..."),S();return}fetch(`http://localhost:${d}/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),B(),S()})}i(ve,"he"),s(ve,"_notifyDevServerReload");let k=null;const W=[];function _(r){if(k){const v=k;k=null,v(r)}else W.push(r)}i(_,"w"),s(_,"pushResult");function re(){return W.length>0?Promise.resolve(W.shift()):new Promise(r=>{k=r})}i(re,"le"),s(re,"waitForNext");let b=s(()=>{},"closeBuild");function V(){return!F||!l&&!q?(F=!0,S(),!0):!1}i(V,"Q"),s(V,"builtOk");function H(){try{return JSON.stringify((0,signature_1.transpileCompilerOptions)(E.tsConfig,n))}catch{return}}i(H,"ee"),s(H,"compileShape");function P(){if(p)return;const{createDevWebpackConfig:r}=require("../../create-webpack-dev"),v=require("webpack"),c=E.webpackConfigPath?path.resolve(E.appRoot,E.webpackConfigPath):void 0;if(c)try{delete require.cache[require.resolve(c)]}catch{}const u=r(E),{watch:f,...t}=u,J=(0,config_files_1.configFilesOf)(E),Y=H();let X;t.plugins=[...t.plugins??[],new config_files_1.ConfigFilesPlugin({files:s(()=>J,"files"),changed:s(w=>{if(!c||!w.includes(c)){const h=H();if(h===void 0||h===Y)return}X=w.map(h=>path.relative(n,h)).sort().join(", ")},"changed")})];const R=v(t);M=(0,dev_devtool_1.bundleCarriesSourceMaps)(R.options.devtool);let g;const L=(0,compile_retry_1.createFailureRetry)(()=>{p||!g||(console.log(`[serve] ${o.projectName}: compiling again after the failure`),g.invalidate())}),se=s((w,h)=>{if(X!==void 0&&g&&!p){console.log(`[serve] ${o.projectName}: ${X} changed what it compiles with \u2014 compiling again with a new compiler`),L.dispose();const z=g;g=void 0,setImmediate(()=>z.close(()=>P()));return}if(w){if(console.error("[serve] Webpack error:",w),g&&!p){const{delayMs:z,retry:he}=L.failed();console.log(`[serve] ${o.projectName}: compiling again in ${Math.round(z/1e3)} s (retry ${he}) \u2014 webpack does not after a failure like this`)}_({success:!1});return}L.succeeded();const fe=h.hasErrors();if(console.info(h.toString({colors:!0,chunks:!1,assets:!0})),fe){_({success:!1});return}V(),_({success:!0,baseUrl:`http://localhost:${d}`})},"onBuild");if(frozen()){console.log(`[serve] ${o.projectName}: frozen \u2014 compiling once, no file watcher`),R.run((w,h)=>{se(w,h),R.close(()=>{})});return}g=R.watch(u.watchOptions||{},se),b=s(()=>{L.dispose(),g?.close(()=>{})},"closeBuild")}i(P,"$"),s(P,"compileOnItsOwn");function te(r){const v=r.accepted.projects.filter(t=>t!==o.projectName);console.log(`[serve] ${o.projectName}: compiled by the workspace's shared compilation ${r.accepted.group.slice(0,8)}${v.length?` with ${v.join(", ")}`:""} \u2014 no webpack in this process`);const c=new devserver_notifier_1.DevserverNotifier(d,e.gateway?.https===!0,(0,devserver_notifier_1.devserverControlSock)(a)),u=(0,attach_1.createAttachedTypecheck)({appName:o.projectName,tsConfig:Q,workspaceRoot:n,memoryLimit:e.memoryLimit||8192});let f;b=s(()=>{r.close(),u.dispose()},"closeBuild"),r.listen(t=>{if(!p)switch(t.type){case"watch-run":c.watchRun(t.paths);return;case"watch-closed":c.degrade("watch closed");return;case"failed":console.error(`[serve] the shared compiler failed: ${t.message}`),c.failed(`the shared compiler failed: ${t.message}`),_({success:!1});return;case"refused":console.log(`[serve] ${o.projectName}: compiling on its own from now on \u2014 ${t.reason}`),b(),P();return;case"built":{if(console.info(t.text),M=t.sourceMaps,u.built(t),!t.ok){c.failed(),_({success:!1});return}const J=t.hash!==f;f=t.hash;const Y=V();c.built(J&&!Y),_({success:!0,baseUrl:`http://localhost:${d}`});return}default:return}})}if(i(te,"ue"),s(te,"attachToSharedBuild"),(0,attach_1.sharedBuildOffered)()&&!frozen()){const r=await(0,attach_1.joinSharedBuild)({project:o.projectName,target:o.targetName??"serve-hmr",...o.configurationName?{configuration:o.configurationName}:{},options:E,targetOptions:{...e},env:definedEnv(process.env)});r.kind==="attached"?te(r.session):(console.log(`[serve] ${o.projectName}: compiling on its own \u2014 ${r.reason}`),P())}else P();try{for(;;)yield await re()}finally{O(),b(),de()}}i(serveExecutor,"serveExecutor"),s(serveExecutor,"serveExecutor"),exports.default=serveExecutor,module.exports=serveExecutor,module.exports.default=serveExecutor;
@@ -1 +1 @@
1
- "use strict";var v=Object.defineProperty;var i=(n,o)=>v(n,"name",{value:o,configurable:!0});var a=Object.defineProperty,c=i((n,o)=>a(n,"name",{value:o,configurable:!0}),"c"),S=Object.defineProperty,r=c((n,o)=>S(n,"name",{value:o,configurable:!0}),"r");Object.defineProperty(exports,"__esModule",{value:!0}),exports.STOP_SIGNALS=void 0,exports.stopOnSignal=stopOnSignal;const devserver_host_1=require("../../devserver-host");exports.STOP_SIGNALS=["SIGINT","SIGTERM","SIGHUP","SIGQUIT"];function stopOnSignal(n){const o=n.proc??process,d=n.log??(e=>console.log(e));let s=!1;const p=r(e=>{if(n.stop(),!s){s=!0;try{n.close()}catch{}(n.devserverOwnsExit??devserver_host_1.devserverOwnsExit)()||setImmediate(()=>o.exit((0,devserver_host_1.exitCodeForSignal)(e)))}},"end"),l=exports.STOP_SIGNALS.map(e=>{const t=r(()=>p(e),"handler");return o.on(e,t),{event:e,handler:t}});if(typeof o.send=="function"){const e=r(()=>{s||(d("[serve] the parent process is gone (its IPC channel closed) \u2014 stopping the service"),p("SIGTERM"))},"onDisconnect");o.on("disconnect",e),l.push({event:"disconnect",handler:e})}return()=>{for(const{event:e,handler:t}of l)o.removeListener(e,t)}}i(stopOnSignal,"stopOnSignal"),c(stopOnSignal,"stopOnSignal"),r(stopOnSignal,"stopOnSignal");
1
+ "use strict";var a=Object.defineProperty;var c=(t,o)=>a(t,"name",{value:o,configurable:!0});var S=Object.defineProperty,r=c((t,o)=>S(t,"name",{value:o,configurable:!0}),"r");Object.defineProperty(exports,"__esModule",{value:!0}),exports.STOP_SIGNALS=void 0,exports.stopOnSignal=stopOnSignal;const devserver_host_1=require("../../devserver-host");exports.STOP_SIGNALS=["SIGINT","SIGTERM","SIGHUP","SIGQUIT"];function stopOnSignal(t){const o=t.proc??process,p=t.log??(e=>console.log(e));let s=!1;const i=r(e=>{if(t.stop(),!s){s=!0;try{t.close()}catch{}(t.devserverOwnsExit??devserver_host_1.devserverOwnsExit)()||setImmediate(()=>o.exit((0,devserver_host_1.exitCodeForSignal)(e)))}},"end"),d=exports.STOP_SIGNALS.map(e=>{const n=r(()=>i(e),"handler");return o.on(e,n),{event:e,handler:n}});if(typeof o.send=="function"){const e=r(()=>{s||(p("[serve] the parent process is gone (its IPC channel closed) \u2014 stopping the service"),i("SIGTERM"))},"onDisconnect");o.on("disconnect",e),d.push({event:"disconnect",handler:e})}return()=>{for(const{event:e,handler:n}of d)o.removeListener(e,n)}}c(stopOnSignal,"stopOnSignal"),r(stopOnSignal,"stopOnSignal");
@@ -1 +1 @@
1
- "use strict";var o=Object.defineProperty;var i=(e,t)=>o(e,"name",{value:t,configurable:!0});var s=Object.defineProperty,a=i((e,t)=>s(e,"name",{value:t,configurable:!0}),"a"),n=Object.defineProperty,r=a((e,t)=>n(e,"name",{value:t,configurable:!0}),"r");Object.defineProperty(exports,"__esModule",{value:!0}),exports.isValidHostname=isValidHostname;const LABEL=/^[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?$/,MAX_HOSTNAME_LENGTH=253;function isValidHostname(e){return typeof e!="string"||e.length===0||e.length>MAX_HOSTNAME_LENGTH?!1:e.split(".").every(t=>LABEL.test(t))}i(isValidHostname,"isValidHostname"),a(isValidHostname,"isValidHostname"),r(isValidHostname,"isValidHostname");
1
+ "use strict";var s=Object.defineProperty;var a=(e,t)=>s(e,"name",{value:t,configurable:!0});var n=Object.defineProperty,r=a((e,t)=>n(e,"name",{value:t,configurable:!0}),"r");Object.defineProperty(exports,"__esModule",{value:!0}),exports.isValidHostname=isValidHostname;const LABEL=/^[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?$/,MAX_HOSTNAME_LENGTH=253;function isValidHostname(e){return typeof e!="string"||e.length===0||e.length>MAX_HOSTNAME_LENGTH?!1:e.split(".").every(t=>LABEL.test(t))}a(isValidHostname,"isValidHostname"),r(isValidHostname,"isValidHostname");
@@ -1,6 +1,6 @@
1
- "use strict";var m=Object.defineProperty;var p=(r,e)=>m(r,"name",{value:e,configurable:!0});var f=Object.defineProperty,l=p((r,e)=>f(r,"name",{value:e,configurable:!0}),"l"),h=Object.defineProperty,d=l((r,e)=>h(r,"name",{value:e,configurable:!0}),"d");Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=trustExecutor,exports.missingHostLines=missingHostLines,exports.collectHosts=collectHosts;const tslib_1=require("tslib"),node_child_process_1=require("node:child_process"),node_dns_1=require("node:dns"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path")),basic_ssl_1=require("../../basic-ssl"),checkout_cache_1=require("../../checkout-cache"),hostname_1=require("./hostname");async function trustExecutor(r,e){const t=(0,checkout_cache_1.checkoutCacheDir)(e.root,"davnx-webpack"),n=(0,basic_ssl_1.ensureCaSync)(t),c=process.env.LENSMCP_TRUST_HOSTS_ONLY==="1",s=collectHosts(r,e);if(s.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 y of s)console.log(` \u2022 /etc/hosts: "127.0.0.1 ${y}" and "::1 ${y}"`);return{success:!0}}const o=caSha256Fingerprint(n),a=c||o!==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(o)===!0;if(c)console.log("[trust] hosts-only: a shared daemon serves TLS with its own CA \u2014 skipping the keychain step.");else if(a)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 u=fs.readFileSync("/etc/hosts","utf8"),i=missingHostLines(s,u,await resolveAll(s));if(i.length===0)console.log("[trust] /etc/hosts already complete (both families for every hostname, by a line or by the OS resolver).");else{if(console.log(`[trust] appending to /etc/hosts (sudo):
1
+ "use strict";var f=Object.defineProperty;var l=(r,t)=>f(r,"name",{value:t,configurable:!0});var h=Object.defineProperty,d=l((r,t)=>h(r,"name",{value:t,configurable:!0}),"d");Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=trustExecutor,exports.missingHostLines=missingHostLines,exports.collectHosts=collectHosts;const tslib_1=require("tslib"),node_child_process_1=require("node:child_process"),node_dns_1=require("node:dns"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path")),basic_ssl_1=require("../../basic-ssl"),checkout_cache_1=require("../../checkout-cache"),hostname_1=require("./hostname");async function trustExecutor(r,t){const e=(0,checkout_cache_1.checkoutCacheDir)(t.root,"davnx-webpack"),n=(0,basic_ssl_1.ensureCaSync)(e),c=process.env.LENSMCP_TRUST_HOSTS_ONLY==="1",s=collectHosts(r,t);if(s.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 p of s)console.log(` \u2022 /etc/hosts: "127.0.0.1 ${p}" and "::1 ${p}"`);return{success:!0}}const o=caSha256Fingerprint(n),a=c||o!==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(o)===!0;if(c)console.log("[trust] hosts-only: a shared daemon serves TLS with its own CA \u2014 skipping the keychain step.");else if(a)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 u=fs.readFileSync("/etc/hosts","utf8"),i=missingHostLines(s,u,await resolveAll(s));if(i.length===0)console.log("[trust] /etc/hosts already complete (both families for every hostname, by a line or by the OS resolver).");else{if(console.log(`[trust] appending to /etc/hosts (sudo):
2
2
  ${i.join(`
3
3
  `)}`),(0,node_child_process_1.spawnSync)("sudo",["tee","-a","/etc/hosts"],{input:i.join(`
4
4
  `)+`
5
- `,stdio:["pipe","ignore","inherit"]}).status!==0)return console.error("[trust] /etc/hosts update failed."),{success:!1};(0,node_child_process_1.spawnSync)("sudo",["dscacheutil","-flushcache"],{stdio:"inherit"}),(0,node_child_process_1.spawnSync)("sudo",["killall","-HUP","mDNSResponder"],{stdio:"inherit"})}if(!c){const y=(0,node_child_process_1.spawnSync)("security",["verify-cert","-c",n,"-p","basic"],{stdio:"ignore"});console.log(`[trust] CA trust check: ${y.status===0?"OK":"NOT TRUSTED YET (browser restart may be needed)"}`)}for(const y of s)console.log(`[trust] ${y} \u2192 https ready (hosts + cert SAN ride the gateway config)`);return{success:!0}}p(trustExecutor,"trustExecutor"),l(trustExecutor,"trustExecutor"),d(trustExecutor,"trustExecutor");function caSha256Fingerprint(r){const e=(0,node_child_process_1.spawnSync)("openssl",["x509","-in",r,"-noout","-fingerprint","-sha256"],{encoding:"utf8"});if(e.status!==0||!e.stdout)return;const t=e.stdout.split("=")[1]?.replaceAll(":","").trim().toUpperCase();return t&&/^[0-9A-F]{64}$/.test(t)?t:void 0}p(caSha256Fingerprint,"caSha256Fingerprint"),l(caSha256Fingerprint,"caSha256Fingerprint"),d(caSha256Fingerprint,"caSha256Fingerprint");function missingHostLines(r,e,t){const n=d((s,o)=>e.split(`
6
- `).some(a=>{const u=a.trim();if(u.startsWith("#"))return!1;const i=u.split(/\s+/);return i[0]===s&&i.slice(1).includes(o)}),"hasEntry"),c=[];for(const s of r)!n("127.0.0.1",s)&&!t.get(s)?.v4&&c.push(`127.0.0.1 ${s}`),!n("::1",s)&&!t.get(s)?.v6&&c.push(`::1 ${s}`);return c}p(missingHostLines,"missingHostLines"),l(missingHostLines,"missingHostLines"),d(missingHostLines,"missingHostLines");async function resolveAll(r){const e=d(t=>new Promise(n=>{const c=setTimeout(()=>n({v4:!1,v6:!1}),2e3);(0,node_dns_1.lookup)(t,{all:!0},(s,o)=>{if(clearTimeout(c),s||!Array.isArray(o))return n({v4:!1,v6:!1});n({v4:o.some(a=>a.family===4&&a.address.startsWith("127.")),v6:o.some(a=>a.family===6&&a.address==="::1")})})}),"one");return new Map(await Promise.all(r.map(async t=>[t,await e(t)])))}p(resolveAll,"resolveAll"),l(resolveAll,"resolveAll"),d(resolveAll,"resolveAll");function collectHosts(r,e){const t=[],n=e.projectName?e.projectsConfigurations?.projects[e.projectName]:void 0,c=r.serveTarget??"serve-hmr",s=n?.targets?.[c]?.options?.gateway?.routes??[];for(const o of s)o.host&&(0,hostname_1.isValidHostname)(o.host)?t.push(o.host):o.host&&console.warn(`[trust] ignoring invalid hostname in ${c} routes: ${JSON.stringify(o.host)}`);for(const o of Object.values(e.projectsConfigurations?.projects??{}))try{const a=JSON.parse(fs.readFileSync(path.join(e.root,o.root,"project.json"),"utf8")),u=a.cluster??a.davnx,i=u?.host;i&&!(0,hostname_1.isValidHostname)(i)&&console.warn(`[trust] ignoring invalid hostname in ${o.root}/project.json: ${JSON.stringify(i)}`),i&&(0,hostname_1.isValidHostname)(i)&&(t.push(i),u?.service&&u.internalHost!==!1&&t.push(typeof u.internalHost=="string"?u.internalHost:`internal.${i}`))}catch{}return[...new Set([...t,"lensmcp.local",...r.hosts??[]])]}p(collectHosts,"collectHosts"),l(collectHosts,"collectHosts"),d(collectHosts,"collectHosts");
5
+ `,stdio:["pipe","ignore","inherit"]}).status!==0)return console.error("[trust] /etc/hosts update failed."),{success:!1};(0,node_child_process_1.spawnSync)("sudo",["dscacheutil","-flushcache"],{stdio:"inherit"}),(0,node_child_process_1.spawnSync)("sudo",["killall","-HUP","mDNSResponder"],{stdio:"inherit"})}if(!c){const p=(0,node_child_process_1.spawnSync)("security",["verify-cert","-c",n,"-p","basic"],{stdio:"ignore"});console.log(`[trust] CA trust check: ${p.status===0?"OK":"NOT TRUSTED YET (browser restart may be needed)"}`)}for(const p of s)console.log(`[trust] ${p} \u2192 https ready (hosts + cert SAN ride the gateway config)`);return{success:!0}}l(trustExecutor,"trustExecutor"),d(trustExecutor,"trustExecutor");function caSha256Fingerprint(r){const t=(0,node_child_process_1.spawnSync)("openssl",["x509","-in",r,"-noout","-fingerprint","-sha256"],{encoding:"utf8"});if(t.status!==0||!t.stdout)return;const e=t.stdout.split("=")[1]?.replaceAll(":","").trim().toUpperCase();return e&&/^[0-9A-F]{64}$/.test(e)?e:void 0}l(caSha256Fingerprint,"caSha256Fingerprint"),d(caSha256Fingerprint,"caSha256Fingerprint");function missingHostLines(r,t,e){const n=d((s,o)=>t.split(`
6
+ `).some(a=>{const u=a.trim();if(u.startsWith("#"))return!1;const i=u.split(/\s+/);return i[0]===s&&i.slice(1).includes(o)}),"hasEntry"),c=[];for(const s of r)!n("127.0.0.1",s)&&!e.get(s)?.v4&&c.push(`127.0.0.1 ${s}`),!n("::1",s)&&!e.get(s)?.v6&&c.push(`::1 ${s}`);return c}l(missingHostLines,"missingHostLines"),d(missingHostLines,"missingHostLines");async function resolveAll(r){const t=d(e=>new Promise(n=>{const c=setTimeout(()=>n({v4:!1,v6:!1}),2e3);(0,node_dns_1.lookup)(e,{all:!0},(s,o)=>{if(clearTimeout(c),s||!Array.isArray(o))return n({v4:!1,v6:!1});n({v4:o.some(a=>a.family===4&&a.address.startsWith("127.")),v6:o.some(a=>a.family===6&&a.address==="::1")})})}),"one");return new Map(await Promise.all(r.map(async e=>[e,await t(e)])))}l(resolveAll,"resolveAll"),d(resolveAll,"resolveAll");function collectHosts(r,t){const e=[],n=t.projectName?t.projectsConfigurations?.projects[t.projectName]:void 0,c=r.serveTarget??"serve-hmr",s=n?.targets?.[c]?.options?.gateway?.routes??[];for(const o of s)o.host&&(0,hostname_1.isValidHostname)(o.host)?e.push(o.host):o.host&&console.warn(`[trust] ignoring invalid hostname in ${c} routes: ${JSON.stringify(o.host)}`);for(const o of Object.values(t.projectsConfigurations?.projects??{}))try{const a=JSON.parse(fs.readFileSync(path.join(t.root,o.root,"project.json"),"utf8")),u=a.cluster??a.davnx,i=u?.host;i&&!(0,hostname_1.isValidHostname)(i)&&console.warn(`[trust] ignoring invalid hostname in ${o.root}/project.json: ${JSON.stringify(i)}`),i&&(0,hostname_1.isValidHostname)(i)&&(e.push(i),u?.service&&u.internalHost!==!1&&e.push(typeof u.internalHost=="string"?u.internalHost:`internal.${i}`))}catch{}return[...new Set([...e,"lensmcp.local",...r.hosts??[]])]}l(collectHosts,"collectHosts"),d(collectHosts,"collectHosts");
package/exit-reason.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var p=Object.defineProperty;var r=(t,e)=>p(t,"name",{value:e,configurable:!0});var l=Object.defineProperty,s=r((t,e)=>l(t,"name",{value:e,configurable:!0}),"s"),h=Object.defineProperty,i=s((t,e)=>h(t,"name",{value:e,configurable:!0}),"i");Object.defineProperty(exports,"__esModule",{value:!0}),exports.TailBuffer=void 0,exports.describeExit=describeExit,exports.crashReport=crashReport;class TailBuffer{static{r(this,"TailBuffer")}static{s(this,"TailBuffer")}static{i(this,"TailBuffer")}constructor(e=20,a=500){this.max=e,this.maxLineChars=a,this.lines=[]}push(e){e&&(this.lines.push(e.length>this.maxLineChars?`${e.slice(0,this.maxLineChars)}\u2026`:e),this.lines.length>this.max&&this.lines.shift())}snapshot(){return[...this.lines]}}exports.TailBuffer=TailBuffer;function describeExit(t,e){return e==="SIGKILL"||t===137?"killed with SIGKILL \u2014 the kernel OOM killer, or something outside the dev cluster (`kill -9`, a container memory limit); not a crash in the app":e==="SIGSEGV"||e==="SIGBUS"||e==="SIGABRT"?`died on ${e} \u2014 a native crash or a V8 abort (a heap out-of-memory prints "FATAL ERROR" on stderr first)`:e==="SIGPIPE"?"died on SIGPIPE \u2014 it wrote to a closed pipe":e==="SIGHUP"?"received SIGHUP \u2014 its terminal or parent session went away":e==="SIGINT"||e==="SIGTERM"||t===0?null:t===134?"aborted (exit 134, SIGABRT) \u2014 usually a V8 heap out-of-memory":t===1?"exited 1 \u2014 an uncaught exception or an explicit process.exit(1)":t!==null?`exited ${t}`:null}r(describeExit,"describeExit"),s(describeExit,"describeExit"),i(describeExit,"describeExit");function crashReport(t,e,a,n){const u=describeExit(e,a),o=[t+(u?` \u2014 ${u}`:"")];if(n.length){o.push(` last ${n.length} line(s) of output before it died:`);for(const c of n)o.push(` | ${c}`)}else o.push(" (it wrote nothing to stdout/stderr before it died)");return o.join(`
2
- `)}r(crashReport,"crashReport"),s(crashReport,"crashReport"),i(crashReport,"crashReport");
1
+ "use strict";var l=Object.defineProperty;var s=(t,e)=>l(t,"name",{value:e,configurable:!0});var h=Object.defineProperty,i=s((t,e)=>h(t,"name",{value:e,configurable:!0}),"i");Object.defineProperty(exports,"__esModule",{value:!0}),exports.TailBuffer=void 0,exports.describeExit=describeExit,exports.crashReport=crashReport;class TailBuffer{static{s(this,"TailBuffer")}static{i(this,"TailBuffer")}constructor(e=20,o=500){this.max=e,this.maxLineChars=o,this.lines=[]}push(e){e&&(this.lines.push(e.length>this.maxLineChars?`${e.slice(0,this.maxLineChars)}\u2026`:e),this.lines.length>this.max&&this.lines.shift())}snapshot(){return[...this.lines]}}exports.TailBuffer=TailBuffer;function describeExit(t,e){return e==="SIGKILL"||t===137?"killed with SIGKILL \u2014 the kernel OOM killer, or something outside the dev cluster (`kill -9`, a container memory limit); not a crash in the app":e==="SIGSEGV"||e==="SIGBUS"||e==="SIGABRT"?`died on ${e} \u2014 a native crash or a V8 abort (a heap out-of-memory prints "FATAL ERROR" on stderr first)`:e==="SIGPIPE"?"died on SIGPIPE \u2014 it wrote to a closed pipe":e==="SIGHUP"?"received SIGHUP \u2014 its terminal or parent session went away":e==="SIGINT"||e==="SIGTERM"||t===0?null:t===134?"aborted (exit 134, SIGABRT) \u2014 usually a V8 heap out-of-memory":t===1?"exited 1 \u2014 an uncaught exception or an explicit process.exit(1)":t!==null?`exited ${t}`:null}s(describeExit,"describeExit"),i(describeExit,"describeExit");function crashReport(t,e,o,n){const a=describeExit(e,o),r=[t+(a?` \u2014 ${a}`:"")];if(n.length){r.push(` last ${n.length} line(s) of output before it died:`);for(const u of n)r.push(` | ${u}`)}else r.push(" (it wrote nothing to stdout/stderr before it died)");return r.join(`
2
+ `)}s(crashReport,"crashReport"),i(crashReport,"crashReport");
@@ -1 +1 @@
1
- "use strict";var h=Object.defineProperty;var s=(e,t)=>h(e,"name",{value:t,configurable:!0});var p=Object.defineProperty,o=s((e,t)=>p(e,"name",{value:t,configurable:!0}),"o"),a=Object.defineProperty,r=o((e,t)=>a(e,"name",{value:t,configurable:!0}),"r");Object.defineProperty(exports,"__esModule",{value:!0}),exports.ForkTsCheckReporterPlugin=void 0,exports.loadForkTsChecker=loadForkTsChecker;const tslib_1=require("tslib"),path=tslib_1.__importStar(require("node:path")),typecheck_bus_1=require("./typecheck-bus");function loadForkTsChecker(e){const t=[];try{t.push(path.dirname(require.resolve("@nx/webpack/package.json",{paths:[e]})))}catch{}t.push(e,__dirname);for(const i of t)try{return require(require.resolve("fork-ts-checker-webpack-plugin",{paths:[i]}))}catch{}return null}s(loadForkTsChecker,"loadForkTsChecker"),o(loadForkTsChecker,"loadForkTsChecker"),r(loadForkTsChecker,"loadForkTsChecker");function toDiagnostic(e,t){return{file:e.file?path.relative(t,e.file)||e.file:"<unknown>",line:e.location?.start?.line??0,column:e.location?.start?.column??0,severity:e.severity==="warning"?"warning":"error",code:/^TS\d+$/.test(e.code)?e.code:`TS${e.code}`,message:e.message}}s(toDiagnostic,"toDiagnostic"),o(toDiagnostic,"toDiagnostic"),r(toDiagnostic,"toDiagnostic");class ForkTsCheckReporterPlugin{static{s(this,"ForkTsCheckReporterPlugin")}static{o(this,"ForkTsCheckReporterPlugin")}static{r(this,"ForkTsCheckReporterPlugin")}constructor(t){this.startedAt=0,this.opts=t}apply(t){const i=loadForkTsChecker(this.opts.workspaceRoot)?.getCompilerHooks;if(typeof i!="function")return;let n;try{n=i(t)}catch{return}n.start?.tapPromise("LensmcpForkTsCheckReporter",async c=>(this.startedAt=Date.now(),c)),n.issues?.tap("LensmcpForkTsCheckReporter",c=>{try{(0,typecheck_bus_1.publishTypecheckDiagnostics)({workspaceRoot:this.opts.workspaceRoot,project:this.opts.appName,tool:"fork-ts-checker",tsConfig:this.opts.tsConfig,diagnostics:(c??[]).map(l=>toDiagnostic(l,this.opts.workspaceRoot)),durationMs:this.startedAt?Date.now()-this.startedAt:0,...this.opts.eventFile?{eventFile:this.opts.eventFile}:{}})}catch{}return c})}}exports.ForkTsCheckReporterPlugin=ForkTsCheckReporterPlugin;
1
+ "use strict";var p=Object.defineProperty;var o=(e,t)=>p(e,"name",{value:t,configurable:!0});var a=Object.defineProperty,r=o((e,t)=>a(e,"name",{value:t,configurable:!0}),"r");Object.defineProperty(exports,"__esModule",{value:!0}),exports.ForkTsCheckReporterPlugin=void 0,exports.loadForkTsChecker=loadForkTsChecker;const tslib_1=require("tslib"),path=tslib_1.__importStar(require("node:path")),typecheck_bus_1=require("./typecheck-bus");function loadForkTsChecker(e){const t=[];try{t.push(path.dirname(require.resolve("@nx/webpack/package.json",{paths:[e]})))}catch{}t.push(e,__dirname);for(const s of t)try{return require(require.resolve("fork-ts-checker-webpack-plugin",{paths:[s]}))}catch{}return null}o(loadForkTsChecker,"loadForkTsChecker"),r(loadForkTsChecker,"loadForkTsChecker");function toDiagnostic(e,t){return{file:e.file?path.relative(t,e.file)||e.file:"<unknown>",line:e.location?.start?.line??0,column:e.location?.start?.column??0,severity:e.severity==="warning"?"warning":"error",code:/^TS\d+$/.test(e.code)?e.code:`TS${e.code}`,message:e.message}}o(toDiagnostic,"toDiagnostic"),r(toDiagnostic,"toDiagnostic");class ForkTsCheckReporterPlugin{static{o(this,"ForkTsCheckReporterPlugin")}static{r(this,"ForkTsCheckReporterPlugin")}constructor(t){this.startedAt=0,this.opts=t}apply(t){const s=loadForkTsChecker(this.opts.workspaceRoot)?.getCompilerHooks;if(typeof s!="function")return;let c;try{c=s(t)}catch{return}c.start?.tapPromise("LensmcpForkTsCheckReporter",async i=>(this.startedAt=Date.now(),i)),c.issues?.tap("LensmcpForkTsCheckReporter",i=>{try{(0,typecheck_bus_1.publishTypecheckDiagnostics)({workspaceRoot:this.opts.workspaceRoot,project:this.opts.appName,tool:"fork-ts-checker",tsConfig:this.opts.tsConfig,diagnostics:(i??[]).map(n=>toDiagnostic(n,this.opts.workspaceRoot)),durationMs:this.startedAt?Date.now()-this.startedAt:0,...this.opts.eventFile?{eventFile:this.opts.eventFile}:{}})}catch{}return i})}}exports.ForkTsCheckReporterPlugin=ForkTsCheckReporterPlugin;
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")});