vana-cli 0.15.0
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/LICENSE +21 -0
- package/README.md +320 -0
- package/dist/cli/auth.d.ts +119 -0
- package/dist/cli/auth.d.ts.map +1 -0
- package/dist/cli/auth.js +528 -0
- package/dist/cli/auth.js.map +1 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +15 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/index.d.ts +92 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +4703 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +10 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/mcp-server.d.ts +15 -0
- package/dist/cli/mcp-server.d.ts.map +1 -0
- package/dist/cli/mcp-server.js +199 -0
- package/dist/cli/mcp-server.js.map +1 -0
- package/dist/cli/queries.d.ts +128 -0
- package/dist/cli/queries.d.ts.map +1 -0
- package/dist/cli/queries.js +422 -0
- package/dist/cli/queries.js.map +1 -0
- package/dist/cli/render/capabilities.d.ts +9 -0
- package/dist/cli/render/capabilities.d.ts.map +1 -0
- package/dist/cli/render/capabilities.js +24 -0
- package/dist/cli/render/capabilities.js.map +1 -0
- package/dist/cli/render/connect-renderer.d.ts +23 -0
- package/dist/cli/render/connect-renderer.d.ts.map +1 -0
- package/dist/cli/render/connect-renderer.js +259 -0
- package/dist/cli/render/connect-renderer.js.map +1 -0
- package/dist/cli/render/flow-theme.d.ts +17 -0
- package/dist/cli/render/flow-theme.d.ts.map +1 -0
- package/dist/cli/render/flow-theme.js +26 -0
- package/dist/cli/render/flow-theme.js.map +1 -0
- package/dist/cli/render/format.d.ts +27 -0
- package/dist/cli/render/format.d.ts.map +1 -0
- package/dist/cli/render/format.js +111 -0
- package/dist/cli/render/format.js.map +1 -0
- package/dist/cli/render/index.d.ts +8 -0
- package/dist/cli/render/index.d.ts.map +1 -0
- package/dist/cli/render/index.js +8 -0
- package/dist/cli/render/index.js.map +1 -0
- package/dist/cli/render/progress.d.ts +11 -0
- package/dist/cli/render/progress.d.ts.map +1 -0
- package/dist/cli/render/progress.js +56 -0
- package/dist/cli/render/progress.js.map +1 -0
- package/dist/cli/render/symbols.d.ts +11 -0
- package/dist/cli/render/symbols.d.ts.map +1 -0
- package/dist/cli/render/symbols.js +21 -0
- package/dist/cli/render/symbols.js.map +1 -0
- package/dist/cli/render/theme.d.ts +16 -0
- package/dist/cli/render/theme.d.ts.map +1 -0
- package/dist/cli/render/theme.js +57 -0
- package/dist/cli/render/theme.js.map +1 -0
- package/dist/cli/search-select.d.ts +17 -0
- package/dist/cli/search-select.d.ts.map +1 -0
- package/dist/cli/search-select.js +29 -0
- package/dist/cli/search-select.js.map +1 -0
- package/dist/cli/telemetry-contract.d.ts +146 -0
- package/dist/cli/telemetry-contract.d.ts.map +1 -0
- package/dist/cli/telemetry-contract.js +56 -0
- package/dist/cli/telemetry-contract.js.map +1 -0
- package/dist/cli/telemetry.d.ts +60 -0
- package/dist/cli/telemetry.d.ts.map +1 -0
- package/dist/cli/telemetry.js +621 -0
- package/dist/cli/telemetry.js.map +1 -0
- package/dist/cli/update-check.d.ts +21 -0
- package/dist/cli/update-check.d.ts.map +1 -0
- package/dist/cli/update-check.js +86 -0
- package/dist/cli/update-check.js.map +1 -0
- package/dist/connectors/index.d.ts +2 -0
- package/dist/connectors/index.d.ts.map +1 -0
- package/dist/connectors/index.js +2 -0
- package/dist/connectors/index.js.map +1 -0
- package/dist/connectors/registry.d.ts +55 -0
- package/dist/connectors/registry.d.ts.map +1 -0
- package/dist/connectors/registry.js +301 -0
- package/dist/connectors/registry.js.map +1 -0
- package/dist/core/cli-types.d.ts +722 -0
- package/dist/core/cli-types.d.ts.map +1 -0
- package/dist/core/cli-types.js +328 -0
- package/dist/core/cli-types.js.map +1 -0
- package/dist/core/constants.d.ts +33 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +25 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/errors.d.ts +47 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +50 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/grants.d.ts +19 -0
- package/dist/core/grants.d.ts.map +1 -0
- package/dist/core/grants.js +31 -0
- package/dist/core/grants.js.map +1 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +7 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/paths.d.ts +30 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +95 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/state-store.d.ts +44 -0
- package/dist/core/state-store.d.ts.map +1 -0
- package/dist/core/state-store.js +101 -0
- package/dist/core/state-store.js.map +1 -0
- package/dist/core/types.d.ts +148 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/personal-server/client.d.ts +34 -0
- package/dist/personal-server/client.d.ts.map +1 -0
- package/dist/personal-server/client.js +108 -0
- package/dist/personal-server/client.js.map +1 -0
- package/dist/personal-server/index.d.ts +28 -0
- package/dist/personal-server/index.d.ts.map +1 -0
- package/dist/personal-server/index.js +157 -0
- package/dist/personal-server/index.js.map +1 -0
- package/dist/personal-server/scope-resolver.d.ts +22 -0
- package/dist/personal-server/scope-resolver.d.ts.map +1 -0
- package/dist/personal-server/scope-resolver.js +80 -0
- package/dist/personal-server/scope-resolver.js.map +1 -0
- package/dist/react/ConnectButton.d.ts +27 -0
- package/dist/react/ConnectButton.d.ts.map +1 -0
- package/dist/react/ConnectButton.js +39 -0
- package/dist/react/ConnectButton.js.map +1 -0
- package/dist/react/index.d.ts +4 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +4 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/useVanaConnect.d.ts +50 -0
- package/dist/react/useVanaConnect.d.ts.map +1 -0
- package/dist/react/useVanaConnect.js +114 -0
- package/dist/react/useVanaConnect.js.map +1 -0
- package/dist/react/useVanaData.d.ts +69 -0
- package/dist/react/useVanaData.d.ts.map +1 -0
- package/dist/react/useVanaData.js +144 -0
- package/dist/react/useVanaData.js.map +1 -0
- package/dist/runtime/core/contracts.d.ts +84 -0
- package/dist/runtime/core/contracts.d.ts.map +1 -0
- package/dist/runtime/core/contracts.js +2 -0
- package/dist/runtime/core/contracts.js.map +1 -0
- package/dist/runtime/core/index.d.ts +2 -0
- package/dist/runtime/core/index.d.ts.map +1 -0
- package/dist/runtime/core/index.js +2 -0
- package/dist/runtime/core/index.js.map +1 -0
- package/dist/runtime/index.d.ts +4 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +3 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/managed-playwright.d.ts +42 -0
- package/dist/runtime/managed-playwright.d.ts.map +1 -0
- package/dist/runtime/managed-playwright.js +178 -0
- package/dist/runtime/managed-playwright.js.map +1 -0
- package/dist/runtime/playwright/browser.d.ts +12 -0
- package/dist/runtime/playwright/browser.d.ts.map +1 -0
- package/dist/runtime/playwright/browser.js +229 -0
- package/dist/runtime/playwright/browser.js.map +1 -0
- package/dist/runtime/playwright/in-process-run.d.ts +6 -0
- package/dist/runtime/playwright/in-process-run.d.ts.map +1 -0
- package/dist/runtime/playwright/in-process-run.js +625 -0
- package/dist/runtime/playwright/in-process-run.js.map +1 -0
- package/dist/runtime/playwright/index.d.ts +3 -0
- package/dist/runtime/playwright/index.d.ts.map +1 -0
- package/dist/runtime/playwright/index.js +3 -0
- package/dist/runtime/playwright/index.js.map +1 -0
- package/dist/runtime/repo-paths.d.ts +2 -0
- package/dist/runtime/repo-paths.d.ts.map +1 -0
- package/dist/runtime/repo-paths.js +36 -0
- package/dist/runtime/repo-paths.js.map +1 -0
- package/dist/server/config.d.ts +38 -0
- package/dist/server/config.d.ts.map +1 -0
- package/dist/server/config.js +45 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/connect.d.ts +43 -0
- package/dist/server/connect.d.ts.map +1 -0
- package/dist/server/connect.js +115 -0
- package/dist/server/connect.js.map +1 -0
- package/dist/server/data-client.d.ts +31 -0
- package/dist/server/data-client.d.ts.map +1 -0
- package/dist/server/data-client.js +95 -0
- package/dist/server/data-client.js.map +1 -0
- package/dist/server/index.d.ts +8 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +8 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/manifest-signer.d.ts +25 -0
- package/dist/server/manifest-signer.d.ts.map +1 -0
- package/dist/server/manifest-signer.js +51 -0
- package/dist/server/manifest-signer.js.map +1 -0
- package/dist/server/request-signer.d.ts +31 -0
- package/dist/server/request-signer.d.ts.map +1 -0
- package/dist/server/request-signer.js +72 -0
- package/dist/server/request-signer.js.map +1 -0
- package/dist/server/session-relay.d.ts +39 -0
- package/dist/server/session-relay.d.ts.map +1 -0
- package/dist/server/session-relay.js +74 -0
- package/dist/server/session-relay.js.map +1 -0
- package/dist/server/webhook.d.ts +11 -0
- package/dist/server/webhook.d.ts.map +1 -0
- package/dist/server/webhook.js +18 -0
- package/dist/server/webhook.js.map +1 -0
- package/dist/skills/index.d.ts +4 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +3 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/paths.d.ts +33 -0
- package/dist/skills/paths.d.ts.map +1 -0
- package/dist/skills/paths.js +81 -0
- package/dist/skills/paths.js.map +1 -0
- package/dist/skills/registry.d.ts +48 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/registry.js +173 -0
- package/dist/skills/registry.js.map +1 -0
- package/package.json +147 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { privateKeyToAccount } from "viem/accounts";
|
|
3
|
+
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
|
+
function canonicalizeJson(obj) {
|
|
12
|
+
if (obj === null || typeof obj !== "object")
|
|
13
|
+
return obj;
|
|
14
|
+
if (Array.isArray(obj))
|
|
15
|
+
return obj.map(canonicalizeJson);
|
|
16
|
+
const sorted = {};
|
|
17
|
+
for (const key of Object.keys(obj).sort()) {
|
|
18
|
+
if (key === "signature")
|
|
19
|
+
continue;
|
|
20
|
+
sorted[key] = canonicalizeJson(obj[key]);
|
|
21
|
+
}
|
|
22
|
+
return sorted;
|
|
23
|
+
}
|
|
24
|
+
function computeBodyHash(body, format) {
|
|
25
|
+
if (!body || body.length === 0) {
|
|
26
|
+
return format === "prefixed" ? EMPTY_BODY_HASH : "";
|
|
27
|
+
}
|
|
28
|
+
const parsed = JSON.parse(body);
|
|
29
|
+
const canonical = canonicalizeJson(parsed);
|
|
30
|
+
const canonicalStr = JSON.stringify(canonical);
|
|
31
|
+
const hash = createHash("sha256").update(canonicalStr).digest("hex");
|
|
32
|
+
return format === "prefixed" ? `sha256:${hash}` : hash;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Creates a request signer that generates `Web3Signed` authorization headers.
|
|
36
|
+
*
|
|
37
|
+
* @param config - Configuration containing the builder's private key.
|
|
38
|
+
* @returns A {@link RequestSigner} instance.
|
|
39
|
+
*/
|
|
40
|
+
export function createRequestSigner(config) {
|
|
41
|
+
const account = privateKeyToAccount(config.privateKey);
|
|
42
|
+
const bodyHashFormat = config.bodyHashFormat ?? "legacy";
|
|
43
|
+
return {
|
|
44
|
+
address: account.address,
|
|
45
|
+
async signRequest(params) {
|
|
46
|
+
const now = Math.floor(Date.now() / 1000);
|
|
47
|
+
const payload = {
|
|
48
|
+
aud: params.aud,
|
|
49
|
+
bodyHash: computeBodyHash(params.body, bodyHashFormat),
|
|
50
|
+
exp: now + 300,
|
|
51
|
+
iat: now,
|
|
52
|
+
method: params.method,
|
|
53
|
+
uri: params.uri,
|
|
54
|
+
};
|
|
55
|
+
if (params.grantId !== undefined) {
|
|
56
|
+
payload["grantId"] = params.grantId;
|
|
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}`;
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=request-signer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-signer.js","sourceRoot":"","sources":["../../src/server/request-signer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { SessionRelayConfig, SessionInitParams, SessionPollResult } from "../core/types.js";
|
|
2
|
+
/** Raw response from the Session Relay init endpoint. */
|
|
3
|
+
export interface RelaySessionInitResult {
|
|
4
|
+
sessionId: string;
|
|
5
|
+
deepLinkUrl: string;
|
|
6
|
+
expiresAt: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Low-level client for the Session Relay service.
|
|
10
|
+
*
|
|
11
|
+
* @see {@link createSessionRelay} to create an instance.
|
|
12
|
+
*/
|
|
13
|
+
export interface SessionRelay {
|
|
14
|
+
/** Creates a new session and returns the raw relay response (sessionId, deepLinkUrl, expiresAt). */
|
|
15
|
+
initSession(params: SessionInitParams): Promise<RelaySessionInitResult>;
|
|
16
|
+
/** Polls the session status once. */
|
|
17
|
+
pollSession(sessionId: string): Promise<SessionPollResult>;
|
|
18
|
+
/**
|
|
19
|
+
* Polls until the session reaches a terminal state (`approved`, `denied`, or `expired`).
|
|
20
|
+
*
|
|
21
|
+
* @param sessionId - The session to poll.
|
|
22
|
+
* @param opts - Optional polling interval (default 2 s) and timeout (default 15 min).
|
|
23
|
+
* @throws {@link ConnectError} with code `POLL_TIMEOUT` if the timeout is exceeded.
|
|
24
|
+
*/
|
|
25
|
+
pollUntilComplete(sessionId: string, opts?: {
|
|
26
|
+
interval?: number;
|
|
27
|
+
timeout?: number;
|
|
28
|
+
}): Promise<SessionPollResult>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Creates a low-level Session Relay client.
|
|
32
|
+
*
|
|
33
|
+
* Prefer the high-level {@link connect} function for most use cases.
|
|
34
|
+
*
|
|
35
|
+
* @param config - Session Relay configuration.
|
|
36
|
+
* @returns A {@link SessionRelay} instance.
|
|
37
|
+
*/
|
|
38
|
+
export declare function createSessionRelay(config: SessionRelayConfig): SessionRelay;
|
|
39
|
+
//# sourceMappingURL=session-relay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-relay.d.ts","sourceRoot":"","sources":["../../src/server/session-relay.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAG1B,yDAAyD;AACzD,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;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,CA8F3E"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { ConnectError, ConnectErrorCode } from "../core/errors.js";
|
|
2
|
+
import { createRequestSigner } from "./request-signer.js";
|
|
3
|
+
/**
|
|
4
|
+
* Creates a low-level Session Relay client.
|
|
5
|
+
*
|
|
6
|
+
* Prefer the high-level {@link connect} function for most use cases.
|
|
7
|
+
*
|
|
8
|
+
* @param config - Session Relay configuration.
|
|
9
|
+
* @returns A {@link SessionRelay} instance.
|
|
10
|
+
*/
|
|
11
|
+
export function createSessionRelay(config) {
|
|
12
|
+
const baseUrl = config.sessionRelayUrl.replace(/\/+$/, "");
|
|
13
|
+
const signer = createRequestSigner({ privateKey: config.privateKey });
|
|
14
|
+
return {
|
|
15
|
+
async initSession(params) {
|
|
16
|
+
const body = JSON.stringify({
|
|
17
|
+
granteeAddress: config.granteeAddress,
|
|
18
|
+
scopes: params.scopes,
|
|
19
|
+
...(params.webhookUrl && { webhookUrl: params.webhookUrl }),
|
|
20
|
+
...(params.appUserId && { app_user_id: params.appUserId }),
|
|
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);
|
|
45
|
+
}
|
|
46
|
+
return (await res.json());
|
|
47
|
+
},
|
|
48
|
+
async pollSession(sessionId) {
|
|
49
|
+
const res = await fetch(`${baseUrl}/v1/session/${sessionId}/poll`);
|
|
50
|
+
if (!res.ok) {
|
|
51
|
+
const errorBody = await res.json().catch(() => ({}));
|
|
52
|
+
throw new ConnectError(`Poll failed: ${res.status}`, errorBody.error
|
|
53
|
+
?.errorCode ?? ConnectErrorCode.POLL_FAILED, res.status);
|
|
54
|
+
}
|
|
55
|
+
return (await res.json());
|
|
56
|
+
},
|
|
57
|
+
async pollUntilComplete(sessionId, opts) {
|
|
58
|
+
const interval = opts?.interval ?? 2000;
|
|
59
|
+
const timeout = opts?.timeout ?? 900_000; // 15 minutes
|
|
60
|
+
const deadline = Date.now() + timeout;
|
|
61
|
+
while (Date.now() < deadline) {
|
|
62
|
+
const result = await this.pollSession(sessionId);
|
|
63
|
+
if (result.status === "approved" ||
|
|
64
|
+
result.status === "denied" ||
|
|
65
|
+
result.status === "expired") {
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
await new Promise((resolve) => setTimeout(resolve, interval));
|
|
69
|
+
}
|
|
70
|
+
throw new ConnectError("Polling timed out", ConnectErrorCode.POLL_TIMEOUT);
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=session-relay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-relay.js","sourceRoot":"","sources":["../../src/server/session-relay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verifies a webhook payload signature.
|
|
3
|
+
*
|
|
4
|
+
* @param payload - The raw request body as a string or Buffer.
|
|
5
|
+
* @param signature - The signature from the webhook request header.
|
|
6
|
+
* @param secret - The shared secret used to verify the signature.
|
|
7
|
+
* @returns The verified payload.
|
|
8
|
+
* @throws {@link ConnectError} with code `WEBHOOK_INVALID` — this function is not yet implemented.
|
|
9
|
+
*/
|
|
10
|
+
export declare function verifyWebhook(payload: string | Buffer, signature: string, secret: string): unknown;
|
|
11
|
+
//# sourceMappingURL=webhook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/server/webhook.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAUT"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ConnectError, ConnectErrorCode } from "../core/errors.js";
|
|
2
|
+
/**
|
|
3
|
+
* Verifies a webhook payload signature.
|
|
4
|
+
*
|
|
5
|
+
* @param payload - The raw request body as a string or Buffer.
|
|
6
|
+
* @param signature - The signature from the webhook request header.
|
|
7
|
+
* @param secret - The shared secret used to verify the signature.
|
|
8
|
+
* @returns The verified payload.
|
|
9
|
+
* @throws {@link ConnectError} with code `WEBHOOK_INVALID` — this function is not yet implemented.
|
|
10
|
+
*/
|
|
11
|
+
export function verifyWebhook(payload, signature, secret) {
|
|
12
|
+
void payload;
|
|
13
|
+
void signature;
|
|
14
|
+
void secret;
|
|
15
|
+
// TODO: Implement when Data Portability Protocol webhook signing spec is available
|
|
16
|
+
throw new ConnectError("verifyWebhook() is not yet implemented. Webhook signing scheme is pending protocol specification.", ConnectErrorCode.WEBHOOK_INVALID);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=webhook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/server/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEnE;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAwB,EACxB,SAAiB,EACjB,MAAc;IAEd,KAAK,OAAO,CAAC;IACb,KAAK,SAAS,CAAC;IACf,KAAK,MAAM,CAAC;IAEZ,mFAAmF;IACnF,MAAM,IAAI,YAAY,CACpB,mGAAmG,EACnG,gBAAgB,CAAC,eAAe,CACjC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { listAvailableSkills, fetchSkillToCache, installSkill, readInstalledSkills, } from "./registry.js";
|
|
2
|
+
export type { SkillRegistryEntry, AvailableSkill } from "./registry.js";
|
|
3
|
+
export { getSkillsCacheDir, findSkillsDir, getClaudeSkillsDir, getAgentsSkillsDir, getSkillInstallDirs, isClaudeCodeInstalled, } from "./paths.js";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,GACpB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { listAvailableSkills, fetchSkillToCache, installSkill, readInstalledSkills, } from "./registry.js";
|
|
2
|
+
export { getSkillsCacheDir, findSkillsDir, getClaudeSkillsDir, getAgentsSkillsDir, getSkillInstallDirs, isClaudeCodeInstalled, } from "./paths.js";
|
|
3
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns the local cache directory for downloaded skills.
|
|
3
|
+
* @returns Absolute path to `~/.vana/skills/`
|
|
4
|
+
*/
|
|
5
|
+
export declare function getSkillsCacheDir(): string;
|
|
6
|
+
/**
|
|
7
|
+
* Walks up from `cwd` looking for a `skills/registry.json` file.
|
|
8
|
+
* Returns the path to the `skills/` directory if found, or `null`.
|
|
9
|
+
*
|
|
10
|
+
* Also checks for the env override `VANA_SKILLS_DIR`.
|
|
11
|
+
*/
|
|
12
|
+
export declare function findSkillsDir(cwd?: string): string | null;
|
|
13
|
+
/**
|
|
14
|
+
* Returns the universal agent skills directory (cross-agent standard).
|
|
15
|
+
* @returns Absolute path to `~/.agents/skills/`
|
|
16
|
+
*/
|
|
17
|
+
export declare function getAgentsSkillsDir(): string;
|
|
18
|
+
/**
|
|
19
|
+
* Returns the Claude Code skills directory.
|
|
20
|
+
* @returns Absolute path to `~/.claude/skills/`
|
|
21
|
+
*/
|
|
22
|
+
export declare function getClaudeSkillsDir(): string;
|
|
23
|
+
/**
|
|
24
|
+
* Detects whether Claude Code is installed by checking for `~/.claude/`.
|
|
25
|
+
*/
|
|
26
|
+
export declare function isClaudeCodeInstalled(): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Returns all directories where skills should be installed.
|
|
29
|
+
* Always includes the universal `.agents/skills/` path.
|
|
30
|
+
* Adds `~/.claude/skills/` if Claude Code is detected.
|
|
31
|
+
*/
|
|
32
|
+
export declare function getSkillInstallDirs(): string[];
|
|
33
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/skills/paths.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,SAAgB,GAAG,MAAM,GAAG,IAAI,CAoChE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAM9C"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { getVanaHome } from "../core/paths.js";
|
|
5
|
+
/**
|
|
6
|
+
* Returns the local cache directory for downloaded skills.
|
|
7
|
+
* @returns Absolute path to `~/.vana/skills/`
|
|
8
|
+
*/
|
|
9
|
+
export function getSkillsCacheDir() {
|
|
10
|
+
return path.join(getVanaHome(), "skills");
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Walks up from `cwd` looking for a `skills/registry.json` file.
|
|
14
|
+
* Returns the path to the `skills/` directory if found, or `null`.
|
|
15
|
+
*
|
|
16
|
+
* Also checks for the env override `VANA_SKILLS_DIR`.
|
|
17
|
+
*/
|
|
18
|
+
export function findSkillsDir(cwd = process.cwd()) {
|
|
19
|
+
const candidates = [];
|
|
20
|
+
const seen = new Set();
|
|
21
|
+
const pushCandidate = (value) => {
|
|
22
|
+
if (!value) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const resolved = path.resolve(value);
|
|
26
|
+
if (seen.has(resolved)) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
seen.add(resolved);
|
|
30
|
+
candidates.push(resolved);
|
|
31
|
+
};
|
|
32
|
+
pushCandidate(process.env.VANA_SKILLS_DIR);
|
|
33
|
+
let currentDir = path.resolve(cwd);
|
|
34
|
+
while (true) {
|
|
35
|
+
pushCandidate(path.join(currentDir, "skills"));
|
|
36
|
+
const parentDir = path.dirname(currentDir);
|
|
37
|
+
if (parentDir === currentDir) {
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
currentDir = parentDir;
|
|
41
|
+
}
|
|
42
|
+
for (const candidate of candidates) {
|
|
43
|
+
if (fs.existsSync(path.join(candidate, "registry.json"))) {
|
|
44
|
+
return candidate;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Returns the universal agent skills directory (cross-agent standard).
|
|
51
|
+
* @returns Absolute path to `~/.agents/skills/`
|
|
52
|
+
*/
|
|
53
|
+
export function getAgentsSkillsDir() {
|
|
54
|
+
return path.join(os.homedir(), ".agents", "skills");
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Returns the Claude Code skills directory.
|
|
58
|
+
* @returns Absolute path to `~/.claude/skills/`
|
|
59
|
+
*/
|
|
60
|
+
export function getClaudeSkillsDir() {
|
|
61
|
+
return path.join(os.homedir(), ".claude", "skills");
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Detects whether Claude Code is installed by checking for `~/.claude/`.
|
|
65
|
+
*/
|
|
66
|
+
export function isClaudeCodeInstalled() {
|
|
67
|
+
return fs.existsSync(path.join(os.homedir(), ".claude"));
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Returns all directories where skills should be installed.
|
|
71
|
+
* Always includes the universal `.agents/skills/` path.
|
|
72
|
+
* Adds `~/.claude/skills/` if Claude Code is detected.
|
|
73
|
+
*/
|
|
74
|
+
export function getSkillInstallDirs() {
|
|
75
|
+
const dirs = [getAgentsSkillsDir()];
|
|
76
|
+
if (isClaudeCodeInstalled()) {
|
|
77
|
+
dirs.push(getClaudeSkillsDir());
|
|
78
|
+
}
|
|
79
|
+
return dirs;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/skills/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAC/C,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,MAAM,aAAa,GAAG,CAAC,KAAyB,EAAE,EAAE;QAClD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnB,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAE3C,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,IAAI,EAAE,CAAC;QACZ,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;QAE/C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,MAAM;QACR,CAAC;QACD,UAAU,GAAG,SAAS,CAAC;IACzB,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;YACzD,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,IAAI,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACpC,IAAI,qBAAqB,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export interface SkillRegistryEntry {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
version: string;
|
|
6
|
+
files: {
|
|
7
|
+
skill: string;
|
|
8
|
+
supplemental?: string[];
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export interface AvailableSkill {
|
|
12
|
+
id: string;
|
|
13
|
+
name: string;
|
|
14
|
+
description: string;
|
|
15
|
+
version: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* List all available skills from the registry.
|
|
19
|
+
* Tries a local `skills/` directory first, then falls back to remote.
|
|
20
|
+
*/
|
|
21
|
+
export declare function listAvailableSkills(skillsDir?: string): Promise<AvailableSkill[]>;
|
|
22
|
+
/**
|
|
23
|
+
* Fetch a skill's files to the local cache directory.
|
|
24
|
+
* @returns The path to the cached SKILL.md
|
|
25
|
+
*/
|
|
26
|
+
export declare function fetchSkillToCache(skillId: string, cacheDir?: string, skillsDir?: string): Promise<{
|
|
27
|
+
skillPath: string;
|
|
28
|
+
}>;
|
|
29
|
+
/**
|
|
30
|
+
* Install a skill to all detected agent skill directories.
|
|
31
|
+
*
|
|
32
|
+
* Installs to `~/.agents/skills/vana-{id}/` (universal) and
|
|
33
|
+
* `~/.claude/skills/vana-{id}/` if Claude Code is detected.
|
|
34
|
+
*/
|
|
35
|
+
export declare function installSkill(skillId: string, skillsDir?: string): Promise<{
|
|
36
|
+
installedPath: string;
|
|
37
|
+
installedPaths: string[];
|
|
38
|
+
}>;
|
|
39
|
+
/**
|
|
40
|
+
* Read installed skills from all known agent skills directories.
|
|
41
|
+
* Checks both `~/.agents/skills/` and `~/.claude/skills/` for `vana-*` dirs.
|
|
42
|
+
* Deduplicates by skill ID.
|
|
43
|
+
*/
|
|
44
|
+
export declare function readInstalledSkills(): Promise<Array<{
|
|
45
|
+
id: string;
|
|
46
|
+
path: string;
|
|
47
|
+
}>>;
|
|
48
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/skills/registry.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CACnD;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,cAAc,EAAE,CAAC,CAQ3B;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAkChC;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAkD9D;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAClD,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CACpC,CAiCA"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { findSkillsDir, getSkillInstallDirs, getSkillsCacheDir, } from "./paths.js";
|
|
4
|
+
const SKILLS_REGISTRY_URL = "https://raw.githubusercontent.com/vana-com/vana-cli/main/skills/registry.json";
|
|
5
|
+
const SKILLS_BASE_URL = "https://raw.githubusercontent.com/vana-com/vana-cli/main/skills";
|
|
6
|
+
/**
|
|
7
|
+
* List all available skills from the registry.
|
|
8
|
+
* Tries a local `skills/` directory first, then falls back to remote.
|
|
9
|
+
*/
|
|
10
|
+
export async function listAvailableSkills(skillsDir) {
|
|
11
|
+
const registry = await loadSkillsRegistry(skillsDir);
|
|
12
|
+
return (registry.skills ?? []).map((entry) => ({
|
|
13
|
+
id: entry.id,
|
|
14
|
+
name: entry.name,
|
|
15
|
+
description: entry.description,
|
|
16
|
+
version: entry.version,
|
|
17
|
+
}));
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Fetch a skill's files to the local cache directory.
|
|
21
|
+
* @returns The path to the cached SKILL.md
|
|
22
|
+
*/
|
|
23
|
+
export async function fetchSkillToCache(skillId, cacheDir, skillsDir) {
|
|
24
|
+
const resolvedCacheDir = cacheDir ?? getSkillsCacheDir();
|
|
25
|
+
const registry = await loadSkillsRegistry(skillsDir);
|
|
26
|
+
const match = (registry.skills ?? []).find((entry) => entry.id.toLowerCase() === skillId.toLowerCase());
|
|
27
|
+
if (!match) {
|
|
28
|
+
throw new Error(`No skill found with id "${skillId}".`);
|
|
29
|
+
}
|
|
30
|
+
// Fetch the main skill file
|
|
31
|
+
await copyOrFetchSkillFile(match.files.skill, resolvedCacheDir, skillsDir ?? findSkillsDir() ?? undefined);
|
|
32
|
+
// Fetch supplemental files if any
|
|
33
|
+
if (match.files.supplemental) {
|
|
34
|
+
for (const supplementalPath of match.files.supplemental) {
|
|
35
|
+
await copyOrFetchSkillFile(supplementalPath, resolvedCacheDir, skillsDir ?? findSkillsDir() ?? undefined).catch(() => {
|
|
36
|
+
// Supplemental file fetch failure is non-fatal.
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
skillPath: path.join(resolvedCacheDir, match.files.skill),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Install a skill to all detected agent skill directories.
|
|
46
|
+
*
|
|
47
|
+
* Installs to `~/.agents/skills/vana-{id}/` (universal) and
|
|
48
|
+
* `~/.claude/skills/vana-{id}/` if Claude Code is detected.
|
|
49
|
+
*/
|
|
50
|
+
export async function installSkill(skillId, skillsDir) {
|
|
51
|
+
const cacheDir = getSkillsCacheDir();
|
|
52
|
+
const registry = await loadSkillsRegistry(skillsDir);
|
|
53
|
+
const match = (registry.skills ?? []).find((entry) => entry.id.toLowerCase() === skillId.toLowerCase());
|
|
54
|
+
if (!match) {
|
|
55
|
+
throw new Error(`No skill found with id "${skillId}".`);
|
|
56
|
+
}
|
|
57
|
+
// Fetch to cache first
|
|
58
|
+
await fetchSkillToCache(skillId, cacheDir, skillsDir);
|
|
59
|
+
const installDirs = getSkillInstallDirs();
|
|
60
|
+
const installedPaths = [];
|
|
61
|
+
for (const baseDir of installDirs) {
|
|
62
|
+
const installDir = path.join(baseDir, `vana-${match.id}`);
|
|
63
|
+
await fs.mkdir(installDir, { recursive: true });
|
|
64
|
+
// Copy the main skill file
|
|
65
|
+
const cachedSkillPath = path.join(cacheDir, match.files.skill);
|
|
66
|
+
const installedSkillPath = path.join(installDir, "SKILL.md");
|
|
67
|
+
const content = await fs.readFile(cachedSkillPath);
|
|
68
|
+
await fs.writeFile(installedSkillPath, content);
|
|
69
|
+
// Copy supplemental files if any
|
|
70
|
+
if (match.files.supplemental) {
|
|
71
|
+
for (const supplementalRelPath of match.files.supplemental) {
|
|
72
|
+
const cachedPath = path.join(cacheDir, supplementalRelPath);
|
|
73
|
+
const skillDirPrefix = match.id + "/";
|
|
74
|
+
const relFromSkillDir = supplementalRelPath.startsWith(skillDirPrefix)
|
|
75
|
+
? supplementalRelPath.slice(skillDirPrefix.length)
|
|
76
|
+
: path.basename(supplementalRelPath);
|
|
77
|
+
const installedPath = path.join(installDir, relFromSkillDir);
|
|
78
|
+
try {
|
|
79
|
+
await fs.mkdir(path.dirname(installedPath), { recursive: true });
|
|
80
|
+
const fileContent = await fs.readFile(cachedPath);
|
|
81
|
+
await fs.writeFile(installedPath, fileContent);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// Non-fatal if supplemental file is missing from cache.
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
installedPaths.push(installDir);
|
|
89
|
+
}
|
|
90
|
+
return { installedPath: installedPaths[0], installedPaths };
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Read installed skills from all known agent skills directories.
|
|
94
|
+
* Checks both `~/.agents/skills/` and `~/.claude/skills/` for `vana-*` dirs.
|
|
95
|
+
* Deduplicates by skill ID.
|
|
96
|
+
*/
|
|
97
|
+
export async function readInstalledSkills() {
|
|
98
|
+
const installDirs = getSkillInstallDirs();
|
|
99
|
+
const seen = new Set();
|
|
100
|
+
const installed = [];
|
|
101
|
+
for (const baseDir of installDirs) {
|
|
102
|
+
try {
|
|
103
|
+
const entries = await fs.readdir(baseDir, { withFileTypes: true });
|
|
104
|
+
for (const entry of entries) {
|
|
105
|
+
if (!entry.isDirectory() || !entry.name.startsWith("vana-")) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const id = entry.name.replace(/^vana-/, "");
|
|
109
|
+
if (seen.has(id))
|
|
110
|
+
continue;
|
|
111
|
+
const skillPath = path.join(baseDir, entry.name, "SKILL.md");
|
|
112
|
+
try {
|
|
113
|
+
await fs.access(skillPath);
|
|
114
|
+
seen.add(id);
|
|
115
|
+
installed.push({
|
|
116
|
+
id,
|
|
117
|
+
path: path.join(baseDir, entry.name),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// Directory exists but no SKILL.md — skip.
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
// Directory doesn't exist — skip.
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return installed;
|
|
130
|
+
}
|
|
131
|
+
async function loadSkillsRegistry(skillsDir) {
|
|
132
|
+
const resolvedDir = skillsDir ?? findSkillsDir() ?? undefined;
|
|
133
|
+
if (resolvedDir) {
|
|
134
|
+
try {
|
|
135
|
+
const localRegistry = await fs.readFile(path.join(resolvedDir, "registry.json"), "utf8");
|
|
136
|
+
return JSON.parse(localRegistry);
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// Fall through to remote fetch.
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const response = await fetch(SKILLS_REGISTRY_URL, {
|
|
143
|
+
headers: { "User-Agent": "vana-cli" },
|
|
144
|
+
});
|
|
145
|
+
if (!response.ok) {
|
|
146
|
+
throw new Error(`Failed to load skills registry: ${response.status}`);
|
|
147
|
+
}
|
|
148
|
+
return (await response.json());
|
|
149
|
+
}
|
|
150
|
+
async function copyOrFetchSkillFile(relativePath, cacheDir, skillsDir) {
|
|
151
|
+
const destination = path.join(cacheDir, relativePath);
|
|
152
|
+
await fs.mkdir(path.dirname(destination), { recursive: true });
|
|
153
|
+
if (skillsDir) {
|
|
154
|
+
const localPath = path.join(skillsDir, relativePath);
|
|
155
|
+
try {
|
|
156
|
+
const content = await fs.readFile(localPath);
|
|
157
|
+
await fs.writeFile(destination, content);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// Fall through to remote fetch.
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
const response = await fetch(`${SKILLS_BASE_URL}/${relativePath}`, {
|
|
165
|
+
headers: { "User-Agent": "vana-cli" },
|
|
166
|
+
});
|
|
167
|
+
if (!response.ok) {
|
|
168
|
+
throw new Error(`Failed to download ${relativePath}: ${response.status}`);
|
|
169
|
+
}
|
|
170
|
+
const content = Buffer.from(await response.arrayBuffer());
|
|
171
|
+
await fs.writeFile(destination, content);
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/skills/registry.ts"],"names":[],"mappings":"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"}
|