@north-light/cli 0.3.498 → 0.3.500

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.
@@ -1,5 +1,5 @@
1
1
  /** The contract level this build serves and requires. Written by `scripts/contract.mjs release`; never edit by hand. */
2
- export declare const CONTRACT_LEVEL = "1.15";
2
+ export declare const CONTRACT_LEVEL = "1.16";
3
3
  /** Request header naming the one contract level the caller needs, e.g. `1.3`. Optional: absent means no check. */
4
4
  export declare const REQUIRED_CONTRACT_HEADER = "Crouter-Required-Contract";
5
5
  /** Response header listing the contract levels the server serves, comma-separated, one per major, e.g. `1.3`. */
@@ -1 +1 @@
1
- var c=Object.defineProperty;var e=(r,t)=>c(r,"name",{value:t,configurable:!0});const f="1.15",i="Crouter-Required-Contract",p="Crouter-Contract";function l(r){const t=/^(\d+)\.(\d+)$/.exec(r.trim());return t===null?null:{major:Number(t[1]),minor:Number(t[2])}}e(l,"parseContractLevel");function a(r){return r==null?[]:r.split(",").map(t=>l(t)).filter(t=>t!==null)}e(a,"parseServedContracts");function s(r,t){const n=l(r);return n===null?!1:(typeof t=="string"||t===null||t===void 0?a(t):t).some(u=>u.major===n.major&&u.minor>=n.minor)}e(s,"contractSatisfies");function C(r,t,n={}){if(r===void 0)return null;if(l(r)===null)return{status:400,code:"invalid_request",param:i,message:`${i} must be a contract level like 1.0.`};if(s(r,t))return null;const o=r.trim();return{status:426,code:"runtime_version_unsupported",message:t===null||a(t).length===0?`The runtime did not name its contract level; the caller requires contract ${o} or later. Roll the runtime forward.`:`The runtime serves contract ${t}; the caller requires contract ${o} or later within the same major. Roll the runtime forward, or pin an SDK whose crouterContract the runtime serves.`,details:{sdk_version:(n.legacyMinimum??"").trim(),runtime_version:n.runtimeVersion??null,required_contract:o,runtime_contract:t}}}e(C,"contractRefusal");export{p as CONTRACT_HEADER,f as CONTRACT_LEVEL,i as REQUIRED_CONTRACT_HEADER,C as contractRefusal,s as contractSatisfies,l as parseContractLevel,a as parseServedContracts};
1
+ var c=Object.defineProperty;var e=(r,t)=>c(r,"name",{value:t,configurable:!0});const f="1.16",i="Crouter-Required-Contract",p="Crouter-Contract";function l(r){const t=/^(\d+)\.(\d+)$/.exec(r.trim());return t===null?null:{major:Number(t[1]),minor:Number(t[2])}}e(l,"parseContractLevel");function a(r){return r==null?[]:r.split(",").map(t=>l(t)).filter(t=>t!==null)}e(a,"parseServedContracts");function s(r,t){const n=l(r);return n===null?!1:(typeof t=="string"||t===null||t===void 0?a(t):t).some(u=>u.major===n.major&&u.minor>=n.minor)}e(s,"contractSatisfies");function C(r,t,n={}){if(r===void 0)return null;if(l(r)===null)return{status:400,code:"invalid_request",param:i,message:`${i} must be a contract level like 1.0.`};if(s(r,t))return null;const o=r.trim();return{status:426,code:"runtime_version_unsupported",message:t===null||a(t).length===0?`The runtime did not name its contract level; the caller requires contract ${o} or later. Roll the runtime forward.`:`The runtime serves contract ${t}; the caller requires contract ${o} or later within the same major. Roll the runtime forward, or pin an SDK whose crouterContract the runtime serves.`,details:{sdk_version:(n.legacyMinimum??"").trim(),runtime_version:n.runtimeVersion??null,required_contract:o,runtime_contract:t}}}e(C,"contractRefusal");export{p as CONTRACT_HEADER,f as CONTRACT_LEVEL,i as REQUIRED_CONTRACT_HEADER,C as contractRefusal,s as contractSatisfies,l as parseContractLevel,a as parseServedContracts};
@@ -9,6 +9,14 @@ when-and-why-to-read: When you need Release notes, this knowledge should be read
9
9
 
