@north-light/cli 0.3.426 → 0.3.427

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.
@@ -1852,7 +1852,7 @@ Dropped: ${u.dropped}`}}}}var PIn=h(()=>{"use strict";Gt();BD();$D();LD();wU()})
1852
1852
  ${m}
1853
1853
  `)}if(f==="node-done"){process.stderr.write(`
1854
1854
  \u2713 node ${i} finished \u2014 final report submitted.
1855
- `);let m=e.tagPane()??process.env.TMUX_PANE??my()?.pane;!o&&m!==void 0&&ua()&&J0(m)}u()}};return{done:l,teardown:d,isTornDown:()=>c,installSignalHandlers:()=>{let f=()=>d("signal");process.once("SIGTERM",f),process.once("SIGHUP",f),process.once("SIGINT",f)}}}var pkn=h(()=>{"use strict";Ap();wye()});var I0,xye=h(()=>{"use strict";I0=class extends Error{constructor(n){super(`node ${n} has no running broker \u2014 focus or revive it first`);this.nodeId=n;this.name="BrokerUnavailableError"}nodeId}});import{EventEmitter as vxi}from"node:events";var _U,fet=h(()=>{"use strict";Fr();dK();Uhe();Kwe();Sh();TYe();xye();_U=class extends vxi{constructor(n,r={}){super();this.nodeId=n;this.options=r}nodeId;options;socket;decoder=new d6(IYe);closeEmitted=!1;redialFaultRecorded=!1;get socketPath(){return qM(this.nodeId)}recordSocketFault(n,r){if(this.options.recordsViewerFaults===!1)return;if(n==="redial"){if(this.redialFaultRecorded)return;this.redialFaultRecorded=!0}let i=Fhe("viewer\u2194broker",r);Cat(this.nodeId,{link:"viewer\u2194broker",op:n,kind:i.kind,retry:n==="redial"?{disposition:"auto",by:"client"}:{disposition:"manual"},message:r instanceof Error?r.message:String(r)}).catch(o=>{dc({event:"broker.daemon.operation.failed",level:"error",node_id:this.nodeId,error:o,fields:{operation:"viewer_fault_record"}})})}connect(){let n=ybe(this.nodeId);this.socket=n,n.on("connect",()=>{this.redialFaultRecorded=!1,this.clearSocketFault(),this.emit("connect")}),n.on("data",r=>this.onData(r)),n.on("error",r=>this.onError(r,"connect")),n.on("close",()=>this.onClose())}redial(n={}){return this.destroy(),this.decoder=new d6(IYe),this.closeEmitted=!1,n.brokerUnavailableIsExpected&&(this.redialFaultRecorded=!1,this.clearSocketFault()),new Promise((r,i)=>{let o=ybe(this.nodeId);this.socket=o;let s=!1;o.on("connect",()=>{s||(s=!0,this.redialFaultRecorded=!1,this.clearSocketFault(),this.emit("connect"),r())}),o.on("data",a=>this.onData(a)),o.on("error",a=>{if(s){this.onError(a,"redial");return}s=!0;let c=a.code==="ECONNREFUSED"||a.code==="ENOENT";(!n.brokerUnavailableIsExpected||!c)&&this.recordSocketFault("redial",a);try{o.destroy()}catch{}i(a)}),o.on("close",()=>this.onClose())})}send(n){let r=this.socket;if(!(r===void 0||r.destroyed))try{r.write(Jme(n))}catch{}}destroy(){let n=this.socket;if(n!==void 0&&!n.destroyed)try{n.destroy()}catch{}}clearSocketFault(){this.options.recordsViewerFaults!==!1&&Iat(this.nodeId,{link:"viewer\u2194broker"}).catch(n=>{dc({event:"broker.daemon.operation.failed",level:"error",node_id:this.nodeId,error:n,fields:{operation:"viewer_fault_clear"}})})}onData(n){let r;try{r=this.decoder.push(n)}catch(i){let o=i instanceof BF?`broker sent an oversized frame (${i.message}) \u2014 disconnecting`:`failed to decode a broker frame: ${String(i)}`;this.emitError(new Error(o)),this.destroy();return}for(let i of r)this.emit("frame",i)}onError(n,r){this.recordSocketFault(r,n),n.code==="ECONNREFUSED"||n.code==="ENOENT"?this.emitError(new I0(this.nodeId)):this.emitError(new Error(`view socket error: ${n.message}`))}onClose(){this.closeEmitted||(this.closeEmitted=!0,this.emit("close"))}emitError(n){this.listenerCount("error")>0&&this.emit("error",n)}}});import{EventEmitter as Sxi}from"node:events";function Cxi(t,e){if("socketPath"in t)return`ws+unix://${t.socketPath}:/v1/nodes/${encodeURIComponent(e)}/attach?revive=0`;let n=new URL(t.previewEndpoint);return n.protocol=n.protocol==="http:"?"ws:":"wss:",n.pathname=`/v1/nodes/${encodeURIComponent(e)}/attach`,n.search="?wakeParked=1",n.hash="",n.toString()}var QD,fkn=h(()=>{"use strict";OFe();Uhe();xye();QD=class extends Sxi{constructor(n,r){super();this.nodeId=n;this.target=r}nodeId;target;ws;closeEmitted=!1;get url(){return Cxi(this.target,this.nodeId)}dial(){let n=new Fk.default(this.url,{..."relayToken"in this.target?{headers:{authorization:`Bearer ${this.target.relayToken}`}}:{},perMessageDeflate:!1});return this.ws=n,n}connect(){let n=this.dial();n.on("open",()=>{this.emit("connect")}),n.on("message",r=>this.onMessage(r)),n.on("error",r=>this.onError(r)),n.on("close",(r,i)=>this.onClose(r,i.toString()))}redial(n){return this.destroy(),this.closeEmitted=!1,new Promise((r,i)=>{let o=this.dial(),s=!1;o.on("open",()=>{s||(s=!0,this.emit("connect"),r())}),o.on("message",a=>this.onMessage(a)),o.on("error",a=>{if(s){this.onError(a);return}s=!0;try{o.terminate()}catch{}i(a)}),o.on("close",(a,c)=>{s&&this.onClose(a,c.toString())})})}send(n){let r=this.ws;if(!(r===void 0||r.readyState!==Fk.default.OPEN))try{r.send(JSON.stringify(n))}catch{}}destroy(){let n=this.ws;if(n!==void 0&&n.readyState<=Fk.default.OPEN)try{n.close()}catch{}}onMessage(n){let r;try{r=JSON.parse(n.toString())}catch{return}this.emit("frame",r)}onError(n){this.emitError(new Error(`relay transport error: ${n.message}`))}onClose(n,r){if(this.closeEmitted)return;this.closeEmitted=!0;let i=Fhe("viewer\u2194broker",{code:n,reason:r});(n===1008||i.kind==="protocol"||n===1011&&(/^no running broker/.test(r)||/^no node /.test(r)))&&this.emitError(new I0(this.nodeId)),this.emit("close")}emitError(n){this.listenerCount("error")>0&&this.emit("error",n)}}});import{EventEmitter as Ixi}from"node:events";import{randomUUID as Txi}from"node:crypto";function met(t){return t===null?!0:t.lifecycle==="resident"&&t.status==="done"&&t.intent==="parked"&&t.final_report==null?!1:t.status==="done"||t.status==="dead"||t.status==="canceled"}var mkn,nV,hkn=h(()=>{"use strict";fet();xye();fet();fkn();mkn=1e4;nV=class extends Ixi{constructor(n,r={}){super();this.nodeId=n;this.transport=r.transport??new _U(n),this.transport.on("connect",()=>{this.closeEmitted=!1,this.connected=!0,this.lastTransportError=void 0,this.emit("connect")}),this.transport.on("frame",i=>this.onFrame(i)),this.transport.on("error",i=>{this.lastTransportError=i.message,this.emitError(i)}),this.transport.on("close",()=>this.onClose())}nodeId;transport;closeEmitted=!1;connected=!1;lastTransportError;pending=new Map;request(n){let r=Txi();return new Promise((i,o)=>{if(!this.connected){o(new Error(`cannot issue '${n.type}': no live broker connection`));return}let s=setTimeout(()=>{this.pending.delete(r),o(new Error(`request '${n.type}' timed out after ${mkn}ms`))},mkn);typeof s.unref=="function"&&s.unref(),this.pending.set(r,{resolve:i,reject:o,timer:s}),this.send({...n,id:r})})}rejectAllPending(n){for(let{reject:r,timer:i}of this.pending.values())clearTimeout(i),r(new Error(n));this.pending.clear()}connect(){this.transport.connect()}redial(n){return this.transport.redial(n)}send(n){this.transport.send(n)}close(){this.transport.destroy()}onFrame(n){if(n.type==="data"){let r=typeof n.id=="string"?this.pending.get(n.id):void 0;r&&(this.pending.delete(n.id),clearTimeout(r.timer),r.resolve(n));return}if(n.type==="error"&&typeof n.id=="string"&&this.pending.has(n.id)){let r=this.pending.get(n.id);this.pending.delete(n.id),clearTimeout(r.timer),r.reject(new Error(n.message||`request failed: ${n.code}`));return}this.emit("frame",n)}onClose(){this.closeEmitted||(this.closeEmitted=!0,this.connected=!1,this.rejectAllPending(this.lastTransportError??"broker connection closed"),this.emit("close"))}emitError(n){this.listenerCount("error")>0&&this.emit("error",n)}}});var het=h(()=>{"use strict";hkn()});function gkn(t,e){let{nodeId:n,socket:r,canvasSource:i}=t,o,s=!1,a=e.initialDormant===!0,c=!1,u=!1,l=()=>{},d,p,f=new Promise(x=>{l=x}),m=x=>u?Promise.resolve(!1):new Promise(E=>{let _=C=>{d=void 0,p=void 0,E(C)};d=setTimeout(()=>_(!0),x),p=()=>{d!==void 0&&clearTimeout(d),_(!1)}}),g=()=>{r.send({type:"hello",role:e.role,client_id:e.clientId,term:{cols:process.stdout.columns??80,rows:process.stdout.rows??24}})},y=async()=>{s=!0,e.setNotice("\u21BB node refreshing \u2014 reconnecting\u2026",{sticky:!0});let x=200;try{for(;!u&&!e.isTornDown();){let E;try{E=await i.getRow(n)}catch{E=void 0}if(E!==void 0&&met(E)){c=E?.status==="done";break}let _=E?.status==="idle"||E?.intent==="idle-release"||E?.lifecycle==="resident"&&E.status==="done"&&E.intent==="parked"&&E.final_report==null,C=_&&!a;a=_,C&&e.onEnterDormancy(),e.setNotice(_?"":"\u21BB node refreshing \u2014 reconnecting\u2026",{sticky:!_});try{if(!await Promise.race([r.redial({brokerUnavailableIsExpected:_}).then(()=>!0),f.then(()=>!1)])||u||e.isTornDown())return;g(),a=!1,e.setNotice("");return}catch{if(!await m(_?Rxi:Math.min(x,kxi)))return;x*=2}}}finally{s=!1}!u&&!e.isTornDown()&&e.teardown(c?"node-done":"broker-gone")};return{sendHello:g,startDormant:()=>{s||u||e.isTornDown()||(e.onEnterDormancy(),y())},isDormant:()=>a,lastSocketError:()=>o,install:()=>{r.on("frame",e.onFrame),r.on("error",x=>{o=x.message}),r.on("close",()=>{e.isTornDown()||s||y()})},stop:()=>{u||(u=!0,p?.(),l())}}}var kxi,Rxi,ykn=h(()=>{"use strict";het();kxi=1e3,Rxi=3e3});function bye(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;try{let e=Object.getPrototypeOf(t);if(e!==Object.prototype&&e!==null||Object.getOwnPropertySymbols(t).length!==0)return!1;let n=Object.getOwnPropertyNames(t).sort();if(n.length!==3||n[0]!=="body"||n[1]!=="commandName"||n[2]!=="kind")return!1;let r=Object.getOwnPropertyDescriptors(t);if(Object.values(r).some(o=>!("value"in o)))return!1;let i=t;return i.kind!=="memory-slash"||typeof i.commandName!="string"||typeof i.body!="string"?!1:(JSON.stringify(t),!0)}catch{return!1}}function Dxi(t){let e="",n=0,r=!0,i,o;for(;n<t.length;){if(r&&o===void 0){let a=t.slice(n).match(/^(?: {0,3})(`{3,}|~{3,})/);if(a!==null){let c=a[1][0],u=a[1].length;i===void 0?i={marker:c,length:u}:i.marker===c&&u>=i.length&&(i=void 0)}}if(i===void 0&&o===void 0&&t.startsWith("<!--",n)){let a=t.indexOf("-->",n+4),c=a===-1?t.length:a+3,u=t.indexOf(`
1855
+ `);let m=e.tagPane()??process.env.TMUX_PANE??my()?.pane;!o&&m!==void 0&&ua()&&J0(m)}u()}};return{done:l,teardown:d,isTornDown:()=>c,installSignalHandlers:()=>{let f=()=>d("signal");process.once("SIGTERM",f),process.once("SIGHUP",f),process.once("SIGINT",f)}}}var pkn=h(()=>{"use strict";Ap();wye()});var I0,xye=h(()=>{"use strict";I0=class extends Error{constructor(n){super(`node ${n} has no running broker \u2014 focus or revive it first`);this.nodeId=n;this.name="BrokerUnavailableError"}nodeId}});import{EventEmitter as vxi}from"node:events";var _U,fet=h(()=>{"use strict";Fr();dK();Uhe();Kwe();Sh();TYe();xye();_U=class extends vxi{constructor(n,r={}){super();this.nodeId=n;this.options=r}nodeId;options;socket;decoder=new d6(IYe);closeEmitted=!1;redialFaultRecorded=!1;get socketPath(){return qM(this.nodeId)}recordSocketFault(n,r){if(this.options.recordsViewerFaults===!1)return;if(n==="redial"){if(this.redialFaultRecorded)return;this.redialFaultRecorded=!0}let i=Fhe("viewer\u2194broker",r);Cat(this.nodeId,{link:"viewer\u2194broker",op:n,kind:i.kind,retry:n==="redial"?{disposition:"auto",by:"client"}:{disposition:"manual"},message:r instanceof Error?r.message:String(r)}).catch(o=>{dc({event:"broker.daemon.operation.failed",level:"error",node_id:this.nodeId,error:o,fields:{operation:"viewer_fault_record"}})})}connect(){let n=ybe(this.nodeId);this.socket=n,n.on("connect",()=>{this.redialFaultRecorded=!1,this.clearSocketFault(),this.emit("connect")}),n.on("data",r=>this.onData(r)),n.on("error",r=>this.onError(r,"connect")),n.on("close",()=>this.onClose())}redial(n={}){return this.destroy(),this.decoder=new d6(IYe),this.closeEmitted=!1,n.brokerUnavailableIsExpected&&(this.redialFaultRecorded=!1,this.clearSocketFault()),new Promise((r,i)=>{let o=ybe(this.nodeId);this.socket=o;let s=!1;o.on("connect",()=>{s||(s=!0,this.redialFaultRecorded=!1,this.clearSocketFault(),this.emit("connect"),r())}),o.on("data",a=>this.onData(a)),o.on("error",a=>{if(s){this.onError(a,"redial");return}s=!0;let c=a.code==="ECONNREFUSED"||a.code==="ENOENT";(!n.brokerUnavailableIsExpected||!c)&&this.recordSocketFault("redial",a);try{o.destroy()}catch{}i(a)}),o.on("close",()=>this.onClose())})}send(n){let r=this.socket;if(!(r===void 0||r.destroyed))try{r.write(Jme(n))}catch{}}destroy(){let n=this.socket;if(n!==void 0&&!n.destroyed)try{n.destroy()}catch{}}clearSocketFault(){this.options.recordsViewerFaults!==!1&&Iat(this.nodeId,{link:"viewer\u2194broker"}).catch(n=>{dc({event:"broker.daemon.operation.failed",level:"error",node_id:this.nodeId,error:n,fields:{operation:"viewer_fault_clear"}})})}onData(n){let r;try{r=this.decoder.push(n)}catch(i){let o=i instanceof BF?`broker sent an oversized frame (${i.message}) \u2014 disconnecting`:`failed to decode a broker frame: ${String(i)}`;this.emitError(new Error(o)),this.destroy();return}for(let i of r)this.emit("frame",i)}onError(n,r){this.recordSocketFault(r,n),n.code==="ECONNREFUSED"||n.code==="ENOENT"?this.emitError(new I0(this.nodeId)):this.emitError(new Error(`view socket error: ${n.message}`))}onClose(){this.closeEmitted||(this.closeEmitted=!0,this.emit("close"))}emitError(n){this.listenerCount("error")>0&&this.emit("error",n)}}});import{EventEmitter as Sxi}from"node:events";function Cxi(t,e){if("socketPath"in t)return`ws+unix://${t.socketPath}:/v1/nodes/${encodeURIComponent(e)}/attach?revive=0`;let n=new URL(t.previewEndpoint);return n.protocol=n.protocol==="http:"?"ws:":"wss:",n.pathname=`/v1/nodes/${encodeURIComponent(e)}/attach`,n.search="?wakeParked=1",n.hash="",n.toString()}var QD,fkn=h(()=>{"use strict";OFe();Uhe();xye();QD=class extends Sxi{constructor(n,r){super();this.nodeId=n;this.target=r}nodeId;target;ws;closeEmitted=!1;get url(){return Cxi(this.target,this.nodeId)}dial(){let n=new Fk.default(this.url,{..."relayToken"in this.target?{headers:{authorization:`Bearer ${this.target.relayToken}`}}:{},perMessageDeflate:!1});return this.ws=n,n}connect(){let n=this.dial();n.on("open",()=>{this.emit("connect")}),n.on("message",r=>this.onMessage(r)),n.on("error",r=>this.onError(r)),n.on("close",(r,i)=>this.onClose(r,i.toString()))}redial(n){return this.destroy(),this.closeEmitted=!1,new Promise((r,i)=>{let o=this.dial(),s=!1;o.on("open",()=>{s||(s=!0,this.emit("connect"),r())}),o.on("message",a=>this.onMessage(a)),o.on("error",a=>{if(s){this.onError(a);return}s=!0;try{o.terminate()}catch{}i(a)}),o.on("close",(a,c)=>{s&&this.onClose(a,c.toString())})})}send(n){let r=this.ws;if(!(r===void 0||r.readyState!==Fk.default.OPEN))try{r.send(JSON.stringify(n))}catch{}}destroy(){let n=this.ws;if(n!==void 0&&n.readyState<=Fk.default.OPEN)try{n.close(1e3)}catch{}}onMessage(n){let r;try{r=JSON.parse(n.toString())}catch{return}this.emit("frame",r)}onError(n){this.emitError(new Error(`relay transport error: ${n.message}`))}onClose(n,r){if(this.closeEmitted)return;this.closeEmitted=!0;let i=Fhe("viewer\u2194broker",{code:n,reason:r});(n===1008||i.kind==="protocol"||n===1011&&(/^no running broker/.test(r)||/^no node /.test(r)))&&this.emitError(new I0(this.nodeId)),this.emit("close")}emitError(n){this.listenerCount("error")>0&&this.emit("error",n)}}});import{EventEmitter as Ixi}from"node:events";import{randomUUID as Txi}from"node:crypto";function met(t){return t===null?!0:t.lifecycle==="resident"&&t.status==="done"&&t.intent==="parked"&&t.final_report==null?!1:t.status==="done"||t.status==="dead"||t.status==="canceled"}var mkn,nV,hkn=h(()=>{"use strict";fet();xye();fet();fkn();mkn=1e4;nV=class extends Ixi{constructor(n,r={}){super();this.nodeId=n;this.transport=r.transport??new _U(n),this.transport.on("connect",()=>{this.closeEmitted=!1,this.connected=!0,this.lastTransportError=void 0,this.emit("connect")}),this.transport.on("frame",i=>this.onFrame(i)),this.transport.on("error",i=>{this.lastTransportError=i.message,this.emitError(i)}),this.transport.on("close",()=>this.onClose())}nodeId;transport;closeEmitted=!1;connected=!1;lastTransportError;pending=new Map;request(n){let r=Txi();return new Promise((i,o)=>{if(!this.connected){o(new Error(`cannot issue '${n.type}': no live broker connection`));return}let s=setTimeout(()=>{this.pending.delete(r),o(new Error(`request '${n.type}' timed out after ${mkn}ms`))},mkn);typeof s.unref=="function"&&s.unref(),this.pending.set(r,{resolve:i,reject:o,timer:s}),this.send({...n,id:r})})}rejectAllPending(n){for(let{reject:r,timer:i}of this.pending.values())clearTimeout(i),r(new Error(n));this.pending.clear()}connect(){this.transport.connect()}redial(n){return this.transport.redial(n)}send(n){this.transport.send(n)}close(){this.transport.destroy()}onFrame(n){if(n.type==="data"){let r=typeof n.id=="string"?this.pending.get(n.id):void 0;r&&(this.pending.delete(n.id),clearTimeout(r.timer),r.resolve(n));return}if(n.type==="error"&&typeof n.id=="string"&&this.pending.has(n.id)){let r=this.pending.get(n.id);this.pending.delete(n.id),clearTimeout(r.timer),r.reject(new Error(n.message||`request failed: ${n.code}`));return}this.emit("frame",n)}onClose(){this.closeEmitted||(this.closeEmitted=!0,this.connected=!1,this.rejectAllPending(this.lastTransportError??"broker connection closed"),this.emit("close"))}emitError(n){this.listenerCount("error")>0&&this.emit("error",n)}}});var het=h(()=>{"use strict";hkn()});function gkn(t,e){let{nodeId:n,socket:r,canvasSource:i}=t,o,s=!1,a=e.initialDormant===!0,c=!1,u=!1,l=()=>{},d,p,f=new Promise(x=>{l=x}),m=x=>u?Promise.resolve(!1):new Promise(E=>{let _=C=>{d=void 0,p=void 0,E(C)};d=setTimeout(()=>_(!0),x),p=()=>{d!==void 0&&clearTimeout(d),_(!1)}}),g=()=>{r.send({type:"hello",role:e.role,client_id:e.clientId,term:{cols:process.stdout.columns??80,rows:process.stdout.rows??24}})},y=async()=>{s=!0,e.setNotice("\u21BB node refreshing \u2014 reconnecting\u2026",{sticky:!0});let x=200;try{for(;!u&&!e.isTornDown();){let E;try{E=await i.getRow(n)}catch{E=void 0}if(E!==void 0&&met(E)){c=E?.status==="done";break}let _=E?.status==="idle"||E?.intent==="idle-release"||E?.lifecycle==="resident"&&E.status==="done"&&E.intent==="parked"&&E.final_report==null,C=_&&!a;a=_,C&&e.onEnterDormancy(),e.setNotice(_?"":"\u21BB node refreshing \u2014 reconnecting\u2026",{sticky:!_});try{if(!await Promise.race([r.redial({brokerUnavailableIsExpected:_}).then(()=>!0),f.then(()=>!1)])||u||e.isTornDown())return;g(),a=!1,e.setNotice("");return}catch{if(!await m(_?Rxi:Math.min(x,kxi)))return;x*=2}}}finally{s=!1}!u&&!e.isTornDown()&&e.teardown(c?"node-done":"broker-gone")};return{sendHello:g,startDormant:()=>{s||u||e.isTornDown()||(e.onEnterDormancy(),y())},isDormant:()=>a,lastSocketError:()=>o,install:()=>{r.on("frame",e.onFrame),r.on("error",x=>{o=x.message}),r.on("close",()=>{e.isTornDown()||s||y()})},stop:()=>{u||(u=!0,p?.(),l())}}}var kxi,Rxi,ykn=h(()=>{"use strict";het();kxi=1e3,Rxi=3e3});function bye(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;try{let e=Object.getPrototypeOf(t);if(e!==Object.prototype&&e!==null||Object.getOwnPropertySymbols(t).length!==0)return!1;let n=Object.getOwnPropertyNames(t).sort();if(n.length!==3||n[0]!=="body"||n[1]!=="commandName"||n[2]!=="kind")return!1;let r=Object.getOwnPropertyDescriptors(t);if(Object.values(r).some(o=>!("value"in o)))return!1;let i=t;return i.kind!=="memory-slash"||typeof i.commandName!="string"||typeof i.body!="string"?!1:(JSON.stringify(t),!0)}catch{return!1}}function Dxi(t){let e="",n=0,r=!0,i,o;for(;n<t.length;){if(r&&o===void 0){let a=t.slice(n).match(/^(?: {0,3})(`{3,}|~{3,})/);if(a!==null){let c=a[1][0],u=a[1].length;i===void 0?i={marker:c,length:u}:i.marker===c&&u>=i.length&&(i=void 0)}}if(i===void 0&&o===void 0&&t.startsWith("<!--",n)){let a=t.indexOf("-->",n+4),c=a===-1?t.length:a+3,u=t.indexOf(`
1856
1856
  `,c),l=t.lastIndexOf(`
1857
1857
  `,n-1)+1,d=t.slice(l,n),p=t.slice(c,u===-1?t.length:u);if(d.trim()===""&&p.trim()===""){d.length>0&&(e=e.slice(0,-d.length)),n=u===-1?t.length:u+1,r=!0;continue}let f=t.slice(n,c);r=f.endsWith(`
1858
1858
  `),n+=f.length;continue}if(i===void 0&&t[n]==="`"){let a=n;for(;t[a]==="`";)a++;let c=a-n;o===void 0?o=c:o===c&&(o=void 0),e+=t.slice(n,a),r=!1,n=a;continue}let s=t[n];e+=s,r=s===`
@@ -1 +1 @@
1
- var l=Object.defineProperty;var a=(r,t)=>l(r,"name",{value:t,configurable:!0});import{EventEmitter as d}from"node:events";import{WebSocket as h}from"ws";import{classify as m}from"../fault-classifier.js";import{BrokerUnavailableError as f}from"./transport.js";function u(r,t){if("socketPath"in r)return`ws+unix://${r.socketPath}:/v1/nodes/${encodeURIComponent(t)}/attach?revive=0`;const e=new URL(r.previewEndpoint);return e.protocol=e.protocol==="http:"?"ws:":"wss:",e.pathname=`/v1/nodes/${encodeURIComponent(t)}/attach`,e.search="?wakeParked=1",e.hash="",e.toString()}a(u,"relayUrl");class k extends d{static{a(this,"RelayTransport")}nodeId;target;ws;closeEmitted=!1;constructor(t,e){super(),this.nodeId=t,this.target=e}get url(){return u(this.target,this.nodeId)}dial(){const t=new h(this.url,{..."relayToken"in this.target?{headers:{authorization:`Bearer ${this.target.relayToken}`}}:{},perMessageDeflate:!1});return this.ws=t,t}connect(){const t=this.dial();t.on("open",()=>{this.emit("connect")}),t.on("message",e=>this.onMessage(e)),t.on("error",e=>this.onError(e)),t.on("close",(e,n)=>this.onClose(e,n.toString()))}redial(t){return this.destroy(),this.closeEmitted=!1,new Promise((e,n)=>{const o=this.dial();let i=!1;o.on("open",()=>{i||(i=!0,this.emit("connect"),e())}),o.on("message",s=>this.onMessage(s)),o.on("error",s=>{if(i){this.onError(s);return}i=!0;try{o.terminate()}catch{}n(s)}),o.on("close",(s,c)=>{i&&this.onClose(s,c.toString())})})}send(t){const e=this.ws;if(!(e===void 0||e.readyState!==h.OPEN))try{e.send(JSON.stringify(t))}catch{}}destroy(){const t=this.ws;if(t!==void 0&&t.readyState<=h.OPEN)try{t.close()}catch{}}onMessage(t){let e;try{e=JSON.parse(t.toString())}catch{return}this.emit("frame",e)}onError(t){this.emitError(new Error(`relay transport error: ${t.message}`))}onClose(t,e){if(this.closeEmitted)return;this.closeEmitted=!0;const n=m("viewer\u2194broker",{code:t,reason:e});(t===1008||n.kind==="protocol"||t===1011&&(/^no running broker/.test(e)||/^no node /.test(e)))&&this.emitError(new f(this.nodeId)),this.emit("close")}emitError(t){this.listenerCount("error")>0&&this.emit("error",t)}}export{k as RelayTransport};
1
+ var l=Object.defineProperty;var a=(r,t)=>l(r,"name",{value:t,configurable:!0});import{EventEmitter as d}from"node:events";import{WebSocket as h}from"ws";import{classify as m}from"../fault-classifier.js";import{BrokerUnavailableError as f}from"./transport.js";function u(r,t){if("socketPath"in r)return`ws+unix://${r.socketPath}:/v1/nodes/${encodeURIComponent(t)}/attach?revive=0`;const e=new URL(r.previewEndpoint);return e.protocol=e.protocol==="http:"?"ws:":"wss:",e.pathname=`/v1/nodes/${encodeURIComponent(t)}/attach`,e.search="?wakeParked=1",e.hash="",e.toString()}a(u,"relayUrl");class k extends d{static{a(this,"RelayTransport")}nodeId;target;ws;closeEmitted=!1;constructor(t,e){super(),this.nodeId=t,this.target=e}get url(){return u(this.target,this.nodeId)}dial(){const t=new h(this.url,{..."relayToken"in this.target?{headers:{authorization:`Bearer ${this.target.relayToken}`}}:{},perMessageDeflate:!1});return this.ws=t,t}connect(){const t=this.dial();t.on("open",()=>{this.emit("connect")}),t.on("message",e=>this.onMessage(e)),t.on("error",e=>this.onError(e)),t.on("close",(e,n)=>this.onClose(e,n.toString()))}redial(t){return this.destroy(),this.closeEmitted=!1,new Promise((e,n)=>{const o=this.dial();let i=!1;o.on("open",()=>{i||(i=!0,this.emit("connect"),e())}),o.on("message",s=>this.onMessage(s)),o.on("error",s=>{if(i){this.onError(s);return}i=!0;try{o.terminate()}catch{}n(s)}),o.on("close",(s,c)=>{i&&this.onClose(s,c.toString())})})}send(t){const e=this.ws;if(!(e===void 0||e.readyState!==h.OPEN))try{e.send(JSON.stringify(t))}catch{}}destroy(){const t=this.ws;if(t!==void 0&&t.readyState<=h.OPEN)try{t.close(1e3)}catch{}}onMessage(t){let e;try{e=JSON.parse(t.toString())}catch{return}this.emit("frame",e)}onError(t){this.emitError(new Error(`relay transport error: ${t.message}`))}onClose(t,e){if(this.closeEmitted)return;this.closeEmitted=!0;const n=m("viewer\u2194broker",{code:t,reason:e});(t===1008||n.kind==="protocol"||t===1011&&(/^no running broker/.test(e)||/^no node /.test(e)))&&this.emitError(new f(this.nodeId)),this.emit("close")}emitError(t){this.listenerCount("error")>0&&this.emit("error",t)}}export{k as RelayTransport};
@@ -41,6 +41,19 @@ export declare function startRemoteAttachHeartbeat(ws: WebSocket, intervalMs?: n
41
41
  * `ErrorBody`, spec §8) to the raw socket and destroy it. Never throws — a
42
42
  * reset peer is swallowed. Shared with server.ts's auth and startup gates. */
43
43
  export declare function refuseUpgrade(socket: Duplex, status: number, statusText: string, code: string, message: string): void;
44
+ /** Relay one remote WS ⇄ one node broker `view.sock`. Opens the socket on
45
+ * connect; forwards each complete frame socket→WS (bounded decode, one WS
46
+ * message per frame) and re-frames each WS message WS→socket (trailing
47
+ * newline). The relay is semantically verbatim — it never INTERPRETS a frame
48
+ * (it only splits/joins the newline framing). Closes the WS on socket
49
+ * gone/no-broker, destroys the socket on WS close; idempotent teardown, no
50
+ * leaks. Validates the node id first (path-safety + existence) as belt-and-
51
+ * suspenders — the upgrade handler already guarded both. */
52
+ /** A viewer that closed its WebSocket on purpose: 1000 normal, 1001 going
53
+ * away, or 1005 — a close frame carrying no status, which is what a bare
54
+ * `ws.close()` sends. None is a link fault; only an abnormal drop (1006) or an
55
+ * error code is. */
56
+ export declare function isCleanViewerClose(code: number): boolean;
44
57
  /** Handle the HTTP upgrade for `GET /v1/nodes/{id}/attach`. A-9 matches the
45
58
  * route, extracts `{id}`, and calls this with the raw upgrade triplet; this
46
59
  * owns the WS handshake (its own noServer `wss` above) AND the spec §5.3
@@ -1,8 +1,8 @@
1
- var E=Object.defineProperty;var s=(t,e)=>E(t,"name",{value:e,configurable:!0});import{WebSocketServer as $}from"ws";import{isSafeNodeId as A}from"../../core/canvas/paths.js";import{getNode as S}from"../../core/canvas/index.js";import{BROKER_READ_CAPS as R,CLIENT_READ_CAPS as T,FrameDecoder as B,FrameOverflowError as x}from"../../core/runtime/broker-protocol.js";import{classify as k}from"../../core/fault-classifier.js";import{clearFault as p,recordFault as g}from"../../core/canvas/recovery.js";import{decideAttachRevive as C}from"../../core/runtime/revive.js";import{connectViewSocket as N,probeViewSocket as O,waitForBrokerViewSocket as P}from"../../core/runtime/view-socket.js";import{isBeneathRefusal as F}from"../../core/spaces/open-beneath.js";import{attachViewer as _,detachViewer as U}from"./viewer-presence.js";const D=new $({noServer:!0,maxPayload:R.maxLineBytes}),L=25e3,H=6e4;function V(t,e=L,i=H){let o=!0,n=!1,a=Date.now();const f=s(()=>{o=!0},"acknowledge"),m=s(()=>{n||(n=!0,clearInterval(h),t.off("pong",f))},"stop");t.on("pong",f);const h=setInterval(()=>{if(Date.now()-a>i){o=!0;return}if(!o){m(),t.terminate();return}o=!1;try{t.ping()}catch{m(),t.terminate()}},e);return h.unref(),{stop:m,noteActivity:s(()=>{a=Date.now()},"noteActivity")}}s(V,"startRemoteAttachHeartbeat");function b(t){const e=Buffer.from(t,"utf8");return e.byteLength<=123?t:e.subarray(0,123).toString("utf8")}s(b,"clampReason");function u(t,e,i,o,n){const a=JSON.stringify({error:{code:o,message:n}}),f=`HTTP/1.1 ${e} ${i}\r
1
+ var $=Object.defineProperty;var s=(r,e)=>$(r,"name",{value:e,configurable:!0});import{WebSocketServer as R}from"ws";import{isSafeNodeId as A}from"../../core/canvas/paths.js";import{getNode as S}from"../../core/canvas/index.js";import{BROKER_READ_CAPS as C,CLIENT_READ_CAPS as T,FrameDecoder as x,FrameOverflowError as B}from"../../core/runtime/broker-protocol.js";import{classify as k}from"../../core/fault-classifier.js";import{clearFault as d,recordFault as g}from"../../core/canvas/recovery.js";import{decideAttachRevive as N}from"../../core/runtime/revive.js";import{connectViewSocket as O,probeViewSocket as P,waitForBrokerViewSocket as F}from"../../core/runtime/view-socket.js";import{isBeneathRefusal as U}from"../../core/spaces/open-beneath.js";import{attachViewer as _,detachViewer as D}from"./viewer-presence.js";const L=new R({noServer:!0,maxPayload:C.maxLineBytes}),V=25e3,H=6e4;function M(r,e=V,i=H){let n=!0,o=!1,a=Date.now();const f=s(()=>{n=!0},"acknowledge"),m=s(()=>{o||(o=!0,clearInterval(h),r.off("pong",f))},"stop");r.on("pong",f);const h=setInterval(()=>{if(Date.now()-a>i){n=!0;return}if(!n){m(),r.terminate();return}n=!1;try{r.ping()}catch{m(),r.terminate()}},e);return h.unref(),{stop:m,noteActivity:s(()=>{a=Date.now()},"noteActivity")}}s(M,"startRemoteAttachHeartbeat");function b(r){const e=Buffer.from(r,"utf8");return e.byteLength<=123?r:e.subarray(0,123).toString("utf8")}s(b,"clampReason");function u(r,e,i,n,o){const a=JSON.stringify({error:{code:n,message:o}}),f=`HTTP/1.1 ${e} ${i}\r
2
2
  content-type: application/json; charset=utf-8\r
3
3
  content-length: ${Buffer.byteLength(a)}\r
4
4
  connection: close\r
5
5
  \r
6
- `+a;try{t.end(f)}catch{try{t.destroy()}catch{}}}s(u,"refuseUpgrade");function M(t){if(new URL(t.url??"/","http://127.0.0.1").searchParams.get("revive")==="0")return!0;const i=t.headers["x-crtr-attach-revive"];return(Array.isArray(i)?i[0]:i)==="0"}s(M,"reviveOptedOut");function J(t){return new URL(t.url??"/","http://127.0.0.1").searchParams.get("wakeParked")==="1"}s(J,"wakeParkedRequested");function W(t,e){if(!A(e)){try{t.close(1008,b(`invalid node id: ${e}`))}catch{}return}if(S(e)===null){try{t.close(1011,b(`no node ${e}`))}catch{}return}p(e,{link:"viewer\u2194crtrd"});const i=N(e),o=new B(T);let n=!1,a=!1,f,m=!1,h=!1,v=!1;i.on("connect",()=>{m=!0,!n&&v&&_(e,t),p(e,{link:"relay\u2194broker"})});const y=s((r,l)=>{if(!n){if(n=!0,U(e,t),f?.stop(),!i.destroyed)try{i.destroy()}catch{}try{t.close(r,b(l))}catch{}}},"teardown");f=V(t),i.on("data",r=>{f?.noteActivity();let l;try{l=o.push(r)}catch(c){const d=c instanceof x?`broker sent an oversized frame (${c.message})`:`failed to decode a broker frame for ${e}`;y(1009,d);return}for(const c of l)t.readyState===t.OPEN&&t.send(JSON.stringify(c))}),i.on("error",r=>{const l=k("relay\u2194broker",r);g(e,{link:"relay\u2194broker",op:"bridge socket",kind:l.kind,retry:{disposition:"manual"},message:r.message});const c=r.code==="ECONNREFUSED"||r.code==="ENOENT"?`no running broker for ${e}`:`view socket error for ${e}: ${r.message}`;y(1011,c)}),i.on("close",r=>{n||r||(p(e,{link:"relay\u2194broker"}),y(1e3,"broker socket closed"))}),t.on("close",(r,l)=>{const c=l.toString("utf8");if(n){r===1e3&&p(e,{link:"viewer\u2194crtrd"});return}if(r===1e3)p(e,{link:"viewer\u2194crtrd"});else if(!a){a=!0;const d=k("viewer\u2194crtrd",{code:r,reason:c});g(e,{link:"viewer\u2194crtrd",op:"remote attach websocket",kind:d.kind,retry:{disposition:"auto"},message:c||`remote attach closed (${r})`})}y(r,c||`remote attach closed (${r})`)}),t.on("error",()=>{if(!a){a=!0;const r=k("viewer\u2194crtrd",{code:1006,reason:"remote attach websocket error"});g(e,{link:"viewer\u2194crtrd",op:"remote attach websocket",kind:r.kind,retry:{disposition:"auto"},message:"remote attach websocket error"})}y(1011,"remote attach websocket error")}),t.on("message",r=>{if(n||i.destroyed)return;f?.noteActivity();const c=(Array.isArray(r)?Buffer.concat(r):Buffer.isBuffer(r)?r:Buffer.from(new Uint8Array(r))).toString("utf8");if(!h)try{const w=JSON.parse(c);w?.type==="hello"&&(h=!0,v=w.attends!==!1,v&&m&&_(e,t))}catch{}const d=c.endsWith(`
6
+ `+a;try{r.end(f)}catch{try{r.destroy()}catch{}}}s(u,"refuseUpgrade");function J(r){if(new URL(r.url??"/","http://127.0.0.1").searchParams.get("revive")==="0")return!0;const i=r.headers["x-crtr-attach-revive"];return(Array.isArray(i)?i[0]:i)==="0"}s(J,"reviveOptedOut");function W(r){return new URL(r.url??"/","http://127.0.0.1").searchParams.get("wakeParked")==="1"}s(W,"wakeParkedRequested");function E(r){return r===1e3||r===1001||r===1005}s(E,"isCleanViewerClose");function j(r,e){if(!A(e)){try{r.close(1008,b(`invalid node id: ${e}`))}catch{}return}if(S(e)===null){try{r.close(1011,b(`no node ${e}`))}catch{}return}d(e,{link:"viewer\u2194crtrd"});const i=O(e),n=new x(T);let o=!1,a=!1,f,m=!1,h=!1,v=!1;i.on("connect",()=>{m=!0,!o&&v&&_(e,r),d(e,{link:"relay\u2194broker"})});const p=s((t,l)=>{if(!o){if(o=!0,D(e,r),f?.stop(),!i.destroyed)try{i.destroy()}catch{}try{r.close(t,b(l))}catch{}}},"teardown");f=M(r),i.on("data",t=>{f?.noteActivity();let l;try{l=n.push(t)}catch(c){const y=c instanceof B?`broker sent an oversized frame (${c.message})`:`failed to decode a broker frame for ${e}`;p(1009,y);return}for(const c of l)r.readyState===r.OPEN&&r.send(JSON.stringify(c))}),i.on("error",t=>{const l=k("relay\u2194broker",t);g(e,{link:"relay\u2194broker",op:"bridge socket",kind:l.kind,retry:{disposition:"manual"},message:t.message});const c=t.code==="ECONNREFUSED"||t.code==="ENOENT"?`no running broker for ${e}`:`view socket error for ${e}: ${t.message}`;p(1011,c)}),i.on("close",t=>{o||t||(d(e,{link:"relay\u2194broker"}),p(1e3,"broker socket closed"))}),r.on("close",(t,l)=>{const c=l.toString("utf8");if(o){E(t)&&d(e,{link:"viewer\u2194crtrd"});return}if(E(t))d(e,{link:"viewer\u2194crtrd"});else if(!a){a=!0;const y=k("viewer\u2194crtrd",{code:t,reason:c});g(e,{link:"viewer\u2194crtrd",op:"remote attach websocket",kind:y.kind,retry:{disposition:"auto"},message:c||`remote attach closed (${t})`})}p(t,c||`remote attach closed (${t})`)}),r.on("error",()=>{if(!a){a=!0;const t=k("viewer\u2194crtrd",{code:1006,reason:"remote attach websocket error"});g(e,{link:"viewer\u2194crtrd",op:"remote attach websocket",kind:t.kind,retry:{disposition:"auto"},message:"remote attach websocket error"})}p(1011,"remote attach websocket error")}),r.on("message",t=>{if(o||i.destroyed)return;f?.noteActivity();const c=(Array.isArray(t)?Buffer.concat(t):Buffer.isBuffer(t)?t:Buffer.from(new Uint8Array(t))).toString("utf8");if(!h)try{const w=JSON.parse(c);w?.type==="hello"&&(h=!0,v=w.attends!==!1,v&&m&&_(e,r))}catch{}const y=c.endsWith(`
7
7
  `)?c:c+`
8
- `;try{i.write(d)}catch{}})}s(W,"bridgeConnection");async function te(t,e,i,o){e.on("error",()=>{});try{if(!A(o)){u(e,400,"Bad Request","invalid_node_id",`invalid node id: ${o}`);return}if(S(o)===null){u(e,404,"Not Found","node_not_found",`no node ${o}`);return}if(M(t)){if(!await O(o,250)){u(e,409,"Conflict","node_dormant",`node ${o} is dormant and revive was opted out (?revive=0)`);return}}else{let n;try{const a=await C(o,{resume:!0,capacity:"refuse"},J(t));if(a.parked){u(e,409,"Conflict","node_dormant",`node ${o} is parked; attach with ?wakeParked=1 to wake it`);return}n=a.result.launch?.exited}catch(a){const f=a instanceof Error?a.message:String(a);u(e,409,"Conflict","attach_revive_failed",`attach revive failed: ${f}`);return}if(!await P(o,n)){u(e,409,"Conflict","broker_not_ready",`broker view socket for ${o} did not become listenable after revive`);return}}if(e.destroyed)return;D.handleUpgrade(t,e,i,n=>W(n,o))}catch(n){const a=n instanceof Error?n.message:String(n);if(F(n)){u(e,400,"Bad Request","invalid_request",a);return}u(e,500,"Internal Server Error","internal",`attach upgrade failed: ${a}`)}}s(te,"handleAttachUpgrade");export{L as REMOTE_ATTACH_HEARTBEAT_MS,H as REMOTE_ATTACH_QUIET_MS,te as handleAttachUpgrade,u as refuseUpgrade,V as startRemoteAttachHeartbeat};
8
+ `;try{i.write(y)}catch{}})}s(j,"bridgeConnection");async function te(r,e,i,n){e.on("error",()=>{});try{if(!A(n)){u(e,400,"Bad Request","invalid_node_id",`invalid node id: ${n}`);return}if(S(n)===null){u(e,404,"Not Found","node_not_found",`no node ${n}`);return}if(J(r)){if(!await P(n,250)){u(e,409,"Conflict","node_dormant",`node ${n} is dormant and revive was opted out (?revive=0)`);return}}else{let o;try{const a=await N(n,{resume:!0,capacity:"refuse"},W(r));if(a.parked){u(e,409,"Conflict","node_dormant",`node ${n} is parked; attach with ?wakeParked=1 to wake it`);return}o=a.result.launch?.exited}catch(a){const f=a instanceof Error?a.message:String(a);u(e,409,"Conflict","attach_revive_failed",`attach revive failed: ${f}`);return}if(!await F(n,o)){u(e,409,"Conflict","broker_not_ready",`broker view socket for ${n} did not become listenable after revive`);return}}if(e.destroyed)return;L.handleUpgrade(r,e,i,o=>j(o,n))}catch(o){const a=o instanceof Error?o.message:String(o);if(U(o)){u(e,400,"Bad Request","invalid_request",a);return}u(e,500,"Internal Server Error","internal",`attach upgrade failed: ${a}`)}}s(te,"handleAttachUpgrade");export{V as REMOTE_ATTACH_HEARTBEAT_MS,H as REMOTE_ATTACH_QUIET_MS,te as handleAttachUpgrade,E as isCleanViewerClose,u as refuseUpgrade,M as startRemoteAttachHeartbeat};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@north-light/cli",
3
- "version": "0.3.426",
3
+ "version": "0.3.427",
4
4
  "description": "crtr — agent runtime with memory, plugins, and marketplaces",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -137,7 +137,7 @@
137
137
  },
138
138
  "license": "UNLICENSED",
139
139
  "dependencies": {
140
- "@north-light/identity": "0.3.426",
140
+ "@north-light/identity": "0.3.427",
141
141
  "@earendil-works/pi-agent-core": "1.1.0",
142
142
  "@earendil-works/pi-ai": "1.1.0",
143
143
  "@earendil-works/pi-coding-agent": "1.1.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@north-light/identity",
3
- "version": "0.3.426",
3
+ "version": "0.3.427",
4
4
  "description": "crouter cloud access-token verification and scope rules",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
package/runtime.lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@north-light/cli",
3
- "version": "0.3.426",
3
+ "version": "0.3.427",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@north-light/cli",
9
- "version": "0.3.426",
9
+ "version": "0.3.427",
10
10
  "hasInstallScript": true,
11
11
  "license": "UNLICENSED",
12
12
  "workspaces": [
@@ -18,7 +18,7 @@
18
18
  "@earendil-works/pi-ai": "1.1.0",
19
19
  "@earendil-works/pi-coding-agent": "1.1.0",
20
20
  "@earendil-works/pi-tui": "1.1.0",
21
- "@north-light/identity": "0.3.426",
21
+ "@north-light/identity": "0.3.427",
22
22
  "cron-parser": "^5.6.0",
23
23
  "esbuild": "^0.27.7",
24
24
  "jose": "^6.2.12",
@@ -12095,17 +12095,17 @@
12095
12095
  },
12096
12096
  "packages/crouter-api": {
12097
12097
  "name": "@north-light/api",
12098
- "version": "0.3.426",
12098
+ "version": "0.3.427",
12099
12099
  "license": "UNLICENSED"
12100
12100
  },
12101
12101
  "packages/crouter-env-docker": {
12102
12102
  "name": "@north-light/env-docker",
12103
- "version": "0.3.426",
12103
+ "version": "0.3.427",
12104
12104
  "license": "UNLICENSED"
12105
12105
  },
12106
12106
  "packages/crouter-identity": {
12107
12107
  "name": "@north-light/identity",
12108
- "version": "0.3.426",
12108
+ "version": "0.3.427",
12109
12109
  "license": "UNLICENSED",
12110
12110
  "dependencies": {
12111
12111
  "jose": "^6.2.1"
@@ -12113,20 +12113,20 @@
12113
12113
  },
12114
12114
  "packages/crouter-plugin": {
12115
12115
  "name": "@north-light/plugin",
12116
- "version": "0.3.426",
12116
+ "version": "0.3.427",
12117
12117
  "license": "UNLICENSED",
12118
12118
  "dependencies": {
12119
- "@north-light/api": "0.3.426",
12120
- "@north-light/identity": "0.3.426"
12119
+ "@north-light/api": "0.3.427",
12120
+ "@north-light/identity": "0.3.427"
12121
12121
  }
12122
12122
  },
12123
12123
  "packages/crouter-sdk": {
12124
12124
  "name": "@north-light/sdk",
12125
- "version": "0.3.426",
12125
+ "version": "0.3.427",
12126
12126
  "license": "UNLICENSED",
12127
12127
  "dependencies": {
12128
- "@north-light/api": "0.3.426",
12129
- "@north-light/identity": "0.3.426",
12128
+ "@north-light/api": "0.3.427",
12129
+ "@north-light/identity": "0.3.427",
12130
12130
  "jose": "^6.2.1"
12131
12131
  },
12132
12132
  "bin": {