@palmyr/cli 1.0.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 (47) hide show
  1. package/README.md +731 -0
  2. package/dist/admin-auth.d.ts +1 -0
  3. package/dist/admin-auth.js +52 -0
  4. package/dist/admin-auth.js.map +1 -0
  5. package/dist/app.d.ts +182 -0
  6. package/dist/app.js +218 -0
  7. package/dist/app.js.map +1 -0
  8. package/dist/cli.d.ts +2 -0
  9. package/dist/cli.js +3495 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/compute-ssh.d.ts +246 -0
  12. package/dist/compute-ssh.js +577 -0
  13. package/dist/compute-ssh.js.map +1 -0
  14. package/dist/config.d.ts +46 -0
  15. package/dist/config.js +183 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/credential-store.d.ts +4 -0
  18. package/dist/credential-store.js +180 -0
  19. package/dist/credential-store.js.map +1 -0
  20. package/dist/mascot-data.d.ts +1 -0
  21. package/dist/mascot-data.js +14 -0
  22. package/dist/mascot-data.js.map +1 -0
  23. package/dist/pay.d.ts +60 -0
  24. package/dist/pay.js +483 -0
  25. package/dist/pay.js.map +1 -0
  26. package/dist/sdk.d.ts +259 -0
  27. package/dist/sdk.js +944 -0
  28. package/dist/sdk.js.map +1 -0
  29. package/dist/social-queue.d.ts +125 -0
  30. package/dist/social-queue.js +340 -0
  31. package/dist/social-queue.js.map +1 -0
  32. package/dist/social-vault.d.ts +118 -0
  33. package/dist/social-vault.js +268 -0
  34. package/dist/social-vault.js.map +1 -0
  35. package/dist/social-worker.d.ts +43 -0
  36. package/dist/social-worker.js +155 -0
  37. package/dist/social-worker.js.map +1 -0
  38. package/dist/totp.d.ts +2 -0
  39. package/dist/totp.js +46 -0
  40. package/dist/totp.js.map +1 -0
  41. package/dist/ui.d.ts +77 -0
  42. package/dist/ui.js +441 -0
  43. package/dist/ui.js.map +1 -0
  44. package/dist/vault.d.ts +65 -0
  45. package/dist/vault.js +455 -0
  46. package/dist/vault.js.map +1 -0
  47. package/package.json +75 -0
