vana-cli 0.15.0 → 0.15.1
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/dist/cli/auth.d.ts.map +1 -1
- package/dist/cli/auth.js +28 -4
- package/dist/cli/auth.js.map +1 -1
- package/dist/cli/index.js +16 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/server/request-signer.d.ts.map +1 -1
- package/dist/server/request-signer.js +7 -24
- package/dist/server/request-signer.js.map +1 -1
- package/dist/server/session-relay.d.ts +6 -5
- package/dist/server/session-relay.d.ts.map +1 -1
- package/dist/server/session-relay.js +48 -51
- package/dist/server/session-relay.js.map +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-signer.d.ts","sourceRoot":"","sources":["../../src/server/request-signer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"request-signer.d.ts","sourceRoot":"","sources":["../../src/server/request-signer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AA+B5D;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,WAAW,CAAC,MAAM,EAAE;QAClB,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACpB,uDAAuD;IACvD,QAAQ,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,mBAAmB,GAC1B,aAAa,CAuBf"}
|
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
+
import { buildWeb3SignedHeader } from "@opendatalabs/vana-sdk/auth/web3-signed-builder";
|
|
2
3
|
import { privateKeyToAccount } from "viem/accounts";
|
|
3
4
|
const EMPTY_BODY_HASH = "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";
|
|
4
|
-
function base64urlEncode(input) {
|
|
5
|
-
return Buffer.from(input, "utf-8")
|
|
6
|
-
.toString("base64")
|
|
7
|
-
.replace(/\+/g, "-")
|
|
8
|
-
.replace(/\//g, "_")
|
|
9
|
-
.replace(/=+$/, "");
|
|
10
|
-
}
|
|
11
5
|
function canonicalizeJson(obj) {
|
|
12
6
|
if (obj === null || typeof obj !== "object")
|
|
13
7
|
return obj;
|
|
@@ -44,28 +38,17 @@ export function createRequestSigner(config) {
|
|
|
44
38
|
address: account.address,
|
|
45
39
|
async signRequest(params) {
|
|
46
40
|
const now = Math.floor(Date.now() / 1000);
|
|
47
|
-
const
|
|
41
|
+
const bodyHash = computeBodyHash(params.body, bodyHashFormat);
|
|
42
|
+
return buildWeb3SignedHeader({
|
|
48
43
|
aud: params.aud,
|
|
49
|
-
bodyHash: computeBodyHash(params.body, bodyHashFormat),
|
|
50
44
|
exp: now + 300,
|
|
45
|
+
grantId: params.grantId,
|
|
51
46
|
iat: now,
|
|
52
47
|
method: params.method,
|
|
53
48
|
uri: params.uri,
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
// Sort keys for deterministic serialization
|
|
59
|
-
const sortedPayload = Object.keys(payload)
|
|
60
|
-
.sort()
|
|
61
|
-
.reduce((acc, key) => {
|
|
62
|
-
acc[key] = payload[key];
|
|
63
|
-
return acc;
|
|
64
|
-
}, {});
|
|
65
|
-
const payloadJson = JSON.stringify(sortedPayload);
|
|
66
|
-
const payloadBase64 = base64urlEncode(payloadJson);
|
|
67
|
-
const signature = await account.signMessage({ message: payloadBase64 });
|
|
68
|
-
return `Web3Signed ${payloadBase64}.${signature}`;
|
|
49
|
+
bodyHash,
|
|
50
|
+
signMessage: (message) => account.signMessage({ message }),
|
|
51
|
+
});
|
|
69
52
|
},
|
|
70
53
|
};
|
|
71
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-signer.js","sourceRoot":"","sources":["../../src/server/request-signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"request-signer.js","sourceRoot":"","sources":["../../src/server/request-signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,iDAAiD,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,MAAM,eAAe,GACnB,yEAAyE,CAAC;AAG5E,SAAS,gBAAgB,CAAC,GAAY;IACpC,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACxD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACzD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAA8B,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACrE,IAAI,GAAG,KAAK,WAAW;YAAE,SAAS;QAClC,MAAM,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAE,GAA+B,CAAC,GAAG,CAAC,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CACtB,IAAwB,EACxB,MAAsB;IAEtB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrE,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACzD,CAAC;AAyBD;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAA2B;IAE3B,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACvD,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,QAAQ,CAAC;IAEzD,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO;QAExB,KAAK,CAAC,WAAW,CAAC,MAAM;YACtB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YAC1C,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YAE9D,OAAO,qBAAqB,CAAC;gBAC3B,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,GAAG,EAAE,GAAG,GAAG,GAAG;gBACd,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,GAAG,EAAE,GAAG;gBACR,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,QAAQ;gBACR,WAAW,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC;aACnE,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
+
import { type SessionRelayInitResult as SdkRelaySessionInitResult } from "@opendatalabs/vana-sdk/session-relay";
|
|
1
2
|
import type { SessionRelayConfig, SessionInitParams, SessionPollResult } from "../core/types.js";
|
|
2
3
|
/** Raw response from the Session Relay init endpoint. */
|
|
3
|
-
export
|
|
4
|
-
sessionId: string;
|
|
5
|
-
deepLinkUrl: string;
|
|
6
|
-
expiresAt: string;
|
|
7
|
-
}
|
|
4
|
+
export type RelaySessionInitResult = SdkRelaySessionInitResult;
|
|
8
5
|
/**
|
|
9
6
|
* Low-level client for the Session Relay service.
|
|
10
7
|
*
|
|
8
|
+
* This is a CLI adapter over the Vana SDK Session Relay integration. Session
|
|
9
|
+
* Relay is a Vana-operated service integration for app handoff flows, not a
|
|
10
|
+
* protocol-core primitive.
|
|
11
|
+
*
|
|
11
12
|
* @see {@link createSessionRelay} to create an instance.
|
|
12
13
|
*/
|
|
13
14
|
export interface SessionRelay {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-relay.d.ts","sourceRoot":"","sources":["../../src/server/session-relay.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session-relay.d.ts","sourceRoot":"","sources":["../../src/server/session-relay.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,sBAAsB,IAAI,yBAAyB,EACzD,MAAM,sCAAsC,CAAC;AAG9C,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAE1B,yDAAyD;AACzD,MAAM,MAAM,sBAAsB,GAAG,yBAAyB,CAAC;AA0C/D;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAY;IAC3B,oGAAoG;IACpG,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACxE,qCAAqC;IACrC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC3D;;;;;;OAMG;IACH,iBAAiB,CACf,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAC7C,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,CAyC3E"}
|
|
@@ -1,5 +1,28 @@
|
|
|
1
|
+
import { createSessionRelayBuilderClient, } from "@opendatalabs/vana-sdk/session-relay";
|
|
2
|
+
import { privateKeyToAccount } from "viem/accounts";
|
|
1
3
|
import { ConnectError, ConnectErrorCode } from "../core/errors.js";
|
|
2
|
-
|
|
4
|
+
function isRelayErrorLike(err) {
|
|
5
|
+
return (err instanceof Error &&
|
|
6
|
+
"details" in err &&
|
|
7
|
+
err.details !== null &&
|
|
8
|
+
typeof err.details === "object");
|
|
9
|
+
}
|
|
10
|
+
function mapRelayError(err, fallbackCode) {
|
|
11
|
+
if (err instanceof ConnectError) {
|
|
12
|
+
return err;
|
|
13
|
+
}
|
|
14
|
+
if (isRelayErrorLike(err)) {
|
|
15
|
+
const relayCode = err.details.relayErrorCode;
|
|
16
|
+
const code = relayCode === "SESSION_RELAY_POLL_TIMEOUT"
|
|
17
|
+
? ConnectErrorCode.POLL_TIMEOUT
|
|
18
|
+
: (relayCode ?? fallbackCode);
|
|
19
|
+
return new ConnectError(err.message, code, err.details.status);
|
|
20
|
+
}
|
|
21
|
+
if (err instanceof Error) {
|
|
22
|
+
return new ConnectError(err.message, fallbackCode);
|
|
23
|
+
}
|
|
24
|
+
return new ConnectError(String(err), fallbackCode);
|
|
25
|
+
}
|
|
3
26
|
/**
|
|
4
27
|
* Creates a low-level Session Relay client.
|
|
5
28
|
*
|
|
@@ -9,65 +32,39 @@ import { createRequestSigner } from "./request-signer.js";
|
|
|
9
32
|
* @returns A {@link SessionRelay} instance.
|
|
10
33
|
*/
|
|
11
34
|
export function createSessionRelay(config) {
|
|
12
|
-
const
|
|
13
|
-
const
|
|
35
|
+
const account = privateKeyToAccount(config.privateKey);
|
|
36
|
+
const relay = createSessionRelayBuilderClient({
|
|
37
|
+
baseUrl: config.sessionRelayUrl,
|
|
38
|
+
granteeAddress: config.granteeAddress,
|
|
39
|
+
signMessage: (message) => account.signMessage({ message }),
|
|
40
|
+
});
|
|
14
41
|
return {
|
|
15
42
|
async initSession(params) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
});
|
|
22
|
-
const authHeader = await signer.signRequest({
|
|
23
|
-
aud: baseUrl,
|
|
24
|
-
method: "POST",
|
|
25
|
-
uri: "/v1/session/init",
|
|
26
|
-
body,
|
|
27
|
-
});
|
|
28
|
-
const res = await fetch(`${baseUrl}/v1/session/init`, {
|
|
29
|
-
method: "POST",
|
|
30
|
-
headers: {
|
|
31
|
-
"Content-Type": "application/json",
|
|
32
|
-
Authorization: authHeader,
|
|
33
|
-
},
|
|
34
|
-
body,
|
|
35
|
-
});
|
|
36
|
-
if (!res.ok) {
|
|
37
|
-
const errorBody = await res.json().catch(() => ({}));
|
|
38
|
-
const errorMsg = errorBody.error &&
|
|
39
|
-
typeof errorBody.error === "object"
|
|
40
|
-
? errorBody.error
|
|
41
|
-
.message
|
|
42
|
-
: `Session init failed: ${res.status}`;
|
|
43
|
-
throw new ConnectError(errorMsg, errorBody.error
|
|
44
|
-
?.errorCode ?? ConnectErrorCode.SESSION_INIT_FAILED, res.status);
|
|
43
|
+
try {
|
|
44
|
+
return await relay.initSession(params);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
throw mapRelayError(err, ConnectErrorCode.SESSION_INIT_FAILED);
|
|
45
48
|
}
|
|
46
|
-
return (await res.json());
|
|
47
49
|
},
|
|
48
50
|
async pollSession(sessionId) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
51
|
+
try {
|
|
52
|
+
return await relay.pollSession(sessionId);
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
throw mapRelayError(err, ConnectErrorCode.POLL_FAILED);
|
|
54
56
|
}
|
|
55
|
-
return (await res.json());
|
|
56
57
|
},
|
|
57
58
|
async pollUntilComplete(sessionId, opts) {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
return result;
|
|
67
|
-
}
|
|
68
|
-
await new Promise((resolve) => setTimeout(resolve, interval));
|
|
59
|
+
try {
|
|
60
|
+
return await relay.pollUntilComplete(sessionId, {
|
|
61
|
+
intervalMs: opts?.interval,
|
|
62
|
+
timeoutMs: opts?.timeout,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
throw mapRelayError(err, ConnectErrorCode.POLL_FAILED);
|
|
69
67
|
}
|
|
70
|
-
throw new ConnectError("Polling timed out", ConnectErrorCode.POLL_TIMEOUT);
|
|
71
68
|
},
|
|
72
69
|
};
|
|
73
70
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-relay.js","sourceRoot":"","sources":["../../src/server/session-relay.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"session-relay.js","sourceRoot":"","sources":["../../src/server/session-relay.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,GAEhC,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAiBnE,SAAS,gBAAgB,CAAC,GAAY;IACpC,OAAO,CACL,GAAG,YAAY,KAAK;QACpB,SAAS,IAAI,GAAG;QAChB,GAAG,CAAC,OAAO,KAAK,IAAI;QACpB,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAChC,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,GAAY,EACZ,YAA8B;IAE9B,IAAI,GAAG,YAAY,YAAY,EAAE,CAAC;QAChC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC;QAC7C,MAAM,IAAI,GACR,SAAS,KAAK,4BAA4B;YACxC,CAAC,CAAC,gBAAgB,CAAC,YAAY;YAC/B,CAAC,CAAC,CAAC,SAAS,IAAI,YAAY,CAAC,CAAC;QAClC,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;AACrD,CAAC;AA6BD;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAA0B;IAC3D,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,+BAA+B,CAAC;QAC5C,OAAO,EAAE,MAAM,CAAC,eAAe;QAC/B,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,WAAW,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC;KACnE,CAAC,CAAC;IAEH,OAAO;QACL,KAAK,CAAC,WAAW,CACf,MAAyB;YAEzB,IAAI,CAAC;gBACH,OAAO,MAAM,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACzC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,aAAa,CAAC,GAAG,EAAE,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAED,KAAK,CAAC,WAAW,CAAC,SAAiB;YACjC,IAAI,CAAC;gBACH,OAAO,MAAM,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YAC5C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,aAAa,CAAC,GAAG,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QAED,KAAK,CAAC,iBAAiB,CACrB,SAAiB,EACjB,IAA8C;YAE9C,IAAI,CAAC;gBACH,OAAO,MAAM,KAAK,CAAC,iBAAiB,CAAC,SAAS,EAAE;oBAC9C,UAAU,EAAE,IAAI,EAAE,QAAQ;oBAC1B,SAAS,EAAE,IAAI,EAAE,OAAO;iBACzB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,aAAa,CAAC,GAAG,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vana-cli",
|
|
3
|
-
"version": "0.15.
|
|
3
|
+
"version": "0.15.1",
|
|
4
4
|
"description": "Vana data-portability CLI",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -102,6 +102,7 @@
|
|
|
102
102
|
"@inquirer/prompts": "8.3.0",
|
|
103
103
|
"@inquirer/search": "^4.1.6",
|
|
104
104
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
105
|
+
"@opendatalabs/vana-sdk": "^3.9.0",
|
|
105
106
|
"chromium-bidi": "15.0.0",
|
|
106
107
|
"commander": "14.0.3",
|
|
107
108
|
"fuse.js": "^7.1.0",
|