10
10
  Changes to `@north-light/sdk` that can change what an existing app sees. Newest first.
11
11
 
12
+ ## 0.3.499
13
+
14
+ An app-paid app can serve its model calls from its own service. Additive: no request or response an existing app sends or reads changes.
15
+
16
+ ### `inferenceEndpoint({issuer, baseURL, app, providers, rungs, onUsage?})` (additive)
17
+
18
+ Returns a Fetch handler `(Request) => Promise<Response>` to mount at the path of `baseURL`. It verifies the directory token (issuer, `aud` = `baseURL`, expiry, scope `crtr:llm`, the app as grantee) in the header the vendor's API carries its key in, answers 401 with nothing sent upstream otherwise, and forwards `<baseURL>/<provider id>/<vendor path>` to `providers[id].baseURL` with the app's key in place of the token, streaming the vendor's answer back unchanged. A model outside `rungs` is refused. `onUsage` receives the verified person and the vendor's reported usage per completed request.
19
+
12
20
  ## 0.3.495
13
21
 
14
22
  `GET /v1/limits` reports how much of the data disk each app uses on a host without disk quota, and the disk as a whole. Additive: no request or response an existing app sends or reads changes.
@@ -1,5 +1,4 @@
1
- /** A provider's informational receipt must belong to the call that carried it. */
2
- export declare function acceptProviderReceipt(value: string | string[] | undefined, call: {
1
+ type ReceiptCall = {
3
2
  provider: string;
4
3
  tool: string;
5
4
  request_id: string;
@@ -10,4 +9,12 @@ export declare function acceptProviderReceipt(value: string | string[] | undefin
10
9
  payer: string;
11
10
  /** Whose month the receipt adds to when it differs from the receipt's grantee (the person's calls count under `app:terminal`). */
12
11
  ledger_grantee?: string;
13
- }): string | undefined;
12
+ };
13
+ /**
14
+ * A provider's informational receipts must belong to the call that carried them. The header is one
15
+ * receipt object or an array of at most {@link MAX_RECEIPTS}; each is checked and recorded on its
16
+ * own, and one that fails the check is dropped without dropping the others. Returns the first
17
+ * accepted receipt id.
18
+ */
19
+ export declare function acceptProviderReceipt(value: string | string[] | undefined, call: ReceiptCall): string | undefined;
20
+ export {};
@@ -1,2 +1,2 @@
1
- var _=Object.defineProperty;var p=(t,r)=>_(t,"name",{value:r,configurable:!0});import{prepared as o}from"../sqlite-statements.js";import{withCanvasWrite as a}from"../canvas/db.js";import{addUsage as g}from"../usage/ledger.js";function E(t,r){const u=Array.isArray(t)?t[0]:t;if(!u||u.length>16384)return;let i;try{i=JSON.parse(u)}catch{return}if(!i||typeof i!="object"||Array.isArray(i))return;const e=i;if(!(typeof e.receipt_id!="string"||!e.receipt_id||e.receipt_id.length>256||e.provider!==`app:${r.provider}`||e.tool!==r.tool||e.request_id!==r.request_id||e.sub!==r.sub||e.grantee!==r.grantee||e.payer!==r.payer||(e.run_id??null)!==r.run_id||typeof e.unit!="string"||!e.unit||typeof e.units!="number"||!Number.isFinite(e.units)||e.units<0||typeof e.time!="string"||!Number.isFinite(Date.parse(e.time))||typeof e.usd_equivalent!="number"||!Number.isFinite(e.usd_equivalent)||e.usd_equivalent<0))return a(n=>{if(o(n,`INSERT OR IGNORE INTO provider_receipts
2
- (provider, receipt_id, grantee, run_id, usd_equivalent, received_at) VALUES (?, ?, ?, ?, ?, ?)`).run(r.provider,e.receipt_id,r.grantee,r.run_id,e.usd_equivalent,new Date().toISOString()).changes&&(g(n,{grantee:r.ledger_grantee??r.grantee,payer:r.payer.startsWith("app:")?"app":"user",source:`provider:${r.provider}`,served_model:"",input_tokens:0,output_tokens:0,cached_tokens:0,usd_equivalent:e.usd_equivalent}),r.run_id)){const d=o(n,"SELECT usage_json FROM nodes WHERE node_id = ? AND run_id = ?").get(r.run_id,r.run_id);if(d){const s=d.usage_json?JSON.parse(d.usage_json):{};s.cost_usd=(typeof s.cost_usd=="number"?s.cost_usd:0)+e.usd_equivalent,o(n,"UPDATE nodes SET usage_json = ? WHERE node_id = ?").run(JSON.stringify(s),r.run_id)}}}),e.receipt_id}p(E,"acceptProviderReceipt");export{E as acceptProviderReceipt};
1
+ var a=Object.defineProperty;var _=(t,r)=>a(t,"name",{value:r,configurable:!0});import{prepared as p}from"../sqlite-statements.js";import{withCanvasWrite as f}from"../canvas/db.js";import{addUsage as g}from"../usage/ledger.js";const y=8,c=65536;function v(t,r){if(!t||typeof t!="object"||Array.isArray(t))return!1;const e=t;return typeof e.receipt_id=="string"&&!!e.receipt_id&&e.receipt_id.length<=256&&e.provider===`app:${r.provider}`&&e.tool===r.tool&&e.request_id===r.request_id&&e.sub===r.sub&&e.grantee===r.grantee&&e.payer===r.payer&&(e.run_id??null)===r.run_id&&typeof e.unit=="string"&&!!e.unit&&typeof e.units=="number"&&Number.isFinite(e.units)&&e.units>=0&&typeof e.time=="string"&&Number.isFinite(Date.parse(e.time))&&typeof e.usd_equivalent=="number"&&Number.isFinite(e.usd_equivalent)&&e.usd_equivalent>=0}_(v,"belongsToCall");function q(t,r){const e=Array.isArray(t)?t[0]:t;if(!e||e.length>c)return;let n;try{n=JSON.parse(e)}catch{return}if(Array.isArray(n)&&n.length>y)return;const o=(Array.isArray(n)?n:[n]).filter(i=>v(i,r));if(o.length)return f(i=>{for(const s of o){if(!p(i,`INSERT OR IGNORE INTO provider_receipts
2
+ (provider, receipt_id, grantee, run_id, usd_equivalent, received_at) VALUES (?, ?, ?, ?, ?, ?)`).run(r.provider,s.receipt_id,r.grantee,r.run_id,s.usd_equivalent,new Date().toISOString()).changes||(g(i,{grantee:r.ledger_grantee??r.grantee,payer:r.payer.startsWith("app:")?"app":"user",source:`provider:${r.provider}`,served_model:"",input_tokens:0,output_tokens:0,cached_tokens:0,usd_equivalent:s.usd_equivalent}),!r.run_id))continue;const d=p(i,"SELECT usage_json FROM nodes WHERE node_id = ? AND run_id = ?").get(r.run_id,r.run_id);if(!d)continue;const u=d.usage_json?JSON.parse(d.usage_json):{};u.cost_usd=(typeof u.cost_usd=="number"?u.cost_usd:0)+s.usd_equivalent,p(i,"UPDATE nodes SET usage_json = ? WHERE node_id = ?").run(JSON.stringify(u),r.run_id)}}),o[0].receipt_id}_(q,"acceptProviderReceipt");export{q as acceptProviderReceipt};
@@ -1 +1 @@
1
- var y=Object.defineProperty;var o=(n,e)=>y(n,"name",{value:e,configurable:!0});import{request as N}from"node:http";import{request as q}from"node:https";class w extends Error{static{o(this,"ProviderTransportError")}kind;constructor(e,r,i){super(r,i),this.kind=e,this.name="ProviderTransportError"}}const C=1e4,x=3e4,D=250,L=2e3,A=new Set(["ECONNREFUSED","ECONNRESET"]);async function Y(n,e={}){const r=new URL(n.url);if(r.protocol!=="http:"&&r.protocol!=="https:")throw new TypeError(`Unsupported provider protocol: ${r.protocol}`);const i=e.requestMs??x,s=e.connectMs??C;if(!Number.isFinite(i)||i<=0||!Number.isFinite(s)||s<=0)throw new RangeError("Provider timeouts must be positive finite milliseconds");const a=e.deadlineAt??Date.now()+i;if(!Number.isFinite(a))throw new RangeError("Provider deadline must be finite");let c=D,u;for(;;){if(e.signal?.aborted)throw b();const f=a-Date.now();if(f<=0)throw u?new w("connection","Provider connection retry deadline exhausted",{cause:u}):P();try{return await F(r,n,Math.min(s,f),f,e.signal)}catch(l){if(!(l instanceof T))throw l;if(u=l,e.signal?.aborted)throw b();const m=Math.min(c,a-Date.now());if(m<=0)throw S(l);if(await g(m,e.signal),e.signal?.aborted)throw b();if(Date.now()>=a)throw S(l);c=Math.min(c*2,L)}}}o(Y,"sendProviderRequest");class T extends Error{static{o(this,"RetryableConnectionError")}}function S(n){return new w("connection","Provider connection retry deadline exhausted",{cause:n})}o(S,"exhausted");function P(){return new w("timeout","Provider request timed out")}o(P,"timeout");function b(){return new w("aborted","Provider request aborted")}o(b,"aborted");function g(n,e){return new Promise((r,i)=>{if(e?.aborted){i(b());return}const s=setTimeout(a,n);e?.addEventListener("abort",c,{once:!0});function a(){e?.removeEventListener("abort",c),r()}o(a,"done");function c(){clearTimeout(s),e?.removeEventListener("abort",c),i(b())}o(c,"onAbort")})}o(g,"pause");function F(n,e,r,i,s){return new Promise((a,c)=>{if(s?.aborted){c(b());return}let u=!1,f=!1,l=!1,m,R;const E=(n.protocol==="https:"?q:N)(n,{method:e.method,headers:e.headers,agent:!1},t=>{f=!0,clearTimeout(m);const h=[];t.on("data",p=>h.push(p)),t.on("end",()=>{const p=Buffer.concat(h).toString("utf8");let M=p;try{M=JSON.parse(p)}catch{}d(void 0,{status:t.statusCode??0,headers:t.headers,body:M})}),t.on("error",p=>d(new w("connection","Provider response interrupted",{cause:p}))),t.on("close",()=>{t.complete||d(new w("connection","Provider response closed before completion"))})});function _(){clearTimeout(m),clearTimeout(R),s?.removeEventListener("abort",v)}o(_,"cleanup");function d(t,h){u||(u=!0,_(),t?(E.destroy(),c(t)):a(h))}o(d,"finish");function v(){d(b())}if(o(v,"onAbort"),s?.addEventListener("abort",v,{once:!0}),s?.aborted){v();return}m=setTimeout(()=>d(P()),r),R=setTimeout(()=>d(P()),i),E.on("socket",t=>{const h=o(()=>{l=!0,clearTimeout(m)},"connectedNow");t.connecting?t.once(n.protocol==="https:"?"secureConnect":"connect",h):h()}),E.on("error",t=>{u||(!f&&A.has(t.code??"")?d(new T(t.message,{cause:t})):d(new w("connection",f?"Provider response interrupted":"Provider connection failed",{cause:t})))}),E.on("close",()=>{!f&&!u&&d(new T(l?"Provider socket closed before response":"Provider connection closed before response"))}),e.body!==void 0&&E.write(e.body),E.end()})}o(F,"sendOnce");export{w as ProviderTransportError,Y as sendProviderRequest};
1
+ var y=Object.defineProperty;var o=(n,e)=>y(n,"name",{value:e,configurable:!0});import{request as N}from"node:http";import{request as q}from"node:https";class w extends Error{static{o(this,"ProviderTransportError")}kind;constructor(e,r,i){super(r,i),this.kind=e,this.name="ProviderTransportError"}}const x=1e4,C=3e4,D=250,L=2e3,A=new Set(["ECONNREFUSED","ECONNRESET"]);async function Y(n,e={}){const r=new URL(n.url);if(r.protocol!=="http:"&&r.protocol!=="https:")throw new TypeError(`Unsupported provider protocol: ${r.protocol}`);const i=e.requestMs??C,s=e.connectMs??x;if(!Number.isFinite(i)||i<=0||!Number.isFinite(s)||s<=0)throw new RangeError("Provider timeouts must be positive finite milliseconds");const a=e.deadlineAt??Date.now()+i;if(!Number.isFinite(a))throw new RangeError("Provider deadline must be finite");let c=D,u;for(;;){if(e.signal?.aborted)throw b();const f=a-Date.now();if(f<=0)throw u?new w("connection","Provider connection retry deadline exhausted",{cause:u}):P();try{return await F(r,n,Math.min(s,f),f,e.signal)}catch(l){if(!(l instanceof T))throw l;if(u=l,e.signal?.aborted)throw b();const m=Math.min(c,a-Date.now());if(m<=0)throw M(l);if(await g(m,e.signal),e.signal?.aborted)throw b();if(Date.now()>=a)throw M(l);c=Math.min(c*2,L)}}}o(Y,"sendProviderRequest");class T extends Error{static{o(this,"RetryableConnectionError")}}function M(n){return new w("connection","Provider connection retry deadline exhausted",{cause:n})}o(M,"exhausted");function P(){return new w("timeout","Provider request timed out")}o(P,"timeout");function b(){return new w("aborted","Provider request aborted")}o(b,"aborted");function g(n,e){return new Promise((r,i)=>{if(e?.aborted){i(b());return}const s=setTimeout(a,n);e?.addEventListener("abort",c,{once:!0});function a(){e?.removeEventListener("abort",c),r()}o(a,"done");function c(){clearTimeout(s),e?.removeEventListener("abort",c),i(b())}o(c,"onAbort")})}o(g,"pause");function F(n,e,r,i,s){return new Promise((a,c)=>{if(s?.aborted){c(b());return}let u=!1,f=!1,l=!1,m,R;const E=(n.protocol==="https:"?q:N)(n,{method:e.method,headers:e.headers,agent:!1,maxHeaderSize:80*1024},t=>{f=!0,clearTimeout(m);const h=[];t.on("data",p=>h.push(p)),t.on("end",()=>{const p=Buffer.concat(h).toString("utf8");let S=p;try{S=JSON.parse(p)}catch{}d(void 0,{status:t.statusCode??0,headers:t.headers,body:S})}),t.on("error",p=>d(new w("connection","Provider response interrupted",{cause:p}))),t.on("close",()=>{t.complete||d(new w("connection","Provider response closed before completion"))})});function _(){clearTimeout(m),clearTimeout(R),s?.removeEventListener("abort",v)}o(_,"cleanup");function d(t,h){u||(u=!0,_(),t?(E.destroy(),c(t)):a(h))}o(d,"finish");function v(){d(b())}if(o(v,"onAbort"),s?.addEventListener("abort",v,{once:!0}),s?.aborted){v();return}m=setTimeout(()=>d(P()),r),R=setTimeout(()=>d(P()),i),E.on("socket",t=>{const h=o(()=>{l=!0,clearTimeout(m)},"connectedNow");t.connecting?t.once(n.protocol==="https:"?"secureConnect":"connect",h):h()}),E.on("error",t=>{u||(!f&&A.has(t.code??"")?d(new T(t.message,{cause:t})):d(new w("connection",f?"Provider response interrupted":"Provider connection failed",{cause:t})))}),E.on("close",()=>{!f&&!u&&d(new T(l?"Provider socket closed before response":"Provider connection closed before response"))}),e.body!==void 0&&E.write(e.body),E.end()})}o(F,"sendOnce");export{w as ProviderTransportError,Y as sendProviderRequest};
@@ -7,6 +7,14 @@ description: Behavior changes in @north-light/sdk that an app must act on, newes
7
7
 
8
8
  Changes to `@north-light/sdk` that can change what an existing app sees. Newest first.
9
9
 
10
+ ## 0.3.499
11
+
12
+ An app-paid app can serve its model calls from its own service. Additive: no request or response an existing app sends or reads changes.
13
+
14
+ ### `inferenceEndpoint({issuer, baseURL, app, providers, rungs, onUsage?})` (additive)
15
+
16
+ Returns a Fetch handler `(Request) => Promise<Response>` to mount at the path of `baseURL`. It verifies the directory token (issuer, `aud` = `baseURL`, expiry, scope `crtr:llm`, the app as grantee) in the header the vendor's API carries its key in, answers 401 with nothing sent upstream otherwise, and forwards `<baseURL>/<provider id>/<vendor path>` to `providers[id].baseURL` with the app's key in place of the token, streaming the vendor's answer back unchanged. A model outside `rungs` is refused. `onUsage` receives the verified person and the vendor's reported usage per completed request.
17
+
10
18
  ## 0.3.495
11
19
 
12
20
  `GET /v1/limits` reports how much of the data disk each app uses on a host without disk quota, and the disk as a whole. Additive: no request or response an existing app sends or reads changes.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@north-light/cli",
3
- "version": "0.3.498",
3
+ "version": "0.3.500",
4
4
  "description": "crtr — agent runtime with memory, plugins, and marketplaces",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -138,7 +138,7 @@
138
138
  },
