lensmcp 1.26.3 → 1.26.4

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.
@@ -8853,7 +8853,7 @@ the project's owned paths and rules to them. Team \u203A Design proposes a team
8853
8853
  lensmcp agent team-init
8854
8854
  \`\`\``,howYouKnow:"An agent's `agent_join` answers its role's rules, and Team shows the session in its role.",turningOff:`The team's tools, Team and the Inbox leave, and the hooks stop coordinating. The store is kept \u2014 the board, the tasks
8855
8855
  and their logs come back when it is turned on again. Questions waiting for you stay in the store.`},file:"work/work.team.md"}],x2=yi.filter(e=>e!=="platform");function qb(e){let a=[e.sentence,""];a.push(`lensmcp.json ${e.file.exists?"this checkout\u2019s":"none \u2014 everything is on"}`);for(let o of e.file.problems)a.push(` ! ${o}`);e.file.unread.length&&a.push(` \xB7 not read by this version: ${e.file.unread.join(", ")}`),a.push(`On ${e.counts.tools} tools \xB7 ${e.counts.resources} resources \xB7 ${e.counts.screens} pages`),a.push("");for(let o of e.areas){let t=o.state==="on"?`on ${o.features.on} of ${o.features.total} features on${o.features.setup?` \xB7 ${o.features.setup} need${o.features.setup===1?"s":""} setup`:""}`:o.state==="planned"?"planned":`off ${ki(o)}`;a.push(`${o.title.padEnd(14)}${t}`);for(let s of e.features.filter(i=>i.area===o.area))s.state==="on"&&s.readiness==="setup"?a.push(` \u2717 ${s.title} (${s.id}) \u2014 ${wE(s)}`):s.state==="off"&&o.state==="on"&&a.push(` \u2013 ${s.title} (${s.id}) \u2014 off: ${ki(s)}`)}let n=e.features.filter(o=>o.state==="on"&&o.readiness==="waiting");return n.length&&a.push("",`Waiting for the app to run: ${n.map(o=>o.title).join(", ")}.`),a.push("","One feature\u2019s guide: lensmcp project <id> \xB7 all of it as JSON: lensmcp project --json"),e.file.exists&&a.push("lensmcp.json is read and shown; turning a feature off takes its tools and pages away from 01-split S2 on."),a.join(`
8856
- `)}r(qb,"cm"),u(qb,"projectText");var wE=u(e=>e.needs.filter(a=>!a.optional&&a.answer.state==="missing").map(a=>`${a.title}: ${a.answer.saw}${a.fix?` \u2192 ${a.fix.replace(/\.$/,"")}`:""}`).join("; "),"missingWords");function Rb(e){let a=e.features.filter(n=>n.state==="on");return{on:a.length,ready:a.filter(n=>n.readiness==="ready").length,waiting:a.filter(n=>n.readiness==="waiting").map(n=>n.id),unknown:a.filter(n=>n.readiness==="unknown").map(n=>n.id),needs:[...new Set(a.flatMap(n=>n.needs.map(o=>o.probe)))].sort(),setup:a.filter(n=>n.readiness==="setup").map(n=>({id:n.id,title:n.title,area:n.area,missing:n.needs.filter(o=>!o.optional&&o.answer.state==="missing").map(o=>({probe:o.probe,title:o.title,saw:o.answer.saw,fix:o.fix}))})),file:e.file}}r(Rb,"dm"),u(Rb,"doctorAnswer");import{createHash as yE}from"node:crypto";import{readFileSync as vE}from"node:fs";import{homedir as Lb}from"node:os";import{basename as bE,join as xi,resolve as kE}from"node:path";import{execFileSync as xE}from"node:child_process";import{basename as AE,dirname as EE,resolve as _E}from"node:path";var Pb=new Map;function Ub(e){let a=_E(e),n=Pb.get(a);if(n)return n;let o=a;try{let t=xE("git",["rev-parse","--path-format=absolute","--git-common-dir"],{cwd:a,encoding:"utf8",timeout:2e3,stdio:["ignore","pipe","ignore"]}).trim();t&&AE(t)===".git"&&(o=EE(t))}catch{}return Pb.set(a,o),o}r(Ub,"hm"),u(Ub,"mainCheckoutRoot"),Gv();var BE=["sunday","monday","saturday"],DE={min:1,max:500},ie={autoRoutes:"off",autoSql:"off",autoDailyMax:20,fold:"on",aiBodies:"off",reviewCode:"on",replay:"on",sqlValues:"on",teamLaunch:"off",goalWorktrees:"off",teamLaunchFallback:"off",teamLeadGuard:zv,terminals:"off",goalWorktreeServices:"on-demand",teamLaunchMax:3,teamDesignUsd:50,teamDesignDailyUsd:100,checkPick:"on",checkPickDailyUsd:20,retro:"on",retroDailyUsd:20,retroRunUsd:5,roadmapPlanner:"on",roadmapPlannerDailyUsd:25,roadmapWeekStart:"sunday",roadmapDayStart:8},zb={min:1,max:1e3},CE=u(e=>typeof e=="number"&&Number.isFinite(e)&&e>=zb.min&&e<=zb.max,"isDesignUsd"),Mb={min:1,max:200},IE=u(e=>typeof e=="number"&&Number.isFinite(e)&&e>=Mb.min&&e<=Mb.max,"isTuneUsd"),Wb={min:1,max:5e3},TE=u(e=>typeof e=="number"&&Number.isFinite(e)&&e>=Wb.min&&e<=Wb.max,"isDesignDailyUsd"),Zb={min:1,max:1e3},$E=u(e=>typeof e=="number"&&Number.isFinite(e)&&e>=Zb.min&&e<=Zb.max,"isPickDailyUsd"),SE={min:1,max:1e3},NE={min:1,max:20},Rm=u(e=>a=>typeof a=="number"&&Number.isFinite(a)&&a>=e.min&&a<=e.max,"inRange"),OE=Rm(SE),jE=Rm(NE),FE=Rm(DE),qE=u(e=>typeof e=="number"&&Number.isInteger(e)&&e>=0&&e<=23,"isDayStart"),Yb={min:1,max:10},Gb=u(e=>typeof e=="number"&&Number.isInteger(e)&&e>=Yb.min&&e<=Yb.max,"isLaunchMax"),RE=["off","changed","all"],LE=["on-demand","always","none"],PE=["off","named"],Ge=["on","off"],UE={autoDailyUsd:"auto",clickDailyUsd:"click",agentDailyUsd:"agent"},zE=1e3,ME=u(e=>typeof e=="number"&&Number.isFinite(e)&&e>=0&&e<=zE,"isAllowance");function Qb(e){let a={};try{a=e?JSON.parse(e):{}}catch{}let n=Number(a.autoDailyMax);return{autoRoutes:RE.includes(a.autoRoutes)?a.autoRoutes:ie.autoRoutes,autoSql:PE.includes(a.autoSql)?a.autoSql:ie.autoSql,autoDailyMax:Number.isInteger(n)&&n>=1&&n<=200?n:ie.autoDailyMax,fold:Ge.includes(a.fold)?a.fold:ie.fold,aiBodies:Ge.includes(a.aiBodies)?a.aiBodies:ie.aiBodies,reviewCode:Ge.includes(a.reviewCode)?a.reviewCode:ie.reviewCode,replay:Ge.includes(a.replay)?a.replay:ie.replay,sqlValues:Ge.includes(a.sqlValues)?a.sqlValues:ie.sqlValues,teamLaunch:Ge.includes(a.teamLaunch)?a.teamLaunch:ie.teamLaunch,goalWorktrees:Ge.includes(a.goalWorktrees)?a.goalWorktrees:ie.goalWorktrees,teamLaunchFallback:Ge.includes(a.teamLaunchFallback)?a.teamLaunchFallback:ie.teamLaunchFallback,teamLeadGuard:Uv.includes(a.teamLeadGuard)?a.teamLeadGuard:ie.teamLeadGuard,terminals:a.terminals==="on"?"on":ie.terminals,goalWorktreeServices:LE.includes(a.goalWorktreeServices)?a.goalWorktreeServices:ie.goalWorktreeServices,teamLaunchMax:Gb(a.teamLaunchMax)?a.teamLaunchMax:ie.teamLaunchMax,...Gb(a.teamLaunchCheckersMax)?{teamLaunchCheckersMax:a.teamLaunchCheckersMax}:{},teamDesignUsd:CE(a.teamDesignUsd)?a.teamDesignUsd:ie.teamDesignUsd,teamDesignDailyUsd:TE(a.teamDesignDailyUsd)?a.teamDesignDailyUsd:ie.teamDesignDailyUsd,...IE(a.teamTuneUsd)?{teamTuneUsd:a.teamTuneUsd}:{},checkPick:Ge.includes(a.checkPick)?a.checkPick:ie.checkPick,checkPickDailyUsd:$E(a.checkPickDailyUsd)?a.checkPickDailyUsd:ie.checkPickDailyUsd,retro:Ge.includes(a.retro)?a.retro:ie.retro,retroDailyUsd:OE(a.retroDailyUsd)?a.retroDailyUsd:ie.retroDailyUsd,retroRunUsd:jE(a.retroRunUsd)?a.retroRunUsd:ie.retroRunUsd,roadmapPlanner:Ge.includes(a.roadmapPlanner)?a.roadmapPlanner:ie.roadmapPlanner,roadmapPlannerDailyUsd:FE(a.roadmapPlannerDailyUsd)?a.roadmapPlannerDailyUsd:ie.roadmapPlannerDailyUsd,roadmapWeekStart:BE.includes(a.roadmapWeekStart)?a.roadmapWeekStart:ie.roadmapWeekStart,roadmapDayStart:qE(a.roadmapDayStart)?a.roadmapDayStart:ie.roadmapDayStart,...Object.fromEntries(Object.keys(UE).filter(o=>ME(a[o])).map(o=>[o,a[o]]))}}r(Qb,"Zv"),u(Qb,"readFeatures");import{readFileSync as WE}from"node:fs";import{basename as ZE,join as Kb}from"node:path";import{readFileSync as YE}from"node:fs";import{join as Hb}from"node:path";var GE=u(e=>!!e&&typeof e=="object"&&!Array.isArray(e),"isObj");function Lm(e,a){try{let n=JSON.parse(YE(e,"utf8"))?.[a];return GE(n)?n:{}}catch{return{}}}r(Lm,"Vv"),u(Lm,"block");function Ai(e){return{...Lm(Hb(e,"nx.json"),"lensmcp"),...Lm(Hb(e,"lensmcp.json"),"config")}}r(Ai,"Jn"),u(Ai,"readWorkspaceConfig");function Pm(e){try{return JSON.parse(WE(e,"utf8"))}catch{return}}r(Pm,"Qv"),u(Pm,"readJson");function Ss(e){return e.toLowerCase().replace(/^@[^/]+\//,"").replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")||"workspace"}r(Ss,"Ha"),u(Ss,"slugify");function Jb(e){let a=Pm(Kb(e,"nx.json")),n=Ai(e).key;if(typeof n=="string"&&n)return Ss(n);let o=Pm(Kb(e,"package.json"));return o?.name?Ss(o.name):a?.name?Ss(a.name):Ss(ZE(e))}r(Jb,"eb"),u(Jb,"resolveWorkspaceKey");import{readdirSync as QE,readFileSync as KE}from"node:fs";import{readFileSync as HE}from"node:fs";import{join as JE}from"node:path";function Um(e){try{let a=JSON.parse(HE(JE(e,"lensmcp.json"),"utf8")).services;return a&&typeof a=="object"&&!Array.isArray(a)?a:{}}catch{return{}}}r(Um,"Ga"),u(Um,"lensmcpServices");function zm(e,a,n){let o=e[a];if(o===!1)return;if(o&&typeof o=="object"&&!Array.isArray(o))return o;let t=n;return t?.cluster??t?.davnx}r(zm,"Ya"),u(zm,"declFor");import{basename as VE,dirname as XE,join as Vb,relative as e_}from"node:path";var t_=/^[A-Za-z0-9_-]+$/,a_=new Set(["kind","url","databases","lens","run"]);function Xb(e){let a=Ai(e).stores;return a===void 0?{stores:{},errors:[],notes:[]}:ek(a)}r(Xb,"tb"),u(Xb,"readStoresDecl");function ek(e){let a=[],n=[],o={};if(!e||typeof e!="object"||Array.isArray(e))return{stores:o,errors:["`lensmcp.stores` must be an object"],notes:n};for(let[t,s]of Object.entries(e)){let i=`stores.${t}`;if(!t_.test(t)){a.push(`${i}: a store name is letters, digits, '-' and '_'`);continue}if(!s||typeof s!="object"||Array.isArray(s)){a.push(`${i}: must be an object`);continue}let l=s,p=l.kind;if(p!=="postgres"&&p!=="redis"){a.push(`${i}.kind: one of "postgres", "redis"`);continue}let c=typeof l.url=="string"?l.url.trim():"";if(!c){a.push(`${i}.url: the connection URL is required (e.g. "\${${p==="postgres"?"PG_URL":"REDIS_URL"}}")`);continue}let g=l.databases??[];if(!Array.isArray(g)||!g.every(v=>typeof v=="string"&&v.trim())){a.push(`${i}.databases: a list of URLs or database names`);continue}if(g.length&&p!=="postgres"){a.push(`${i}.databases: only a postgres store has databases`);continue}let w=l.lens??{};if(!w||typeof w!="object"||Array.isArray(w)){a.push(`${i}.lens: must be an object`);continue}let f=w;if(f.url!==void 0&&(typeof f.url!="string"||!f.url.trim())){a.push(`${i}.lens.url: a connection URL`);continue}if(f.read!==void 0&&typeof f.read!="boolean"){a.push(`${i}.lens.read: true or false`);continue}if(f.prepare!==void 0&&typeof f.prepare!="boolean"){a.push(`${i}.lens.prepare: true or false`);continue}l.run!==void 0&&n.push(`${i}.run: planned \u2014 lensmcp does not start stores yet; the store is used as declared`);for(let v of Object.keys(l))a_.has(v)||n.push(`${i}.${v}: not a store setting \u2014 ignored`);o[t]={kind:p,url:c,databases:g.map(v=>v.trim()),lens:{...typeof f.url=="string"?{url:f.url.trim()}:{},read:f.read!==!1,prepare:f.prepare!==!1}}}return{stores:o,errors:a,notes:n}}r(ek,"ZS"),u(ek,"validateStoresDecl");var n_=new Set(["node_modules","dist","build","coverage","tmp","out-tsc","bundled"]),s_=6,r_=8e3;function tk(e){let a={parts:[],hosts:[],sources:{}},n=Um(e);for(let o of ak(e)){let t;try{t=JSON.parse(KE(o,"utf8"))}catch{continue}let s=typeof t.name=="string"&&t.name?t.name:VE(XE(o)),i=zm(n,s,t);if(!i||typeof i!="object")continue;let l=e_(e,o);typeof i.service=="string"&&i.service?(a.parts.push({name:s,part:"services",from:l}),Array.isArray(i.sources)&&i.sources.length&&(a.sources[s]=i.sources.length)):typeof i.host=="string"&&i.host&&a.parts.push({name:s,part:"web",from:l});for(let p of[i.host,i.internalHost])typeof p=="string"&&p&&!p.startsWith("*")&&a.hosts.push(p.toLowerCase())}for(let[o,t]of Object.entries(Xb(e).stores))a.parts.push({name:o.charAt(0).toUpperCase()+o.slice(1),part:t.kind==="postgres"?"stores.sql":"stores.kv",from:"nx.json"});return a.parts.sort((o,t)=>o.part.localeCompare(t.part)||o.name.localeCompare(t.name)),a.hosts=[...new Set(a.hosts)].sort(),a}r(tk,"sb"),u(tk,"discoverParts");function ak(e){let a=[],n=[{dir:e,depth:0}],o=0;for(;n.length&&o<r_;){let{dir:t,depth:s}=n.pop();o++;let i;try{i=QE(t,{withFileTypes:!0})}catch{continue}for(let l of i)l.isFile()&&l.name==="project.json"?a.push(Vb(t,l.name)):l.isDirectory()&&s<s_&&!n_.has(l.name)&&!l.name.startsWith(".")&&n.push({dir:Vb(t,l.name),depth:s+1})}return a.sort()}r(ak,"oE"),u(ak,"projectFiles");import{existsSync as o_}from"node:fs";function nk(e,a){if(!o_(e))return{unavailable:"no history yet \u2014 it starts with the lens"};let n;try{let t=process.emitWarning;process.emitWarning=((i,...l)=>{/sqlite/i.test(typeof i=="string"?i:i.message)||t.call(process,i,...l)});let s;try{s=process.getBuiltinModule("node:sqlite")}finally{process.emitWarning=t}n=new s.DatabaseSync(e,{readOnly:!0})}catch(t){return{unavailable:`the history cannot be opened (${t instanceof Error?t.message:String(t)})`}}let o;try{o=n.prepare("SELECT max(ts) AS ts FROM events WHERE kind = ?")}catch(t){return n.close(),{unavailable:`the history cannot be read (${t instanceof Error?t.message:String(t)})`}}return{file:e,newest:u(()=>n.prepare("SELECT max(ts) AS ts FROM events WHERE checkout = ?").get(a)?.ts??void 0,"newest"),lastSeen:u(t=>{let s;for(let i of t){let l=o.get(i)?.ts??void 0;l!==void 0&&(s===void 0||l>s)&&(s=l)}return s},"lastSeen"),meta:u(t=>n.prepare("SELECT value FROM meta WHERE key = ?").get(t)?.value,"meta"),close:u(()=>n.close(),"close")}}r(nk,"ob"),u(nk,"openHistoryFacts");import{accessSync as i_,constants as u_,existsSync as yt,readdirSync as sk,readFileSync as Mm,statSync as rk}from"node:fs";import{delimiter as h_,join as ke}from"node:path";var Ei=["sql-review","route-review","flow-review","ui-review","cache-review","queue-review","ai-review","ai-names","team","team-design"];function ok(e="**/"){return[`${e}.lensmcp/*`,...Ei.map(a=>`!${e}.lensmcp/${a}/`)]}r(ok,"aE"),u(ok,"lensGitignoreLines");var l_="# LensMCP: this machine's runtime state is ignored; the team's analyzer instructions are kept";function ik(e){let a=e.split(`
8856
+ `)}r(qb,"cm"),u(qb,"projectText");var wE=u(e=>e.needs.filter(a=>!a.optional&&a.answer.state==="missing").map(a=>`${a.title}: ${a.answer.saw}${a.fix?` \u2192 ${a.fix.replace(/\.$/,"")}`:""}`).join("; "),"missingWords");function Rb(e){let a=e.features.filter(n=>n.state==="on");return{on:a.length,ready:a.filter(n=>n.readiness==="ready").length,waiting:a.filter(n=>n.readiness==="waiting").map(n=>n.id),unknown:a.filter(n=>n.readiness==="unknown").map(n=>n.id),needs:[...new Set(a.flatMap(n=>n.needs.map(o=>o.probe)))].sort(),setup:a.filter(n=>n.readiness==="setup").map(n=>({id:n.id,title:n.title,area:n.area,missing:n.needs.filter(o=>!o.optional&&o.answer.state==="missing").map(o=>({probe:o.probe,title:o.title,saw:o.answer.saw,fix:o.fix}))})),file:e.file}}r(Rb,"dm"),u(Rb,"doctorAnswer");import{createHash as yE}from"node:crypto";import{readFileSync as vE}from"node:fs";import{homedir as Lb}from"node:os";import{basename as bE,join as xi,resolve as kE}from"node:path";import{execFileSync as xE}from"node:child_process";import{basename as AE,dirname as EE,resolve as _E}from"node:path";var Pb=new Map;function Ub(e){let a=_E(e),n=Pb.get(a);if(n)return n;let o=a;try{let t=xE("git",["rev-parse","--path-format=absolute","--git-common-dir"],{cwd:a,encoding:"utf8",timeout:2e3,stdio:["ignore","pipe","ignore"]}).trim();t&&AE(t)===".git"&&(o=EE(t))}catch{}return Pb.set(a,o),o}r(Ub,"hm"),u(Ub,"mainCheckoutRoot"),Gv();var BE=["sunday","monday","saturday"],DE={min:1,max:500},ie={autoRoutes:"off",autoSql:"off",autoDailyMax:20,fold:"on",aiBodies:"off",reviewCode:"on",replay:"on",sqlValues:"on",teamLaunch:"off",goalWorktrees:"off",teamLaunchFallback:"off",teamLeadGuard:zv,terminals:"off",goalWorktreeServices:"on-demand",teamLaunchMax:3,teamDesignUsd:50,teamDesignDailyUsd:100,checkPick:"on",checkPickDailyUsd:20,retro:"on",retroDailyUsd:20,retroRunUsd:5,roadmapPlanner:"on",roadmapPlannerDailyUsd:25,roadmapWeekStart:"sunday",roadmapDayStart:8},zb={min:1,max:1e3},CE=u(e=>typeof e=="number"&&Number.isFinite(e)&&e>=zb.min&&e<=zb.max,"isDesignUsd"),Mb={min:1,max:200},IE=u(e=>typeof e=="number"&&Number.isFinite(e)&&e>=Mb.min&&e<=Mb.max,"isTuneUsd"),Wb={min:1,max:5e3},TE=u(e=>typeof e=="number"&&Number.isFinite(e)&&e>=Wb.min&&e<=Wb.max,"isDesignDailyUsd"),Zb={min:1,max:1e3},$E=u(e=>typeof e=="number"&&Number.isFinite(e)&&e>=Zb.min&&e<=Zb.max,"isPickDailyUsd"),SE={min:1,max:1e3},NE={min:1,max:20},Rm=u(e=>a=>typeof a=="number"&&Number.isFinite(a)&&a>=e.min&&a<=e.max,"inRange"),OE=Rm(SE),jE=Rm(NE),FE=Rm(DE),qE=u(e=>typeof e=="number"&&Number.isInteger(e)&&e>=0&&e<=23,"isDayStart"),Yb={min:1,max:10},Gb=u(e=>typeof e=="number"&&Number.isInteger(e)&&e>=Yb.min&&e<=Yb.max,"isLaunchMax"),RE=["off","changed","all"],LE=["on-demand","always","none"],PE=["off","named"],Ge=["on","off"],UE={autoDailyUsd:"auto",clickDailyUsd:"click",agentDailyUsd:"agent"},zE=1e3,ME=u(e=>typeof e=="number"&&Number.isFinite(e)&&e>=0&&e<=zE,"isAllowance");function Qb(e){let a={};try{a=e?JSON.parse(e):{}}catch{}let n=Number(a.autoDailyMax);return{autoRoutes:RE.includes(a.autoRoutes)?a.autoRoutes:ie.autoRoutes,autoSql:PE.includes(a.autoSql)?a.autoSql:ie.autoSql,autoDailyMax:Number.isInteger(n)&&n>=1&&n<=200?n:ie.autoDailyMax,fold:Ge.includes(a.fold)?a.fold:ie.fold,aiBodies:Ge.includes(a.aiBodies)?a.aiBodies:ie.aiBodies,reviewCode:Ge.includes(a.reviewCode)?a.reviewCode:ie.reviewCode,replay:Ge.includes(a.replay)?a.replay:ie.replay,sqlValues:Ge.includes(a.sqlValues)?a.sqlValues:ie.sqlValues,teamLaunch:Ge.includes(a.teamLaunch)?a.teamLaunch:ie.teamLaunch,goalWorktrees:Ge.includes(a.goalWorktrees)?a.goalWorktrees:ie.goalWorktrees,teamLaunchFallback:Ge.includes(a.teamLaunchFallback)?a.teamLaunchFallback:ie.teamLaunchFallback,teamLeadGuard:Uv.includes(a.teamLeadGuard)?a.teamLeadGuard:ie.teamLeadGuard,terminals:a.terminals==="on"?"on":ie.terminals,goalWorktreeServices:LE.includes(a.goalWorktreeServices)?a.goalWorktreeServices:ie.goalWorktreeServices,teamLaunchMax:Gb(a.teamLaunchMax)?a.teamLaunchMax:ie.teamLaunchMax,...Gb(a.teamLaunchCheckersMax)?{teamLaunchCheckersMax:a.teamLaunchCheckersMax}:{},teamDesignUsd:CE(a.teamDesignUsd)?a.teamDesignUsd:ie.teamDesignUsd,teamDesignDailyUsd:TE(a.teamDesignDailyUsd)?a.teamDesignDailyUsd:ie.teamDesignDailyUsd,...IE(a.teamTuneUsd)?{teamTuneUsd:a.teamTuneUsd}:{},checkPick:Ge.includes(a.checkPick)?a.checkPick:ie.checkPick,checkPickDailyUsd:$E(a.checkPickDailyUsd)?a.checkPickDailyUsd:ie.checkPickDailyUsd,retro:Ge.includes(a.retro)?a.retro:ie.retro,retroDailyUsd:OE(a.retroDailyUsd)?a.retroDailyUsd:ie.retroDailyUsd,retroRunUsd:jE(a.retroRunUsd)?a.retroRunUsd:ie.retroRunUsd,roadmapPlanner:Ge.includes(a.roadmapPlanner)?a.roadmapPlanner:ie.roadmapPlanner,roadmapPlannerDailyUsd:FE(a.roadmapPlannerDailyUsd)?a.roadmapPlannerDailyUsd:ie.roadmapPlannerDailyUsd,roadmapWeekStart:BE.includes(a.roadmapWeekStart)?a.roadmapWeekStart:ie.roadmapWeekStart,roadmapDayStart:qE(a.roadmapDayStart)?a.roadmapDayStart:ie.roadmapDayStart,...Object.fromEntries(Object.keys(UE).filter(o=>ME(a[o])).map(o=>[o,a[o]]))}}r(Qb,"Zv"),u(Qb,"readFeatures");import{readFileSync as WE}from"node:fs";import{basename as ZE,join as Kb}from"node:path";import{readFileSync as YE}from"node:fs";import{join as Hb}from"node:path";var GE=u(e=>!!e&&typeof e=="object"&&!Array.isArray(e),"isObj");function Lm(e,a){try{let n=JSON.parse(YE(e,"utf8"))?.[a];return GE(n)?n:{}}catch{return{}}}r(Lm,"Vv"),u(Lm,"block");function Ai(e){return{...Lm(Hb(e,"nx.json"),"lensmcp"),...Lm(Hb(e,"lensmcp.json"),"config")}}r(Ai,"Jn"),u(Ai,"readWorkspaceConfig");function Pm(e){try{return JSON.parse(WE(e,"utf8"))}catch{return}}r(Pm,"Qv"),u(Pm,"readJson");function Ss(e){return e.toLowerCase().replace(/^@[^/]+\//,"").replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")||"workspace"}r(Ss,"Ha"),u(Ss,"slugify");function Jb(e){let a=Pm(Kb(e,"nx.json")),n=Ai(e).key;if(typeof n=="string"&&n)return Ss(n);let o=Pm(Kb(e,"package.json"));return o?.name?Ss(o.name):a?.name?Ss(a.name):Ss(ZE(e))}r(Jb,"eb"),u(Jb,"resolveWorkspaceKey");import{readdirSync as QE,readFileSync as KE}from"node:fs";import{readFileSync as HE}from"node:fs";import{join as JE}from"node:path";function Um(e){try{let a=JSON.parse(HE(JE(e,"lensmcp.json"),"utf8")).services;return a&&typeof a=="object"&&!Array.isArray(a)?a:{}}catch{return{}}}r(Um,"Ga"),u(Um,"lensmcpServices");function zm(e,a,n){let o=e[a];if(o===!1)return;let t=n,s=t?.cluster??t?.davnx;return o&&typeof o=="object"&&!Array.isArray(o)?{...s,...o}:s}r(zm,"Ya"),u(zm,"declFor");import{basename as VE,dirname as XE,join as Vb,relative as e_}from"node:path";var t_=/^[A-Za-z0-9_-]+$/,a_=new Set(["kind","url","databases","lens","run"]);function Xb(e){let a=Ai(e).stores;return a===void 0?{stores:{},errors:[],notes:[]}:ek(a)}r(Xb,"tb"),u(Xb,"readStoresDecl");function ek(e){let a=[],n=[],o={};if(!e||typeof e!="object"||Array.isArray(e))return{stores:o,errors:["`lensmcp.stores` must be an object"],notes:n};for(let[t,s]of Object.entries(e)){let i=`stores.${t}`;if(!t_.test(t)){a.push(`${i}: a store name is letters, digits, '-' and '_'`);continue}if(!s||typeof s!="object"||Array.isArray(s)){a.push(`${i}: must be an object`);continue}let l=s,p=l.kind;if(p!=="postgres"&&p!=="redis"){a.push(`${i}.kind: one of "postgres", "redis"`);continue}let c=typeof l.url=="string"?l.url.trim():"";if(!c){a.push(`${i}.url: the connection URL is required (e.g. "\${${p==="postgres"?"PG_URL":"REDIS_URL"}}")`);continue}let g=l.databases??[];if(!Array.isArray(g)||!g.every(v=>typeof v=="string"&&v.trim())){a.push(`${i}.databases: a list of URLs or database names`);continue}if(g.length&&p!=="postgres"){a.push(`${i}.databases: only a postgres store has databases`);continue}let w=l.lens??{};if(!w||typeof w!="object"||Array.isArray(w)){a.push(`${i}.lens: must be an object`);continue}let f=w;if(f.url!==void 0&&(typeof f.url!="string"||!f.url.trim())){a.push(`${i}.lens.url: a connection URL`);continue}if(f.read!==void 0&&typeof f.read!="boolean"){a.push(`${i}.lens.read: true or false`);continue}if(f.prepare!==void 0&&typeof f.prepare!="boolean"){a.push(`${i}.lens.prepare: true or false`);continue}l.run!==void 0&&n.push(`${i}.run: planned \u2014 lensmcp does not start stores yet; the store is used as declared`);for(let v of Object.keys(l))a_.has(v)||n.push(`${i}.${v}: not a store setting \u2014 ignored`);o[t]={kind:p,url:c,databases:g.map(v=>v.trim()),lens:{...typeof f.url=="string"?{url:f.url.trim()}:{},read:f.read!==!1,prepare:f.prepare!==!1}}}return{stores:o,errors:a,notes:n}}r(ek,"ZS"),u(ek,"validateStoresDecl");var n_=new Set(["node_modules","dist","build","coverage","tmp","out-tsc","bundled"]),s_=6,r_=8e3;function tk(e){let a={parts:[],hosts:[],sources:{}},n=Um(e);for(let o of ak(e)){let t;try{t=JSON.parse(KE(o,"utf8"))}catch{continue}let s=typeof t.name=="string"&&t.name?t.name:VE(XE(o)),i=zm(n,s,t);if(!i||typeof i!="object")continue;let l=e_(e,o);typeof i.service=="string"&&i.service?(a.parts.push({name:s,part:"services",from:l}),Array.isArray(i.sources)&&i.sources.length&&(a.sources[s]=i.sources.length)):typeof i.host=="string"&&i.host&&a.parts.push({name:s,part:"web",from:l});for(let p of[i.host,i.internalHost])typeof p=="string"&&p&&!p.startsWith("*")&&a.hosts.push(p.toLowerCase())}for(let[o,t]of Object.entries(Xb(e).stores))a.parts.push({name:o.charAt(0).toUpperCase()+o.slice(1),part:t.kind==="postgres"?"stores.sql":"stores.kv",from:"nx.json"});return a.parts.sort((o,t)=>o.part.localeCompare(t.part)||o.name.localeCompare(t.name)),a.hosts=[...new Set(a.hosts)].sort(),a}r(tk,"sb"),u(tk,"discoverParts");function ak(e){let a=[],n=[{dir:e,depth:0}],o=0;for(;n.length&&o<r_;){let{dir:t,depth:s}=n.pop();o++;let i;try{i=QE(t,{withFileTypes:!0})}catch{continue}for(let l of i)l.isFile()&&l.name==="project.json"?a.push(Vb(t,l.name)):l.isDirectory()&&s<s_&&!n_.has(l.name)&&!l.name.startsWith(".")&&n.push({dir:Vb(t,l.name),depth:s+1})}return a.sort()}r(ak,"oE"),u(ak,"projectFiles");import{existsSync as o_}from"node:fs";function nk(e,a){if(!o_(e))return{unavailable:"no history yet \u2014 it starts with the lens"};let n;try{let t=process.emitWarning;process.emitWarning=((i,...l)=>{/sqlite/i.test(typeof i=="string"?i:i.message)||t.call(process,i,...l)});let s;try{s=process.getBuiltinModule("node:sqlite")}finally{process.emitWarning=t}n=new s.DatabaseSync(e,{readOnly:!0})}catch(t){return{unavailable:`the history cannot be opened (${t instanceof Error?t.message:String(t)})`}}let o;try{o=n.prepare("SELECT max(ts) AS ts FROM events WHERE kind = ?")}catch(t){return n.close(),{unavailable:`the history cannot be read (${t instanceof Error?t.message:String(t)})`}}return{file:e,newest:u(()=>n.prepare("SELECT max(ts) AS ts FROM events WHERE checkout = ?").get(a)?.ts??void 0,"newest"),lastSeen:u(t=>{let s;for(let i of t){let l=o.get(i)?.ts??void 0;l!==void 0&&(s===void 0||l>s)&&(s=l)}return s},"lastSeen"),meta:u(t=>n.prepare("SELECT value FROM meta WHERE key = ?").get(t)?.value,"meta"),close:u(()=>n.close(),"close")}}r(nk,"ob"),u(nk,"openHistoryFacts");import{accessSync as i_,constants as u_,existsSync as yt,readdirSync as sk,readFileSync as Mm,statSync as rk}from"node:fs";import{delimiter as h_,join as ke}from"node:path";var Ei=["sql-review","route-review","flow-review","ui-review","cache-review","queue-review","ai-review","ai-names","team","team-design"];function ok(e="**/"){return[`${e}.lensmcp/*`,...Ei.map(a=>`!${e}.lensmcp/${a}/`)]}r(ok,"aE"),u(ok,"lensGitignoreLines");var l_="# LensMCP: this machine's runtime state is ignored; the team's analyzer instructions are kept";function ik(e){let a=e.split(`
8857
8857
  `),n=/^(\/|\*\*\/)?\.lensmcp\/?(\*)?$/,o=a.findIndex(i=>n.test(i.trim())),t=!1;if(o<0){let i=e.length&&!e.endsWith(`
8858
8858
  `)?`${e}
8859
8859
  `:e;return{text:`${i}${i.trim()?`
@@ -16,7 +16,7 @@ export declare function withBridgeAllowedOrigins(existing: string | undefined, h
16
16
  export declare function lensmcpJsonProblem(root: string): string | undefined;
17
17
  /** The services `<root>/lensmcp.json` declares — read before a project's own `project.json` (lock-step with @lensmcp/cluster runtime/services-decl.ts). */
18
18
  export declare function lensmcpServices(root: string): Record<string, unknown>;
19
- /** A project's declaration: lensmcp.json `services` first (`false` turns it off), then its `cluster`, then `davnx`. */
19
+ /** A project's declaration: its `cluster` (else `davnx`), with its lensmcp.json `services` entry over it key by key; `false` turns it off. */
20
20
  export declare function declFor<D>(services: Readonly<Record<string, unknown>>, name: string | undefined, raw: {
21
21
  cluster?: D;
22
22
  davnx?: D;
@@ -1 +1 @@
1
- "use strict";var u=Object.defineProperty;var s=(r,e)=>u(r,"name",{value:e,configurable:!0});var f=Object.defineProperty,n=s((r,e)=>f(r,"name",{value:e,configurable:!0}),"o");import{readFileSync as a}from"node:fs";import{basename as p,dirname as m,join as l}from"node:path";export function clusterPageHosts(r){const e=new Set;for(const o of r){if(o.service||typeof o.host!="string")continue;const t=o.host.trim().toLowerCase();t&&e.add(t.startsWith("*.")?t.slice(1):t)}return[...e]}s(clusterPageHosts,"clusterPageHosts"),n(clusterPageHosts,"clusterPageHosts");export function withBridgeAllowedOrigins(r,e){const o=[...new Set([...(r??"").split(/[\s,]+/).filter(Boolean),...e])];return o.length>0?o.join(","):void 0}s(withBridgeAllowedOrigins,"withBridgeAllowedOrigins"),n(withBridgeAllowedOrigins,"withBridgeAllowedOrigins");export function lensmcpJsonProblem(r){const e=l(r,"lensmcp.json");let o;try{o=a(e,"utf8")}catch{return}try{const t=JSON.parse(o);return t&&typeof t=="object"&&!Array.isArray(t)?void 0:`${e} is not a JSON object \u2014 fix it, or remove it`}catch(t){return`${e} is not valid JSON (${t instanceof Error?t.message:String(t)}) \u2014 fix it, or remove it`}}s(lensmcpJsonProblem,"lensmcpJsonProblem"),n(lensmcpJsonProblem,"lensmcpJsonProblem");export function lensmcpServices(r){try{const e=JSON.parse(a(l(r,"lensmcp.json"),"utf8")).services;return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}s(lensmcpServices,"lensmcpServices"),n(lensmcpServices,"lensmcpServices");export function declFor(r,e,o){const t=e===void 0?void 0:r[e];if(t!==!1)return t&&typeof t=="object"&&!Array.isArray(t)?t:o?.cluster??o?.davnx}s(declFor,"declFor"),n(declFor,"declFor");export function readClusterPageDecls(r,e={}){const o=[];for(const t of r)try{const i=JSON.parse(a(t,"utf8")),c=declFor(e,typeof i.name=="string"?i.name:p(m(t)),i);c&&typeof c=="object"&&o.push(c)}catch{}return o}s(readClusterPageDecls,"readClusterPageDecls"),n(readClusterPageDecls,"readClusterPageDecls");
1
+ "use strict";var l=Object.defineProperty;var s=(r,e)=>l(r,"name",{value:e,configurable:!0});var f=Object.defineProperty,c=s((r,e)=>f(r,"name",{value:e,configurable:!0}),"o");import{readFileSync as a}from"node:fs";import{basename as p,dirname as m,join as u}from"node:path";export function clusterPageHosts(r){const e=new Set;for(const o of r){if(o.service||typeof o.host!="string")continue;const t=o.host.trim().toLowerCase();t&&e.add(t.startsWith("*.")?t.slice(1):t)}return[...e]}s(clusterPageHosts,"clusterPageHosts"),c(clusterPageHosts,"clusterPageHosts");export function withBridgeAllowedOrigins(r,e){const o=[...new Set([...(r??"").split(/[\s,]+/).filter(Boolean),...e])];return o.length>0?o.join(","):void 0}s(withBridgeAllowedOrigins,"withBridgeAllowedOrigins"),c(withBridgeAllowedOrigins,"withBridgeAllowedOrigins");export function lensmcpJsonProblem(r){const e=u(r,"lensmcp.json");let o;try{o=a(e,"utf8")}catch{return}try{const t=JSON.parse(o);return t&&typeof t=="object"&&!Array.isArray(t)?void 0:`${e} is not a JSON object \u2014 fix it, or remove it`}catch(t){return`${e} is not valid JSON (${t instanceof Error?t.message:String(t)}) \u2014 fix it, or remove it`}}s(lensmcpJsonProblem,"lensmcpJsonProblem"),c(lensmcpJsonProblem,"lensmcpJsonProblem");export function lensmcpServices(r){try{const e=JSON.parse(a(u(r,"lensmcp.json"),"utf8")).services;return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}s(lensmcpServices,"lensmcpServices"),c(lensmcpServices,"lensmcpServices");export function declFor(r,e,o){const t=e===void 0?void 0:r[e];if(t===!1)return;const n=o?.cluster??o?.davnx;return t&&typeof t=="object"&&!Array.isArray(t)?{...n,...t}:n}s(declFor,"declFor"),c(declFor,"declFor");export function readClusterPageDecls(r,e={}){const o=[];for(const t of r)try{const n=JSON.parse(a(t,"utf8")),i=declFor(e,typeof n.name=="string"?n.name:p(m(t)),n);i&&typeof i=="object"&&o.push(i)}catch{}return o}s(readClusterPageDecls,"readClusterPageDecls"),c(readClusterPageDecls,"readClusterPageDecls");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lensmcp",
3
- "version": "1.26.3",
3
+ "version": "1.26.4",
4
4
  "type": "module",
5
5
  "main": "./index.js",
6
6
  "module": "./index.js",
@@ -18,8 +18,8 @@
18
18
  },
19
19
  "dependencies": {
20
20
  "@frontmcp/sdk": "^1.12.1",
21
- "@lensmcp/cluster": "1.26.3",
22
- "@lensmcp/nx-plugin": "1.26.3",
21
+ "@lensmcp/cluster": "1.26.4",
22
+ "@lensmcp/nx-plugin": "1.26.4",
23
23
  "reflect-metadata": "^0.2.2",
24
24
  "tslib": "^2.3.0",
25
25
  "vectoriadb": "^2.2.0"
@@ -2,7 +2,7 @@
2
2
  "name": "lensmcp",
3
3
  "displayName": "LensMCP",
4
4
  "description": "The observability lens for coding agents. One command brings up the dev cluster gateway (every project.json `cluster` decl → its host on :443), the per-project lens dashboard at https://lensmcp.local/<project>/, and the MCP server your agent connects to — scoped automatically to whatever project you opened Claude Code in.",
5
- "version": "1.26.3",
5
+ "version": "1.26.4",
6
6
  "author": {
7
7
  "name": "David Antoon",
8
8
  "email": "davidmantoon@gmail.com"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lensmcp",
3
- "version": "1.26.3",
3
+ "version": "1.26.4",
4
4
  "description": "Observe a running Nx workspace from Codex with runtime flows, build health, cluster failures, and a live dashboard.",
5
5
  "author": {
6
6
  "name": "David Antoon",