@colin999n9/gworld-agent 0.1.0-alpha.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.
Files changed (86) hide show
  1. package/README.md +127 -0
  2. package/dist/cli.d.ts +12 -0
  3. package/dist/cli.js +256 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/client-installer.d.ts +20 -0
  6. package/dist/client-installer.js +48 -0
  7. package/dist/client-installer.js.map +1 -0
  8. package/dist/config.d.ts +37 -0
  9. package/dist/config.js +184 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/data/indexer-client.d.ts +34 -0
  12. package/dist/data/indexer-client.js +172 -0
  13. package/dist/data/indexer-client.js.map +1 -0
  14. package/dist/data/rpc-reader.d.ts +69 -0
  15. package/dist/data/rpc-reader.js +163 -0
  16. package/dist/data/rpc-reader.js.map +1 -0
  17. package/dist/domain.d.ts +204 -0
  18. package/dist/domain.js +2 -0
  19. package/dist/domain.js.map +1 -0
  20. package/dist/errors.d.ts +10 -0
  21. package/dist/errors.js +16 -0
  22. package/dist/errors.js.map +1 -0
  23. package/dist/factory.d.ts +4 -0
  24. package/dist/factory.js +25 -0
  25. package/dist/factory.js.map +1 -0
  26. package/dist/fs.d.ts +3 -0
  27. package/dist/fs.js +35 -0
  28. package/dist/fs.js.map +1 -0
  29. package/dist/generated/abis.d.ts +7446 -0
  30. package/dist/generated/abis.js +4861 -0
  31. package/dist/generated/abis.js.map +1 -0
  32. package/dist/generated/deployments.d.ts +145 -0
  33. package/dist/generated/deployments.js +150 -0
  34. package/dist/generated/deployments.js.map +1 -0
  35. package/dist/generated/protocol.d.ts +165 -0
  36. package/dist/generated/protocol.js +132 -0
  37. package/dist/generated/protocol.js.map +1 -0
  38. package/dist/geometry.d.ts +24 -0
  39. package/dist/geometry.js +31 -0
  40. package/dist/geometry.js.map +1 -0
  41. package/dist/json.d.ts +3 -0
  42. package/dist/json.js +14 -0
  43. package/dist/json.js.map +1 -0
  44. package/dist/mcp/server.d.ts +4 -0
  45. package/dist/mcp/server.js +134 -0
  46. package/dist/mcp/server.js.map +1 -0
  47. package/dist/mcp/stdio.d.ts +2 -0
  48. package/dist/mcp/stdio.js +23 -0
  49. package/dist/mcp/stdio.js.map +1 -0
  50. package/dist/runner/audit-store.d.ts +27 -0
  51. package/dist/runner/audit-store.js +61 -0
  52. package/dist/runner/audit-store.js.map +1 -0
  53. package/dist/runner/file-state.d.ts +7 -0
  54. package/dist/runner/file-state.js +23 -0
  55. package/dist/runner/file-state.js.map +1 -0
  56. package/dist/runner/legal-actions.d.ts +22 -0
  57. package/dist/runner/legal-actions.js +171 -0
  58. package/dist/runner/legal-actions.js.map +1 -0
  59. package/dist/runner/observation.d.ts +12 -0
  60. package/dist/runner/observation.js +47 -0
  61. package/dist/runner/observation.js.map +1 -0
  62. package/dist/runner/policy.d.ts +10 -0
  63. package/dist/runner/policy.js +68 -0
  64. package/dist/runner/policy.js.map +1 -0
  65. package/dist/runner/runtime.d.ts +73 -0
  66. package/dist/runner/runtime.js +236 -0
  67. package/dist/runner/runtime.js.map +1 -0
  68. package/dist/runner/strategy.d.ts +2 -0
  69. package/dist/runner/strategy.js +19 -0
  70. package/dist/runner/strategy.js.map +1 -0
  71. package/dist/runner/transaction-executor.d.ts +58 -0
  72. package/dist/runner/transaction-executor.js +114 -0
  73. package/dist/runner/transaction-executor.js.map +1 -0
  74. package/dist/runner/writer-lock.d.ts +14 -0
  75. package/dist/runner/writer-lock.js +81 -0
  76. package/dist/runner/writer-lock.js.map +1 -0
  77. package/dist/wallet/keystore.d.ts +18 -0
  78. package/dist/wallet/keystore.js +111 -0
  79. package/dist/wallet/keystore.js.map +1 -0
  80. package/dist/wallet/password-store.d.ts +27 -0
  81. package/dist/wallet/password-store.js +118 -0
  82. package/dist/wallet/password-store.js.map +1 -0
  83. package/package.json +41 -0
  84. package/skill/gworld/SKILL.md +58 -0
  85. package/skill/gworld/references/rules.md +33 -0
  86. package/skill/gworld/references/troubleshooting.md +22 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/runner/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { LegalAction } from '../domain.js';
