@lensmcp/vite-plugin 1.25.16 → 1.25.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/event-mappers.js +2 -2
- package/lib/plugin.d.ts +22 -0
- package/lib/plugin.js +31 -7
- package/lib/replay-setting.d.ts +18 -0
- package/lib/replay-setting.js +1 -0
- package/lib/runtime-guard.d.ts +6 -0
- package/lib/runtime-guard.js +1 -1
- package/lib/types.d.ts +6 -0
- package/package.json +7 -6
package/lib/event-mappers.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var Ye=Object.defineProperty;var c=(e,n)=>Ye(e,"name",{value:n,configurable:!0});var Ze=Object.defineProperty,v=c((e,n)=>Ze(e,"name",{value:n,configurable:!0}),"c"),_e=Object.defineProperty,f=v((e,n)=>_e(e,"name",{value:n,configurable:!0}),"u"),en=Object.defineProperty,p=f((e,n)=>en(e,"name",{value:n,configurable:!0}),"u"),nn=Object.defineProperty,b=p((e,n)=>nn(e,"name",{value:n,configurable:!0}),"u"),tn=Object.defineProperty,d=b((e,n)=>tn(e,"name",{value:n,configurable:!0}),"c"),on=Object.defineProperty,m=d((e,n)=>on(e,"name",{value:n,configurable:!0}),"c"),rn=Object.defineProperty,s=m((e,n)=>rn(e,"name",{value:n,configurable:!0}),"c"),an=Object.defineProperty,g=s((e,n)=>an(e,"name",{value:n,configurable:!0}),"u"),ln=Object.defineProperty,y=g((e,n)=>ln(e,"name",{value:n,configurable:!0}),"u"),un=Object.defineProperty,j=y((e,n)=>un(e,"name",{value:n,configurable:!0}),"u"),cn=Object.defineProperty,T=j((e,n)=>cn(e,"name",{value:n,configurable:!0}),"c"),vn=Object.defineProperty,E=T((e,n)=>vn(e,"name",{value:n,configurable:!0}),"c"),fn=Object.defineProperty,O=E((e,n)=>fn(e,"name",{value:n,configurable:!0}),"c"),pn=Object.defineProperty,P=O((e,n)=>pn(e,"name",{value:n,configurable:!0}),"u"),bn=Object.defineProperty,I=P((e,n)=>bn(e,"name",{value:n,configurable:!0}),"u"),dn=Object.defineProperty,w=I((e,n)=>dn(e,"name",{value:n,configurable:!0}),"u"),mn=Object.defineProperty,k=w((e,n)=>mn(e,"name",{value:n,configurable:!0}),"c"),sn=Object.defineProperty,$=k((e,n)=>sn(e,"name",{value:n,configurable:!0}),"c"),gn=Object.defineProperty,h=$((e,n)=>gn(e,"name",{value:n,configurable:!0}),"c"),yn=Object.defineProperty,x=h((e,n)=>yn(e,"name",{value:n,configurable:!0}),"u"),jn=Object.defineProperty,S=x((e,n)=>jn(e,"name",{value:n,configurable:!0}),"u"),Tn=Object.defineProperty,U=S((e,n)=>Tn(e,"name",{value:n,configurable:!0}),"u"),En=Object.defineProperty,R=U((e,n)=>En(e,"name",{value:n,configurable:!0}),"c"),On=Object.defineProperty,A=R((e,n)=>On(e,"name",{value:n,configurable:!0}),"c"),Pn=Object.defineProperty,C=A((e,n)=>Pn(e,"name",{value:n,configurable:!0}),"c"),In=Object.defineProperty,F=C((e,n)=>In(e,"name",{value:n,configurable:!0}),"u"),wn=Object.defineProperty,J=F((e,n)=>wn(e,"name",{value:n,configurable:!0}),"u"),kn=Object.defineProperty,L=J((e,n)=>kn(e,"name",{value:n,configurable:!0}),"u"),$n=Object.defineProperty,N=L((e,n)=>$n(e,"name",{value:n,configurable:!0}),"c"),hn=Object.defineProperty,q=N((e,n)=>hn(e,"name",{value:n,configurable:!0}),"c"),xn=Object.defineProperty,z=q((e,n)=>xn(e,"name",{value:n,configurable:!0}),"c"),Sn=Object.defineProperty,B=z((e,n)=>Sn(e,"name",{value:n,configurable:!0}),"u"),Un=Object.defineProperty,D=B((e,n)=>Un(e,"name",{value:n,configurable:!0}),"u"),Rn=Object.defineProperty,G=D((e,n)=>Rn(e,"name",{value:n,configurable:!0}),"u"),An=Object.defineProperty,H=G((e,n)=>An(e,"name",{value:n,configurable:!0}),"c"),Cn=Object.defineProperty,K=H((e,n)=>Cn(e,"name",{value:n,configurable:!0}),"c"),Fn=Object.defineProperty,M=K((e,n)=>Fn(e,"name",{value:n,configurable:!0}),"c"),Jn=Object.defineProperty,Q=M((e,n)=>Jn(e,"name",{value:n,configurable:!0}),"u"),Ln=Object.defineProperty,V=Q((e,n)=>Ln(e,"name",{value:n,configurable:!0}),"u"),Nn=Object.defineProperty,W=V((e,n)=>Nn(e,"name",{value:n,configurable:!0}),"u"),qn=Object.defineProperty,X=W((e,n)=>qn(e,"name",{value:n,configurable:!0}),"c"),zn=Object.defineProperty,Y=X((e,n)=>zn(e,"name",{value:n,configurable:!0}),"c"),Bn=Object.defineProperty,Z=Y((e,n)=>Bn(e,"name",{value:n,configurable:!0}),"c"),Dn=Object.defineProperty,_=Z((e,n)=>Dn(e,"name",{value:n,configurable:!0}),"u"),Gn=Object.defineProperty,ee=_((e,n)=>Gn(e,"name",{value:n,configurable:!0}),"u"),Hn=Object.defineProperty,ne=ee((e,n)=>Hn(e,"name",{value:n,configurable:!0}),"u"),Kn=Object.defineProperty,te=ne((e,n)=>Kn(e,"name",{value:n,configurable:!0}),"c"),Mn=Object.defineProperty,oe=te((e,n)=>Mn(e,"name",{value:n,configurable:!0}),"c"),Qn=Object.defineProperty,re=oe((e,n)=>Qn(e,"name",{value:n,configurable:!0}),"c"),Vn=Object.defineProperty,ae=re((e,n)=>Vn(e,"name",{value:n,configurable:!0}),"u"),Wn=Object.defineProperty,ie=ae((e,n)=>Wn(e,"name",{value:n,configurable:!0}),"u"),Xn=Object.defineProperty,le=ie((e,n)=>Xn(e,"name",{value:n,configurable:!0}),"u"),Yn=Object.defineProperty,ue=le((e,n)=>Yn(e,"name",{value:n,configurable:!0}),"c"),Zn=Object.defineProperty,ce=ue((e,n)=>Zn(e,"name",{value:n,configurable:!0}),"c"),_n=Object.defineProperty,ve=ce((e,n)=>_n(e,"name",{value:n,configurable:!0}),"c"),et=Object.defineProperty,fe=ve((e,n)=>et(e,"name",{value:n,configurable:!0}),"u"),nt=Object.defineProperty,pe=fe((e,n)=>nt(e,"name",{value:n,configurable:!0}),"u"),tt=Object.defineProperty,be=pe((e,n)=>tt(e,"name",{value:n,configurable:!0}),"u"),ot=Object.defineProperty,de=be((e,n)=>ot(e,"name",{value:n,configurable:!0}),"u"),rt=Object.defineProperty,me=de((e,n)=>rt(e,"name",{value:n,configurable:!0}),"u"),at=Object.defineProperty,se=me((e,n)=>at(e,"name",{value:n,configurable:!0}),"u"),it=Object.defineProperty,ge=se((e,n)=>it(e,"name",{value:n,configurable:!0}),"u"),lt=Object.defineProperty,ye=ge((e,n)=>lt(e,"name",{value:n,configurable:!0}),"u"),ut=Object.defineProperty,je=ye((e,n)=>ut(e,"name",{value:n,configurable:!0}),"u"),ct=Object.defineProperty,Te=je((e,n)=>ct(e,"name",{value:n,configurable:!0}),"s"),vt=Object.defineProperty,Ee=Te((e,n)=>vt(e,"name",{value:n,configurable:!0}),"s"),ft=Object.defineProperty,Oe=Ee((e,n)=>ft(e,"name",{value:n,configurable:!0}),"s"),pt=Object.defineProperty,Pe=Oe((e,n)=>pt(e,"name",{value:n,configurable:!0}),"c"),bt=Object.defineProperty,Ie=Pe((e,n)=>bt(e,"name",{value:n,configurable:!0}),"c"),dt=Object.defineProperty,we=Ie((e,n)=>dt(e,"name",{value:n,configurable:!0}),"c"),mt=Object.defineProperty,ke=we((e,n)=>mt(e,"name",{value:n,configurable:!0}),"c"),st=Object.defineProperty,$e=ke((e,n)=>st(e,"name",{value:n,configurable:!0}),"c"),gt=Object.defineProperty,he=$e((e,n)=>gt(e,"name",{value:n,configurable:!0}),"c"),yt=Object.defineProperty,xe=he((e,n)=>yt(e,"name",{value:n,configurable:!0}),"l"),jt=Object.defineProperty,Se=xe((e,n)=>jt(e,"name",{value:n,configurable:!0}),"l"),Tt=Object.defineProperty,Ue=Se((e,n)=>Tt(e,"name",{value:n,configurable:!0}),"c"),Et=Object.defineProperty,Re=Ue((e,n)=>Et(e,"name",{value:n,configurable:!0}),"c"),Ot=Object.defineProperty,Ae=Re((e,n)=>Ot(e,"name",{value:n,configurable:!0}),"c"),Pt=Object.defineProperty,Ce=Ae((e,n)=>Pt(e,"name",{value:n,configurable:!0}),"u"),It=Object.defineProperty,Fe=Ce((e,n)=>It(e,"name",{value:n,configurable:!0}),"u"),wt=Object.defineProperty,Je=Fe((e,n)=>wt(e,"name",{value:n,configurable:!0}),"u"),kt=Object.defineProperty,Le=Je((e,n)=>kt(e,"name",{value:n,configurable:!0}),"c"),$t=Object.defineProperty,Ne=Le((e,n)=>$t(e,"name",{value:n,configurable:!0}),"c"),ht=Object.defineProperty,qe=Ne((e,n)=>ht(e,"name",{value:n,configurable:!0}),"c"),xt=Object.defineProperty,ze=qe((e,n)=>xt(e,"name",{value:n,configurable:!0}),"u"),St=Object.defineProperty,Be=ze((e,n)=>St(e,"name",{value:n,configurable:!0}),"u"),Ut=Object.defineProperty,De=Be((e,n)=>Ut(e,"name",{value:n,configurable:!0}),"u"),Rt=Object.defineProperty,Ge=De((e,n)=>Rt(e,"name",{value:n,configurable:!0}),"u"),At=Object.defineProperty,He=Ge((e,n)=>At(e,"name",{value:n,configurable:!0}),"o"),Ct=Object.defineProperty,Ke=He((e,n)=>Ct(e,"name",{value:n,configurable:!0}),"o"),Ft=Object.defineProperty,Me=Ke((e,n)=>Ft(e,"name",{value:n,configurable:!0}),"o"),Jt=Object.defineProperty,Qe=Me((e,n)=>Jt(e,"name",{value:n,configurable:!0}),"o"),Lt=Object.defineProperty,Ve=Qe((e,n)=>Lt(e,"name",{value:n,configurable:!0}),"o"),Nt=Object.defineProperty,We=Ve((e,n)=>Nt(e,"name",{value:n,configurable:!0}),"o");import{fingerprint as l,ulid as u}from"@lensmcp/core";const qt="pending";export function envelopeToEvent(e,n=qt){const a=e.tabId?{tabId:e.tabId}:{};switch(e.kind){case"error":return{id:u(),sessionId:n,timestamp:e.at,source:"client-runtime",category:"runtime",severity:"error",context:{sessionId:n,...a},fingerprint:l({kind:"runtime",identity:`error:${t(e.stack)}`,file:e.source,detail:e.message}),title:e.message,message:e.stack??e.message,location:e.source?{file:e.source,line:e.lineno,column:e.colno}:void 0,raw:e};case"unhandledrejection":return{id:u(),sessionId:n,timestamp:e.at,source:"client-runtime",category:"runtime",severity:"error",context:{sessionId:n,...a},fingerprint:l({kind:"runtime",identity:`unhandledrejection:${e.reason.slice(0,80)}`}),title:"Unhandled promise rejection",message:e.reason,raw:e};case"console":{const i=e.level==="error"?"error":e.level==="warn"?"warning":"info",Xe=e.args.map(r).join(" ");return{id:u(),sessionId:n,timestamp:e.at,source:"client-runtime",category:"runtime",severity:i,context:{sessionId:n,...a},fingerprint:l({kind:"runtime",identity:`console:${e.level}:${Xe.slice(0,80)}`}),title:`console.${e.level}`,message:Xe,raw:e}}case"fetch":{const i=e.error!==void 0||e.status!==void 0&&e.status>=400;return{id:u(),sessionId:n,timestamp:e.at,source:"client-runtime",category:"network",severity:i?"error":"info",context:{sessionId:n,...a},fingerprint:l({kind:"network",identity:`${e.method}:${o(e.url)}:${e.status??"err"}`}),title:`${e.method} ${e.url}${e.status!==void 0?` \u2192 ${e.status}`:""}`,message:e.error,relatedUrls:[e.url],raw:e}}case"route":return{id:u(),sessionId:n,timestamp:e.at,source:"client-runtime",category:"runtime",severity:"info",context:{sessionId:n,url:e.url,...a},fingerprint:l({kind:"runtime",identity:`route:${e.url}`}),title:`Route \u2192 ${e.url}`,raw:e};case"ready":return{id:u(),sessionId:n,timestamp:e.at,source:"client-runtime",category:"runtime",severity:"info",context:{sessionId:n,url:e.url,...a},fingerprint:l({kind:"runtime",identity:"client-ready"}),title:"Client runtime ready",message:e.userAgent,raw:e};case"publish":return{id:u(),sessionId:n,timestamp:e.at,source:e.source,category:e.category,severity:e.severity??"info",context:{sessionId:n,...a,...e.context??{}},fingerprint:e.fingerprint??l({kind:"publish",identity:e.title}),title:e.title,message:e.message,raw:e.raw}}}c(envelopeToEvent,"envelopeToEvent"),v(envelopeToEvent,"envelopeToEvent"),f(envelopeToEvent,"envelopeToEvent"),p(envelopeToEvent,"envelopeToEvent"),b(envelopeToEvent,"envelopeToEvent"),d(envelopeToEvent,"envelopeToEvent"),m(envelopeToEvent,"envelopeToEvent"),s(envelopeToEvent,"envelopeToEvent"),g(envelopeToEvent,"envelopeToEvent"),y(envelopeToEvent,"envelopeToEvent"),j(envelopeToEvent,"envelopeToEvent"),T(envelopeToEvent,"envelopeToEvent"),E(envelopeToEvent,"envelopeToEvent"),O(envelopeToEvent,"envelopeToEvent"),P(envelopeToEvent,"envelopeToEvent"),I(envelopeToEvent,"envelopeToEvent"),w(envelopeToEvent,"envelopeToEvent"),k(envelopeToEvent,"envelopeToEvent"),$(envelopeToEvent,"envelopeToEvent"),h(envelopeToEvent,"envelopeToEvent"),x(envelopeToEvent,"envelopeToEvent"),S(envelopeToEvent,"envelopeToEvent"),U(envelopeToEvent,"envelopeToEvent"),R(envelopeToEvent,"envelopeToEvent"),A(envelopeToEvent,"envelopeToEvent"),C(envelopeToEvent,"envelopeToEvent"),F(envelopeToEvent,"envelopeToEvent"),J(envelopeToEvent,"envelopeToEvent"),L(envelopeToEvent,"envelopeToEvent"),N(envelopeToEvent,"envelopeToEvent"),q(envelopeToEvent,"envelopeToEvent"),z(envelopeToEvent,"envelopeToEvent"),B(envelopeToEvent,"envelopeToEvent"),D(envelopeToEvent,"envelopeToEvent"),G(envelopeToEvent,"envelopeToEvent"),H(envelopeToEvent,"envelopeToEvent"),K(envelopeToEvent,"envelopeToEvent"),M(envelopeToEvent,"envelopeToEvent"),Q(envelopeToEvent,"envelopeToEvent"),V(envelopeToEvent,"envelopeToEvent"),W(envelopeToEvent,"envelopeToEvent"),X(envelopeToEvent,"envelopeToEvent"),Y(envelopeToEvent,"envelopeToEvent"),Z(envelopeToEvent,"envelopeToEvent"),_(envelopeToEvent,"envelopeToEvent"),ee(envelopeToEvent,"envelopeToEvent"),ne(envelopeToEvent,"envelopeToEvent"),te(envelopeToEvent,"envelopeToEvent"),oe(envelopeToEvent,"envelopeToEvent"),re(envelopeToEvent,"envelopeToEvent"),ae(envelopeToEvent,"envelopeToEvent"),ie(envelopeToEvent,"envelopeToEvent"),le(envelopeToEvent,"envelopeToEvent"),ue(envelopeToEvent,"envelopeToEvent"),ce(envelopeToEvent,"envelopeToEvent"),ve(envelopeToEvent,"envelopeToEvent"),fe(envelopeToEvent,"envelopeToEvent"),pe(envelopeToEvent,"envelopeToEvent"),be(envelopeToEvent,"envelopeToEvent"),de(envelopeToEvent,"envelopeToEvent"),me(envelopeToEvent,"envelopeToEvent"),se(envelopeToEvent,"envelopeToEvent"),ge(envelopeToEvent,"envelopeToEvent"),ye(envelopeToEvent,"envelopeToEvent"),je(envelopeToEvent,"envelopeToEvent"),Te(envelopeToEvent,"envelopeToEvent"),Ee(envelopeToEvent,"envelopeToEvent"),Oe(envelopeToEvent,"envelopeToEvent"),Pe(envelopeToEvent,"envelopeToEvent"),Ie(envelopeToEvent,"envelopeToEvent"),we(envelopeToEvent,"envelopeToEvent"),ke(envelopeToEvent,"envelopeToEvent"),$e(envelopeToEvent,"envelopeToEvent"),he(envelopeToEvent,"envelopeToEvent"),xe(envelopeToEvent,"envelopeToEvent"),Se(envelopeToEvent,"envelopeToEvent"),Ue(envelopeToEvent,"envelopeToEvent"),Re(envelopeToEvent,"envelopeToEvent"),Ae(envelopeToEvent,"envelopeToEvent"),Ce(envelopeToEvent,"envelopeToEvent"),Fe(envelopeToEvent,"envelopeToEvent"),Je(envelopeToEvent,"envelopeToEvent"),Le(envelopeToEvent,"envelopeToEvent"),Ne(envelopeToEvent,"envelopeToEvent"),qe(envelopeToEvent,"envelopeToEvent"),ze(envelopeToEvent,"envelopeToEvent"),Be(envelopeToEvent,"envelopeToEvent"),De(envelopeToEvent,"envelopeToEvent"),Ge(envelopeToEvent,"envelopeToEvent"),He(envelopeToEvent,"envelopeToEvent"),Ke(envelopeToEvent,"envelopeToEvent"),Me(envelopeToEvent,"envelopeToEvent"),Qe(envelopeToEvent,"envelopeToEvent"),Ve(envelopeToEvent,"envelopeToEvent"),We(envelopeToEvent,"envelopeToEvent");function t(e){if(!e)return"unknown";const n=e.split(`
|
|
2
|
-
`).slice(0,2);for(const a of n){const i=a.match(/at\s+(\S+)/);if(i&&i[1])return i[1]}return"unknown"}
|
|
1
|
+
"use strict";var nn=Object.defineProperty;var u=(e,n)=>nn(e,"name",{value:n,configurable:!0});var tn=Object.defineProperty,v=u((e,n)=>tn(e,"name",{value:n,configurable:!0}),"u"),on=Object.defineProperty,f=v((e,n)=>on(e,"name",{value:n,configurable:!0}),"u"),rn=Object.defineProperty,p=f((e,n)=>rn(e,"name",{value:n,configurable:!0}),"c"),an=Object.defineProperty,b=p((e,n)=>an(e,"name",{value:n,configurable:!0}),"c"),ln=Object.defineProperty,d=b((e,n)=>ln(e,"name",{value:n,configurable:!0}),"c"),cn=Object.defineProperty,m=d((e,n)=>cn(e,"name",{value:n,configurable:!0}),"u"),un=Object.defineProperty,s=m((e,n)=>un(e,"name",{value:n,configurable:!0}),"u"),vn=Object.defineProperty,g=s((e,n)=>vn(e,"name",{value:n,configurable:!0}),"u"),fn=Object.defineProperty,y=g((e,n)=>fn(e,"name",{value:n,configurable:!0}),"c"),pn=Object.defineProperty,j=y((e,n)=>pn(e,"name",{value:n,configurable:!0}),"c"),bn=Object.defineProperty,T=j((e,n)=>bn(e,"name",{value:n,configurable:!0}),"c"),dn=Object.defineProperty,E=T((e,n)=>dn(e,"name",{value:n,configurable:!0}),"u"),mn=Object.defineProperty,O=E((e,n)=>mn(e,"name",{value:n,configurable:!0}),"u"),sn=Object.defineProperty,P=O((e,n)=>sn(e,"name",{value:n,configurable:!0}),"u"),gn=Object.defineProperty,I=P((e,n)=>gn(e,"name",{value:n,configurable:!0}),"c"),yn=Object.defineProperty,w=I((e,n)=>yn(e,"name",{value:n,configurable:!0}),"c"),jn=Object.defineProperty,k=w((e,n)=>jn(e,"name",{value:n,configurable:!0}),"c"),Tn=Object.defineProperty,$=k((e,n)=>Tn(e,"name",{value:n,configurable:!0}),"u"),En=Object.defineProperty,h=$((e,n)=>En(e,"name",{value:n,configurable:!0}),"u"),On=Object.defineProperty,x=h((e,n)=>On(e,"name",{value:n,configurable:!0}),"u"),Pn=Object.defineProperty,S=x((e,n)=>Pn(e,"name",{value:n,configurable:!0}),"c"),In=Object.defineProperty,U=S((e,n)=>In(e,"name",{value:n,configurable:!0}),"c"),wn=Object.defineProperty,R=U((e,n)=>wn(e,"name",{value:n,configurable:!0}),"c"),kn=Object.defineProperty,A=R((e,n)=>kn(e,"name",{value:n,configurable:!0}),"u"),$n=Object.defineProperty,C=A((e,n)=>$n(e,"name",{value:n,configurable:!0}),"u"),hn=Object.defineProperty,F=C((e,n)=>hn(e,"name",{value:n,configurable:!0}),"u"),xn=Object.defineProperty,J=F((e,n)=>xn(e,"name",{value:n,configurable:!0}),"c"),Sn=Object.defineProperty,L=J((e,n)=>Sn(e,"name",{value:n,configurable:!0}),"c"),Un=Object.defineProperty,N=L((e,n)=>Un(e,"name",{value:n,configurable:!0}),"c"),Rn=Object.defineProperty,q=N((e,n)=>Rn(e,"name",{value:n,configurable:!0}),"u"),An=Object.defineProperty,z=q((e,n)=>An(e,"name",{value:n,configurable:!0}),"u"),Cn=Object.defineProperty,B=z((e,n)=>Cn(e,"name",{value:n,configurable:!0}),"u"),Fn=Object.defineProperty,D=B((e,n)=>Fn(e,"name",{value:n,configurable:!0}),"c"),Jn=Object.defineProperty,G=D((e,n)=>Jn(e,"name",{value:n,configurable:!0}),"c"),Ln=Object.defineProperty,H=G((e,n)=>Ln(e,"name",{value:n,configurable:!0}),"c"),Nn=Object.defineProperty,K=H((e,n)=>Nn(e,"name",{value:n,configurable:!0}),"u"),qn=Object.defineProperty,M=K((e,n)=>qn(e,"name",{value:n,configurable:!0}),"u"),zn=Object.defineProperty,Q=M((e,n)=>zn(e,"name",{value:n,configurable:!0}),"u"),Bn=Object.defineProperty,V=Q((e,n)=>Bn(e,"name",{value:n,configurable:!0}),"c"),Dn=Object.defineProperty,W=V((e,n)=>Dn(e,"name",{value:n,configurable:!0}),"c"),Gn=Object.defineProperty,X=W((e,n)=>Gn(e,"name",{value:n,configurable:!0}),"c"),Hn=Object.defineProperty,Y=X((e,n)=>Hn(e,"name",{value:n,configurable:!0}),"u"),Kn=Object.defineProperty,Z=Y((e,n)=>Kn(e,"name",{value:n,configurable:!0}),"u"),Mn=Object.defineProperty,_=Z((e,n)=>Mn(e,"name",{value:n,configurable:!0}),"u"),Qn=Object.defineProperty,ee=_((e,n)=>Qn(e,"name",{value:n,configurable:!0}),"c"),Vn=Object.defineProperty,ne=ee((e,n)=>Vn(e,"name",{value:n,configurable:!0}),"c"),Wn=Object.defineProperty,te=ne((e,n)=>Wn(e,"name",{value:n,configurable:!0}),"c"),Xn=Object.defineProperty,oe=te((e,n)=>Xn(e,"name",{value:n,configurable:!0}),"u"),Yn=Object.defineProperty,re=oe((e,n)=>Yn(e,"name",{value:n,configurable:!0}),"u"),Zn=Object.defineProperty,ae=re((e,n)=>Zn(e,"name",{value:n,configurable:!0}),"u"),_n=Object.defineProperty,ie=ae((e,n)=>_n(e,"name",{value:n,configurable:!0}),"c"),et=Object.defineProperty,le=ie((e,n)=>et(e,"name",{value:n,configurable:!0}),"c"),nt=Object.defineProperty,ce=le((e,n)=>nt(e,"name",{value:n,configurable:!0}),"c"),tt=Object.defineProperty,ue=ce((e,n)=>tt(e,"name",{value:n,configurable:!0}),"u"),ot=Object.defineProperty,ve=ue((e,n)=>ot(e,"name",{value:n,configurable:!0}),"u"),rt=Object.defineProperty,fe=ve((e,n)=>rt(e,"name",{value:n,configurable:!0}),"u"),at=Object.defineProperty,pe=fe((e,n)=>at(e,"name",{value:n,configurable:!0}),"c"),it=Object.defineProperty,be=pe((e,n)=>it(e,"name",{value:n,configurable:!0}),"c"),lt=Object.defineProperty,de=be((e,n)=>lt(e,"name",{value:n,configurable:!0}),"c"),ct=Object.defineProperty,me=de((e,n)=>ct(e,"name",{value:n,configurable:!0}),"u"),ut=Object.defineProperty,se=me((e,n)=>ut(e,"name",{value:n,configurable:!0}),"u"),vt=Object.defineProperty,ge=se((e,n)=>vt(e,"name",{value:n,configurable:!0}),"u"),ft=Object.defineProperty,ye=ge((e,n)=>ft(e,"name",{value:n,configurable:!0}),"u"),pt=Object.defineProperty,je=ye((e,n)=>pt(e,"name",{value:n,configurable:!0}),"u"),bt=Object.defineProperty,Te=je((e,n)=>bt(e,"name",{value:n,configurable:!0}),"u"),dt=Object.defineProperty,Ee=Te((e,n)=>dt(e,"name",{value:n,configurable:!0}),"u"),mt=Object.defineProperty,Oe=Ee((e,n)=>mt(e,"name",{value:n,configurable:!0}),"u"),st=Object.defineProperty,Pe=Oe((e,n)=>st(e,"name",{value:n,configurable:!0}),"u"),gt=Object.defineProperty,Ie=Pe((e,n)=>gt(e,"name",{value:n,configurable:!0}),"s"),yt=Object.defineProperty,we=Ie((e,n)=>yt(e,"name",{value:n,configurable:!0}),"s"),jt=Object.defineProperty,ke=we((e,n)=>jt(e,"name",{value:n,configurable:!0}),"s"),Tt=Object.defineProperty,$e=ke((e,n)=>Tt(e,"name",{value:n,configurable:!0}),"c"),Et=Object.defineProperty,he=$e((e,n)=>Et(e,"name",{value:n,configurable:!0}),"c"),Ot=Object.defineProperty,xe=he((e,n)=>Ot(e,"name",{value:n,configurable:!0}),"c"),Pt=Object.defineProperty,Se=xe((e,n)=>Pt(e,"name",{value:n,configurable:!0}),"c"),It=Object.defineProperty,Ue=Se((e,n)=>It(e,"name",{value:n,configurable:!0}),"c"),wt=Object.defineProperty,Re=Ue((e,n)=>wt(e,"name",{value:n,configurable:!0}),"c"),kt=Object.defineProperty,Ae=Re((e,n)=>kt(e,"name",{value:n,configurable:!0}),"l"),$t=Object.defineProperty,Ce=Ae((e,n)=>$t(e,"name",{value:n,configurable:!0}),"l"),ht=Object.defineProperty,Fe=Ce((e,n)=>ht(e,"name",{value:n,configurable:!0}),"c"),xt=Object.defineProperty,Je=Fe((e,n)=>xt(e,"name",{value:n,configurable:!0}),"c"),St=Object.defineProperty,Le=Je((e,n)=>St(e,"name",{value:n,configurable:!0}),"c"),Ut=Object.defineProperty,Ne=Le((e,n)=>Ut(e,"name",{value:n,configurable:!0}),"u"),Rt=Object.defineProperty,qe=Ne((e,n)=>Rt(e,"name",{value:n,configurable:!0}),"u"),At=Object.defineProperty,ze=qe((e,n)=>At(e,"name",{value:n,configurable:!0}),"u"),Ct=Object.defineProperty,Be=ze((e,n)=>Ct(e,"name",{value:n,configurable:!0}),"c"),Ft=Object.defineProperty,De=Be((e,n)=>Ft(e,"name",{value:n,configurable:!0}),"c"),Jt=Object.defineProperty,Ge=De((e,n)=>Jt(e,"name",{value:n,configurable:!0}),"c"),Lt=Object.defineProperty,He=Ge((e,n)=>Lt(e,"name",{value:n,configurable:!0}),"u"),Nt=Object.defineProperty,Ke=He((e,n)=>Nt(e,"name",{value:n,configurable:!0}),"u"),qt=Object.defineProperty,Me=Ke((e,n)=>qt(e,"name",{value:n,configurable:!0}),"u"),zt=Object.defineProperty,Qe=Me((e,n)=>zt(e,"name",{value:n,configurable:!0}),"u"),Bt=Object.defineProperty,Ve=Qe((e,n)=>Bt(e,"name",{value:n,configurable:!0}),"o"),Dt=Object.defineProperty,We=Ve((e,n)=>Dt(e,"name",{value:n,configurable:!0}),"o"),Gt=Object.defineProperty,Xe=We((e,n)=>Gt(e,"name",{value:n,configurable:!0}),"o"),Ht=Object.defineProperty,Ye=Xe((e,n)=>Ht(e,"name",{value:n,configurable:!0}),"o"),Kt=Object.defineProperty,Ze=Ye((e,n)=>Kt(e,"name",{value:n,configurable:!0}),"o"),Mt=Object.defineProperty,_e=Ze((e,n)=>Mt(e,"name",{value:n,configurable:!0}),"o");import{fingerprint as l,ulid as c}from"@lensmcp/core";const Qt="pending";export function envelopeToEvent(e,n=Qt){const a=e.tabId?{tabId:e.tabId}:{};switch(e.kind){case"error":return{id:c(),sessionId:n,timestamp:e.at,source:"client-runtime",category:"runtime",severity:"error",context:{sessionId:n,...a},fingerprint:l({kind:"runtime",identity:`error:${t(e.stack)}`,file:e.source,detail:e.message}),title:e.message,message:e.stack??e.message,location:e.source?{file:e.source,line:e.lineno,column:e.colno}:void 0,raw:e};case"unhandledrejection":return{id:c(),sessionId:n,timestamp:e.at,source:"client-runtime",category:"runtime",severity:"error",context:{sessionId:n,...a},fingerprint:l({kind:"runtime",identity:`unhandledrejection:${e.reason.slice(0,80)}`}),title:"Unhandled promise rejection",message:e.reason,raw:e};case"console":{const i=e.level==="error"?"error":e.level==="warn"?"warning":"info",en=e.args.map(r).join(" ");return{id:c(),sessionId:n,timestamp:e.at,source:"client-runtime",category:"runtime",severity:i,context:{sessionId:n,...a},fingerprint:l({kind:"runtime",identity:`console:${e.level}:${en.slice(0,80)}`}),title:`console.${e.level}`,message:en,raw:e}}case"fetch":{const i=e.error!==void 0||e.status!==void 0&&e.status>=400;return{id:c(),sessionId:n,timestamp:e.at,source:"client-runtime",category:"network",severity:i?"error":"info",context:{sessionId:n,...a},fingerprint:l({kind:"network",identity:`${e.method}:${o(e.url)}:${e.status??"err"}`}),title:`${e.method} ${e.url}${e.status!==void 0?` \u2192 ${e.status}`:""}`,message:e.error,relatedUrls:[e.url],raw:e}}case"route":return{id:c(),sessionId:n,timestamp:e.at,source:"client-runtime",category:"runtime",severity:"info",context:{sessionId:n,url:e.url,...a},fingerprint:l({kind:"runtime",identity:`route:${e.url}`}),title:`Route \u2192 ${e.url}`,raw:e};case"ready":return{id:c(),sessionId:n,timestamp:e.at,source:"client-runtime",category:"runtime",severity:"info",context:{sessionId:n,url:e.url,...a},fingerprint:l({kind:"runtime",identity:"client-ready"}),title:"Client runtime ready",message:e.userAgent,raw:e};case"publish":return{id:c(),sessionId:n,timestamp:e.at,source:e.source,category:e.category,severity:e.severity??"info",context:{sessionId:n,...a,...e.context??{}},fingerprint:e.fingerprint??l({kind:"publish",identity:e.title}),title:e.title,message:e.message,raw:e.raw}}}u(envelopeToEvent,"envelopeToEvent"),v(envelopeToEvent,"envelopeToEvent"),f(envelopeToEvent,"envelopeToEvent"),p(envelopeToEvent,"envelopeToEvent"),b(envelopeToEvent,"envelopeToEvent"),d(envelopeToEvent,"envelopeToEvent"),m(envelopeToEvent,"envelopeToEvent"),s(envelopeToEvent,"envelopeToEvent"),g(envelopeToEvent,"envelopeToEvent"),y(envelopeToEvent,"envelopeToEvent"),j(envelopeToEvent,"envelopeToEvent"),T(envelopeToEvent,"envelopeToEvent"),E(envelopeToEvent,"envelopeToEvent"),O(envelopeToEvent,"envelopeToEvent"),P(envelopeToEvent,"envelopeToEvent"),I(envelopeToEvent,"envelopeToEvent"),w(envelopeToEvent,"envelopeToEvent"),k(envelopeToEvent,"envelopeToEvent"),$(envelopeToEvent,"envelopeToEvent"),h(envelopeToEvent,"envelopeToEvent"),x(envelopeToEvent,"envelopeToEvent"),S(envelopeToEvent,"envelopeToEvent"),U(envelopeToEvent,"envelopeToEvent"),R(envelopeToEvent,"envelopeToEvent"),A(envelopeToEvent,"envelopeToEvent"),C(envelopeToEvent,"envelopeToEvent"),F(envelopeToEvent,"envelopeToEvent"),J(envelopeToEvent,"envelopeToEvent"),L(envelopeToEvent,"envelopeToEvent"),N(envelopeToEvent,"envelopeToEvent"),q(envelopeToEvent,"envelopeToEvent"),z(envelopeToEvent,"envelopeToEvent"),B(envelopeToEvent,"envelopeToEvent"),D(envelopeToEvent,"envelopeToEvent"),G(envelopeToEvent,"envelopeToEvent"),H(envelopeToEvent,"envelopeToEvent"),K(envelopeToEvent,"envelopeToEvent"),M(envelopeToEvent,"envelopeToEvent"),Q(envelopeToEvent,"envelopeToEvent"),V(envelopeToEvent,"envelopeToEvent"),W(envelopeToEvent,"envelopeToEvent"),X(envelopeToEvent,"envelopeToEvent"),Y(envelopeToEvent,"envelopeToEvent"),Z(envelopeToEvent,"envelopeToEvent"),_(envelopeToEvent,"envelopeToEvent"),ee(envelopeToEvent,"envelopeToEvent"),ne(envelopeToEvent,"envelopeToEvent"),te(envelopeToEvent,"envelopeToEvent"),oe(envelopeToEvent,"envelopeToEvent"),re(envelopeToEvent,"envelopeToEvent"),ae(envelopeToEvent,"envelopeToEvent"),ie(envelopeToEvent,"envelopeToEvent"),le(envelopeToEvent,"envelopeToEvent"),ce(envelopeToEvent,"envelopeToEvent"),ue(envelopeToEvent,"envelopeToEvent"),ve(envelopeToEvent,"envelopeToEvent"),fe(envelopeToEvent,"envelopeToEvent"),pe(envelopeToEvent,"envelopeToEvent"),be(envelopeToEvent,"envelopeToEvent"),de(envelopeToEvent,"envelopeToEvent"),me(envelopeToEvent,"envelopeToEvent"),se(envelopeToEvent,"envelopeToEvent"),ge(envelopeToEvent,"envelopeToEvent"),ye(envelopeToEvent,"envelopeToEvent"),je(envelopeToEvent,"envelopeToEvent"),Te(envelopeToEvent,"envelopeToEvent"),Ee(envelopeToEvent,"envelopeToEvent"),Oe(envelopeToEvent,"envelopeToEvent"),Pe(envelopeToEvent,"envelopeToEvent"),Ie(envelopeToEvent,"envelopeToEvent"),we(envelopeToEvent,"envelopeToEvent"),ke(envelopeToEvent,"envelopeToEvent"),$e(envelopeToEvent,"envelopeToEvent"),he(envelopeToEvent,"envelopeToEvent"),xe(envelopeToEvent,"envelopeToEvent"),Se(envelopeToEvent,"envelopeToEvent"),Ue(envelopeToEvent,"envelopeToEvent"),Re(envelopeToEvent,"envelopeToEvent"),Ae(envelopeToEvent,"envelopeToEvent"),Ce(envelopeToEvent,"envelopeToEvent"),Fe(envelopeToEvent,"envelopeToEvent"),Je(envelopeToEvent,"envelopeToEvent"),Le(envelopeToEvent,"envelopeToEvent"),Ne(envelopeToEvent,"envelopeToEvent"),qe(envelopeToEvent,"envelopeToEvent"),ze(envelopeToEvent,"envelopeToEvent"),Be(envelopeToEvent,"envelopeToEvent"),De(envelopeToEvent,"envelopeToEvent"),Ge(envelopeToEvent,"envelopeToEvent"),He(envelopeToEvent,"envelopeToEvent"),Ke(envelopeToEvent,"envelopeToEvent"),Me(envelopeToEvent,"envelopeToEvent"),Qe(envelopeToEvent,"envelopeToEvent"),Ve(envelopeToEvent,"envelopeToEvent"),We(envelopeToEvent,"envelopeToEvent"),Xe(envelopeToEvent,"envelopeToEvent"),Ye(envelopeToEvent,"envelopeToEvent"),Ze(envelopeToEvent,"envelopeToEvent"),_e(envelopeToEvent,"envelopeToEvent");function t(e){if(!e)return"unknown";const n=e.split(`
|
|
2
|
+
`).slice(0,2);for(const a of n){const i=a.match(/at\s+(\S+)/);if(i&&i[1])return i[1]}return"unknown"}u(t,"t"),v(t,"t"),f(t,"t"),p(t,"t"),b(t,"t"),d(t,"t"),m(t,"t"),s(t,"t"),g(t,"t"),y(t,"t"),j(t,"t"),T(t,"t"),E(t,"t"),O(t,"t"),P(t,"t"),I(t,"t"),w(t,"t"),k(t,"t"),$(t,"t"),h(t,"t"),x(t,"t"),S(t,"t"),U(t,"t"),R(t,"t"),A(t,"t"),C(t,"t"),F(t,"t"),J(t,"t"),L(t,"t"),N(t,"t"),q(t,"t"),z(t,"t"),B(t,"t"),D(t,"t"),G(t,"t"),H(t,"t"),K(t,"t"),M(t,"t"),Q(t,"t"),V(t,"t"),W(t,"t"),X(t,"t"),Y(t,"t"),Z(t,"t"),_(t,"t"),ee(t,"t"),ne(t,"t"),te(t,"t"),oe(t,"t"),re(t,"t"),ae(t,"t"),ie(t,"t"),le(t,"t"),ce(t,"t"),ue(t,"t"),ve(t,"t"),fe(t,"t"),pe(t,"t"),be(t,"t"),de(t,"t"),me(t,"t"),se(t,"t"),ge(t,"t"),ye(t,"t"),je(t,"t"),Te(t,"t"),Ee(t,"t"),Oe(t,"t"),Pe(t,"t"),Ie(t,"t"),we(t,"t"),ke(t,"t"),$e(t,"t"),he(t,"t"),xe(t,"t"),Se(t,"n"),Ue(t,"t"),Re(t,"n"),Ae(t,"t"),Ce(t,"n"),Fe(t,"t"),Je(t,"n"),Le(t,"t"),Ne(t,"r"),qe(t,"t"),ze(t,"r"),Be(t,"t"),De(t,"n"),Ge(t,"n"),He(t,"r"),Ke(t,"n"),Me(t,"o"),Qe(t,"a"),Ve(t,"l"),We(t,"l"),Xe(t,"c"),Ye(t,"c"),Ze(t,"s"),_e(t,"normaliseStackTopFrame");function o(e){try{return`${new URL(e,"http://x").pathname}`}catch{return e}}u(o,"o"),v(o,"o"),f(o,"o"),p(o,"o"),b(o,"o"),d(o,"o"),m(o,"o"),s(o,"o"),g(o,"o"),y(o,"o"),j(o,"o"),T(o,"o"),E(o,"o"),O(o,"o"),P(o,"o"),I(o,"o"),w(o,"o"),k(o,"r"),$(o,"r"),h(o,"r"),x(o,"r"),S(o,"r"),U(o,"r"),R(o,"r"),A(o,"r"),C(o,"r"),F(o,"r"),J(o,"r"),L(o,"r"),N(o,"r"),q(o,"r"),z(o,"r"),B(o,"r"),D(o,"r"),G(o,"r"),H(o,"r"),K(o,"r"),M(o,"r"),Q(o,"r"),V(o,"r"),W(o,"r"),X(o,"r"),Y(o,"r"),Z(o,"r"),_(o,"r"),ee(o,"r"),ne(o,"r"),te(o,"r"),oe(o,"r"),re(o,"r"),ae(o,"r"),ie(o,"r"),le(o,"r"),ce(o,"r"),ue(o,"r"),ve(o,"r"),fe(o,"r"),pe(o,"r"),be(o,"r"),de(o,"r"),me(o,"r"),se(o,"r"),ge(o,"r"),ye(o,"r"),je(o,"r"),Te(o,"r"),Ee(o,"r"),Oe(o,"r"),Pe(o,"r"),Ie(o,"r"),we(o,"r"),ke(o,"r"),$e(o,"r"),he(o,"r"),xe(o,"r"),Se(o,"r"),Ue(o,"r"),Re(o,"r"),Ae(o,"r"),Ce(o,"r"),Fe(o,"r"),Je(o,"r"),Le(o,"r"),Ne(o,"n"),qe(o,"r"),ze(o,"n"),Be(o,"r"),De(o,"r"),Ge(o,"r"),He(o,"i"),Ke(o,"i"),Me(o,"a"),Qe(o,"c"),Ve(o,"d"),We(o,"d"),Xe(o,"l"),Ye(o,"l"),Ze(o,"m"),_e(o,"normaliseUrl");function r(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}u(r,"r"),v(r,"r"),f(r,"r"),p(r,"r"),b(r,"r"),d(r,"r"),m(r,"r"),s(r,"r"),g(r,"r"),y(r,"r"),j(r,"r"),T(r,"r"),E(r,"r"),O(r,"r"),P(r,"r"),I(r,"r"),w(r,"r"),k(r,"o"),$(r,"o"),h(r,"o"),x(r,"o"),S(r,"o"),U(r,"o"),R(r,"o"),A(r,"o"),C(r,"o"),F(r,"o"),J(r,"o"),L(r,"o"),N(r,"o"),q(r,"o"),z(r,"o"),B(r,"o"),D(r,"o"),G(r,"o"),H(r,"o"),K(r,"o"),M(r,"o"),Q(r,"o"),V(r,"o"),W(r,"o"),X(r,"o"),Y(r,"o"),Z(r,"o"),_(r,"o"),ee(r,"o"),ne(r,"o"),te(r,"o"),oe(r,"o"),re(r,"o"),ae(r,"o"),ie(r,"o"),le(r,"o"),ce(r,"o"),ue(r,"o"),ve(r,"o"),fe(r,"o"),pe(r,"o"),be(r,"o"),de(r,"o"),me(r,"o"),se(r,"o"),ge(r,"o"),ye(r,"o"),je(r,"o"),Te(r,"i"),Ee(r,"o"),Oe(r,"i"),Pe(r,"i"),Ie(r,"i"),we(r,"i"),ke(r,"i"),$e(r,"i"),he(r,"i"),xe(r,"i"),Se(r,"i"),Ue(r,"i"),Re(r,"i"),Ae(r,"i"),Ce(r,"i"),Fe(r,"i"),Je(r,"i"),Le(r,"i"),Ne(r,"i"),qe(r,"i"),ze(r,"i"),Be(r,"i"),De(r,"i"),Ge(r,"i"),He(r,"o"),Ke(r,"o"),Me(r,"c"),Qe(r,"u"),Ve(r,"m"),We(r,"m"),Xe(r,"d"),Ye(r,"d"),Ze(r,"d"),_e(r,"stringify");
|
package/lib/plugin.d.ts
CHANGED
|
@@ -39,6 +39,8 @@ interface BoundDeps {
|
|
|
39
39
|
bus?: EventBus;
|
|
40
40
|
/** Session id stamped onto each event. */
|
|
41
41
|
sessionId?: string;
|
|
42
|
+
/** The session replay recorder's text (tests); by default @lensmcp/client-runtime's built `replay-source`. */
|
|
43
|
+
replaySource?: () => Promise<string | undefined>;
|
|
42
44
|
}
|
|
43
45
|
/**
|
|
44
46
|
* Vite plugin that:
|
|
@@ -135,4 +137,24 @@ export declare function resetTransformFailuresForTests(): void;
|
|
|
135
137
|
* real WebSocket without booting Vite (see the react-bridge smoke).
|
|
136
138
|
*/
|
|
137
139
|
export declare function handleClientEnvelope(raw: string, deps: BoundDeps): void;
|
|
140
|
+
/** Where the inlined runtime connects. */
|
|
141
|
+
interface InlineRuntimeOptions {
|
|
142
|
+
host: string;
|
|
143
|
+
port: number;
|
|
144
|
+
/** This dev-server start's bridge token; absent in a build, which starts no bridge. */
|
|
145
|
+
token?: string;
|
|
146
|
+
/** Reload once when Vite's HMR socket fails to connect in a tab whose socket worked before (LensmcpViteOptions). */
|
|
147
|
+
hmrRecovery?: boolean;
|
|
148
|
+
/** The app this dev server serves (nx's project), what a page visit names its page by (`<app> <pattern>`). */
|
|
149
|
+
app?: string;
|
|
150
|
+
/** Session replay is on: hand the recorder (`/@lensmcp/replay`, the next script) its bridge, and write anchors. */
|
|
151
|
+
replay?: boolean;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Minimal browser-side runtime that mirrors what `@lensmcp/client-runtime`
|
|
155
|
+
* will eventually own. Inlined here so Phase 1 has no cross-build
|
|
156
|
+
* coupling. Future: replace with a real import of the published
|
|
157
|
+
* package's browser bundle.
|
|
158
|
+
*/
|
|
159
|
+
export declare function buildInlineClientRuntime(opts: InlineRuntimeOptions): string;
|
|
138
160
|
export {};
|
package/lib/plugin.js
CHANGED
|
@@ -1,9 +1,19 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var Z=Object.defineProperty;var g=(e,n)=>Z(e,"name",{value:n,configurable:!0});var Q=Object.defineProperty,y=g((e,n)=>Q(e,"name",{value:n,configurable:!0}),"g"),ee=Object.defineProperty,d=y((e,n)=>ee(e,"name",{value:n,configurable:!0}),"c");import{randomBytes as te}from"node:crypto";import{existsSync as F,readdirSync as ne,realpathSync as W,statSync as se,unwatchFile as re,watchFile as oe}from"node:fs";import{delimiter as ie,dirname as Y,join as S,relative as L,resolve as O,sep as M}from"node:path";import{fingerprint as N,ulid as B}from"@lensmcp/core";import{BRIDGE_TOKEN_PARAM as ae,createBridgeServer as le,makePublisher as X,handleClientEnvelope as ce}from"@lensmcp/bridge";import{CLIENT_VIRTUAL_ID as G,createRuntimeModuleGuard as de,REPLAY_VIRTUAL_ID as K,RESOLVED_CLIENT_VIRTUAL_ID as D,RESOLVED_REPLAY_VIRTUAL_ID as J}from"./runtime-guard.js";import{captureFilePath as ue,replayEnabled as he}from"./replay-setting.js";const pe="/__lensmcp/watcher-health",q=256,fe=64,me=new Set(["node_modules",".git","dist","tmp","coverage","build","out","target",".nx",".lensmcp"]);export function checkoutViteCacheDir(e,n,s=process.cwd()){const p=O(s,e??".");let a;if(n)a=O(p,n);else{let m=p;for(;!F(S(m,"package.json"))&&Y(m)!==m;)m=Y(m);a=S(F(S(m,"package.json"))?m:p,"node_modules",".vite")}const f=a.split(M),c=f.indexOf("node_modules");if(c<1)return;const r=f.slice(0,c).join(M)||M;try{if(W(S(r,"node_modules"))===S(W(r),"node_modules"))return}catch{return}const l=f.slice(c+1);return S(r,".lensmcp","cache","vite",...l[0]===".vite"?l.slice(1):l)}g(checkoutViteCacheDir,"checkoutViteCacheDir"),y(checkoutViteCacheDir,"checkoutViteCacheDir"),d(checkoutViteCacheDir,"checkoutViteCacheDir");export function resolveExtraWatchRoots(e,n){if(!e)return[];const s=O(n),p=d((c,r)=>{const l=L(r,c);return l!==""&&!l.startsWith("..")&&!l.startsWith(M)&&!/^[A-Za-z]:/.test(l)},"inside"),a=[],f=d(c=>{a.length<fe&&!a.includes(c)&&a.push(c)},"push");for(const c of e.split(ie)){const r=c.trim();if(!r)continue;const l=O(r);let m;try{m=F(l)&&se(l).isDirectory()}catch{m=!1}if(m&&!(l===s||p(l,s))){if(p(s,l)){const R=L(l,s).split(M).filter(Boolean);let b=l;for(const k of R){let _;try{_=ne(b,{withFileTypes:!0})}catch{_=[]}for(const t of _)!t.isDirectory()||t.name===k||t.name.startsWith(".")||me.has(t.name)||f(S(b,t.name));b=S(b,k)}continue}f(l)}}return a}g(resolveExtraWatchRoots,"resolveExtraWatchRoots"),y(resolveExtraWatchRoots,"resolveExtraWatchRoots"),d(resolveExtraWatchRoots,"resolveExtraWatchRoots");async function P(){try{const e=await import("@lensmcp/client-runtime/replay-source");return typeof e.REPLAY_BUNDLE=="string"?e.REPLAY_BUNDLE:void 0}catch{return}}g(P,"Y"),y(P,"ae"),d(P,"loadReplaySource");export function lensmcpVitePlugin(e={},n={}){const s=e.enabled??!0,p=e.wsHost??"127.0.0.1",a=e.injectClient??!0;let f,c,r;const l=X(n),m=e.aliasValtio??!0,R=e.transformSource??!0,b=e.applyOnBuild??process.env.LENSMCP_VITE_APPLY_ON_BUILD==="1",k=ue(),_=d(()=>!!c&&he({...e.replay!==void 0?{option:e.replay}:{},captureFile:k}),"replayOn");return{name:"@lensmcp/vite-plugin",apply:d((t,u)=>s&&(u.command==="serve"||b),"apply"),enforce:"pre",wsPort:d(()=>f,"wsPort"),config(t){if(!s)return;const u=checkoutViteCacheDir(t?.root,t?.cacheDir);u&&console.log(`[lensmcp] node_modules is shared with another checkout \u2014 Vite's dependency cache moves to ${u}`),process.env.LENSMCP_FREEZE==="1"&&(console.log("[lensmcp] frozen worktree instance \u2014 Vite watches no files"),t&&(t.server={...t.server,watch:null}));const o={...u?{cacheDir:u}:{}};return m?{...o,resolve:{alias:[{find:/^valtio$/,replacement:"@lensmcp/valtio-instrumentation"}]}}:Object.keys(o).length?o:void 0},async configureServer(t){if(!s)return;r=te(24).toString("base64url"),c=await le({host:p,port:e.wsPort??0,bus:n.bus,sessionId:n.sessionId,token:r,...e.wsAllowedOrigins?{allowedOrigins:e.wsAllowedOrigins}:{}}),f=c.port,t.middlewares.use(de(c));let u=_();oe(k,{interval:5e3,persistent:!1},()=>{const i=_();if(i===u)return;u=i;const v=t.moduleGraph?.getModuleById?.(D);v&&t.moduleGraph.invalidateModule(v)}),t.httpServer?.once("close",()=>re(k)),t.ws.on("vite:error",i=>{l($(i,n.sessionId))});const o=resolveExtraWatchRoots(process.env.LENSMCP_WATCH_DIRS,t.config?.root??process.cwd());if(o.length>0&&typeof t.watcher?.add=="function")try{t.watcher.add(o),console.log(`[lensmcp] watching ${o.length} extra source root(s) for set changes: ${o.map(i=>L(t.config?.root??process.cwd(),i)||i).join(", ")}`)}catch(i){console.warn(`[lensmcp] could not widen the watcher: ${i?.message??String(i)}`)}let h=0,I=0,T=0;const w=[],A=d((i,v)=>{h=Date.now(),I+=1,T+=1,w.push({sequence:T,kind:i,path:O(v),at:h}),w.length>q&&w.splice(0,w.length-q)},"stampFsSetEvent");t.watcher.on("add",i=>A("add",i)),t.watcher.on("addDir",i=>A("addDir",i)),t.watcher.on("unlink",i=>A("unlink",i)),t.watcher.on("unlinkDir",i=>A("unlinkDir",i)),t.middlewares.use(pe,(i,v)=>{v.setHeader("content-type","application/json"),v.setHeader("cache-control","no-store"),v.end(JSON.stringify({schemaVersion:2,ready:!0,sequence:T,lastFsSetEventAt:h,fsSetEvents:I,recentEvents:w,extraWatchRoots:o,now:Date.now()}))})},resolveId(t){return t===G?D:t===K?J:null},load(t){if(t===J)return(n.replaySource??P)().then(h=>h??`// @lensmcp/vite-plugin: this install has no session replay recorder (@lensmcp/client-runtime/replay-source)
|
|
2
|
+
`);if(t!==D)return null;const u=f??e.wsPort??0,o=process.env.LENSMCP_APP||process.env.NX_TASK_TARGET_PROJECT;return buildInlineClientRuntime({host:p,port:u,token:r,hmrRecovery:e.hmrRecovery!==!1,...o?{app:o}:{},..._()?{replay:!0}:{}})},async transform(t,u){if(!s||!R)return null;const o=u.split("?")[0]??u;if(o.includes("/node_modules/")||!/\.[jt]sx$/.test(o))return null;const h=await H(t,o);return h?{code:h.code,map:h.map}:null},transformIndexHtml(){if(!a||!s)return;const t=[{tag:"script",attrs:{type:"module",src:G},injectTo:"head-prepend"}];return _()&&t.push({tag:"script",attrs:{type:"module",src:K},injectTo:"head-prepend"}),t},handleHotUpdate(t){if(!s)return;const u=t.modules.map(h=>h.file??h.id??null).filter(h=>!!h),o=hmrReloadCause(t.modules);l({id:B(),sessionId:n.sessionId??"pending",timestamp:Date.now(),source:"vite",category:"build",severity:o.willFullReload?"warning":"info",context:{sessionId:n.sessionId??"pending"},fingerprint:N({kind:"hmr",identity:t.file}),title:o.willFullReload?`HMR ${t.file} \u2014 FULL RELOAD (no boundary above ${o.deadEnd??"it"})`:`HMR ${t.file}`,location:{file:t.file},relatedFiles:u,raw:{kind:"hmr",file:t.file,willFullReload:o.willFullReload,deadEnd:o.deadEnd,chain:o.chain,acceptedBy:o.boundaries}})},generateBundle(t,u){if(!s)return;const o=[];let h=0;for(const T of Object.values(u)){const w=T,A=w.fileName;let i;if(w.type==="chunk")i=(w.code??"").length;else{const E=w.source;i=typeof E=="string"?E.length:E instanceof Uint8Array?E.byteLength:0}h+=i;const v=[];if(w.type==="chunk"&&w.modules){for(const[E,C]of Object.entries(w.modules)){const z=C.renderedLength??C.originalLength??0;v.push({id:E,sizeBytes:z})}v.sort((E,C)=>C.sizeBytes-E.sizeBytes)}o.push({name:A,sizeBytes:i,modules:v})}const I={timestamp:Date.now(),totalBytes:h,chunks:o};l({id:B(),sessionId:n.sessionId??"pending",timestamp:Date.now(),source:"rollup",category:"build",severity:"info",context:{sessionId:n.sessionId??"pending"},fingerprint:N({kind:"bundle",identity:"report"}),title:`Bundle report: ${o.length} chunks, ${h} bytes`,raw:{kind:"bundle-report",report:I}})},async closeBundle(){c&&(await c.close(),c=void 0,r=void 0)}}}g(lensmcpVitePlugin,"lensmcpVitePlugin"),y(lensmcpVitePlugin,"lensmcpVitePlugin"),d(lensmcpVitePlugin,"lensmcpVitePlugin");const x=12;export function hmrReloadCause(e){const n=[],s=[],p=new Set;let a=null;const f=d(r=>r.file??r.id??"(anonymous module)","nameOf"),c=d((r,l)=>{if(p.has(r))return!1;if(p.add(r),r.isSelfAccepting===!0)return s.length<x&&s.push(f(r)),!1;const m=[...r.importers??[]];if(m.length===0)return a===null&&(a=f(r),n.push(...l.slice(-x),f(r))),!0;let R=!1;for(const b of m){if(b.acceptedHmrDeps?.has(r)){s.length<x&&s.push(f(b));continue}c(b,[...l,f(r)])&&(R=!0)}return R},"walk");return{willFullReload:e.map(r=>c(r,[])).some(Boolean),deadEnd:a,chain:n,boundaries:s}}g(hmrReloadCause,"hmrReloadCause"),y(hmrReloadCause,"hmrReloadCause"),d(hmrReloadCause,"hmrReloadCause");async function H(e,n){try{const[{transformSync:s},{lensmcpBabelPlugin:p}]=await Promise.all([import("@babel/core"),import("@lensmcp/react-instrumentation")]),a=s(e,{filename:n,babelrc:!1,configFile:!1,sourceMaps:!0,parserOpts:{plugins:["jsx","typescript"]},plugins:[[p,{rootDir:process.cwd()}]],code:!0});return a?.code?{code:a.code,map:a.map}:null}catch(s){return j(n,s),null}}g(H,"X"),y(H,"le"),d(H,"runLensmcpBabel");const V=new Set;function j(e,n){V.has(e)||(V.add(e),console.warn(`[lensmcp] could not instrument ${e}: ${n?.message??n}. The file still builds, but its renders, effects and hooks will be MISSING from react://renders/*, react://effects/recent and react://hooks/recent.`))}g(j,"G"),y(j,"ce"),d(j,"warnTransformFailed");export function resetTransformFailuresForTests(){V.clear()}g(resetTransformFailuresForTests,"resetTransformFailuresForTests"),y(resetTransformFailuresForTests,"resetTransformFailuresForTests"),d(resetTransformFailuresForTests,"resetTransformFailuresForTests");export function handleClientEnvelope(e,n){ce(e,X(n),n.sessionId)}g(handleClientEnvelope,"handleClientEnvelope"),y(handleClientEnvelope,"handleClientEnvelope"),d(handleClientEnvelope,"handleClientEnvelope");function U(e){const n=e?.loc?.file??e?.id;return typeof n!="string"||n.length===0?void 0:{file:n.split("?")[0]||n,...typeof e?.loc?.line=="number"?{line:e.loc.line}:{},...typeof e?.loc?.column=="number"?{column:e.loc.column}:{}}}g(U,"K"),y(U,"de"),d(U,"errorLocation");function $(e,n){const s=e.err?.message??"Vite error",p=e.err?.stack,a=U(e.err);return{id:B(),sessionId:n??"pending",timestamp:Date.now(),source:"vite",category:"build",severity:"error",context:{sessionId:n??"pending"},fingerprint:N({kind:"vite",identity:e.type??s,...a?{file:a.file}:{}}),title:s,message:p,...a?{location:a}:{},raw:{kind:"build-diagnostic",...a?{file:a.file}:{},...e.err?.plugin?{plugin:e.err.plugin}:{}}}}g($,"J"),y($,"ue"),d($,"viteErrorToEvent");export function buildInlineClientRuntime(e){const n=`ws://${e.host}:${e.port}${e.token?`/?${ae}=${encodeURIComponent(e.token)}`:""}`,s=e.replay?`{ endpoint: ${JSON.stringify(`http://${e.host}:${e.port}`)}, ${e.token?`token: ${JSON.stringify(e.token)}, `:""}tabId: TAB_ID, ${e.app?`app: ${JSON.stringify(e.app)}, `:""}fetch: NATIVE_FETCH }`:"";return`// @lensmcp/client-runtime (inlined by @lensmcp/vite-plugin)
|
|
2
3
|
(() => {
|
|
3
4
|
if (typeof window === 'undefined') return;
|
|
4
5
|
if (window.__LENSMCP_CLIENT__) return;
|
|
5
6
|
window.__LENSMCP_CLIENT__ = true;
|
|
6
7
|
${e.app?`window.__LENSMCP_APP__ = ${JSON.stringify(e.app)};`:""}
|
|
8
|
+
// The page's own fetch, before this runtime (below) or flow-fetch wraps it: the replay recorder uploads through it,
|
|
9
|
+
// so its chunks are neither recorded as app requests nor given lens headers (which would force a CORS preflight).
|
|
10
|
+
const NATIVE_FETCH = typeof window.fetch === 'function' ? window.fetch.bind(window) : undefined;
|
|
11
|
+
// Session replay anchors (planning/replay/00-plan.md \xA72.4): navigation, HMR and errors, written into the recording
|
|
12
|
+
// on the page clock. A no-op until the recorder runs (it is the next script) or when replay is off.
|
|
13
|
+
function mark(tag, payload) {
|
|
14
|
+
const replay = window.__LENSMCP_REPLAY__;
|
|
15
|
+
if (replay && typeof replay.mark === 'function') { try { replay.mark(tag, payload); } catch (e) {} }
|
|
16
|
+
}
|
|
7
17
|
|
|
8
18
|
// React DevTools hook shim/patch \u2014 this script is the FIRST module script in
|
|
9
19
|
// the document, so it runs BEFORE react-dom evaluates. react-dom only calls
|
|
@@ -55,7 +65,7 @@
|
|
|
55
65
|
} catch (e) { /* strictly passive \u2014 never break the host page */ }
|
|
56
66
|
})();
|
|
57
67
|
|
|
58
|
-
const WS_URL = ${JSON.stringify(
|
|
68
|
+
const WS_URL = ${JSON.stringify(n)};
|
|
59
69
|
let ws = null;
|
|
60
70
|
let queue = [];
|
|
61
71
|
let openOnce = false;
|
|
@@ -70,7 +80,11 @@
|
|
|
70
80
|
return t;
|
|
71
81
|
} catch (e) { return 'tab-' + Math.random().toString(36).slice(2, 10); }
|
|
72
82
|
})();
|
|
73
|
-
|
|
83
|
+
${s?`
|
|
84
|
+
// Session replay: the recorder (/@lensmcp/replay) is the next module script; it takes this once and deletes it. The
|
|
85
|
+
// token is already this module's \u2014 a window property is readable by the page's own origin only.
|
|
86
|
+
window.__LENSMCP_REPLAY_BOOT__ = ${s};
|
|
87
|
+
`:""}
|
|
74
88
|
// BATCHED transport: capture is synchronous (per-event at/tabId stamped NOW \u2014 the recorded
|
|
75
89
|
// timeline is exact), but the stringify + socket frame happen ONCE per macrotask, off the
|
|
76
90
|
// interaction task. A commit storm (a tab switch mounting hundreds of components) used to pay
|
|
@@ -214,11 +228,14 @@
|
|
|
214
228
|
const cause = { path: p && p.path, triggeredBy: p && p.triggeredBy, at: Date.now() };
|
|
215
229
|
try { sessionStorage.setItem('lensmcp:reloadCause', JSON.stringify(cause)); } catch (e) {}
|
|
216
230
|
send({ kind: 'hmr', event: 'full-reload', path: cause.path, triggeredBy: cause.triggeredBy });
|
|
231
|
+
mark('lens/hmr', { type: 'full-reload', files: cause.path ? [String(cause.path)] : [], triggeredBy: cause.triggeredBy ? String(cause.triggeredBy) : undefined });
|
|
217
232
|
flushBatch(); // the page is about to unload \u2014 do not leave this in the macrotask queue
|
|
218
233
|
});
|
|
219
234
|
hot.on('vite:beforeUpdate', (p) => {
|
|
220
235
|
const updates = (p && p.updates) || [];
|
|
221
|
-
|
|
236
|
+
const files = bound(updates.map((u) => u && (u.path || u.acceptedPath)));
|
|
237
|
+
send({ kind: 'hmr', event: 'update', count: updates.length, updates: files });
|
|
238
|
+
mark('lens/hmr', { type: 'update', files: files.filter((f) => typeof f === 'string') });
|
|
222
239
|
});
|
|
223
240
|
hot.on('vite:invalidate', (p) => send({ kind: 'hmr', event: 'invalidate', path: p && p.path, message: p && p.message }));
|
|
224
241
|
hot.on('vite:ws:disconnect', () => send({ kind: 'hmr', event: 'ws-disconnect' }));
|
|
@@ -331,15 +348,18 @@
|
|
|
331
348
|
lineno: e.lineno,
|
|
332
349
|
colno: e.colno,
|
|
333
350
|
});
|
|
351
|
+
mark('lens/error', { message: String(e.message || (err && err.name) || 'error'), source: e.filename || undefined });
|
|
334
352
|
}, true);
|
|
335
353
|
window.addEventListener('unhandledrejection', (e) => {
|
|
336
354
|
const r = e.reason;
|
|
355
|
+
const reason = clipStr(describeReason(r), MAX_STACK);
|
|
337
356
|
send({
|
|
338
357
|
kind: 'unhandledrejection',
|
|
339
|
-
reason
|
|
358
|
+
reason,
|
|
340
359
|
name: r && r.name,
|
|
341
360
|
stack: clipStr(r && r.stack, MAX_STACK),
|
|
342
361
|
});
|
|
362
|
+
mark('lens/error', { message: String(reason) });
|
|
343
363
|
});
|
|
344
364
|
|
|
345
365
|
// Console
|
|
@@ -379,7 +399,11 @@
|
|
|
379
399
|
// Route changes (History API + popstate)
|
|
380
400
|
const origPush = history.pushState;
|
|
381
401
|
const origReplace = history.replaceState;
|
|
382
|
-
function notify(from) {
|
|
402
|
+
function notify(from) {
|
|
403
|
+
send({ kind: 'route', url: location.href, from });
|
|
404
|
+
// A replaceState to the same URL (a router updating its state) is no navigation in the recording.
|
|
405
|
+
if (from !== location.href) mark('lens/nav', { from, to: location.href });
|
|
406
|
+
}
|
|
383
407
|
history.pushState = function(...args) { const from = location.href; const r = origPush.apply(this, args); notify(from); return r; };
|
|
384
408
|
history.replaceState = function(...args) { const from = location.href; const r = origReplace.apply(this, args); notify(from); return r; };
|
|
385
409
|
window.addEventListener('popstate', () => notify(undefined));
|
|
@@ -429,4 +453,4 @@
|
|
|
429
453
|
try { return safeWalk(v, 0, { left: SAFE_MAX_BYTES }); } catch (e) { return String(v); }
|
|
430
454
|
}
|
|
431
455
|
})();
|
|
432
|
-
`}g(
|
|
456
|
+
`}g(buildInlineClientRuntime,"buildInlineClientRuntime"),y(buildInlineClientRuntime,"buildInlineClientRuntime"),d(buildInlineClientRuntime,"buildInlineClientRuntime");
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether this dev server serves the session replay recorder (planning/replay/00-plan.md — the owner's D1: on by
|
|
3
|
+
* default). In order:
|
|
4
|
+
*
|
|
5
|
+
* 1. `LENSMCP_REPLAY` in the dev server's env: `0` / `off` / `false` off, `1` / `on` / `true` on;
|
|
6
|
+
* 2. the plugin's `replay` option;
|
|
7
|
+
* 3. Settings › Features, as the lens writes it beside the bus file (`.lensmcp/capture.json`, `"replay": "off"`) —
|
|
8
|
+
* the same file the node taps read live;
|
|
9
|
+
* 4. on.
|
|
10
|
+
*/
|
|
11
|
+
export declare function replayEnabled(o: {
|
|
12
|
+
option?: boolean;
|
|
13
|
+
env?: Record<string, string | undefined>;
|
|
14
|
+
captureFile: string;
|
|
15
|
+
read?: (file: string) => string;
|
|
16
|
+
}): boolean;
|
|
17
|
+
/** `.lensmcp/capture.json` beside the bus file this dev server writes to (node-instrumentation's capture-file.ts, same rule). */
|
|
18
|
+
export declare function captureFilePath(env?: Record<string, string | undefined>, cwd?: string): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var i=Object.defineProperty;var t=(r,e)=>i(r,"name",{value:e,configurable:!0});var p=Object.defineProperty,a=t((r,e)=>p(r,"name",{value:e,configurable:!0}),"t"),c=Object.defineProperty,n=a((r,e)=>c(r,"name",{value:e,configurable:!0}),"t");import{readFileSync as u}from"node:fs";import{dirname as l,join as s}from"node:path";import{lensEventFile as f}from"@lensmcp/core/lens-events";export function replayEnabled(r){const e=(r.env??process.env).LENSMCP_REPLAY?.trim().toLowerCase();if(e==="0"||e==="off"||e==="false")return!1;if(e==="1"||e==="on"||e==="true")return!0;if(r.option!==void 0)return r.option;try{return JSON.parse((r.read??(o=>u(o,"utf8")))(r.captureFile)).replay!=="off"}catch{return!0}}t(replayEnabled,"replayEnabled"),a(replayEnabled,"replayEnabled"),n(replayEnabled,"replayEnabled");export function captureFilePath(r=process.env,e=process.cwd()){return s(l(f(r,e)),"capture.json")}t(captureFilePath,"captureFilePath"),a(captureFilePath,"captureFilePath"),n(captureFilePath,"captureFilePath");
|
package/lib/runtime-guard.d.ts
CHANGED
|
@@ -3,6 +3,12 @@ import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
|
3
3
|
export declare const CLIENT_VIRTUAL_ID = "/@lensmcp/client-runtime";
|
|
4
4
|
/** The id `resolveId` maps it to; Vite serves it under `/@id/__x00__lensmcp-client-runtime` as well. */
|
|
5
5
|
export declare const RESOLVED_CLIENT_VIRTUAL_ID = "\0lensmcp-client-runtime";
|
|
6
|
+
/**
|
|
7
|
+
* The session replay recorder's script (`@lensmcp/client-runtime`'s `replay.bundle.js`). It carries no token — the
|
|
8
|
+
* runtime hands its bridge to it in the page — so it needs no guard.
|
|
9
|
+
*/
|
|
10
|
+
export declare const REPLAY_VIRTUAL_ID = "/@lensmcp/replay";
|
|
11
|
+
export declare const RESOLVED_REPLAY_VIRTUAL_ID = "\0lensmcp-replay";
|
|
6
12
|
/** What the guard needs from the bridge: its origin policy. */
|
|
7
13
|
export interface RuntimeGuardBridge {
|
|
8
14
|
admitsOrigin(origin: string): boolean;
|
package/lib/runtime-guard.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var h=Object.defineProperty;var r=(t,e)=>h(t,"name",{value:e,configurable:!0});var R=Object.defineProperty,n=r((t,e)=>R(t,"name",{value:e,configurable:!0}),"i"),g=Object.defineProperty,u=n((t,e)=>g(t,"name",{value:e,configurable:!0}),"i");export const CLIENT_VIRTUAL_ID="/@lensmcp/client-runtime",RESOLVED_CLIENT_VIRTUAL_ID="\0lensmcp-client-runtime",REPLAY_VIRTUAL_ID="/@lensmcp/replay",RESOLVED_REPLAY_VIRTUAL_ID="\0lensmcp-replay";export function createRuntimeModuleGuard(t){return(e,i,s)=>{if(!isRuntimeModuleRequest(e.url)){s();return}const a=o(e,"origin"),l=a===void 0?void 0:c(a)??a,m=o(e,"sec-fetch-site"),v=p(e,l,m);if(v===void 0){if(l===void 0?m==="cross-site":!t.admitsOrigin(l)){i.statusCode=403,i.setHeader("content-type","text/plain"),i.end("lensmcp: the client runtime is not served cross-origin to an origin the bridge does not admit");return}s();return}i.once("finish",()=>{(i.statusCode===200||i.statusCode===304)&&t.learnOrigin(v)}),s()}}r(createRuntimeModuleGuard,"createRuntimeModuleGuard"),n(createRuntimeModuleGuard,"createRuntimeModuleGuard"),u(createRuntimeModuleGuard,"createRuntimeModuleGuard");export function isRuntimeModuleRequest(t){if(!t)return!1;let e=t.split("?")[0]?.split("#")[0]??"";try{e=decodeURI(e)}catch{return!1}return e.endsWith(CLIENT_VIRTUAL_ID)||e.endsWith(RESOLVED_CLIENT_VIRTUAL_ID.slice(1))}r(isRuntimeModuleRequest,"isRuntimeModuleRequest"),n(isRuntimeModuleRequest,"isRuntimeModuleRequest"),u(isRuntimeModuleRequest,"isRuntimeModuleRequest");function p(t,e,i){const s=f(t);if(i==="same-origin")return e===void 0?s:c(e);if(i===void 0)return e===void 0||e===s?s:void 0}r(p,"f"),n(p,"l"),u(p,"sameOriginPage");function f(t){const e=d(o(t,"x-forwarded-proto"))??(t.socket?.encrypted?"https":"http"),i=d(o(t,"x-forwarded-host"))??o(t,"host")??o(t,":authority");return i?c(`${e}://${i}`):void 0}r(f,"m"),n(f,"h"),u(f,"servedOrigin");function o(t,e){const i=t.headers[e];return typeof i=="string"?i:Array.isArray(i)?i[0]:void 0}r(o,"s"),n(o,"o"),u(o,"headerOf");function d(t){return t?.split(",")[0]?.trim()||void 0}r(d,"a"),n(d,"a"),u(d,"firstValue");function c(t){if(t)try{const e=new URL(t);return e.protocol==="http:"||e.protocol==="https:"?e.origin:void 0}catch{return}}r(c,"u"),n(c,"u"),u(c,"normalizeOrigin");
|
package/lib/types.d.ts
CHANGED
|
@@ -37,6 +37,12 @@ export interface LensmcpViteOptions {
|
|
|
37
37
|
* minutes, so a setup where the socket never connects is reported, never looped. `false` = report only.
|
|
38
38
|
*/
|
|
39
39
|
hmrRecovery?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Session replay: the page records itself with rrweb (`/@lensmcp/replay`, injected after the runtime) and streams
|
|
42
|
+
* the recording to the bridge (planning/replay/00-plan.md). On by default; `LENSMCP_REPLAY=0` in the dev server's
|
|
43
|
+
* env wins over this, and without either, Settings › Features (`.lensmcp/capture.json`) decides.
|
|
44
|
+
*/
|
|
45
|
+
replay?: boolean;
|
|
40
46
|
/**
|
|
41
47
|
* Also attach during `vite build`. Default **false** — everything this plugin does (the WS
|
|
42
48
|
* bridge, the injected client runtime, `data-agent-source` on every element, source paths in
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lensmcp/vite-plugin",
|
|
3
|
-
"version": "1.25.
|
|
3
|
+
"version": "1.25.18",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./index.js",
|
|
6
6
|
"module": "./index.js",
|
|
@@ -15,11 +15,12 @@
|
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"@babel/core": "^7.0.0",
|
|
18
|
-
"@lensmcp/bridge": "1.25.
|
|
19
|
-
"@lensmcp/
|
|
20
|
-
"@lensmcp/
|
|
21
|
-
"@lensmcp/
|
|
22
|
-
"@lensmcp/
|
|
18
|
+
"@lensmcp/bridge": "1.25.18",
|
|
19
|
+
"@lensmcp/client-runtime": "1.25.18",
|
|
20
|
+
"@lensmcp/core": "1.25.18",
|
|
21
|
+
"@lensmcp/protocol-types": "1.25.18",
|
|
22
|
+
"@lensmcp/react-instrumentation": "1.25.18",
|
|
23
|
+
"@lensmcp/valtio-instrumentation": "1.25.18",
|
|
23
24
|
"tslib": "^2.3.0"
|
|
24
25
|
},
|
|
25
26
|
"peerDependencies": {
|