package/dist/config.js ADDED
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Palmyr local config + data management
3
+ * Everything lives in ~/.palmyr/
4
+ */
5
+ import { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync, unlinkSync, statSync, renameSync } from 'fs';
6
+ import { join } from 'path';
7
+ import { homedir } from 'os';
8
+ const HOME = join(homedir(), '.palmyr');
9
+ // One-time migration: rename legacy ~/.agentos/ → ~/.palmyr/ on first run after rebrand.
10
+ const LEGACY_HOME = join(homedir(), '.agentos');
11
+ if (existsSync(LEGACY_HOME) && !existsSync(HOME)) {
12
+ try {
13
+ renameSync(LEGACY_HOME, HOME);
14
+ process.stderr.write(`migrated config dir: ${LEGACY_HOME} → ${HOME}\n`);
15
+ }
16
+ catch (e) {
17
+ process.stderr.write(`warning: could not migrate ${LEGACY_HOME} → ${HOME}: ${e.message}\n`);
18
+ }
19
+ }
20
+ // Directory structure
21
+ const DIRS = {
22
+ root: HOME,
23
+ data: join(HOME, 'data'),
24
+ logs: join(HOME, 'logs'),
25
+ drafts: join(HOME, 'drafts'),
26
+ memory: join(HOME, 'memory'),
27
+ };
28
+ const LOG_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000; // 30 days
29
+ export function ensureDirs() {
30
+ for (const dir of Object.values(DIRS)) {
31
+ if (!existsSync(dir))
32
+ mkdirSync(dir, { recursive: true });
33
+ }
34
+ // Prune log files older than 30 days
35
+ try {
36
+ const now = Date.now();
37
+ for (const f of readdirSync(DIRS.logs).filter(f => f.endsWith('.log'))) {
38
+ const fpath = join(DIRS.logs, f);
39
+ if (now - statSync(fpath).mtimeMs > LOG_MAX_AGE_MS) {
40
+ unlinkSync(fpath);
41
+ }
42
+ }
43
+ }
44
+ catch { }
45
+ }
46
+ const CONFIG_PATH = join(HOME, 'config.json');
47
+ const DEFAULT_CONFIG = {
48
+ api: 'https://palmyr.ai',
49
+ wallets: {},
50
+ defaultChain: 'solana',
51
+ };
52
+ export function loadConfig() {
53
+ if (!existsSync(CONFIG_PATH))
54
+ return DEFAULT_CONFIG;
55
+ try {
56
+ const raw = JSON.parse(readFileSync(CONFIG_PATH, 'utf8'));
57
+ // Migrate legacy single-keyfile config
58
+ if (raw.keyfile && !raw.wallets) {
59
+ const chain = raw.chain || 'solana';
60
+ raw.wallets = { [chain]: { keyfile: raw.keyfile } };
61
+ raw.defaultChain = chain;
62
+ delete raw.keyfile;
63
+ delete raw.chain;
64
+ }
65
+ return { ...DEFAULT_CONFIG, ...raw };
66
+ }
67
+ catch {
68
+ return DEFAULT_CONFIG;
69
+ }
70
+ }
71
+ export function saveConfig(config) {
72
+ ensureDirs();
73
+ writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));
74
+ }
75
+ export function addWalletToConfig(chain, keyfile) {
76
+ const config = loadConfig();
77
+ if (!config.wallets)
78
+ config.wallets = {};
79
+ config.wallets[chain] = { keyfile: keyfile.replace(homedir(), '~') };
80
+ if (!config.setupDone)
81
+ config.defaultChain = chain;
82
+ config.setupDone = true;
83
+ saveConfig(config);
84
+ }
85
+ // ── Credentials ──
86
+ export function getKeyfile(chain) {
87
+ const config = loadConfig();
88
+ const targetChain = chain || config.defaultChain || 'solana';
89
+ // Priority: env var > config wallet > default locations
90
+ if (process.env.PALMYR_KEYFILE)
91
+ return process.env.PALMYR_KEYFILE;
92
+ const walletConfig = config.wallets?.[targetChain];
93
+ if (walletConfig?.keyfile) {
94
+ const resolved = walletConfig.keyfile.replace('~', homedir());
95
+ if (existsSync(resolved))
96
+ return resolved;
97
+ }
98
+ // Default Solana location
99
+ if (targetChain === 'solana') {
100
+ const defaultSol = join(homedir(), '.config', 'solana', 'id.json');
101
+ if (existsSync(defaultSol))
102
+ return defaultSol;
103
+ }
104
+ return null;
105
+ }
106
+ export function loadKeypair(chain) {
107
+ const path = getKeyfile(chain);
108
+ if (!path)
109
+ return null;
110
+ try {
111
+ const data = JSON.parse(readFileSync(path, 'utf8'));
112
+ return Uint8Array.from(data);
113
+ }
114
+ catch {
115
+ return null;
116
+ }
117
+ }
118
+ export function getConfiguredChains() {
119
+ const config = loadConfig();
120
+ return Object.keys(config.wallets || {});
121
+ }
122
+ // ── Data Store (small JSON files) ──
123
+ function dataPath(file) { return join(DIRS.data, file); }
124
+ export function getData(file) {
125
+ const p = dataPath(file);
126
+ if (!existsSync(p))
127
+ return null;
128
+ try {
129
+ return JSON.parse(readFileSync(p, 'utf8'));
130
+ }
131
+ catch {
132
+ return null;
133
+ }
134
+ }
135
+ export function setData(file, data) {
136
+ ensureDirs();
137
+ writeFileSync(dataPath(file), JSON.stringify(data, null, 2));
138
+ }
139
+ // Helpers for common data
140
+ export function getPhones() { return getData('phones.json') || []; }
141
+ export function addPhone(phone) { const p = getPhones(); p.push(phone); setData('phones.json', p); }
142
+ export function getInboxes() { return getData('inboxes.json') || []; }
143
+ export function addInbox(inbox) { const i = getInboxes(); i.push(inbox); setData('inboxes.json', i); }
144
+ export function getServers() { return getData('servers.json') || []; }
145
+ export function addServer(server) { const s = getServers(); s.push(server); setData('servers.json', s); }
146
+ export function getDomains() { return getData('domains.json') || []; }
147
+ export function addDomain(domain) { const d = getDomains(); d.push(domain); setData('domains.json', d); }
148
+ export function getAccounts() { return getData('accounts.json') || []; }
149
+ export function addAccount(account) { const a = getAccounts(); a.push(account); setData('accounts.json', a); }
150
+ // ── Drafts ──
151
+ export function saveDraft(id, draft) {
152
+ ensureDirs();
153
+ writeFileSync(join(DIRS.drafts, `${id}.json`), JSON.stringify(draft, null, 2));
154
+ }
155
+ export function getDraft(id) {
156
+ const p = join(DIRS.drafts, `${id}.json`);
157
+ if (!existsSync(p))
158
+ return null;
159
+ try {
160
+ return JSON.parse(readFileSync(p, 'utf8'));
161
+ }
162
+ catch {
163
+ return null;
164
+ }
165
+ }
166
+ // ── Memory ──
167
+ export function addNote(note) {
168
+ ensureDirs();
169
+ const p = join(DIRS.memory, 'notes.md');
170
+ const existing = existsSync(p) ? readFileSync(p, 'utf8') : '';
171
+ const timestamp = new Date().toISOString();
172
+ writeFileSync(p, existing + `\n- [${timestamp}] ${note}`);
173
+ }
174
+ // ── Logging ──
175
+ export function log(message) {
176
+ ensureDirs();
177
+ const date = new Date().toISOString().split('T')[0];
178
+ const p = join(DIRS.logs, `${date}.log`);
179
+ const existing = existsSync(p) ? readFileSync(p, 'utf8') : '';
180
+ const timestamp = new Date().toISOString();
181
+ writeFileSync(p, existing + `[${timestamp}] ${message}\n`);
182
+ }
183
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function isCredentialStoreAvailable(): boolean;
2
+ export declare function storeSecret(account: string, secret: string): void;
3
+ export declare function retrieveSecret(account: string): string | null;
4
+ export declare function deleteSecret(account: string): void;
@@ -0,0 +1,180 @@
1
+ /**
2
+ * OS credential store — CLI-side module for protecting wallet session secrets.
3
+ *
4
+ * Windows: DPAPI via PowerShell (encrypted blob at ~/.palmyr/secrets/<id>.dpapi)
5
+ * macOS: Keychain via `security` CLI
6
+ * Linux: Secret Service via `secret-tool` CLI
7
+ *
8
+ * Security: All inputs are validated as hex-only before use. All OS commands
9
+ * use execFileSync/spawnSync with argument arrays — never shell interpolation.
10
+ */
11
+ import { execFileSync, spawnSync } from 'child_process';
12
+ import { existsSync, mkdirSync, unlinkSync } from 'fs';
13
+ import { join } from 'path';
14
+ import { homedir } from 'os';
15
+ const SECRETS_DIR = join(homedir(), '.palmyr', 'secrets');
16
+ const SERVICE = 'palmyr-wallet';
17
+ const HEX_RE = /^[0-9a-f]+$/i;
18
+ function ensureSecretsDir() {
19
+ if (!existsSync(SECRETS_DIR))
20
+ mkdirSync(SECRETS_DIR, { recursive: true });
21
+ }
22
+ function dpapiPath(account) {
23
+ return join(SECRETS_DIR, `${account}.dpapi`);
24
+ }
25
+ function assertHex(value, label) {
26
+ if (!value || !HEX_RE.test(value)) {
27
+ throw new Error(`${label} must be a non-empty hex string, got: ${typeof value === 'string' ? value.slice(0, 20) : typeof value}`);
28
+ }
29
+ }
30
+ function platform() {
31
+ const p = process.platform;
32
+ if (p === 'win32' || p === 'darwin')
33
+ return p;
34
+ return 'linux';
35
+ }
36
+ // ─── Windows (DPAPI) ───
37
+ function storeWindows(account, secret) {
38
+ ensureSecretsDir();
39
+ const outPath = dpapiPath(account);
40
+ const script = [
41
+ 'Add-Type -AssemblyName System.Security',
42
+ `$bytes = [System.Text.Encoding]::UTF8.GetBytes('${secret}')`,
43
+ '$enc = [System.Security.Cryptography.ProtectedData]::Protect($bytes, $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser)',
44
+ `[System.IO.File]::WriteAllBytes('${outPath.replace(/\\/g, '\\\\')}', $enc)`,
45
+ ].join('; ');
46
+ execFileSync('powershell.exe', ['-NoProfile', '-Command', script], { stdio: 'ignore', timeout: 10000 });
47
+ }
48
+ function retrieveWindows(account) {
49
+ const fpath = dpapiPath(account);
50
+ if (!existsSync(fpath))
51
+ return null;
52
+ const script = [
53
+ 'Add-Type -AssemblyName System.Security',
54
+ `$enc = [System.IO.File]::ReadAllBytes('${fpath.replace(/\\/g, '\\\\')}')`,
55
+ '$dec = [System.Security.Cryptography.ProtectedData]::Unprotect($enc, $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser)',
56
+ '[System.Text.Encoding]::UTF8.GetString($dec)',
57
+ ].join('; ');
58
+ try {
59
+ return execFileSync('powershell.exe', ['-NoProfile', '-Command', script], { encoding: 'utf8', timeout: 10000 }).trim();
60
+ }
61
+ catch {
62
+ return null;
63
+ }
64
+ }
65
+ function deleteWindows(account) {
66
+ const fpath = dpapiPath(account);
67
+ if (existsSync(fpath))
68
+ unlinkSync(fpath);
69
+ }
70
+ // ─── macOS (Keychain) ───
71
+ function storeMac(account, secret) {
72
+ try {
73
+ execFileSync('security', ['delete-generic-password', '-s', SERVICE, '-a', account], { stdio: 'ignore' });
74
+ }
75
+ catch { }
76
+ execFileSync('security', ['add-generic-password', '-s', SERVICE, '-a', account, '-w', secret], { stdio: 'ignore', timeout: 5000 });
77
+ }
78
+ function retrieveMac(account) {
79
+ try {
80
+ return execFileSync('security', ['find-generic-password', '-s', SERVICE, '-a', account, '-w'], { encoding: 'utf8', timeout: 5000 }).trim();
81
+ }
82
+ catch {
83
+ return null;
84
+ }
85
+ }
86
+ function deleteMac(account) {
87
+ try {
88
+ execFileSync('security', ['delete-generic-password', '-s', SERVICE, '-a', account], { stdio: 'ignore' });
89
+ }
90
+ catch { }
91
+ }
92
+ // ─── Linux (secret-tool) ───
93
+ function storeLinux(account, secret) {
94
+ const result = spawnSync('secret-tool', ['store', `--label=${SERVICE}`, 'service', SERVICE, 'account', account], {
95
+ input: secret,
96
+ stdio: ['pipe', 'ignore', 'ignore'],
97
+ timeout: 5000,
98
+ });
99
+ if (result.status !== 0) {
100
+ throw new Error(`secret-tool store failed with exit code ${result.status}`);
101
+ }
102
+ }
103
+ function retrieveLinux(account) {
104
+ try {
105
+ return execFileSync('secret-tool', ['lookup', 'service', SERVICE, 'account', account], { encoding: 'utf8', timeout: 5000 }).trim();
106
+ }
107
+ catch {
108
+ return null;
109
+ }
110
+ }
111
+ function deleteLinux(account) {
112
+ try {
113
+ execFileSync('secret-tool', ['clear', 'service', SERVICE, 'account', account], { stdio: 'ignore' });
114
+ }
115
+ catch { }
116
+ }
117
+ // ─── Public API ───
118
+ export function isCredentialStoreAvailable() {
119
+ const p = platform();
120
+ try {
121
+ if (p === 'win32') {
122
+ execFileSync('powershell.exe', ['-NoProfile', '-Command', 'Add-Type -AssemblyName System.Security'], { stdio: 'ignore', timeout: 5000 });
123
+ return true;
124
+ }
125
+ if (p === 'darwin') {
126
+ execFileSync('which', ['security'], { stdio: 'ignore', timeout: 2000 });
127
+ return true;
128
+ }
129
+ execFileSync('which', ['secret-tool'], { stdio: 'ignore', timeout: 2000 });
130
+ return true;
131
+ }
132
+ catch {
133
+ return false;
134
+ }
135
+ }
136
+ export function storeSecret(account, secret) {
137
+ assertHex(account, 'account');
138
+ assertHex(secret, 'secret');
139
+ const p = platform();
140
+ try {
141
+ if (p === 'win32')
142
+ return storeWindows(account, secret);
143
+ if (p === 'darwin')
144
+ return storeMac(account, secret);
145
+ return storeLinux(account, secret);
146
+ }
147
+ catch (err) {
148
+ throw new Error(`Failed to store secret in OS credential store (${p}): ${err.message}. ` +
149
+ `Your wallet key cannot be stored securely. On Windows, ensure PowerShell and DPAPI are available. ` +
150
+ `On macOS, ensure the 'security' command works. On Linux, install 'secret-tool'.`);
151
+ }
152
+ }
153
+ export function retrieveSecret(account) {
154
+ assertHex(account, 'account');
155
+ const p = platform();
156
+ try {
157
+ if (p === 'win32')
158
+ return retrieveWindows(account);
159
+ if (p === 'darwin')
160
+ return retrieveMac(account);
161
+ return retrieveLinux(account);
162
+ }
163
+ catch {
164
+ return null;
165
+ }
166
+ }
167
+ export function deleteSecret(account) {
168
+ assertHex(account, 'account');
169
+ const p = platform();
170
+ try {
171
+ if (p === 'win32')
172
+ deleteWindows(account);
173
+ else if (p === 'darwin')
174
+ deleteMac(account);
175
+ else
176
+ deleteLinux(account);
177
+ }
178
+ catch { }
179
+ }
180
+ //# sourceMappingURL=credential-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-store.js","sourceRoot":"","sources":["../credential-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const MASCOT_STIPPLE: string[];
@@ -0,0 +1,14 @@
1
+ // Braille mascot: clean round eyes (no dots), original cheeky smile kept
2
+ export const MASCOT_STIPPLE = [
3
+ "⠀⠀⠀⢀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⡀⠀⠀⠀",
4
+ "⠀⠀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠀",
5
+ "⠀⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⠀",
6
+ "⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀",
7
+ "⠀⣿⣿⣿⣿⠀⠀⠀⣿⣿⣿⣿⠀⠀⠀⣿⣿⣿⣿⠀",
8
+ "⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀",
9
+ "⠀⣿⣿⣿⣿⣿⡿⢻⣿⣿⣿⣿⡟⢿⣿⣿⣿⣿⣿⠀",
10
+ "⠀⣿⣿⣿⣿⣿⣿⣧⣍⣛⣛⣩⣼⣿⣿⣿⣿⣿⣿⠀",
11
+ "⠀⢉⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡉⠀",
12
+ "⠀⠀⠘⠻⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠟⠃⠀⠀",
13
+ ];
14
+ //# sourceMappingURL=mascot-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mascot-data.js","sourceRoot":"","sources":["../mascot-data.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,MAAM,CAAC,MAAM,cAAc,GAAa;IACtC,sBAAsB;IACtB,sBAAsB;IACtB,sBAAsB;IACtB,sBAAsB;IACtB,sBAAsB;IACtB,sBAAsB;IACtB,sBAAsB;IACtB,sBAAsB;IACtB,sBAAsB;IACtB,sBAAsB;CACvB,CAAC"}
package/dist/pay.d.ts ADDED
@@ -0,0 +1,60 @@
1
+ /**
2
+ * x402 payment handler for Palmyr CLI
3
+ * Supports both Solana (SPL USDC transfer) and Base/EVM (EIP-3009 TransferWithAuthorization).
4
+ * Both flows are gasless: the server/facilitator absorbs chain fees.
5
+ */
6
+ /**
7
+ * A single PaymentRequirements entry from the 402 response (one per chain).
8
+ * Keeps the full server-supplied object so it can be echoed back verbatim
9
+ * in the PaymentPayload's `accepted` field — the canonical x402 v2 client
10
+ * (`@x402/core/client/createPaymentPayload`) and the CDP facilitator's zod
11
+ * validators both reject a stubbed `{ scheme, network }`.
12
+ */
13
+ interface PaymentOption {
14
+ amount: bigint;
15
+ payTo: string;
16
+ feePayer: string;
17
+ asset: string;
18
+ network: string;
19
+ /** Full PaymentRequirements object — echo this into `paymentPayload.accepted`. */
20
+ requirements: Record<string, any>;
21
+ }
22
+ /**
23
+ * Parse a 402 response. Returns available payment options by chain plus the
24
+ * top-level `resource` block so callers can echo it into the PaymentPayload.
25
+ */
26
+ export declare function parsePaymentRequired(data: any): {
27
+ solana: PaymentOption | null;
28
+ base: PaymentOption | null;
29
+ resource: any;
30
+ extensions: any;
31
+ };
32
+ /**
33
+ * Build and partially sign a USDC transfer transaction for x402 payment.
34
+ * Uses raw keypair for transaction building (needed for multi-instruction Solana txs).
35
+ */
36
+ export declare function buildPaymentTransaction(payTo: string, amount: bigint, feePayer: string, walletId?: string, passphrase?: string): Promise<{
37
+ transaction: string;
38
+ payer: string;
39
+ } | null>;
40
+ /**
41
+ * Like paidRequest, but returns the raw Response from the final paid call
42
+ * so the caller can consume a streaming body (e.g. text/event-stream for i402).
43
+ *
44
+ * The probe request is always issued without a payment header to elicit the
45
+ * server's 402 with proper payment-required metadata — this lets the server
46
+ * advertise the exact amount due (critical for i402 /chat/:id/execute which
47
+ * charges plan.total_cost_usdc rather than a fixed fee).
48
+ */
49
+ export declare function paidStreamRequest(api: string, method: string, path: string, body?: Record<string, unknown>, passphrase?: string): Promise<{
50
+ response: Response;
51
+ paid: boolean;
52
+ amountUsdc: number;
53
+ payer?: string;
54
+ }>;
55
+ export declare function paidRequest(api: string, method: string, path: string, body?: Record<string, unknown>, passphrase?: string, attempt?: number): Promise<{
56
+ data: any;
57
+ paid: boolean;
58
+ txHash?: string;
59
+ }>;
60
+ export {};