2
+ export declare function conservativeAction(actions: LegalAction[]): LegalAction | null;
@@ -0,0 +1,19 @@
1
+ const PRIORITY = {
2
+ continueFragmentResolution: 0,
3
+ checkin: 1,
4
+ claimMarket: 2,
5
+ finalizeMarket: 3,
6
+ settleMarket: 4,
7
+ requestMarket: 5,
8
+ claim: 6,
9
+ reinforce: 7,
10
+ move: 8,
11
+ bet: 9,
12
+ attack: 10,
13
+ };
14
+ export function conservativeAction(actions) {
15
+ return [...actions]
16
+ .filter((action) => action.risk === 'low')
17
+ .sort((left, right) => PRIORITY[left.action.kind] - PRIORITY[right.action.kind] || left.actionId.localeCompare(right.actionId))[0] ?? null;
18
+ }
19
+ //# sourceMappingURL=strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategy.js","sourceRoot":"","sources":["../../src/runner/strategy.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAkD;IAC9D,0BAA0B,EAAE,CAAC;IAC7B,OAAO,EAAE,CAAC;IACV,WAAW,EAAE,CAAC;IACd,cAAc,EAAE,CAAC;IACjB,YAAY,EAAE,CAAC;IACf,aAAa,EAAE,CAAC;IAChB,KAAK,EAAE,CAAC;IACR,SAAS,EAAE,CAAC;IACZ,IAAI,EAAE,CAAC;IACP,GAAG,EAAE,CAAC;IACN,MAAM,EAAE,EAAE;CACX,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,OAAsB;IACvD,OAAO,CAAC,GAAG,OAAO,CAAC;SAChB,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC;SACzC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC/I,CAAC"}
@@ -0,0 +1,58 @@
1
+ import type { Abi } from 'viem';
2
+ import type { Address, GameAction, Hash, TransactionResult } from '../domain.js';
3
+ import type { AgentIndexerClient } from '../data/indexer-client.js';
4
+ import type { AgentRpcReader } from '../data/rpc-reader.js';
5
+ import { type WriterLock } from './writer-lock.js';
6
+ type ContractRequest = {
7
+ address: Address;
8
+ abi: Abi;
9
+ functionName: string;
10
+ args?: readonly unknown[];
11
+ value?: bigint;
12
+ account: Address;
13
+ };
14
+ export type ExecutorPublicClient = {
15
+ simulateContract(args: ContractRequest): Promise<{
16
+ request: unknown;
17
+ }>;
18
+ waitForTransactionReceipt(args: {
19
+ hash: Hash;
20
+ confirmations?: number;
21
+ }): Promise<{
22
+ status: 'success' | 'reverted';
23
+ blockNumber: bigint;
24
+ }>;
25
+ };
26
+ export type ExecutorWalletClient = {
27
+ writeContract(request: unknown): Promise<Hash>;
28
+ };
29
+ type LifecycleAction = {
30
+ kind: 'createAgent';
31
+ } | {
32
+ kind: 'refreshSpawnRandomness';
33
+ agentId: bigint;
34
+ } | {
35
+ kind: 'spawnAgent';
36
+ agentId: bigint;
37
+ };
38
+ export type ExecutableAction = GameAction | LifecycleAction;
39
+ export declare class TransactionExecutor {
40
+ private readonly wallet;
41
+ private readonly rpc;
42
+ private readonly indexer;
43
+ private readonly publicClient;
44
+ private readonly walletClient;
45
+ private readonly confirmations;
46
+ private readonly indexingTimeoutMs;
47
+ private readonly writerLock;
48
+ private inFlight;
49
+ constructor(wallet: Address, rpc: AgentRpcReader, indexer: AgentIndexerClient, publicClient: ExecutorPublicClient, walletClient: ExecutorWalletClient, confirmations: number, indexingTimeoutMs: number, writerLock?: WriterLock);
50
+ private steps;
51
+ simulate(action: ExecutableAction): Promise<{
52
+ steps: string[];
53
+ deferredUntilApproval: boolean;
54
+ }>;
55
+ execute(action: ExecutableAction): Promise<TransactionResult>;
56
+ private executeLocked;
57
+ }
58
+ export {};
@@ -0,0 +1,114 @@
1
+ import { AgentError } from '../errors.js';
2
+ import { contractAbis } from '../generated/abis.js';
3
+ import { MemoryWriterLock } from './writer-lock.js';
4
+ export class TransactionExecutor {
5
+ wallet;
6
+ rpc;
7
+ indexer;
8
+ publicClient;
9
+ walletClient;
10
+ confirmations;
11
+ indexingTimeoutMs;
12
+ writerLock;
13
+ inFlight = false;
14
+ constructor(wallet, rpc, indexer, publicClient, walletClient, confirmations, indexingTimeoutMs, writerLock = new MemoryWriterLock()) {
15
+ this.wallet = wallet;
16
+ this.rpc = rpc;
17
+ this.indexer = indexer;
18
+ this.publicClient = publicClient;
19
+ this.walletClient = walletClient;
20
+ this.confirmations = confirmations;
21
+ this.indexingTimeoutMs = indexingTimeoutMs;
22
+ this.writerLock = writerLock;
23
+ }
24
+ async steps(action) {
25
+ const modules = await this.rpc.modules();
26
+ switch (action.kind) {
27
+ case 'createAgent': return [{ label: 'create-agent', address: modules.registry, abi: contractAbis.registry, functionName: 'createAgent' }];
28
+ case 'refreshSpawnRandomness': return [{ label: 'refresh-spawn-randomness', address: modules.registry, abi: contractAbis.registry, functionName: 'refreshSpawnRandomness', args: [action.agentId] }];
29
+ case 'spawnAgent': return [{ label: 'spawn-agent', address: modules.world, abi: contractAbis.world, functionName: 'spawnAgent', args: [action.agentId] }];
30
+ case 'checkin': return [{ label: 'check-in', address: modules.ledger, abi: contractAbis.ledger, functionName: 'checkin', args: [action.agentId] }];
31
+ case 'claim': return [{ label: 'claim', address: modules.world, abi: contractAbis.world, functionName: 'claim', args: [action.agentId, action.tileKey] }];
32
+ case 'move': return [{ label: 'move', address: modules.world, abi: contractAbis.world, functionName: 'move', args: [action.agentId, action.expectedFrom, action.path, action.expectedNonce] }];
33
+ case 'attack': return [{ label: 'attack', address: modules.world, abi: contractAbis.world, functionName: 'attack', args: [action.agentId, action.tileKey, action.apCap] }];
34
+ case 'reinforce': return [{ label: 'reinforce', address: modules.world, abi: contractAbis.world, functionName: 'reinforce', args: [action.agentId, action.tileKey, action.apCap] }];
35
+ case 'continueFragmentResolution': return [{ label: 'continue-fragment', address: modules.world, abi: contractAbis.world, functionName: 'continueFragmentResolution', args: [action.agentId, action.maxSteps] }];
36
+ case 'requestMarket': return [{ label: 'request-market', address: modules.market, abi: contractAbis.market, functionName: 'requestMarket' }];
37
+ case 'finalizeMarket': return [{ label: 'finalize-market', address: modules.market, abi: contractAbis.market, functionName: 'finalizeMarket', args: [action.round] }];
38
+ case 'settleMarket': return [{ label: 'settle-market', address: modules.market, abi: contractAbis.market, functionName: 'settle', args: [action.marketId] }];
39
+ case 'claimMarket': return [{ label: 'claim-market', address: modules.market, abi: contractAbis.market, functionName: 'claim', args: [action.marketId] }];
40
+ case 'bet': {
41
+ const payment = await this.rpc.marketPayment(action.marketId, this.wallet);
42
+ const steps = [];
43
+ if (payment.mode === 'erc20' && payment.allowance < action.amountG) {
44
+ steps.push({
45
+ label: 'approve-market-escrow', address: payment.gToken, abi: contractAbis.erc20,
46
+ functionName: 'approve', args: [payment.escrow, action.amountG],
47
+ });
48
+ }
49
+ steps.push({
50
+ label: 'bet', address: payment.market, abi: contractAbis.market, functionName: 'bet',
51
+ args: [action.marketId, action.agentId, action.optionIndex, action.amountG],
52
+ ...(payment.mode === 'native' ? { value: action.amountG } : {}),
53
+ });
54
+ return steps;
55
+ }
56
+ }
57
+ }
58
+ async simulate(action) {
59
+ const steps = await this.steps(action);
60
+ const deferredUntilApproval = action.kind === 'bet' && steps.length === 2;
61
+ const simulationSteps = deferredUntilApproval ? steps.slice(0, 1) : steps;
62
+ try {
63
+ for (const step of simulationSteps) {
64
+ await this.publicClient.simulateContract({ ...step, account: this.wallet });
65
+ }
66
+ return { steps: steps.map((step) => step.label), deferredUntilApproval };
67
+ }
68
+ catch (error) {
69
+ throw new AgentError('simulation_failed', `Simulation failed for ${action.kind}`, error);
70
+ }
71
+ }
72
+ async execute(action) {
73
+ if (this.inFlight)
74
+ throw new AgentError('runner_busy', 'Another transaction is already in flight for this wallet');
75
+ this.inFlight = true;
76
+ try {
77
+ return await this.writerLock.withLock(() => this.executeLocked(action));
78
+ }
79
+ finally {
80
+ this.inFlight = false;
81
+ }
82
+ }
83
+ async executeLocked(action) {
84
+ const hashes = [];
85
+ let blockNumber = 0n;
86
+ const steps = await this.steps(action);
87
+ for (const step of steps) {
88
+ let request;
89
+ try {
90
+ request = (await this.publicClient.simulateContract({ ...step, account: this.wallet })).request;
91
+ }
92
+ catch (error) {
93
+ throw new AgentError('simulation_failed', `Simulation failed at ${step.label}`, error);
94
+ }
95
+ const hash = await this.walletClient.writeContract(request);
96
+ hashes.push(hash);
97
+ const receipt = await this.publicClient.waitForTransactionReceipt({ hash, confirmations: this.confirmations });
98
+ if (receipt.status !== 'success')
99
+ throw new AgentError('transaction_reverted', `Transaction reverted at ${step.label}`);
100
+ blockNumber = receipt.blockNumber;
101
+ }
102
+ let indexing = 'indexed';
103
+ try {
104
+ await this.indexer.waitForBlock(blockNumber, this.indexingTimeoutMs);
105
+ }
106
+ catch (error) {
107
+ if (!(error instanceof AgentError) || error.code !== 'indexer_lagging')
108
+ throw error;
109
+ indexing = 'lagging';
110
+ }
111
+ return { action: action.kind, hashes, blockNumber, indexing };
112
+ }
113
+ }
114
+ //# sourceMappingURL=transaction-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction-executor.js","sourceRoot":"","sources":["../../src/runner/transaction-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface WriterLock {
2
+ withLock<T>(operation: () => Promise<T>): Promise<T>;
3
+ }
4
+ export declare class MemoryWriterLock implements WriterLock {
5
+ private held;
6
+ withLock<T>(operation: () => Promise<T>): Promise<T>;
7
+ }
8
+ export declare class FileWriterLock implements WriterLock {
9
+ private readonly path;
10
+ constructor(path: string);
11
+ withLock<T>(operation: () => Promise<T>): Promise<T>;
12
+ private acquire;
13
+ private ownerIsAlive;
14
+ }
@@ -0,0 +1,81 @@
1
+ import { mkdir, open, readFile, unlink } from 'node:fs/promises';
2
+ import { dirname } from 'node:path';
3
+ import { AgentError } from '../errors.js';
4
+ export class MemoryWriterLock {
5
+ held = false;
6
+ async withLock(operation) {
7
+ if (this.held)
8
+ throw new AgentError('runner_busy', 'Another transaction is already in flight for this wallet');
9
+ this.held = true;
10
+ try {
11
+ return await operation();
12
+ }
13
+ finally {
14
+ this.held = false;
15
+ }
16
+ }
17
+ }
18
+ export class FileWriterLock {
19
+ path;
20
+ constructor(path) {
21
+ this.path = path;
22
+ }
23
+ async withLock(operation) {
24
+ const handle = await this.acquire();
25
+ try {
26
+ return await operation();
27
+ }
28
+ finally {
29
+ await handle.close();
30
+ try {
31
+ await unlink(this.path);
32
+ }
33
+ catch (error) {
34
+ if (error.code !== 'ENOENT')
35
+ throw error;
36
+ }
37
+ }
38
+ }
39
+ async acquire(recovered = false) {
40
+ await mkdir(dirname(this.path), { recursive: true, mode: 0o700 });
41
+ try {
42
+ const handle = await open(this.path, 'wx', 0o600);
43
+ await handle.writeFile(`${JSON.stringify({ pid: process.pid, createdAt: new Date().toISOString() })}\n`, 'utf8');
44
+ await handle.sync();
45
+ return handle;
46
+ }
47
+ catch (error) {
48
+ if (error.code !== 'EEXIST')
49
+ throw error;
50
+ if (!recovered && !(await this.ownerIsAlive())) {
51
+ try {
52
+ await unlink(this.path);
53
+ }
54
+ catch (unlinkError) {
55
+ if (unlinkError.code !== 'ENOENT')
56
+ throw unlinkError;
57
+ }
58
+ return this.acquire(true);
59
+ }
60
+ throw new AgentError('runner_busy', 'Another GWorld process is signing for this profile');
61
+ }
62
+ }
63
+ async ownerIsAlive() {
64
+ try {
65
+ const owner = JSON.parse(await readFile(this.path, 'utf8'));
66
+ if (!Number.isSafeInteger(owner.pid) || Number(owner.pid) <= 0)
67
+ return true;
68
+ try {
69
+ process.kill(Number(owner.pid), 0);
70
+ return true;
71
+ }
72
+ catch (error) {
73
+ return error.code !== 'ESRCH';
74
+ }
75
+ }
76
+ catch {
77
+ return true;
78
+ }
79
+ }
80
+ }
81
+ //# sourceMappingURL=writer-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer-lock.js","sourceRoot":"","sources":["../../src/runner/writer-lock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Address, PrivateKey } from '../domain.js';
2
+ export type EncryptedKeyStore = {
3
+ version: 1;
4
+ address: Address;
5
+ crypto: {
6
+ cipher: 'aes-256-gcm';
7
+ kdf: 'scrypt';
8
+ salt: string;
9
+ iv: string;
10
+ tag: string;
11
+ ciphertext: string;
12
+ };
13
+ };
14
+ export declare function encryptPrivateKey(privateKey: PrivateKey, password: string): Promise<EncryptedKeyStore>;
15
+ export declare function decryptPrivateKey(value: unknown, password: string): Promise<PrivateKey>;
16
+ export declare function saveKeyStore(path: string, store: EncryptedKeyStore): Promise<void>;
17
+ export declare function loadKeyStore(path: string): Promise<EncryptedKeyStore>;
18
+ export declare function savePrivateKeyExport(path: string, privateKey: PrivateKey): Promise<void>;
@@ -0,0 +1,111 @@
1
+ import { createCipheriv, createDecipheriv, randomBytes, scrypt as scryptCallback, timingSafeEqual } from 'node:crypto';
2
+ import { readFile, stat } from 'node:fs/promises';
3
+ import { getAddress } from 'viem';
4
+ import { privateKeyToAccount } from 'viem/accounts';
5
+ import { AgentError } from '../errors.js';
6
+ import { atomicWritePrivateFile, createPrivateFile } from '../fs.js';
7
+ function assertPrivateKey(value) {
8
+ if (!/^0x[0-9a-fA-F]{64}$/.test(value))
9
+ throw new AgentError('wallet_corrupt', 'Wallet key has an invalid format');
10
+ }
11
+ async function deriveKey(password, salt) {
12
+ if (password.length < 12)
13
+ throw new AgentError('wallet_locked', 'Wallet password must be at least 12 characters');
14
+ return new Promise((resolve, reject) => {
15
+ scryptCallback(password, salt, 32, { N: 1 << 15, r: 8, p: 1, maxmem: 64 * 1024 * 1024 }, (error, key) => (error ? reject(error) : resolve(key)));
16
+ });
17
+ }
18
+ export async function encryptPrivateKey(privateKey, password) {
19
+ assertPrivateKey(privateKey);
20
+ const salt = randomBytes(32);
21
+ const iv = randomBytes(12);
22
+ const key = await deriveKey(password, salt);
23
+ const cipher = createCipheriv('aes-256-gcm', key, iv);
24
+ const ciphertext = Buffer.concat([cipher.update(privateKey.slice(2), 'utf8'), cipher.final()]);
25
+ const address = privateKeyToAccount(privateKey).address.toLowerCase();
26
+ return {
27
+ version: 1,
28
+ address,
29
+ crypto: {
30
+ cipher: 'aes-256-gcm',
31
+ kdf: 'scrypt',
32
+ salt: salt.toString('base64'),
33
+ iv: iv.toString('base64'),
34
+ tag: cipher.getAuthTag().toString('base64'),
35
+ ciphertext: ciphertext.toString('base64'),
36
+ },
37
+ };
38
+ }
39
+ function parseStore(value) {
40
+ const store = value;
41
+ try {
42
+ if (store.version !== 1 || store.crypto.cipher !== 'aes-256-gcm' || store.crypto.kdf !== 'scrypt')
43
+ throw new Error();
44
+ const address = getAddress(store.address).toLowerCase();
45
+ for (const field of ['salt', 'iv', 'tag', 'ciphertext']) {
46
+ if (typeof store.crypto[field] !== 'string' || store.crypto[field].length === 0)
47
+ throw new Error();
48
+ }
49
+ return { ...store, address };
50
+ }
51
+ catch {
52
+ throw new AgentError('wallet_corrupt', 'Wallet keystore is invalid');
53
+ }
54
+ }
55
+ export async function decryptPrivateKey(value, password) {
56
+ const store = parseStore(value);
57
+ try {
58
+ const salt = Buffer.from(store.crypto.salt, 'base64');
59
+ const iv = Buffer.from(store.crypto.iv, 'base64');
60
+ const tag = Buffer.from(store.crypto.tag, 'base64');
61
+ const ciphertext = Buffer.from(store.crypto.ciphertext, 'base64');
62
+ const key = await deriveKey(password, salt);
63
+ const decipher = createDecipheriv('aes-256-gcm', key, iv);
64
+ decipher.setAuthTag(tag);
65
+ const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]).toString('utf8');
66
+ const privateKey = `0x${plaintext}`;
67
+ assertPrivateKey(privateKey);
68
+ const actual = Buffer.from(privateKeyToAccount(privateKey).address.slice(2), 'hex');
69
+ const expected = Buffer.from(store.address.slice(2), 'hex');
70
+ if (!timingSafeEqual(actual, expected))
71
+ throw new Error('address mismatch');
72
+ return privateKey;
73
+ }
74
+ catch (error) {
75
+ if (error instanceof AgentError && error.code === 'wallet_locked')
76
+ throw error;
77
+ throw new AgentError('wallet_locked', 'Unable to unlock wallet; password or keystore is invalid');
78
+ }
79
+ }
80
+ export async function saveKeyStore(path, store) {
81
+ await atomicWritePrivateFile(path, `${JSON.stringify(parseStore(store), null, 2)}\n`);
82
+ }
83
+ export async function loadKeyStore(path) {
84
+ try {
85
+ const store = parseStore(JSON.parse(await readFile(path, 'utf8')));
86
+ const mode = (await stat(path)).mode & 0o777;
87
+ if ((mode & 0o077) !== 0)
88
+ throw new AgentError('wallet_corrupt', 'Wallet keystore permissions must be 0600');
89
+ return store;
90
+ }
91
+ catch (error) {
92
+ if (error.code === 'ENOENT')
93
+ throw new AgentError('wallet_missing', `Wallet keystore not found: ${path}`);
94
+ if (error instanceof AgentError)
95
+ throw error;
96
+ throw new AgentError('wallet_corrupt', 'Wallet keystore cannot be read');
97
+ }
98
+ }
99
+ export async function savePrivateKeyExport(path, privateKey) {
100
+ assertPrivateKey(privateKey);
101
+ try {
102
+ await createPrivateFile(path, `${privateKey}\n`);
103
+ }
104
+ catch (error) {
105
+ if (error.code === 'EEXIST') {
106
+ throw new AgentError('config_invalid', `Private-key export target already exists: ${path}`);
107
+ }
108
+ throw error;
109
+ }
110
+ }
111
+ //# sourceMappingURL=keystore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keystore.js","sourceRoot":"","sources":["../../src/wallet/keystore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { type SpawnSyncReturns } from 'node:child_process';
2
+ export interface PasswordStore {
3
+ available(): boolean;
4
+ get(profile: string): Promise<string | null>;
5
+ set(profile: string, password: string): Promise<void>;
6
+ }
7
+ type Spawn = (command: string, args: string[], options: Record<string, unknown>) => SpawnSyncReturns<string>;
8
+ export declare class MacOsKeychainPasswordStore implements PasswordStore {
9
+ private readonly spawn;
10
+ private readonly platform;
11
+ constructor(spawn?: Spawn, platform?: NodeJS.Platform);
12
+ available(): boolean;
13
+ get(profile: string): Promise<string | null>;
14
+ set(profile: string, password: string): Promise<void>;
15
+ }
16
+ export declare function promptHidden(question: string): Promise<string>;
17
+ export declare function promptText(question: string): Promise<string>;
18
+ export declare class PasswordManager {
19
+ private readonly keychain;
20
+ private readonly prompt;
21
+ constructor(keychain?: PasswordStore, prompt?: (question: string) => Promise<string>);
22
+ create(profile: string, interactive?: boolean): Promise<string>;
23
+ unlock(profile: string, interactive?: boolean): Promise<string>;
24
+ unlockForExport(): Promise<string>;
25
+ private assertPassword;
26
+ }
27
+ export {};
@@ -0,0 +1,118 @@
1
+ import { readFile, stat } from 'node:fs/promises';
2
+ import { spawnSync } from 'node:child_process';
3
+ import { createInterface } from 'node:readline/promises';
4
+ import { Writable } from 'node:stream';
5
+ import { AgentError } from '../errors.js';
6
+ export class MacOsKeychainPasswordStore {
7
+ spawn;
8
+ platform;
9
+ constructor(spawn = (command, args, options) => spawnSync(command, args, { ...options, encoding: 'utf8' }), platform = process.platform) {
10
+ this.spawn = spawn;
11
+ this.platform = platform;
12
+ }
13
+ available() {
14
+ if (this.platform !== 'darwin')
15
+ return false;
16
+ return this.spawn('security', ['help'], { stdio: 'ignore' }).status === 0;
17
+ }
18
+ async get(profile) {
19
+ if (!this.available())
20
+ return null;
21
+ const result = this.spawn('security', ['find-generic-password', '-a', profile, '-s', 'com.galxe.gworld.agent', '-w'], { stdio: ['ignore', 'pipe', 'ignore'] });
22
+ return result.status === 0 && result.stdout ? result.stdout.trim() : null;
23
+ }
24
+ async set(profile, password) {
25
+ if (!this.available())
26
+ throw new AgentError('unsupported', 'macOS Keychain is not available');
27
+ const result = this.spawn('security', ['add-generic-password', '-U', '-a', profile, '-s', 'com.galxe.gworld.agent', '-l', `GWorld Agent (${profile})`, '-w'], { input: `${password}\n`, stdio: ['pipe', 'ignore', 'pipe'] });
28
+ if (result.status !== 0)
29
+ throw new AgentError('wallet_locked', 'Unable to store the wallet password in macOS Keychain');
30
+ }
31
+ }
32
+ async function passwordFromEnvironment() {
33
+ if (process.env.GWORLD_KEYSTORE_PASSWORD)
34
+ return process.env.GWORLD_KEYSTORE_PASSWORD;
35
+ const path = process.env.GWORLD_KEYSTORE_PASSWORD_FILE;
36
+ if (!path)
37
+ return null;
38
+ const mode = (await stat(path)).mode & 0o777;
39
+ if ((mode & 0o077) !== 0)
40
+ throw new AgentError('wallet_locked', 'GWORLD_KEYSTORE_PASSWORD_FILE permissions must be 0600');
41
+ return (await readFile(path, 'utf8')).trim();
42
+ }
43
+ export async function promptHidden(question) {
44
+ if (!process.stdin.isTTY)
45
+ throw new AgentError('wallet_locked', 'A TTY, macOS Keychain, or keystore password environment is required');
46
+ process.stderr.write(question);
47
+ let muted = true;
48
+ const output = new Writable({
49
+ write(chunk, _encoding, callback) {
50
+ if (!muted)
51
+ process.stderr.write(chunk);
52
+ callback();
53
+ },
54
+ });
55
+ const reader = createInterface({ input: process.stdin, output, terminal: true });
56
+ try {
57
+ const answer = await reader.question('');
58
+ muted = false;
59
+ process.stderr.write('\n');
60
+ return answer.trim();
61
+ }
62
+ finally {
63
+ reader.close();
64
+ }
65
+ }
66
+ export async function promptText(question) {
67
+ if (!process.stdin.isTTY)
68
+ throw new AgentError('unsupported', 'An interactive TTY is required');
69
+ const reader = createInterface({ input: process.stdin, output: process.stderr, terminal: true });
70
+ try {
71
+ return (await reader.question(question)).trim();
72
+ }
73
+ finally {
74
+ reader.close();
75
+ }
76
+ }
77
+ export class PasswordManager {
78
+ keychain;
79
+ prompt;
80
+ constructor(keychain = new MacOsKeychainPasswordStore(), prompt = promptHidden) {
81
+ this.keychain = keychain;
82
+ this.prompt = prompt;
83
+ }
84
+ async create(profile, interactive = true) {
85
+ const fromEnvironment = await passwordFromEnvironment();
86
+ if (fromEnvironment)
87
+ return this.assertPassword(fromEnvironment);
88
+ if (!interactive)
89
+ throw new AgentError('wallet_locked', 'No non-interactive keystore password source is configured');
90
+ const first = this.assertPassword(await this.prompt('Create GWorld wallet recovery password: '));
91
+ const second = await this.prompt('Confirm GWorld wallet recovery password: ');
92
+ if (first !== second)
93
+ throw new AgentError('wallet_locked', 'Wallet passwords do not match');
94
+ if (this.keychain.available())
95
+ await this.keychain.set(profile, first);
96
+ return first;
97
+ }
98
+ async unlock(profile, interactive = true) {
99
+ const fromKeychain = await this.keychain.get(profile);
100
+ if (fromKeychain)
101
+ return this.assertPassword(fromKeychain);
102
+ const fromEnvironment = await passwordFromEnvironment();
103
+ if (fromEnvironment)
104
+ return this.assertPassword(fromEnvironment);
105
+ if (!interactive)
106
+ throw new AgentError('wallet_locked', 'Wallet is locked; configure Keychain or GWORLD_KEYSTORE_PASSWORD_FILE');
107
+ return this.assertPassword(await this.prompt('Unlock GWorld wallet: '));
108
+ }
109
+ async unlockForExport() {
110
+ return this.assertPassword(await this.prompt('Re-enter GWorld wallet recovery password to export: '));
111
+ }
112
+ assertPassword(password) {
113
+ if (password.length < 12)
114
+ throw new AgentError('wallet_locked', 'Wallet password must be at least 12 characters');
115
+ return password;
116
+ }
117
+ }
118
+ //# sourceMappingURL=password-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password-store.js","sourceRoot":"","sources":["../../src/wallet/password-store.ts"],"names":[],"mappings":"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"}