139
139
  "license": "UNLICENSED",
140
140
  "dependencies": {
141
- "@north-light/identity": "0.3.498",
141
+ "@north-light/identity": "0.3.500",
142
142
  "@earendil-works/pi-agent-core": "1.1.0",
143
143
  "@earendil-works/pi-ai": "1.1.0",
144
144
  "@earendil-works/pi-coding-agent": "1.1.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@north-light/identity",
3
- "version": "0.3.498",
3
+ "version": "0.3.500",
4
4
  "description": "Northlight 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.498",
3
+ "version": "0.3.500",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@north-light/cli",
9
- "version": "0.3.498",
9
+ "version": "0.3.500",
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.498",
21
+ "@north-light/identity": "0.3.500",
22
22
  "cron-parser": "^5.6.0",
23
23
  "esbuild": "^0.27.7",
24
24
  "jose": "^6.2.12",
@@ -12116,17 +12116,17 @@
12116
12116
  },
12117
12117
  "packages/crouter-api": {
12118
12118
  "name": "@north-light/api",
12119
- "version": "0.3.498",
12119
+ "version": "0.3.500",
12120
12120
  "license": "UNLICENSED"
12121
12121
  },
12122
12122
  "packages/crouter-env-docker": {
12123
12123
  "name": "@north-light/env-docker",
12124
- "version": "0.3.498",
12124
+ "version": "0.3.500",
12125
12125
  "license": "UNLICENSED"
12126
12126
  },
