@seedhape/local-wallet 0.2.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/dist/agent-identity.d.ts +45 -0
- package/dist/agent-identity.d.ts.map +1 -0
- package/dist/agent-identity.js +300 -0
- package/dist/agent-identity.js.map +1 -0
- package/dist/hosted.d.ts +82 -0
- package/dist/hosted.d.ts.map +1 -0
- package/dist/hosted.js +180 -0
- package/dist/hosted.js.map +1 -0
- package/dist/identity-backup.d.ts +12 -0
- package/dist/identity-backup.d.ts.map +1 -0
- package/dist/identity-backup.js +130 -0
- package/dist/identity-backup.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +429 -0
- package/dist/index.js.map +1 -0
- package/dist/keychain.d.ts +30 -0
- package/dist/keychain.d.ts.map +1 -0
- package/dist/keychain.js +99 -0
- package/dist/keychain.js.map +1 -0
- package/dist/seedhape-identity.d.ts +87 -0
- package/dist/seedhape-identity.d.ts.map +1 -0
- package/dist/seedhape-identity.js +110 -0
- package/dist/seedhape-identity.js.map +1 -0
- package/dist/server.d.ts +43 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +160 -0
- package/dist/server.js.map +1 -0
- package/dist/web-bot-auth.d.ts +37 -0
- package/dist/web-bot-auth.d.ts.map +1 -0
- package/dist/web-bot-auth.js +87 -0
- package/dist/web-bot-auth.js.map +1 -0
- package/package.json +20 -0
- package/src/agent-identity.ts +293 -0
- package/src/hosted.ts +174 -0
- package/src/identity-backup.ts +134 -0
- package/src/index.ts +374 -0
- package/src/keychain.ts +114 -0
- package/src/seedhape-identity.ts +113 -0
- package/src/server.ts +187 -0
- package/src/web-bot-auth.ts +94 -0
- package/test/identity-backup.test.mjs +90 -0
- package/test/identity-fork.test.mjs +128 -0
- package/test/pay-flow.test.mjs +139 -0
- package/test/setup-flow.test.mjs +47 -0
- package/test/web-bot-auth.test.mjs +134 -0
- package/tsconfig.json +15 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Address, Hex } from "@seedhape/core";
|
|
2
|
+
export declare function createLocalWallet(agentId: string): Promise<Address>;
|
|
3
|
+
export declare function localWalletAddress(agentId: string): Promise<Address | null>;
|
|
4
|
+
export declare function localWalletPrivateKey(agentId: string): Promise<Hex | null>;
|
|
5
|
+
export declare function deleteLocalWallet(agentId: string): Promise<boolean>;
|
|
6
|
+
/** Identity controller is stored under a separate OS-keychain service from payment wallets. */
|
|
7
|
+
export declare function createOrGetIdentityController(agentId: string): Promise<Hex>;
|
|
8
|
+
/** Import a controller only into an empty slot, or accept the same key idempotently. */
|
|
9
|
+
export declare function importIdentityController(agentId: string, privateKey: Hex): Promise<Address>;
|
|
10
|
+
export declare function identityControllerPrivateKey(agentId: string): Promise<Hex | null>;
|
|
11
|
+
/** Explicit recovery export; callers must only invoke this in a trusted local terminal. */
|
|
12
|
+
export declare function exportIdentityControllerPrivateKey(agentId: string): Promise<Hex | null>;
|
|
13
|
+
export declare function createOrGetIdentityKeyStoreMasterKey(agentId: string): Promise<Buffer>;
|
|
14
|
+
export declare function identityKeyStoreMasterKey(agentId: string): Promise<Buffer | null>;
|
|
15
|
+
export declare function restoreIdentityCredentials(agentId: string, controllerKey: Hex, masterKey: Buffer): Promise<void>;
|
|
16
|
+
export type StoredWebBotAuthKey = {
|
|
17
|
+
privateKeyPem: string;
|
|
18
|
+
publicJwk: {
|
|
19
|
+
kty: "OKP";
|
|
20
|
+
crv: "Ed25519";
|
|
21
|
+
x: string;
|
|
22
|
+
};
|
|
23
|
+
keyId: string;
|
|
24
|
+
signatureAgent: string;
|
|
25
|
+
createdAt: number;
|
|
26
|
+
};
|
|
27
|
+
export declare function saveWebBotAuthKey(agentId: string, key: StoredWebBotAuthKey): Promise<void>;
|
|
28
|
+
export declare function loadWebBotAuthKey(agentId: string): Promise<StoredWebBotAuthKey | null>;
|
|
29
|
+
export declare function deleteWebBotAuthKey(agentId: string): Promise<boolean>;
|
|
30
|
+
//# sourceMappingURL=keychain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain.d.ts","sourceRoot":"","sources":["../src/keychain.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAMnD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMzE;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAGjF;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAGhF;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEzE;AAED,+FAA+F;AAC/F,wBAAsB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAQjF;AAED,wFAAwF;AACxF,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAQjG;AAED,wBAAsB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAEvF;AAED,2FAA2F;AAC3F,wBAAsB,kCAAkC,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAE7F;AAED,wBAAsB,oCAAoC,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ3F;AAED,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGvF;AAED,wBAAsB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAatH;AAKD,MAAM,MAAM,mBAAmB,GAAG;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE;QAAE,GAAG,EAAE,KAAK,CAAC;QAAC,GAAG,EAAE,SAAS,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhG;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAG5F;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE3E"}
|
package/dist/keychain.js
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import keytar from "keytar";
|
|
2
|
+
import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
|
|
3
|
+
const SERVICE = "seedhape-agent-wallet";
|
|
4
|
+
const IDENTITY_SERVICE = "seedhape-agent-identity-controller";
|
|
5
|
+
const IDENTITY_KEYSTORE_SERVICE = "seedhape-agent-identity-keystore";
|
|
6
|
+
export async function createLocalWallet(agentId) {
|
|
7
|
+
const existing = await keytar.getPassword(SERVICE, agentId);
|
|
8
|
+
if (existing)
|
|
9
|
+
return privateKeyToAccount(existing).address;
|
|
10
|
+
const privateKey = generatePrivateKey();
|
|
11
|
+
await keytar.setPassword(SERVICE, agentId, privateKey);
|
|
12
|
+
return privateKeyToAccount(privateKey).address;
|
|
13
|
+
}
|
|
14
|
+
export async function localWalletAddress(agentId) {
|
|
15
|
+
const privateKey = await keytar.getPassword(SERVICE, agentId);
|
|
16
|
+
return privateKey ? privateKeyToAccount(privateKey).address : null;
|
|
17
|
+
}
|
|
18
|
+
export async function localWalletPrivateKey(agentId) {
|
|
19
|
+
const privateKey = await keytar.getPassword(SERVICE, agentId);
|
|
20
|
+
return privateKey;
|
|
21
|
+
}
|
|
22
|
+
export async function deleteLocalWallet(agentId) {
|
|
23
|
+
return keytar.deletePassword(SERVICE, agentId);
|
|
24
|
+
}
|
|
25
|
+
/** Identity controller is stored under a separate OS-keychain service from payment wallets. */
|
|
26
|
+
export async function createOrGetIdentityController(agentId) {
|
|
27
|
+
const existing = await keytar.getPassword(IDENTITY_SERVICE, agentId);
|
|
28
|
+
if (existing)
|
|
29
|
+
return existing;
|
|
30
|
+
const privateKey = generatePrivateKey();
|
|
31
|
+
await keytar.setPassword(IDENTITY_SERVICE, agentId, privateKey);
|
|
32
|
+
const persisted = await keytar.getPassword(IDENTITY_SERVICE, agentId);
|
|
33
|
+
if (!persisted)
|
|
34
|
+
throw new Error("Could not persist identity controller in the operating system keychain.");
|
|
35
|
+
return persisted;
|
|
36
|
+
}
|
|
37
|
+
/** Import a controller only into an empty slot, or accept the same key idempotently. */
|
|
38
|
+
export async function importIdentityController(agentId, privateKey) {
|
|
39
|
+
const importedAddress = privateKeyToAccount(privateKey).address;
|
|
40
|
+
const existing = await keytar.getPassword(IDENTITY_SERVICE, agentId);
|
|
41
|
+
if (existing && privateKeyToAccount(existing).address.toLowerCase() !== importedAddress.toLowerCase()) {
|
|
42
|
+
throw new Error("A different identity controller is already stored in this OS keychain slot. Set SEEDHAPE_AGENT_IDENTITY_CONTROLLER_ID to a fresh slot.");
|
|
43
|
+
}
|
|
44
|
+
if (!existing)
|
|
45
|
+
await keytar.setPassword(IDENTITY_SERVICE, agentId, privateKey);
|
|
46
|
+
return importedAddress;
|
|
47
|
+
}
|
|
48
|
+
export async function identityControllerPrivateKey(agentId) {
|
|
49
|
+
return await keytar.getPassword(IDENTITY_SERVICE, agentId);
|
|
50
|
+
}
|
|
51
|
+
/** Explicit recovery export; callers must only invoke this in a trusted local terminal. */
|
|
52
|
+
export async function exportIdentityControllerPrivateKey(agentId) {
|
|
53
|
+
return identityControllerPrivateKey(agentId);
|
|
54
|
+
}
|
|
55
|
+
export async function createOrGetIdentityKeyStoreMasterKey(agentId) {
|
|
56
|
+
const existing = await keytar.getPassword(IDENTITY_KEYSTORE_SERVICE, agentId);
|
|
57
|
+
if (existing)
|
|
58
|
+
return Buffer.from(existing, "base64url");
|
|
59
|
+
const masterKey = Buffer.from(generatePrivateKey().slice(2), "hex");
|
|
60
|
+
await keytar.setPassword(IDENTITY_KEYSTORE_SERVICE, agentId, masterKey.toString("base64url"));
|
|
61
|
+
const persisted = await keytar.getPassword(IDENTITY_KEYSTORE_SERVICE, agentId);
|
|
62
|
+
if (!persisted)
|
|
63
|
+
throw new Error("Could not persist the identity key-store key in the operating system keychain.");
|
|
64
|
+
return Buffer.from(persisted, "base64url");
|
|
65
|
+
}
|
|
66
|
+
export async function identityKeyStoreMasterKey(agentId) {
|
|
67
|
+
const existing = await keytar.getPassword(IDENTITY_KEYSTORE_SERVICE, agentId);
|
|
68
|
+
return existing ? Buffer.from(existing, "base64url") : null;
|
|
69
|
+
}
|
|
70
|
+
export async function restoreIdentityCredentials(agentId, controllerKey, masterKey) {
|
|
71
|
+
if (masterKey.length !== 32)
|
|
72
|
+
throw new Error("Identity backup key-store key must be 32 bytes.");
|
|
73
|
+
const controller = privateKeyToAccount(controllerKey).address;
|
|
74
|
+
const currentController = await keytar.getPassword(IDENTITY_SERVICE, agentId);
|
|
75
|
+
const currentMaster = await keytar.getPassword(IDENTITY_KEYSTORE_SERVICE, agentId);
|
|
76
|
+
if (currentController && privateKeyToAccount(currentController).address.toLowerCase() !== controller.toLowerCase()) {
|
|
77
|
+
throw new Error("A different identity controller is already stored under this OS keychain account. Use a fresh SEEDHAPE_AGENT_IDENTITY_CONTROLLER_ID or back up the existing identity first.");
|
|
78
|
+
}
|
|
79
|
+
if (currentMaster && !Buffer.from(currentMaster, "base64url").equals(masterKey)) {
|
|
80
|
+
throw new Error("A different identity key-store key is already stored under this OS keychain account. Use a fresh SEEDHAPE_AGENT_IDENTITY_CONTROLLER_ID or back up the existing identity first.");
|
|
81
|
+
}
|
|
82
|
+
if (!currentController)
|
|
83
|
+
await keytar.setPassword(IDENTITY_SERVICE, agentId, controllerKey);
|
|
84
|
+
if (!currentMaster)
|
|
85
|
+
await keytar.setPassword(IDENTITY_KEYSTORE_SERVICE, agentId, masterKey.toString("base64url"));
|
|
86
|
+
}
|
|
87
|
+
// ── Web Bot Auth (Ed25519 key that proves which agent is calling) ──────────
|
|
88
|
+
const WEB_BOT_AUTH_SERVICE = "seedhape-web-bot-auth";
|
|
89
|
+
export async function saveWebBotAuthKey(agentId, key) {
|
|
90
|
+
await keytar.setPassword(WEB_BOT_AUTH_SERVICE, agentId, JSON.stringify(key));
|
|
91
|
+
}
|
|
92
|
+
export async function loadWebBotAuthKey(agentId) {
|
|
93
|
+
const raw = await keytar.getPassword(WEB_BOT_AUTH_SERVICE, agentId);
|
|
94
|
+
return raw ? JSON.parse(raw) : null;
|
|
95
|
+
}
|
|
96
|
+
export async function deleteWebBotAuthKey(agentId) {
|
|
97
|
+
return keytar.deletePassword(WEB_BOT_AUTH_SERVICE, agentId);
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=keychain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../src/keychain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* On-chain (ERC-8004) identity for a self-custody agent, with Seedhape doing the
|
|
3
|
+
* hosting so the user configures nothing:
|
|
4
|
+
*
|
|
5
|
+
* • Seedhape tells the wallet which Base registry / AgentTrust contract to use.
|
|
6
|
+
* • Seedhape can top up the identity controller's gas once per account.
|
|
7
|
+
* • Seedhape serves the agent's public registration and key directory.
|
|
8
|
+
*
|
|
9
|
+
* Every key stays on this machine. Merchants reject key-directory signatures
|
|
10
|
+
* older than 5 minutes, so while the wallet runs it re-signs the directory and
|
|
11
|
+
* uploads just the signature every few minutes.
|
|
12
|
+
*/
|
|
13
|
+
import type { PrivateKeyAccount } from "viem/accounts";
|
|
14
|
+
import { type AgentMetadataPublisher, type AgentOperationalKeyStore, type AgentTrustConfig } from "@seedhape/core";
|
|
15
|
+
export type IdentityConfig = {
|
|
16
|
+
enabled: false;
|
|
17
|
+
} | {
|
|
18
|
+
enabled: true;
|
|
19
|
+
network: "base" | "base-sepolia";
|
|
20
|
+
chainId: 8453 | 84532;
|
|
21
|
+
identityRegistry: `0x${string}`;
|
|
22
|
+
trustContract: `0x${string}`;
|
|
23
|
+
rpcUrl: string;
|
|
24
|
+
signatureAgent: string;
|
|
25
|
+
minimumControllerBalanceWei: string;
|
|
26
|
+
gasSponsored: boolean;
|
|
27
|
+
};
|
|
28
|
+
/** Directory signatures last just under the 5-minute maximum and are refreshed well before expiry. */
|
|
29
|
+
export declare const DIRECTORY_LIFETIME_SECONDS = 290;
|
|
30
|
+
export declare const DIRECTORY_REFRESH_MS = 240000;
|
|
31
|
+
export declare const fetchIdentityConfig: () => Promise<IdentityConfig>;
|
|
32
|
+
export declare function trustConfigFrom(config: Extract<IdentityConfig, {
|
|
33
|
+
enabled: true;
|
|
34
|
+
}>): AgentTrustConfig;
|
|
35
|
+
export declare const requestGasSponsorship: (controller: string) => Promise<{
|
|
36
|
+
outcome: "funded";
|
|
37
|
+
} | {
|
|
38
|
+
outcome: "pending";
|
|
39
|
+
transactionHash: string;
|
|
40
|
+
} | {
|
|
41
|
+
outcome: "manual";
|
|
42
|
+
reason: string;
|
|
43
|
+
}>;
|
|
44
|
+
/** Must match the hosted ownershipMessage() exactly. */
|
|
45
|
+
export declare const ownershipMessage: (identityRef: string, keyId: string) => string;
|
|
46
|
+
export type PublishedDirectory = {
|
|
47
|
+
identityRef: string;
|
|
48
|
+
keyId: string;
|
|
49
|
+
keyStoreRef: string;
|
|
50
|
+
publicJwk: Record<string, unknown>;
|
|
51
|
+
directoryUri: string;
|
|
52
|
+
};
|
|
53
|
+
/** Sign the key directory locally and upload only the signature (plus public key) to Seedhape. */
|
|
54
|
+
export declare function uploadDirectory(keyStore: AgentOperationalKeyStore, directory: PublishedDirectory, owner?: PrivateKeyAccount): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Metadata publisher used by setupAgent: keeps the local files (so identity
|
|
57
|
+
* backups keep working) and publishes the same metadata through Seedhape.
|
|
58
|
+
*/
|
|
59
|
+
export declare class SeedhapeMetadataPublisher implements AgentMetadataPublisher {
|
|
60
|
+
private readonly signatureAgent;
|
|
61
|
+
private readonly keyStore;
|
|
62
|
+
private readonly owner;
|
|
63
|
+
private readonly files;
|
|
64
|
+
private refresher;
|
|
65
|
+
constructor(metadataDirectory: string, signatureAgent: string, keyStore: AgentOperationalKeyStore, owner: PrivateKeyAccount);
|
|
66
|
+
publishWebBotAuthDirectory(input: {
|
|
67
|
+
instanceId: string;
|
|
68
|
+
identityRef: string;
|
|
69
|
+
keyId: string;
|
|
70
|
+
keyStoreRef: string;
|
|
71
|
+
publicJwk: Record<string, unknown>;
|
|
72
|
+
}): Promise<{
|
|
73
|
+
signatureAgent: string;
|
|
74
|
+
directoryUri: string;
|
|
75
|
+
}>;
|
|
76
|
+
publishRegistration(input: {
|
|
77
|
+
identityRef: string;
|
|
78
|
+
registration: Record<string, unknown>;
|
|
79
|
+
}): Promise<string>;
|
|
80
|
+
stop(): void;
|
|
81
|
+
}
|
|
82
|
+
/** Keep a ready agent's directory fresh while the local wallet runs. Returns a function that refreshes immediately. */
|
|
83
|
+
export declare function startDirectoryRefresher(keyStore: AgentOperationalKeyStore, directory: PublishedDirectory, onError?: (error: unknown) => void): {
|
|
84
|
+
refresh: (force?: boolean) => Promise<void>;
|
|
85
|
+
stop: () => void;
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=seedhape-identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seedhape-identity.d.ts","sourceRoot":"","sources":["../src/seedhape-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAA8B,KAAK,sBAAsB,EAAE,KAAK,wBAAwB,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAG/I,MAAM,MAAM,cAAc,GACtB;IAAE,OAAO,EAAE,KAAK,CAAA;CAAE,GAClB;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAAC;IAAC,OAAO,EAAE,IAAI,GAAG,KAAK,CAAC;IAAC,gBAAgB,EAAE,KAAK,MAAM,EAAE,CAAC;IAAC,aAAa,EAAE,KAAK,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,2BAA2B,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAAC;AAElP,sGAAsG;AACtG,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,eAAO,MAAM,oBAAoB,SAAU,CAAC;AAsB5C,eAAO,MAAM,mBAAmB,+BAAkE,CAAC;AAEnG,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,EAAE;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,CAAC,GAAG,gBAAgB,CAEpG;AAED,eAAO,MAAM,qBAAqB,GAAI,YAAY,MAAM;aACtC,QAAQ;;aAAgB,SAAS;qBAAmB,MAAM;;aAAgB,QAAQ;YAAU,MAAM;EAAiE,CAAC;AAEtL,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,GAAI,aAAa,MAAM,EAAE,OAAO,MAAM,WAAkF,CAAC;AAEtJ,MAAM,MAAM,kBAAkB,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvJ,kGAAkG;AAClG,wBAAsB,eAAe,CAAC,QAAQ,EAAE,wBAAwB,EAAE,SAAS,EAAE,kBAAkB,EAAE,KAAK,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQjJ;AAED;;;GAGG;AACH,qBAAa,yBAA0B,YAAW,sBAAsB;IAI/B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAAU,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAA4B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAH3J,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IACnD,OAAO,CAAC,SAAS,CAA6C;gBAElD,iBAAiB,EAAE,MAAM,EAAmB,cAAc,EAAE,MAAM,EAAmB,QAAQ,EAAE,wBAAwB,EAAmB,KAAK,EAAE,iBAAiB;IAIxK,0BAA0B,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE;;;;IAWrJ,mBAAmB,CAAC,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAMjH,IAAI;CACL;AAED,uHAAuH;AACvH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,wBAAwB,EAAE,SAAS,EAAE,kBAAkB,EAAE,OAAO,GAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAe;;;EAStJ"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* On-chain (ERC-8004) identity for a self-custody agent, with Seedhape doing the
|
|
3
|
+
* hosting so the user configures nothing:
|
|
4
|
+
*
|
|
5
|
+
* • Seedhape tells the wallet which Base registry / AgentTrust contract to use.
|
|
6
|
+
* • Seedhape can top up the identity controller's gas once per account.
|
|
7
|
+
* • Seedhape serves the agent's public registration and key directory.
|
|
8
|
+
*
|
|
9
|
+
* Every key stays on this machine. Merchants reject key-directory signatures
|
|
10
|
+
* older than 5 minutes, so while the wallet runs it re-signs the directory and
|
|
11
|
+
* uploads just the signature every few minutes.
|
|
12
|
+
*/
|
|
13
|
+
import { FileAgentMetadataPublisher } from "@seedhape/core";
|
|
14
|
+
import { SeedhapeAuthError, SeedhapeUnreachableError, loadToken, seedhapeUrl } from "./hosted.js";
|
|
15
|
+
/** Directory signatures last just under the 5-minute maximum and are refreshed well before expiry. */
|
|
16
|
+
export const DIRECTORY_LIFETIME_SECONDS = 290;
|
|
17
|
+
export const DIRECTORY_REFRESH_MS = 240_000;
|
|
18
|
+
async function call(method, path, body) {
|
|
19
|
+
const token = await loadToken();
|
|
20
|
+
if (!token)
|
|
21
|
+
throw new SeedhapeAuthError();
|
|
22
|
+
let response;
|
|
23
|
+
try {
|
|
24
|
+
response = await fetch(`${seedhapeUrl()}${path}`, {
|
|
25
|
+
method,
|
|
26
|
+
headers: { authorization: `Bearer ${token}`, ...(body ? { "content-type": "application/json" } : {}) },
|
|
27
|
+
...(body ? { body: JSON.stringify(body) } : {}),
|
|
28
|
+
signal: AbortSignal.timeout(60_000),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
throw new SeedhapeUnreachableError(error);
|
|
33
|
+
}
|
|
34
|
+
if (response.status === 401)
|
|
35
|
+
throw new SeedhapeAuthError();
|
|
36
|
+
const parsed = await response.json().catch(() => ({}));
|
|
37
|
+
if (!response.ok)
|
|
38
|
+
throw new Error(parsed.error ?? `Seedhape returned HTTP ${response.status}.`);
|
|
39
|
+
return parsed;
|
|
40
|
+
}
|
|
41
|
+
export const fetchIdentityConfig = () => call("GET", "/api/local-wallet/identity");
|
|
42
|
+
export function trustConfigFrom(config) {
|
|
43
|
+
return { network: config.network, chainId: config.chainId, identityRegistry: config.identityRegistry, contractAddress: config.trustContract, rpcUrl: config.rpcUrl };
|
|
44
|
+
}
|
|
45
|
+
export const requestGasSponsorship = (controller) => call("POST", "/api/local-wallet/identity/sponsor", { controller });
|
|
46
|
+
/** Must match the hosted ownershipMessage() exactly. */
|
|
47
|
+
export const ownershipMessage = (identityRef, keyId) => `Seedhape self-custody agent metadata\nidentity=${identityRef}\nkey=${keyId}`;
|
|
48
|
+
/** Sign the key directory locally and upload only the signature (plus public key) to Seedhape. */
|
|
49
|
+
export async function uploadDirectory(keyStore, directory, owner) {
|
|
50
|
+
const signer = await keyStore.getSigner(directory.keyStoreRef);
|
|
51
|
+
const signed = await signer.signDirectory({ url: directory.directoryUri, keyId: directory.keyId, expiresInSeconds: DIRECTORY_LIFETIME_SECONDS });
|
|
52
|
+
await call("PUT", "/api/local-wallet/identity/directory", {
|
|
53
|
+
identityRef: directory.identityRef, keyId: directory.keyId, publicJwk: directory.publicJwk,
|
|
54
|
+
signature: signed.Signature, signatureInput: signed["Signature-Input"],
|
|
55
|
+
...(owner ? { ownerSignature: await owner.signMessage({ message: ownershipMessage(directory.identityRef, directory.keyId) }) } : {}),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Metadata publisher used by setupAgent: keeps the local files (so identity
|
|
60
|
+
* backups keep working) and publishes the same metadata through Seedhape.
|
|
61
|
+
*/
|
|
62
|
+
export class SeedhapeMetadataPublisher {
|
|
63
|
+
signatureAgent;
|
|
64
|
+
keyStore;
|
|
65
|
+
owner;
|
|
66
|
+
files;
|
|
67
|
+
refresher;
|
|
68
|
+
constructor(metadataDirectory, signatureAgent, keyStore, owner) {
|
|
69
|
+
this.signatureAgent = signatureAgent;
|
|
70
|
+
this.keyStore = keyStore;
|
|
71
|
+
this.owner = owner;
|
|
72
|
+
this.files = new FileAgentMetadataPublisher(metadataDirectory, signatureAgent);
|
|
73
|
+
}
|
|
74
|
+
async publishWebBotAuthDirectory(input) {
|
|
75
|
+
const published = await this.files.publishWebBotAuthDirectory(input);
|
|
76
|
+
const directory = { ...input, directoryUri: published.directoryUri };
|
|
77
|
+
await uploadDirectory(this.keyStore, directory, this.owner);
|
|
78
|
+
// Setup keeps going (on-chain transactions, then a live check of the directory), so keep the signature fresh meanwhile.
|
|
79
|
+
this.stop();
|
|
80
|
+
this.refresher = setInterval(() => { void uploadDirectory(this.keyStore, directory).catch(() => undefined); }, DIRECTORY_REFRESH_MS);
|
|
81
|
+
this.refresher.unref?.();
|
|
82
|
+
return published;
|
|
83
|
+
}
|
|
84
|
+
async publishRegistration(input) {
|
|
85
|
+
const uri = await this.files.publishRegistration(input);
|
|
86
|
+
await call("PUT", "/api/local-wallet/identity/registration", input);
|
|
87
|
+
return uri;
|
|
88
|
+
}
|
|
89
|
+
stop() { if (this.refresher)
|
|
90
|
+
clearInterval(this.refresher); this.refresher = undefined; }
|
|
91
|
+
}
|
|
92
|
+
/** Keep a ready agent's directory fresh while the local wallet runs. Returns a function that refreshes immediately. */
|
|
93
|
+
export function startDirectoryRefresher(keyStore, directory, onError = () => { }) {
|
|
94
|
+
let last = 0;
|
|
95
|
+
const refresh = async (force = false) => {
|
|
96
|
+
if (!force && Date.now() - last < 60_000)
|
|
97
|
+
return;
|
|
98
|
+
try {
|
|
99
|
+
await uploadDirectory(keyStore, directory);
|
|
100
|
+
last = Date.now();
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
onError(error);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
const timer = setInterval(() => { void refresh(true); }, DIRECTORY_REFRESH_MS);
|
|
107
|
+
timer.unref?.();
|
|
108
|
+
return { refresh, stop: () => clearInterval(timer) };
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=seedhape-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seedhape-identity.js","sourceRoot":"","sources":["../src/seedhape-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,0BAA0B,EAAqF,MAAM,gBAAgB,CAAC;AAC/I,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAMlG,sGAAsG;AACtG,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAC9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAE5C,KAAK,UAAU,IAAI,CAAI,MAA8B,EAAE,IAAY,EAAE,IAAc;IACjF,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,iBAAiB,EAAE,CAAC;IAC1C,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,EAAE,GAAG,IAAI,EAAE,EAAE;YAChD,MAAM;YACN,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;YACtG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;QAAE,MAAM,IAAI,iBAAiB,EAAE,CAAC;IAC3D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAA2B,CAAC;IACjF,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,0BAA0B,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAChG,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAiB,KAAK,EAAE,4BAA4B,CAAC,CAAC;AAEnG,MAAM,UAAU,eAAe,CAAC,MAAkD;IAChF,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,EAAE,eAAe,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AACvK,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,UAAkB,EAAE,EAAE,CAC1D,IAAI,CAAkH,MAAM,EAAE,oCAAoC,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;AAEtL,wDAAwD;AACxD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,WAAmB,EAAE,KAAa,EAAE,EAAE,CAAC,kDAAkD,WAAW,SAAS,KAAK,EAAE,CAAC;AAItJ,kGAAkG;AAClG,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAkC,EAAE,SAA6B,EAAE,KAAyB;IAChI,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,YAAY,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,CAAC,CAAC;IACjJ,MAAM,IAAI,CAAC,KAAK,EAAE,sCAAsC,EAAE;QACxD,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS;QAC1F,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,cAAc,EAAE,MAAM,CAAC,iBAAiB,CAAC;QACtE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,KAAK,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrI,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,yBAAyB;IAIoB;IAAyC;IAAqD;IAHrI,KAAK,CAA6B;IAC3C,SAAS,CAA6C;IAE9D,YAAY,iBAAyB,EAAmB,cAAsB,EAAmB,QAAkC,EAAmB,KAAwB;QAAtH,mBAAc,GAAd,cAAc,CAAQ;QAAmB,aAAQ,GAAR,QAAQ,CAA0B;QAAmB,UAAK,GAAL,KAAK,CAAmB;QAC5K,IAAI,CAAC,KAAK,GAAG,IAAI,0BAA0B,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,0BAA0B,CAAC,KAA0H;QACzJ,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC;QACrE,MAAM,SAAS,GAAG,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC;QACrE,MAAM,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,wHAAwH;QACxH,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;QACrI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,KAAqE;QAC7F,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,IAAI,CAAC,KAAK,EAAE,yCAAyC,EAAE,KAAK,CAAC,CAAC;QACpE,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,KAAK,IAAI,IAAI,CAAC,SAAS;QAAE,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC;CAC1F;AAED,uHAAuH;AACvH,MAAM,UAAU,uBAAuB,CAAC,QAAkC,EAAE,SAA6B,EAAE,UAAoC,GAAG,EAAE,GAAE,CAAC;IACrJ,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,OAAO,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,EAAE;QACtC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,MAAM;YAAE,OAAO;QACjD,IAAI,CAAC;YAAC,MAAM,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAAC,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAAC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAAC,CAAC;IAC1G,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;IAC/E,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IAChB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;AACvD,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local MCP server for a self-custody agent wallet.
|
|
3
|
+
*
|
|
4
|
+
* The key never leaves the OS keychain, and this server is the only thing that
|
|
5
|
+
* signs with it. It does not keep its own rules: every payment is checked and
|
|
6
|
+
* reserved by the user's Seedhape account first (pause switch, spending rules,
|
|
7
|
+
* budget), and the outcome is reported back so it appears in their activity.
|
|
8
|
+
* If Seedhape can't be reached, nothing is paid.
|
|
9
|
+
*
|
|
10
|
+
* Everything else (finding services, budgets, rules, history, funding) lives in
|
|
11
|
+
* the hosted Seedhape MCP, which the agent should also have connected.
|
|
12
|
+
*/
|
|
13
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
14
|
+
import { type AssetRef, type Eip712Signer, type OutboundRequestPolicy } from "@seedhape/core";
|
|
15
|
+
import type { StoredWebBotAuthKey } from "./keychain.js";
|
|
16
|
+
import { type RequestSigner } from "./web-bot-auth.js";
|
|
17
|
+
export interface LocalWalletDeps {
|
|
18
|
+
agentId: string;
|
|
19
|
+
address: `0x${string}` | null;
|
|
20
|
+
signer: Eip712Signer | null;
|
|
21
|
+
asset: AssetRef;
|
|
22
|
+
absoluteMaxPerPayment: bigint;
|
|
23
|
+
/** Signs every outgoing HTTPS request so merchants can identify this agent (Web Bot Auth). */
|
|
24
|
+
webBotAuth?: StoredWebBotAuthKey | null;
|
|
25
|
+
/** On-chain (ERC-8004) identity; preferred over webBotAuth when present. */
|
|
26
|
+
identity?: {
|
|
27
|
+
identityRef: string;
|
|
28
|
+
signatureAgent: string;
|
|
29
|
+
keyId: string;
|
|
30
|
+
signRequest: RequestSigner;
|
|
31
|
+
refreshDirectory(): Promise<void>;
|
|
32
|
+
} | null;
|
|
33
|
+
/** Tests only: allow a merchant on a private/loopback address. */
|
|
34
|
+
outboundPolicy?: OutboundRequestPolicy;
|
|
35
|
+
/** Tests only: replace the network. */
|
|
36
|
+
fetchImpl?: typeof fetch;
|
|
37
|
+
/** First-use browser setup; returns credentials to install into this live server. */
|
|
38
|
+
finishSetup?: () => Promise<Pick<LocalWalletDeps, "address" | "signer" | "webBotAuth" | "identity">>;
|
|
39
|
+
setupNeeded?: boolean;
|
|
40
|
+
onSetupError?: (error: unknown) => void;
|
|
41
|
+
}
|
|
42
|
+
export declare function createServer(deps: LocalWalletDeps): McpServer;
|
|
43
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,OAAO,EAAoC,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAE,KAAK,qBAAqB,EAA2B,MAAM,gBAAgB,CAAC;AAEzJ,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAExE,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,KAAK,MAAM,EAAE,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,QAAQ,CAAC;IAChB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,8FAA8F;IAC9F,UAAU,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACxC,4EAA4E;IAC5E,QAAQ,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,aAAa,CAAC;QAAC,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IAChJ,kEAAkE;IAClE,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,uCAAuC;IACvC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,qFAAqF;IACrF,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC;IACrG,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACzC;AAgBD,wBAAgB,YAAY,CAAC,IAAI,EAAE,eAAe,GAAG,SAAS,CAiI7D"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local MCP server for a self-custody agent wallet.
|
|
3
|
+
*
|
|
4
|
+
* The key never leaves the OS keychain, and this server is the only thing that
|
|
5
|
+
* signs with it. It does not keep its own rules: every payment is checked and
|
|
6
|
+
* reserved by the user's Seedhape account first (pause switch, spending rules,
|
|
7
|
+
* budget), and the outcome is reported back so it appears in their activity.
|
|
8
|
+
* If Seedhape can't be reached, nothing is paid.
|
|
9
|
+
*
|
|
10
|
+
* Everything else (finding services, budgets, rules, history, funding) lives in
|
|
11
|
+
* the hosted Seedhape MCP, which the agent should also have connected.
|
|
12
|
+
*/
|
|
13
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
14
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
15
|
+
import { createPublicClient, erc20Abi, http } from "viem";
|
|
16
|
+
import { base, baseSepolia } from "viem/chains";
|
|
17
|
+
import { z } from "zod";
|
|
18
|
+
import { PaymentDeclinedError, X402Client } from "@seedhape/core";
|
|
19
|
+
import { SeedhapeAuthError, SeedhapeUnreachableError, authorizePayment, seedhapeUrl, settlePayment, whoAmI } from "./hosted.js";
|
|
20
|
+
import { webBotAuthFetch } from "./web-bot-auth.js";
|
|
21
|
+
const text = (value) => ({ content: [{ type: "text", text: value }] });
|
|
22
|
+
const usdc = (units, decimals) => (Number(units) / 10 ** decimals).toFixed(Math.min(decimals, 6));
|
|
23
|
+
function refusalText(refusal) {
|
|
24
|
+
// Waiting for the user: the reason already says how to finish once they approve.
|
|
25
|
+
if (refusal.approvalId)
|
|
26
|
+
return `PAYMENT NOT MADE.\n\nReason: ${refusal.error}`;
|
|
27
|
+
return `PAYMENT NOT MADE.\n\nReason: ${refusal.error}\n\nError code: ${refusal.code}\nNext step: ${refusal.recovery?.tool ? `call ${refusal.recovery.tool} on the hosted Seedhape MCP. ` : ""}${refusal.hint}\n\nDo not repeat this exact call.`;
|
|
28
|
+
}
|
|
29
|
+
function failureText(error) {
|
|
30
|
+
if (error instanceof SeedhapeAuthError || error instanceof SeedhapeUnreachableError)
|
|
31
|
+
return `PAYMENT NOT MADE.\n\nReason: ${error.message}`;
|
|
32
|
+
return `PAYMENT NOT MADE.\n\nReason: ${error instanceof Error ? error.message : String(error)}`;
|
|
33
|
+
}
|
|
34
|
+
export function createServer(deps) {
|
|
35
|
+
const server = new McpServer({ name: "seedhape-local-wallet", version: "0.2.0" });
|
|
36
|
+
const { asset } = deps;
|
|
37
|
+
let setupInFlight;
|
|
38
|
+
const ensureSetup = async () => {
|
|
39
|
+
if (!deps.setupNeeded || !deps.finishSetup)
|
|
40
|
+
return false;
|
|
41
|
+
if (!setupInFlight) {
|
|
42
|
+
setupInFlight = deps.finishSetup().then((ready) => {
|
|
43
|
+
Object.assign(deps, ready);
|
|
44
|
+
deps.setupNeeded = false;
|
|
45
|
+
}).catch((error) => {
|
|
46
|
+
deps.onSetupError?.(error);
|
|
47
|
+
}).finally(() => { setupInFlight = undefined; });
|
|
48
|
+
}
|
|
49
|
+
return true;
|
|
50
|
+
};
|
|
51
|
+
const client = (hooks) => new X402Client({
|
|
52
|
+
...(deps.signer ? { signer: deps.signer } : {}),
|
|
53
|
+
allowedNetworks: [asset.network],
|
|
54
|
+
allowedAssets: [asset.address],
|
|
55
|
+
absoluteMaxPerPayment: deps.absoluteMaxPerPayment,
|
|
56
|
+
...(deps.outboundPolicy ? { outboundPolicy: deps.outboundPolicy } : {}),
|
|
57
|
+
fetchImpl: webBotAuthFetch(deps.fetchImpl ?? fetch, deps.identity?.signRequest ?? deps.webBotAuth ?? null),
|
|
58
|
+
...hooks,
|
|
59
|
+
});
|
|
60
|
+
server.tool("wallet_status", "Show this computer's self-custody agent wallet: its agent id, address, USDC balance, and whether it is signed in to Seedhape. Read-only. To add funds or change spending rules, use the hosted Seedhape MCP or the Seedhape website.", {}, async () => {
|
|
61
|
+
if (await ensureSetup())
|
|
62
|
+
return text("Finishing setup in your browser. When it’s done, try again.");
|
|
63
|
+
if (!deps.address)
|
|
64
|
+
return text(`No local wallet exists for agent '${deps.agentId}'. Run \`seedhape setup\` in a terminal.`);
|
|
65
|
+
let balance = "unknown";
|
|
66
|
+
try {
|
|
67
|
+
const chain = asset.network === "eip155:8453" ? base : baseSepolia;
|
|
68
|
+
const raw = await createPublicClient({ chain, transport: http(process.env.SEEDHAPE_RPC_URL) }).readContract({ address: asset.address, abi: erc20Abi, functionName: "balanceOf", args: [deps.address] });
|
|
69
|
+
balance = `${usdc(raw, asset.decimals)} ${asset.symbol}`;
|
|
70
|
+
}
|
|
71
|
+
catch { /* balance stays unknown; the hosted wallet_balance tool can also read it */ }
|
|
72
|
+
const account = await whoAmI();
|
|
73
|
+
return text([
|
|
74
|
+
`Agent wallet: ${deps.agentId}`,
|
|
75
|
+
`Address: ${deps.address}`,
|
|
76
|
+
"Payment network: configured",
|
|
77
|
+
`Balance: ${balance}`,
|
|
78
|
+
`Seedhape account (${seedhapeUrl()}): ${account.detail}`,
|
|
79
|
+
`Agent identity: ${deps.identity ? `verified (${deps.identity.identityRef})` : deps.webBotAuth ? "registered signing key" : "not set up; run `seedhape setup`"}`,
|
|
80
|
+
`Key storage: operating system keychain (never leaves this computer)`,
|
|
81
|
+
].join("\n"));
|
|
82
|
+
});
|
|
83
|
+
server.tool("quote", "Get the price of a paid URL without paying: amount, currency, and seller. Always quote first and show the user the price before calling pay.", { url: z.string().url(), method: z.enum(["GET", "POST"]).optional(), body: z.string().optional() }, async ({ url, method, body }) => {
|
|
84
|
+
if (await ensureSetup())
|
|
85
|
+
return text("Finishing setup in your browser. When it’s done, try again.");
|
|
86
|
+
const probe = await client({ authorise: async () => ({ approved: false, reason: "quote only" }) }).probe(url, { method: method ?? "GET", ...(body ? { body, headers: { "content-type": "application/json" } } : {}) });
|
|
87
|
+
if (!probe.challenge)
|
|
88
|
+
return text(`${url} does not ask for payment (HTTP ${probe.response.status}).`);
|
|
89
|
+
const offer = probe.challenge.accepts.find((item) => item.network === asset.network && item.asset.toLowerCase() === asset.address.toLowerCase());
|
|
90
|
+
if (!offer)
|
|
91
|
+
return text(`${url} asks for payment in a currency this wallet does not use. Ask the user to choose another wallet or payment option.`);
|
|
92
|
+
return text(`Price: ${usdc(offer.maxAmountRequired, asset.decimals)} ${asset.symbol}\nSeller: ${offer.payTo}\nResource: ${offer.resource || url}${offer.description ? `\nDescription: ${offer.description}` : ""}`);
|
|
93
|
+
});
|
|
94
|
+
server.tool("pay", "Pay for a URL with this computer's self-custody wallet. Before signing, Seedhape checks the user's pause switch, spending limit, and budget and reserves the amount; if Seedhape refuses or can't be reached, nothing is paid. If the price is above what the user approves automatically, nothing is paid and the response has an approval link: show it to the user, and once they approve call pay again with the same url and the approval_id. On any other refusal the response names the next step; follow it instead of retrying. Set confirm_unusual only when the user explicitly approved a payment Seedhape flagged as unusual in this conversation.", {
|
|
95
|
+
url: z.string().url(),
|
|
96
|
+
method: z.enum(["GET", "POST"]).optional(),
|
|
97
|
+
body: z.string().optional(),
|
|
98
|
+
confirm_unusual: z.boolean().optional(),
|
|
99
|
+
purchase_id: z.string().regex(/^[A-Za-z0-9_-]{10,80}$/).optional().describe("Stable id for this purchase so a retry never pays twice."),
|
|
100
|
+
approval_id: z.string().regex(/^apr_[A-Za-z0-9_-]{10,40}$/).optional().describe("From an earlier response that needed the user's approval. Pass it with the same url once the user has approved."),
|
|
101
|
+
}, async ({ url, method, body, confirm_unusual, purchase_id, approval_id }) => {
|
|
102
|
+
if (await ensureSetup())
|
|
103
|
+
return text("Finishing setup in your browser. When it’s done, try again.");
|
|
104
|
+
if (!deps.signer || !deps.address)
|
|
105
|
+
return text(`PAYMENT NOT MADE.\n\nReason: No local wallet exists for agent '${deps.agentId}'. Run \`seedhape setup\` in a terminal.`);
|
|
106
|
+
const purchaseId = purchase_id ?? `lw_${randomUUID().replace(/-/g, "")}`;
|
|
107
|
+
// Merchants may look up this agent's key while verifying the request; make sure its directory is fresh.
|
|
108
|
+
await deps.identity?.refreshDirectory().catch(() => undefined);
|
|
109
|
+
let authorizationId;
|
|
110
|
+
let refusal;
|
|
111
|
+
let settled;
|
|
112
|
+
const x402 = client({
|
|
113
|
+
// Seedhape decides; this wallet only signs after an approval.
|
|
114
|
+
authorise: async ({ requirement }) => {
|
|
115
|
+
const decision = await authorizePayment({ agentId: deps.agentId, url, requirement: { ...requirement, maxAmountRequired: String(requirement.maxAmountRequired) }, purchaseId, method: method ?? "GET", ...(body ? { bodySha256: createHash("sha256").update(body).digest("base64url") } : {}), ...(approval_id ? { approvalId: approval_id } : {}), ...(confirm_unusual ? { confirmUnusual: true } : {}) });
|
|
116
|
+
if (!decision.ok) {
|
|
117
|
+
refusal = decision;
|
|
118
|
+
return { approved: false, reason: decision.error };
|
|
119
|
+
}
|
|
120
|
+
authorizationId = decision.authorizationId;
|
|
121
|
+
return { approved: true, spendId: decision.authorizationId };
|
|
122
|
+
},
|
|
123
|
+
onSettlement: async (_spendId, settlement, httpStatus) => {
|
|
124
|
+
settled = { success: Boolean(settlement?.success) && httpStatus < 400, ...(settlement?.transaction ? { tx: settlement.transaction } : {}) };
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
try {
|
|
128
|
+
const result = await x402.fetch(url, { method: method ?? "GET", ...(body ? { body, headers: { "content-type": "application/json" } } : {}) });
|
|
129
|
+
if (!result.paid)
|
|
130
|
+
return text(`No payment was required.\n\n---\n\n${await result.response.text()}`);
|
|
131
|
+
const outcome = settled ?? { success: result.response.ok };
|
|
132
|
+
if (authorizationId)
|
|
133
|
+
await settlePayment({ authorizationId, status: outcome.success ? "settled" : "failed", ...(outcome.tx ? { txHash: outcome.tx } : {}), ...(outcome.success ? {} : { error: `Merchant responded HTTP ${result.response.status}` }) }).catch(() => undefined);
|
|
134
|
+
const responseBody = await result.response.text();
|
|
135
|
+
if (!outcome.success)
|
|
136
|
+
return text(`PAYMENT NOT COMPLETED.\n\nReason: the merchant responded HTTP ${result.response.status}. Your budget reservation was released.\nLedger reference: ${authorizationId}\n\n${responseBody.slice(0, 2000)}`);
|
|
137
|
+
return text(`Paid ${usdc(result.amount ?? 0n, asset.decimals)} ${asset.symbol}${outcome.tx ? `, tx ${outcome.tx}` : ""}\nLedger reference: ${authorizationId}\n\n---\n\n${responseBody}`);
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
if (error instanceof SeedhapeAuthError) {
|
|
141
|
+
deps.setupNeeded = true;
|
|
142
|
+
if (await ensureSetup())
|
|
143
|
+
return text("Finishing setup in your browser. When it’s done, try again.");
|
|
144
|
+
}
|
|
145
|
+
if (refusal)
|
|
146
|
+
return text(refusalText(refusal));
|
|
147
|
+
if (!authorizationId)
|
|
148
|
+
return text(failureText(error));
|
|
149
|
+
// Declined before anything was signed or sent: safe to release the reservation.
|
|
150
|
+
if (error instanceof PaymentDeclinedError) {
|
|
151
|
+
await settlePayment({ authorizationId, status: "failed", error: error.message }).catch(() => undefined);
|
|
152
|
+
return text(failureText(error));
|
|
153
|
+
}
|
|
154
|
+
// The payment may have been sent. Leave it pending so it is reconciled, never paid twice.
|
|
155
|
+
return text(`PAYMENT OUTCOME UNKNOWN.\n\nReason: ${error instanceof Error ? error.message : String(error)}\nLedger reference: ${authorizationId}\n\nThe payment may have gone through. Do not pay again; check spend_history or purchase_receipt on the hosted Seedhape MCP.`);
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
return server;
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=server.js.map
|