agentaos 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/LICENSE +199 -0
- package/README.md +249 -0
- package/dist/cli/commands/admin.command.d.ts +3 -0
- package/dist/cli/commands/admin.command.d.ts.map +1 -0
- package/dist/cli/commands/admin.command.js +415 -0
- package/dist/cli/commands/admin.command.js.map +1 -0
- package/dist/cli/commands/balance.command.d.ts +3 -0
- package/dist/cli/commands/balance.command.d.ts.map +1 -0
- package/dist/cli/commands/balance.command.js +65 -0
- package/dist/cli/commands/balance.command.js.map +1 -0
- package/dist/cli/commands/deploy.command.d.ts +3 -0
- package/dist/cli/commands/deploy.command.d.ts.map +1 -0
- package/dist/cli/commands/deploy.command.js +101 -0
- package/dist/cli/commands/deploy.command.js.map +1 -0
- package/dist/cli/commands/info.command.d.ts +3 -0
- package/dist/cli/commands/info.command.d.ts.map +1 -0
- package/dist/cli/commands/info.command.js +30 -0
- package/dist/cli/commands/info.command.js.map +1 -0
- package/dist/cli/commands/init.command.d.ts +3 -0
- package/dist/cli/commands/init.command.d.ts.map +1 -0
- package/dist/cli/commands/init.command.js +364 -0
- package/dist/cli/commands/init.command.js.map +1 -0
- package/dist/cli/commands/link.command.d.ts +3 -0
- package/dist/cli/commands/link.command.d.ts.map +1 -0
- package/dist/cli/commands/link.command.js +111 -0
- package/dist/cli/commands/link.command.js.map +1 -0
- package/dist/cli/commands/login.command.d.ts +4 -0
- package/dist/cli/commands/login.command.d.ts.map +1 -0
- package/dist/cli/commands/login.command.js +149 -0
- package/dist/cli/commands/login.command.js.map +1 -0
- package/dist/cli/commands/network.command.d.ts +3 -0
- package/dist/cli/commands/network.command.d.ts.map +1 -0
- package/dist/cli/commands/network.command.js +206 -0
- package/dist/cli/commands/network.command.js.map +1 -0
- package/dist/cli/commands/proxy.command.d.ts +3 -0
- package/dist/cli/commands/proxy.command.d.ts.map +1 -0
- package/dist/cli/commands/proxy.command.js +248 -0
- package/dist/cli/commands/proxy.command.js.map +1 -0
- package/dist/cli/commands/receive.command.d.ts +3 -0
- package/dist/cli/commands/receive.command.d.ts.map +1 -0
- package/dist/cli/commands/receive.command.js +360 -0
- package/dist/cli/commands/receive.command.js.map +1 -0
- package/dist/cli/commands/send.command.d.ts +3 -0
- package/dist/cli/commands/send.command.d.ts.map +1 -0
- package/dist/cli/commands/send.command.js +83 -0
- package/dist/cli/commands/send.command.js.map +1 -0
- package/dist/cli/commands/sign.command.d.ts +3 -0
- package/dist/cli/commands/sign.command.d.ts.map +1 -0
- package/dist/cli/commands/sign.command.js +53 -0
- package/dist/cli/commands/sign.command.js.map +1 -0
- package/dist/cli/commands/status.command.d.ts +3 -0
- package/dist/cli/commands/status.command.d.ts.map +1 -0
- package/dist/cli/commands/status.command.js +109 -0
- package/dist/cli/commands/status.command.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +50 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/theme.d.ts +35 -0
- package/dist/cli/theme.d.ts.map +1 -0
- package/dist/cli/theme.js +96 -0
- package/dist/cli/theme.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/__tests__/transfer-crypto.test.d.ts +2 -0
- package/dist/lib/__tests__/transfer-crypto.test.d.ts.map +1 -0
- package/dist/lib/__tests__/transfer-crypto.test.js +151 -0
- package/dist/lib/__tests__/transfer-crypto.test.js.map +1 -0
- package/dist/lib/authenticated-fetch.d.ts +6 -0
- package/dist/lib/authenticated-fetch.d.ts.map +1 -0
- package/dist/lib/authenticated-fetch.js +74 -0
- package/dist/lib/authenticated-fetch.js.map +1 -0
- package/dist/lib/config.d.ts +42 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +163 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/erc20-abi.d.ts +43 -0
- package/dist/lib/erc20-abi.d.ts.map +1 -0
- package/dist/lib/erc20-abi.js +34 -0
- package/dist/lib/erc20-abi.js.map +1 -0
- package/dist/lib/errors.d.ts +12 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +23 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/keychain.d.ts +11 -0
- package/dist/lib/keychain.d.ts.map +1 -0
- package/dist/lib/keychain.js +216 -0
- package/dist/lib/keychain.js.map +1 -0
- package/dist/lib/policy-conversions.d.ts +19 -0
- package/dist/lib/policy-conversions.d.ts.map +1 -0
- package/dist/lib/policy-conversions.js +62 -0
- package/dist/lib/policy-conversions.js.map +1 -0
- package/dist/lib/signer-manager.d.ts +17 -0
- package/dist/lib/signer-manager.d.ts.map +1 -0
- package/dist/lib/signer-manager.js +80 -0
- package/dist/lib/signer-manager.js.map +1 -0
- package/dist/lib/transfer-crypto.d.ts +36 -0
- package/dist/lib/transfer-crypto.d.ts.map +1 -0
- package/dist/lib/transfer-crypto.js +109 -0
- package/dist/lib/transfer-crypto.js.map +1 -0
- package/dist/lib/x402-client.d.ts +63 -0
- package/dist/lib/x402-client.d.ts.map +1 -0
- package/dist/lib/x402-client.js +236 -0
- package/dist/lib/x402-client.js.map +1 -0
- package/dist/mcp/index.d.ts +6 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +73 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tools/call-contract.d.ts +4 -0
- package/dist/mcp/tools/call-contract.d.ts.map +1 -0
- package/dist/mcp/tools/call-contract.js +68 -0
- package/dist/mcp/tools/call-contract.js.map +1 -0
- package/dist/mcp/tools/execute.d.ts +4 -0
- package/dist/mcp/tools/execute.d.ts.map +1 -0
- package/dist/mcp/tools/execute.js +59 -0
- package/dist/mcp/tools/execute.js.map +1 -0
- package/dist/mcp/tools/get-audit-log.d.ts +4 -0
- package/dist/mcp/tools/get-audit-log.d.ts.map +1 -0
- package/dist/mcp/tools/get-audit-log.js +85 -0
- package/dist/mcp/tools/get-audit-log.js.map +1 -0
- package/dist/mcp/tools/get-balances.d.ts +4 -0
- package/dist/mcp/tools/get-balances.d.ts.map +1 -0
- package/dist/mcp/tools/get-balances.js +84 -0
- package/dist/mcp/tools/get-balances.js.map +1 -0
- package/dist/mcp/tools/get-status.d.ts +4 -0
- package/dist/mcp/tools/get-status.d.ts.map +1 -0
- package/dist/mcp/tools/get-status.js +66 -0
- package/dist/mcp/tools/get-status.js.map +1 -0
- package/dist/mcp/tools/list-networks.d.ts +4 -0
- package/dist/mcp/tools/list-networks.d.ts.map +1 -0
- package/dist/mcp/tools/list-networks.js +36 -0
- package/dist/mcp/tools/list-networks.js.map +1 -0
- package/dist/mcp/tools/list-signers.d.ts +4 -0
- package/dist/mcp/tools/list-signers.d.ts.map +1 -0
- package/dist/mcp/tools/list-signers.js +36 -0
- package/dist/mcp/tools/list-signers.js.map +1 -0
- package/dist/mcp/tools/read-contract.d.ts +4 -0
- package/dist/mcp/tools/read-contract.d.ts.map +1 -0
- package/dist/mcp/tools/read-contract.js +62 -0
- package/dist/mcp/tools/read-contract.js.map +1 -0
- package/dist/mcp/tools/resolve-address.d.ts +4 -0
- package/dist/mcp/tools/resolve-address.d.ts.map +1 -0
- package/dist/mcp/tools/resolve-address.js +37 -0
- package/dist/mcp/tools/resolve-address.js.map +1 -0
- package/dist/mcp/tools/send-eth.d.ts +4 -0
- package/dist/mcp/tools/send-eth.d.ts.map +1 -0
- package/dist/mcp/tools/send-eth.js +52 -0
- package/dist/mcp/tools/send-eth.js.map +1 -0
- package/dist/mcp/tools/send-token.d.ts +4 -0
- package/dist/mcp/tools/send-token.d.ts.map +1 -0
- package/dist/mcp/tools/send-token.js +102 -0
- package/dist/mcp/tools/send-token.js.map +1 -0
- package/dist/mcp/tools/sign-message.d.ts +4 -0
- package/dist/mcp/tools/sign-message.d.ts.map +1 -0
- package/dist/mcp/tools/sign-message.js +33 -0
- package/dist/mcp/tools/sign-message.js.map +1 -0
- package/dist/mcp/tools/sign-typed-data.d.ts +4 -0
- package/dist/mcp/tools/sign-typed-data.d.ts.map +1 -0
- package/dist/mcp/tools/sign-typed-data.js +48 -0
- package/dist/mcp/tools/sign-typed-data.js.map +1 -0
- package/dist/mcp/tools/simulate.d.ts +4 -0
- package/dist/mcp/tools/simulate.d.ts.map +1 -0
- package/dist/mcp/tools/simulate.js +54 -0
- package/dist/mcp/tools/simulate.js.map +1 -0
- package/dist/mcp/tools/wallet-overview.d.ts +4 -0
- package/dist/mcp/tools/wallet-overview.d.ts.map +1 -0
- package/dist/mcp/tools/wallet-overview.js +109 -0
- package/dist/mcp/tools/wallet-overview.js.map +1 -0
- package/dist/mcp/tools/x402-check.d.ts +3 -0
- package/dist/mcp/tools/x402-check.d.ts.map +1 -0
- package/dist/mcp/tools/x402-check.js +44 -0
- package/dist/mcp/tools/x402-check.js.map +1 -0
- package/dist/mcp/tools/x402-discover.d.ts +3 -0
- package/dist/mcp/tools/x402-discover.d.ts.map +1 -0
- package/dist/mcp/tools/x402-discover.js +42 -0
- package/dist/mcp/tools/x402-discover.js.map +1 -0
- package/dist/mcp/tools/x402-fetch.d.ts +4 -0
- package/dist/mcp/tools/x402-fetch.d.ts.map +1 -0
- package/dist/mcp/tools/x402-fetch.js +45 -0
- package/dist/mcp/tools/x402-fetch.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { AgentaApi, HttpClient, ThresholdSigner } from '@agentaos/sdk';
|
|
2
|
+
export interface SignerConfig {
|
|
3
|
+
version: 1;
|
|
4
|
+
serverUrl: string;
|
|
5
|
+
apiKey: string;
|
|
6
|
+
apiSecret?: string;
|
|
7
|
+
network?: string;
|
|
8
|
+
signerName: string;
|
|
9
|
+
ethAddress: string;
|
|
10
|
+
signerId?: string;
|
|
11
|
+
createdAt?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function getConfigDir(): string;
|
|
14
|
+
export declare function getSignerConfigPath(name: string): string;
|
|
15
|
+
export declare function validateSignerName(name: string): string | null;
|
|
16
|
+
export declare function getDefaultSignerName(): string | null;
|
|
17
|
+
export declare function setDefaultSigner(name: string): void;
|
|
18
|
+
export declare function listSigners(): string[];
|
|
19
|
+
export declare function resolveSignerName(explicit?: string): string;
|
|
20
|
+
export declare function loadSignerConfig(name?: string): SignerConfig;
|
|
21
|
+
export declare function saveSignerConfig(name: string, config: SignerConfig): void;
|
|
22
|
+
export interface RecoveryMeta {
|
|
23
|
+
signerName: string;
|
|
24
|
+
signerId: string;
|
|
25
|
+
ethAddress: string;
|
|
26
|
+
serverUrl: string;
|
|
27
|
+
network?: string;
|
|
28
|
+
receivedAt: string;
|
|
29
|
+
}
|
|
30
|
+
export declare function saveRecoveryMeta(name: string, meta: RecoveryMeta): void;
|
|
31
|
+
export declare function loadRecoveryMeta(name: string): RecoveryMeta | null;
|
|
32
|
+
export declare function listRecoveryMetas(): RecoveryMeta[];
|
|
33
|
+
export declare function resolveApiSecret(config: SignerConfig): string;
|
|
34
|
+
export declare function createClientFromConfig(config: {
|
|
35
|
+
serverUrl: string;
|
|
36
|
+
apiKey: string;
|
|
37
|
+
}): {
|
|
38
|
+
client: HttpClient;
|
|
39
|
+
api: AgentaApi;
|
|
40
|
+
};
|
|
41
|
+
export declare function createSignerFromConfig(config: SignerConfig): Promise<ThresholdSigner>;
|
|
42
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAMvE,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAQD,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD;AAQD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM9D;AAMD,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,IAAI,CAIpD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAGnD;AAMD,wBAAgB,WAAW,IAAI,MAAM,EAAE,CAetC;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAc3D;AAMD,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,YAAY,CAO5D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAMzE;AAMD,MAAM,WAAW,YAAY;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACnB;AAMD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAMvE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAQlE;AAED,wBAAgB,iBAAiB,IAAI,YAAY,EAAE,CAalD;AAMD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAK7D;AAMD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IACtF,MAAM,EAAE,UAAU,CAAC;IACnB,GAAG,EAAE,SAAS,CAAC;CACf,CAIA;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAO3F"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, writeFileSync, } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { CGGMP24Scheme } from '@agentaos/engine';
|
|
5
|
+
import { AgentaApi, HttpClient, ThresholdSigner } from '@agentaos/sdk';
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// Paths
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
const CONFIG_DIR = join(homedir(), '.agenta');
|
|
10
|
+
export function getConfigDir() {
|
|
11
|
+
return CONFIG_DIR;
|
|
12
|
+
}
|
|
13
|
+
export function getSignerConfigPath(name) {
|
|
14
|
+
return join(CONFIG_DIR, 'signers', `${name}.json`);
|
|
15
|
+
}
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Name validation
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
const VALID_NAME_RE = /^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/;
|
|
20
|
+
export function validateSignerName(name) {
|
|
21
|
+
if (!name)
|
|
22
|
+
return 'Account name cannot be empty';
|
|
23
|
+
if (!VALID_NAME_RE.test(name)) {
|
|
24
|
+
return 'Must be 1-64 chars: letters, numbers, hyphens, underscores. Start with alphanumeric.';
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// Default signer
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
export function getDefaultSignerName() {
|
|
32
|
+
const p = join(CONFIG_DIR, '.default');
|
|
33
|
+
if (!existsSync(p))
|
|
34
|
+
return null;
|
|
35
|
+
return readFileSync(p, 'utf-8').trim() || null;
|
|
36
|
+
}
|
|
37
|
+
export function setDefaultSigner(name) {
|
|
38
|
+
ensureDir(CONFIG_DIR);
|
|
39
|
+
writeFileSync(join(CONFIG_DIR, '.default'), `${name}\n`, { mode: 0o600 });
|
|
40
|
+
}
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// List / resolve signers
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
export function listSigners() {
|
|
45
|
+
const dir = join(CONFIG_DIR, 'signers');
|
|
46
|
+
if (!existsSync(dir))
|
|
47
|
+
return [];
|
|
48
|
+
return readdirSync(dir)
|
|
49
|
+
.filter((f) => f.endsWith('.json') && !f.endsWith('.recovery.json'))
|
|
50
|
+
.map((f) => f.replace(/\.json$/, ''))
|
|
51
|
+
.filter((name) => {
|
|
52
|
+
try {
|
|
53
|
+
const raw = readFileSync(getSignerConfigPath(name), 'utf-8');
|
|
54
|
+
const config = JSON.parse(raw);
|
|
55
|
+
return typeof config.serverUrl === 'string' && typeof config.apiKey === 'string';
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
export function resolveSignerName(explicit) {
|
|
63
|
+
if (explicit)
|
|
64
|
+
return explicit;
|
|
65
|
+
const defaultName = getDefaultSignerName();
|
|
66
|
+
if (defaultName)
|
|
67
|
+
return defaultName;
|
|
68
|
+
const signers = listSigners();
|
|
69
|
+
if (signers.length === 1)
|
|
70
|
+
return signers[0];
|
|
71
|
+
if (signers.length === 0) {
|
|
72
|
+
throw new Error('No accounts configured. Run `agenta init` first.');
|
|
73
|
+
}
|
|
74
|
+
throw new Error(`Multiple accounts found: ${signers.join(', ')}.\nUse --signer <name> or run \`agenta init\` to set a default.`);
|
|
75
|
+
}
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
// Signer config I/O
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
export function loadSignerConfig(name) {
|
|
80
|
+
const signerName = resolveSignerName(name);
|
|
81
|
+
const p = getSignerConfigPath(signerName);
|
|
82
|
+
if (!existsSync(p)) {
|
|
83
|
+
throw new Error(`Account "${signerName}" not found. Run \`agenta init\` first.`);
|
|
84
|
+
}
|
|
85
|
+
return JSON.parse(readFileSync(p, 'utf-8'));
|
|
86
|
+
}
|
|
87
|
+
export function saveSignerConfig(name, config) {
|
|
88
|
+
ensureDir(join(CONFIG_DIR, 'signers'));
|
|
89
|
+
const p = getSignerConfigPath(name);
|
|
90
|
+
const tmp = `${p}.tmp`;
|
|
91
|
+
writeFileSync(tmp, JSON.stringify(config, null, '\t'), { mode: 0o600 });
|
|
92
|
+
renameSync(tmp, p);
|
|
93
|
+
}
|
|
94
|
+
function getRecoveryMetaPath(name) {
|
|
95
|
+
return join(CONFIG_DIR, 'signers', `${name}.recovery.json`);
|
|
96
|
+
}
|
|
97
|
+
export function saveRecoveryMeta(name, meta) {
|
|
98
|
+
ensureDir(join(CONFIG_DIR, 'signers'));
|
|
99
|
+
const p = getRecoveryMetaPath(name);
|
|
100
|
+
const tmp = `${p}.tmp`;
|
|
101
|
+
writeFileSync(tmp, JSON.stringify(meta, null, '\t'), { mode: 0o600 });
|
|
102
|
+
renameSync(tmp, p);
|
|
103
|
+
}
|
|
104
|
+
export function loadRecoveryMeta(name) {
|
|
105
|
+
const p = getRecoveryMetaPath(name);
|
|
106
|
+
if (!existsSync(p))
|
|
107
|
+
return null;
|
|
108
|
+
try {
|
|
109
|
+
return JSON.parse(readFileSync(p, 'utf-8'));
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
export function listRecoveryMetas() {
|
|
116
|
+
const dir = join(CONFIG_DIR, 'signers');
|
|
117
|
+
if (!existsSync(dir))
|
|
118
|
+
return [];
|
|
119
|
+
return readdirSync(dir)
|
|
120
|
+
.filter((f) => f.endsWith('.recovery.json'))
|
|
121
|
+
.map((f) => {
|
|
122
|
+
try {
|
|
123
|
+
return JSON.parse(readFileSync(join(dir, f), 'utf-8'));
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
})
|
|
129
|
+
.filter((m) => m !== null);
|
|
130
|
+
}
|
|
131
|
+
// ---------------------------------------------------------------------------
|
|
132
|
+
// Secret resolution
|
|
133
|
+
// ---------------------------------------------------------------------------
|
|
134
|
+
export function resolveApiSecret(config) {
|
|
135
|
+
if (config.apiSecret)
|
|
136
|
+
return config.apiSecret;
|
|
137
|
+
throw new Error('No API secret found in config. Run `agenta init` to reconfigure with your API Secret from AgentaOS.');
|
|
138
|
+
}
|
|
139
|
+
// ---------------------------------------------------------------------------
|
|
140
|
+
// Factories
|
|
141
|
+
// ---------------------------------------------------------------------------
|
|
142
|
+
export function createClientFromConfig(config) {
|
|
143
|
+
const client = new HttpClient({ baseUrl: config.serverUrl, apiKey: config.apiKey });
|
|
144
|
+
const api = new AgentaApi(client);
|
|
145
|
+
return { client, api };
|
|
146
|
+
}
|
|
147
|
+
export async function createSignerFromConfig(config) {
|
|
148
|
+
return ThresholdSigner.fromSecret({
|
|
149
|
+
apiSecret: resolveApiSecret(config),
|
|
150
|
+
serverUrl: config.serverUrl,
|
|
151
|
+
apiKey: config.apiKey,
|
|
152
|
+
scheme: new CGGMP24Scheme(),
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
// ---------------------------------------------------------------------------
|
|
156
|
+
// Internal
|
|
157
|
+
// ---------------------------------------------------------------------------
|
|
158
|
+
function ensureDir(dir) {
|
|
159
|
+
if (!existsSync(dir)) {
|
|
160
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export declare const ERC20_ABI: readonly [{
|
|
2
|
+
readonly name: "transfer";
|
|
3
|
+
readonly type: "function";
|
|
4
|
+
readonly inputs: readonly [{
|
|
5
|
+
readonly name: "to";
|
|
6
|
+
readonly type: "address";
|
|
7
|
+
}, {
|
|
8
|
+
readonly name: "amount";
|
|
9
|
+
readonly type: "uint256";
|
|
10
|
+
}];
|
|
11
|
+
readonly outputs: readonly [{
|
|
12
|
+
readonly type: "bool";
|
|
13
|
+
}];
|
|
14
|
+
readonly stateMutability: "nonpayable";
|
|
15
|
+
}, {
|
|
16
|
+
readonly name: "balanceOf";
|
|
17
|
+
readonly type: "function";
|
|
18
|
+
readonly inputs: readonly [{
|
|
19
|
+
readonly name: "account";
|
|
20
|
+
readonly type: "address";
|
|
21
|
+
}];
|
|
22
|
+
readonly outputs: readonly [{
|
|
23
|
+
readonly type: "uint256";
|
|
24
|
+
}];
|
|
25
|
+
readonly stateMutability: "view";
|
|
26
|
+
}, {
|
|
27
|
+
readonly name: "decimals";
|
|
28
|
+
readonly type: "function";
|
|
29
|
+
readonly inputs: readonly [];
|
|
30
|
+
readonly outputs: readonly [{
|
|
31
|
+
readonly type: "uint8";
|
|
32
|
+
}];
|
|
33
|
+
readonly stateMutability: "view";
|
|
34
|
+
}, {
|
|
35
|
+
readonly name: "symbol";
|
|
36
|
+
readonly type: "function";
|
|
37
|
+
readonly inputs: readonly [];
|
|
38
|
+
readonly outputs: readonly [{
|
|
39
|
+
readonly type: "string";
|
|
40
|
+
}];
|
|
41
|
+
readonly stateMutability: "view";
|
|
42
|
+
}];
|
|
43
|
+
//# sourceMappingURL=erc20-abi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"erc20-abi.d.ts","sourceRoot":"","sources":["../../src/lib/erc20-abi.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgCZ,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export const ERC20_ABI = [
|
|
2
|
+
{
|
|
3
|
+
name: 'transfer',
|
|
4
|
+
type: 'function',
|
|
5
|
+
inputs: [
|
|
6
|
+
{ name: 'to', type: 'address' },
|
|
7
|
+
{ name: 'amount', type: 'uint256' },
|
|
8
|
+
],
|
|
9
|
+
outputs: [{ type: 'bool' }],
|
|
10
|
+
stateMutability: 'nonpayable',
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
name: 'balanceOf',
|
|
14
|
+
type: 'function',
|
|
15
|
+
inputs: [{ name: 'account', type: 'address' }],
|
|
16
|
+
outputs: [{ type: 'uint256' }],
|
|
17
|
+
stateMutability: 'view',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: 'decimals',
|
|
21
|
+
type: 'function',
|
|
22
|
+
inputs: [],
|
|
23
|
+
outputs: [{ type: 'uint8' }],
|
|
24
|
+
stateMutability: 'view',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'symbol',
|
|
28
|
+
type: 'function',
|
|
29
|
+
inputs: [],
|
|
30
|
+
outputs: [{ type: 'string' }],
|
|
31
|
+
stateMutability: 'view',
|
|
32
|
+
},
|
|
33
|
+
];
|
|
34
|
+
//# sourceMappingURL=erc20-abi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"erc20-abi.js","sourceRoot":"","sources":["../../src/lib/erc20-abi.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG;IACxB;QACC,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE;YACP,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE;YAC/B,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;SACnC;QACD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC3B,eAAe,EAAE,YAAY;KAC7B;IACD;QACC,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC9B,eAAe,EAAE,MAAM;KACvB;IACD;QACC,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC5B,eAAe,EAAE,MAAM;KACvB;IACD;QACC,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC7B,eAAe,EAAE,MAAM;KACvB;CACQ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Matches MCP SDK's CallToolResult — index signature required by the Zod schema. */
|
|
2
|
+
interface ToolResult {
|
|
3
|
+
[key: string]: unknown;
|
|
4
|
+
content: Array<{
|
|
5
|
+
type: 'text';
|
|
6
|
+
text: string;
|
|
7
|
+
}>;
|
|
8
|
+
isError?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function formatError(error: unknown, prefix: string): ToolResult;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAOA,qFAAqF;AACrF,UAAU,UAAU;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAoBtE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { HttpClientError } from '@agentaos/sdk';
|
|
2
|
+
export function formatError(error, prefix) {
|
|
3
|
+
if (error instanceof HttpClientError && error.statusCode === 403) {
|
|
4
|
+
const lines = [`${prefix}: policy violation`];
|
|
5
|
+
try {
|
|
6
|
+
const body = JSON.parse(error.body);
|
|
7
|
+
if (body.violations?.length) {
|
|
8
|
+
lines.push('');
|
|
9
|
+
lines.push('Policy violations:');
|
|
10
|
+
for (const v of body.violations) {
|
|
11
|
+
lines.push(` - [${v.type}] ${v.reason}`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
lines.push(error.body);
|
|
17
|
+
}
|
|
18
|
+
return { content: [{ type: 'text', text: lines.join('\n') }], isError: true };
|
|
19
|
+
}
|
|
20
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
21
|
+
return { content: [{ type: 'text', text: `${prefix}: ${msg}` }], isError: true };
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAchD,MAAM,UAAU,WAAW,CAAC,KAAc,EAAE,MAAc;IACzD,IAAI,KAAK,YAAY,eAAe,IAAI,KAAK,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;QAClE,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,oBAAoB,CAAC,CAAC;QAC9C,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAuC,CAAC;YAC1E,IAAI,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;gBAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;gBACjC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBACjC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC3C,CAAC;YACF,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC/E,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,KAAK,GAAG,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAClF,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare function storeSession(token: string, serverUrl?: string, refreshToken?: string): Promise<void>;
|
|
2
|
+
export declare function getSession(): Promise<string | null>;
|
|
3
|
+
export declare function getRefreshToken(): Promise<string | null>;
|
|
4
|
+
export declare function deleteSession(): Promise<boolean>;
|
|
5
|
+
export declare function storeUserShare(signerName: string, shareBase64: string, target?: 'keychain' | 'file'): Promise<void>;
|
|
6
|
+
export declare function getUserShare(signerName: string): Promise<string | null>;
|
|
7
|
+
export declare function deleteUserShare(signerName: string): Promise<boolean>;
|
|
8
|
+
export declare function isKeychainAvailable(): Promise<boolean>;
|
|
9
|
+
/** Read the server URL stored alongside the session token (if present). */
|
|
10
|
+
export declare function getSessionServerUrl(): Promise<string | null>;
|
|
11
|
+
//# sourceMappingURL=keychain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain.d.ts","sourceRoot":"","sources":["../../src/lib/keychain.ts"],"names":[],"mappings":"AAyCA,wBAAsB,YAAY,CACjC,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAEzD;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE9D;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAEtD;AAMD,wBAAsB,cAAc,CACnC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,UAAU,GAAG,MAAmB,GACtC,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAS7E;AAED,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU1E;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAQ5D;AA8HD,2EAA2E;AAC3E,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CASlE"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from 'node:fs';
|
|
3
|
+
import { platform } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { getConfigDir } from './config.js';
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// macOS login keychain via `security` CLI
|
|
8
|
+
//
|
|
9
|
+
// Same pattern as: gh (GitHub CLI), aws-vault, docker credential helper.
|
|
10
|
+
// Uses the default (login) keychain — auto-unlocked on user login.
|
|
11
|
+
//
|
|
12
|
+
// We store with -T '' (empty trusted-app list) so macOS prompts the user
|
|
13
|
+
// on every keychain read. On Macs with Touch ID this triggers biometric;
|
|
14
|
+
// on Mac Mini / headless it shows a password dialog.
|
|
15
|
+
//
|
|
16
|
+
// If the keychain read fails (headless SSH without GUI, locked keychain),
|
|
17
|
+
// getUserShare() falls through to the .user-share file fallback.
|
|
18
|
+
// During `agenta init`, headless users should pick "Local file" storage.
|
|
19
|
+
//
|
|
20
|
+
// For SSH sessions: `security unlock-keychain` once per session, then
|
|
21
|
+
// the approval dialog still fires per-item access (because -T '').
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
const SERVICE_NAME = 'agenta';
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// Session (JWT) storage
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// Session tokens use file storage only (~/.agenta/session.json, 0600).
|
|
28
|
+
// No keychain — a short-lived JWT doesn't need biometric protection,
|
|
29
|
+
// and keychain prompts add unnecessary friction for admin ops.
|
|
30
|
+
export async function storeSession(token, serverUrl, refreshToken) {
|
|
31
|
+
storeSessionToFile(token, serverUrl, refreshToken);
|
|
32
|
+
}
|
|
33
|
+
export async function getSession() {
|
|
34
|
+
return loadSessionFromFile();
|
|
35
|
+
}
|
|
36
|
+
export async function getRefreshToken() {
|
|
37
|
+
return loadRefreshTokenFromFile();
|
|
38
|
+
}
|
|
39
|
+
export async function deleteSession() {
|
|
40
|
+
return deleteSessionFile();
|
|
41
|
+
}
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Public API — User Shares
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
export async function storeUserShare(signerName, shareBase64, target = 'keychain') {
|
|
46
|
+
if (target === 'keychain') {
|
|
47
|
+
macKeychainSet(signerName, shareBase64);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
storeUserShareToFile(signerName, shareBase64);
|
|
51
|
+
}
|
|
52
|
+
export async function getUserShare(signerName) {
|
|
53
|
+
if (isMacOS()) {
|
|
54
|
+
try {
|
|
55
|
+
return macKeychainGet(signerName);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// Keychain locked, headless, or user denied → fall through to file
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return loadUserShareFromFile(signerName);
|
|
62
|
+
}
|
|
63
|
+
export async function deleteUserShare(signerName) {
|
|
64
|
+
if (isMacOS()) {
|
|
65
|
+
try {
|
|
66
|
+
macKeychainDelete(signerName);
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// fall through to file
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return deleteUserShareFile(signerName);
|
|
74
|
+
}
|
|
75
|
+
export async function isKeychainAvailable() {
|
|
76
|
+
if (!isMacOS())
|
|
77
|
+
return false;
|
|
78
|
+
try {
|
|
79
|
+
execFileSync('security', ['help'], { stdio: 'ignore' });
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
// macOS Keychain
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
function isMacOS() {
|
|
90
|
+
return platform() === 'darwin';
|
|
91
|
+
}
|
|
92
|
+
function macKeychainSet(account, secret) {
|
|
93
|
+
// -U = upsert (update if exists, add if not). Atomic, no delete-then-add race.
|
|
94
|
+
// -T '' = empty trusted-app list → forces Touch ID / password on every read.
|
|
95
|
+
// Used for user shares (signing keys) — biometric gate for fund movement.
|
|
96
|
+
// -j = comment shown in Keychain Access.app for user clarity.
|
|
97
|
+
execFileSync('security', [
|
|
98
|
+
'add-generic-password',
|
|
99
|
+
'-U',
|
|
100
|
+
'-s',
|
|
101
|
+
SERVICE_NAME,
|
|
102
|
+
'-a',
|
|
103
|
+
account,
|
|
104
|
+
'-w',
|
|
105
|
+
secret,
|
|
106
|
+
'-T',
|
|
107
|
+
'',
|
|
108
|
+
'-j',
|
|
109
|
+
'AgentaOS signing key',
|
|
110
|
+
], { stdio: 'ignore' });
|
|
111
|
+
}
|
|
112
|
+
function macKeychainGet(account) {
|
|
113
|
+
try {
|
|
114
|
+
const result = execFileSync('security', ['find-generic-password', '-s', SERVICE_NAME, '-a', account, '-w'], { encoding: 'utf-8' });
|
|
115
|
+
return result.trim() || null;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function macKeychainDelete(account) {
|
|
122
|
+
execFileSync('security', ['delete-generic-password', '-s', SERVICE_NAME, '-a', account], {
|
|
123
|
+
stdio: 'ignore',
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
// ---------------------------------------------------------------------------
|
|
127
|
+
// File-based fallback (Linux / Windows / CI / headless SSH)
|
|
128
|
+
// ---------------------------------------------------------------------------
|
|
129
|
+
function getUserShareFilePath(signerName) {
|
|
130
|
+
return join(getConfigDir(), 'signers', `${signerName}.user-share`);
|
|
131
|
+
}
|
|
132
|
+
function storeUserShareToFile(signerName, shareBase64) {
|
|
133
|
+
const p = getUserShareFilePath(signerName);
|
|
134
|
+
const tmpPath = `${p}.tmp`;
|
|
135
|
+
writeFileSync(tmpPath, shareBase64, { mode: 0o600 });
|
|
136
|
+
renameSync(tmpPath, p);
|
|
137
|
+
}
|
|
138
|
+
function loadUserShareFromFile(signerName) {
|
|
139
|
+
const p = getUserShareFilePath(signerName);
|
|
140
|
+
if (!existsSync(p))
|
|
141
|
+
return null;
|
|
142
|
+
return readFileSync(p, 'utf-8').trim();
|
|
143
|
+
}
|
|
144
|
+
function deleteUserShareFile(signerName) {
|
|
145
|
+
const p = getUserShareFilePath(signerName);
|
|
146
|
+
if (!existsSync(p))
|
|
147
|
+
return false;
|
|
148
|
+
unlinkSync(p);
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
// ---------------------------------------------------------------------------
|
|
152
|
+
// File-based session fallback
|
|
153
|
+
// ---------------------------------------------------------------------------
|
|
154
|
+
function getSessionFilePath() {
|
|
155
|
+
return join(getConfigDir(), 'session.json');
|
|
156
|
+
}
|
|
157
|
+
function storeSessionToFile(token, serverUrl, refreshToken) {
|
|
158
|
+
const dir = getConfigDir();
|
|
159
|
+
if (!existsSync(dir)) {
|
|
160
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
161
|
+
}
|
|
162
|
+
const p = getSessionFilePath();
|
|
163
|
+
const tmpPath = `${p}.tmp`;
|
|
164
|
+
const payload = { token, createdAt: new Date().toISOString() };
|
|
165
|
+
if (serverUrl)
|
|
166
|
+
payload.serverUrl = serverUrl;
|
|
167
|
+
if (refreshToken)
|
|
168
|
+
payload.refreshToken = refreshToken;
|
|
169
|
+
writeFileSync(tmpPath, JSON.stringify(payload), { mode: 0o600 });
|
|
170
|
+
renameSync(tmpPath, p);
|
|
171
|
+
}
|
|
172
|
+
function loadSessionFromFile() {
|
|
173
|
+
const p = getSessionFilePath();
|
|
174
|
+
if (!existsSync(p))
|
|
175
|
+
return null;
|
|
176
|
+
try {
|
|
177
|
+
const data = JSON.parse(readFileSync(p, 'utf-8'));
|
|
178
|
+
return data.token ?? null;
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
function loadRefreshTokenFromFile() {
|
|
185
|
+
const p = getSessionFilePath();
|
|
186
|
+
if (!existsSync(p))
|
|
187
|
+
return null;
|
|
188
|
+
try {
|
|
189
|
+
const data = JSON.parse(readFileSync(p, 'utf-8'));
|
|
190
|
+
return data.refreshToken ?? null;
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/** Read the server URL stored alongside the session token (if present). */
|
|
197
|
+
export async function getSessionServerUrl() {
|
|
198
|
+
const p = getSessionFilePath();
|
|
199
|
+
if (!existsSync(p))
|
|
200
|
+
return null;
|
|
201
|
+
try {
|
|
202
|
+
const data = JSON.parse(readFileSync(p, 'utf-8'));
|
|
203
|
+
return data.serverUrl ?? null;
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
function deleteSessionFile() {
|
|
210
|
+
const p = getSessionFilePath();
|
|
211
|
+
if (!existsSync(p))
|
|
212
|
+
return false;
|
|
213
|
+
unlinkSync(p);
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=keychain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../src/lib/keychain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Policy conversion utilities for the CLI.
|
|
3
|
+
* Mirrors the app's policy-builder/conversions.ts but for CLI use.
|
|
4
|
+
*/
|
|
5
|
+
export type FormValues = Record<string, Record<string, unknown>>;
|
|
6
|
+
export type EnabledMap = Record<string, boolean>;
|
|
7
|
+
/**
|
|
8
|
+
* Convert form state → PolicyRule[] for the API.
|
|
9
|
+
* Reject rules first, then one accept rule with all AND'd criteria.
|
|
10
|
+
*/
|
|
11
|
+
export declare function buildRules(values: FormValues, enabled: EnabledMap): Record<string, unknown>[];
|
|
12
|
+
/**
|
|
13
|
+
* Parse a PolicyRule[] back to form state.
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseFormValues(rules: Record<string, unknown>[]): {
|
|
16
|
+
values: FormValues;
|
|
17
|
+
enabled: EnabledMap;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=policy-conversions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-conversions.d.ts","sourceRoot":"","sources":["../../src/lib/policy-conversions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AACjE,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CA4B7F;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG;IAClE,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,UAAU,CAAC;CACpB,CA2BA"}
|