12127
12127
  "packages/crouter-identity": {
12128
12128
  "name": "@north-light/identity",
12129
- "version": "0.3.498",
12129
+ "version": "0.3.500",
12130
12130
  "license": "UNLICENSED",
12131
12131
  "dependencies": {
12132
12132
  "jose": "^6.2.1"
@@ -12134,20 +12134,20 @@
12134
12134
  },
12135
12135
  "packages/crouter-plugin": {
12136
12136
  "name": "@north-light/plugin",
12137
- "version": "0.3.498",
12137
+ "version": "0.3.500",
12138
12138
  "license": "UNLICENSED",
12139
12139
  "dependencies": {
12140
- "@north-light/api": "0.3.498",
12141
- "@north-light/identity": "0.3.498"
12140
+ "@north-light/api": "0.3.500",
12141
+ "@north-light/identity": "0.3.500"
12142
12142
  }
12143
12143
  },
12144
12144
  "packages/crouter-sdk": {
12145
12145
  "name": "@north-light/sdk",
12146
- "version": "0.3.498",
12146
+ "version": "0.3.500",
12147
12147
  "license": "UNLICENSED",
12148
12148
  "dependencies": {
12149
- "@north-light/api": "0.3.498",
12150
- "@north-light/identity": "0.3.498",
12149
+ "@north-light/api": "0.3.500",
12150
+ "@north-light/identity": "0.3.500",
12151
12151
  "jose": "^6.2.1"
12152
12152
  },
12153
12153
  "bin": {