@agentsmarket/cli 0.1.1 → 0.5.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 (81) hide show
  1. package/README.md +1455 -44
  2. package/dist/commands/balance.js +3 -3
  3. package/dist/commands/call.d.ts +23 -1
  4. package/dist/commands/call.js +187 -45
  5. package/dist/commands/call.js.map +1 -1
  6. package/dist/commands/info.d.ts +6 -6
  7. package/dist/commands/info.js +33 -35
  8. package/dist/commands/info.js.map +1 -1
  9. package/dist/commands/init.d.ts +11 -7
  10. package/dist/commands/init.js +36 -38
  11. package/dist/commands/init.js.map +1 -1
  12. package/dist/commands/install.js +2 -2
  13. package/dist/commands/mcp.js +9 -11
  14. package/dist/commands/mcp.js.map +1 -1
  15. package/dist/commands/pipeline/call.d.ts +18 -0
  16. package/dist/commands/pipeline/call.js +58 -0
  17. package/dist/commands/pipeline/call.js.map +1 -0
  18. package/dist/commands/pipeline/install.d.ts +7 -0
  19. package/dist/commands/pipeline/install.js +16 -0
  20. package/dist/commands/pipeline/install.js.map +1 -0
  21. package/dist/commands/pipeline/publish.d.ts +15 -0
  22. package/dist/commands/pipeline/publish.js +22 -0
  23. package/dist/commands/pipeline/publish.js.map +1 -0
  24. package/dist/commands/publish-openapi.d.ts +16 -0
  25. package/dist/commands/publish-openapi.js +61 -0
  26. package/dist/commands/publish-openapi.js.map +1 -0
  27. package/dist/commands/publish-pipeline.d.ts +15 -0
  28. package/dist/commands/publish-pipeline.js +141 -0
  29. package/dist/commands/publish-pipeline.js.map +1 -0
  30. package/dist/commands/publish.js +37 -42
  31. package/dist/commands/publish.js.map +1 -1
  32. package/dist/commands/refund.js +15 -17
  33. package/dist/commands/refund.js.map +1 -1
  34. package/dist/commands/register.js +6 -27
  35. package/dist/commands/register.js.map +1 -1
  36. package/dist/commands/run.d.ts +31 -0
  37. package/dist/commands/run.js +305 -0
  38. package/dist/commands/run.js.map +1 -0
  39. package/dist/commands/scan.js +2 -5
  40. package/dist/commands/scan.js.map +1 -1
  41. package/dist/commands/search.js +1 -1
  42. package/dist/commands/skill/call.d.ts +12 -0
  43. package/dist/commands/skill/call.js +17 -0
  44. package/dist/commands/skill/call.js.map +1 -0
  45. package/dist/commands/skill/install.d.ts +7 -0
  46. package/dist/commands/skill/install.js +13 -0
  47. package/dist/commands/skill/install.js.map +1 -0
  48. package/dist/commands/skill/publish.d.ts +18 -0
  49. package/dist/commands/skill/publish.js +28 -0
  50. package/dist/commands/skill/publish.js.map +1 -0
  51. package/dist/commands/validate.d.ts +20 -0
  52. package/dist/commands/validate.js +91 -0
  53. package/dist/commands/validate.js.map +1 -0
  54. package/dist/index.d.ts +4 -6
  55. package/dist/index.js +90 -29
  56. package/dist/index.js.map +1 -1
  57. package/dist/lib/config.d.ts +12 -13
  58. package/dist/lib/config.js +27 -27
  59. package/dist/lib/config.js.map +1 -1
  60. package/dist/lib/http.d.ts +23 -8
  61. package/dist/lib/http.js +28 -48
  62. package/dist/lib/http.js.map +1 -1
  63. package/dist/lib/identity.d.ts +29 -0
  64. package/dist/lib/identity.js +57 -0
  65. package/dist/lib/identity.js.map +1 -0
  66. package/dist/lib/mcp-install.d.ts +13 -0
  67. package/dist/lib/mcp-install.js +6 -6
  68. package/dist/lib/mcp-install.js.map +1 -1
  69. package/dist/lib/pipeline-spec.d.ts +66 -0
  70. package/dist/lib/pipeline-spec.js +273 -0
  71. package/dist/lib/pipeline-spec.js.map +1 -0
  72. package/package.json +12 -4
  73. package/dist/lib/keys.d.ts +0 -69
  74. package/dist/lib/keys.js +0 -85
  75. package/dist/lib/keys.js.map +0 -1
  76. package/dist/lib/payment-keys.d.ts +0 -25
  77. package/dist/lib/payment-keys.js +0 -55
  78. package/dist/lib/payment-keys.js.map +0 -1
  79. package/dist/lib/payment.d.ts +0 -27
  80. package/dist/lib/payment.js +0 -123
  81. package/dist/lib/payment.js.map +0 -1
@@ -0,0 +1,273 @@
1
+ /**
2
+ * Pipeline spec validation — shared between `agentsmarket run` and `agentsmarket validate`.
3
+ *
4
+ * Returns:
5
+ * { ok: true, usesStages, warnings } — spec is valid
6
+ * { ok: false, error } — spec has issue
7
+ *
8
+ * v0.2 additions:
9
+ * - `uses@version` syntax validation (semver-like hint; full validation at runtime)
10
+ * - `output_format: structured_json` requires non-empty `fields: [...]`
11
+ * - `mcp_servers`/`mcp_tools` are arrays of strings (declaration-level only)
12
+ * - `working_dir` is a non-empty string
13
+ * - `uses_parallel` (v0.3) is rejected with a clear message
14
+ *
15
+ * v0.3 R6 additions (Provider ≠ Model):
16
+ * - When a stage declares `provider:`, the (provider, model) pair must be
17
+ * registered in `PROVIDER_REGISTRY` (openai, anthropic, minimax,
18
+ * openrouter, replicate). Validated via `validateProviderModel()` from
19
+ * `@agentsmarket/pipeline-runtime`. Auto-dispatch by model name removed.
20
+ */
21
+ import { validateProviderModel } from '@agentsmarket/pipeline-runtime';
22
+ export const COST_PER_LLM_CALL_USDC = 0.01;
23
+ const VERSION_HINT_RE = /^[A-Za-z0-9._+\-]{1,32}$/;
24
+ const MCP_NAME_RE = /^[a-z][a-z0-9_-]{0,63}$/;
25
+ const OUTPUT_FORMAT_VALUES = new Set(['text', 'code', 'markdown', 'structured_json']);
26
+ const WORKING_DIR_HINT_RE = /^[./~A-Za-z0-9_\-/ ]{1,512}$/;
27
+ export function validatePipelineSpec(spec) {
28
+ if (!spec || typeof spec !== 'object') {
29
+ return { ok: false, error: 'spec must be an object' };
30
+ }
31
+ const s = spec;
32
+ if (!s.name || typeof s.name !== 'string') {
33
+ return { ok: false, error: 'spec.name is required (string)' };
34
+ }
35
+ if (!Array.isArray(s.stages) || s.stages.length === 0) {
36
+ return { ok: false, error: 'spec.stages[] is required and must be non-empty' };
37
+ }
38
+ const seenIds = new Set();
39
+ const usesStages = [];
40
+ const warnings = [];
41
+ for (let i = 0; i < s.stages.length; i++) {
42
+ const stage = s.stages[i];
43
+ if (!stage || typeof stage !== 'object') {
44
+ return { ok: false, error: `stages[${i}] must be an object` };
45
+ }
46
+ if (!stage.id || typeof stage.id !== 'string') {
47
+ return { ok: false, error: `stages[${i}].id is required (string)` };
48
+ }
49
+ if (seenIds.has(stage.id)) {
50
+ return { ok: false, error: `duplicate stage id: '${stage.id}'` };
51
+ }
52
+ seenIds.add(stage.id);
53
+ if (stage.uses_parallel !== undefined) {
54
+ return {
55
+ ok: false,
56
+ error: `stage '${stage.id}': 'uses_parallel' is v0.3+ and not supported by v0.2 runtime. Use 'uses:' (sequential) or split into multiple stages.`,
57
+ };
58
+ }
59
+ const hasModel = typeof stage.model === 'string' && stage.model.length > 0;
60
+ const hasUses = stage.uses !== undefined;
61
+ const hasPrompt = typeof stage.prompt === 'string' && stage.prompt.length > 0;
62
+ if (!hasModel && !hasUses && !hasPrompt) {
63
+ return {
64
+ ok: false,
65
+ error: `stage '${stage.id}': must have 'model'+'prompt' (LLM), 'uses' (skill), or just 'prompt'`,
66
+ };
67
+ }
68
+ if (hasUses) {
69
+ usesStages.push(stage.id);
70
+ const usesErr = validateUsesSyntax(stage.uses, stage.id);
71
+ if (usesErr)
72
+ return { ok: false, error: usesErr };
73
+ }
74
+ if (stage.output_format !== undefined) {
75
+ if (typeof stage.output_format !== 'string' || !OUTPUT_FORMAT_VALUES.has(stage.output_format)) {
76
+ return {
77
+ ok: false,
78
+ error: `stage '${stage.id}': output_format must be one of text|code|markdown|structured_json`,
79
+ };
80
+ }
81
+ if (stage.output_format === 'structured_json') {
82
+ if (!Array.isArray(stage.fields) || stage.fields.length === 0) {
83
+ return {
84
+ ok: false,
85
+ error: `stage '${stage.id}': output_format=structured_json requires 'fields: [...]' with at least one entry`,
86
+ };
87
+ }
88
+ for (const f of stage.fields) {
89
+ if (typeof f !== 'string' || f.length === 0) {
90
+ return {
91
+ ok: false,
92
+ error: `stage '${stage.id}': every entry in 'fields' must be a non-empty string`,
93
+ };
94
+ }
95
+ }
96
+ }
97
+ }
98
+ if (stage.mcp_servers !== undefined) {
99
+ if (!Array.isArray(stage.mcp_servers)) {
100
+ return { ok: false, error: `stage '${stage.id}': mcp_servers must be an array of strings` };
101
+ }
102
+ for (const name of stage.mcp_servers) {
103
+ if (typeof name !== 'string' || !MCP_NAME_RE.test(name)) {
104
+ return {
105
+ ok: false,
106
+ error: `stage '${stage.id}': mcp_servers entries must match /^[a-z][a-z0-9_-]{0,63}$/ — got '${String(name)}'`,
107
+ };
108
+ }
109
+ }
110
+ warnings.push(`stage '${stage.id}': mcp_servers declared but not executed in v0.2 (forward-compat for v0.3)`);
111
+ }
112
+ if (stage.mcp_tools !== undefined) {
113
+ if (!Array.isArray(stage.mcp_tools)) {
114
+ return { ok: false, error: `stage '${stage.id}': mcp_tools must be an array of strings` };
115
+ }
116
+ for (const name of stage.mcp_tools) {
117
+ if (typeof name !== 'string' || !MCP_NAME_RE.test(name)) {
118
+ return {
119
+ ok: false,
120
+ error: `stage '${stage.id}': mcp_tools entries must match /^[a-z][a-z0-9_-]{0,63}$/ — got '${String(name)}'`,
121
+ };
122
+ }
123
+ }
124
+ warnings.push(`stage '${stage.id}': mcp_tools declared but not executed in v0.2 (forward-compat for v0.3)`);
125
+ }
126
+ if (stage.working_dir !== undefined && stage.working_dir !== null) {
127
+ if (typeof stage.working_dir !== 'string' || !WORKING_DIR_HINT_RE.test(stage.working_dir)) {
128
+ return {
129
+ ok: false,
130
+ error: `stage '${stage.id}': working_dir must be a non-empty path-like string`,
131
+ };
132
+ }
133
+ warnings.push(`stage '${stage.id}': working_dir is CLI-only — server execution will log 'working_dir_ignored_on_server'`);
134
+ }
135
+ if (stage.provider !== undefined) {
136
+ if (typeof stage.provider !== 'string') {
137
+ return {
138
+ ok: false,
139
+ error: `stage '${stage.id}': provider must be a string (got ${typeof stage.provider})`,
140
+ };
141
+ }
142
+ if (stage.provider.length === 0) {
143
+ return {
144
+ ok: false,
145
+ error: `stage '${stage.id}': provider must be a non-empty string`,
146
+ };
147
+ }
148
+ const stageModel = stage.model ?? s.defaults?.model ?? 'MiniMax-M3';
149
+ try {
150
+ validateProviderModel(stage.provider, stageModel);
151
+ }
152
+ catch (e) {
153
+ const msg = e instanceof Error ? e.message : String(e);
154
+ return {
155
+ ok: false,
156
+ error: `stage '${stage.id}': ${msg}`,
157
+ };
158
+ }
159
+ }
160
+ if (stage.retry !== undefined) {
161
+ const err = validateRetryConfig(stage.retry, stage.id);
162
+ if (err)
163
+ return { ok: false, error: err };
164
+ }
165
+ if (stage.run_if !== undefined) {
166
+ if (typeof stage.run_if !== 'string' || stage.run_if.length === 0) {
167
+ return { ok: false, error: `stage '${stage.id}': run_if must be a non-empty string` };
168
+ }
169
+ }
170
+ if (stage.when !== undefined) {
171
+ const err = validateWhenInSpec(stage.when, stage.id);
172
+ if (err)
173
+ return { ok: false, error: err };
174
+ }
175
+ }
176
+ return { ok: true, usesStages, warnings };
177
+ }
178
+ function validateWhenInSpec(when, stageId) {
179
+ if (typeof when === 'object' && when !== null && !Array.isArray(when)) {
180
+ const w = when;
181
+ if (Array.isArray(w.all)) {
182
+ for (const c of w.all) {
183
+ if (typeof c !== 'string') {
184
+ return `stage '${stageId}': when.all entries must be strings`;
185
+ }
186
+ }
187
+ }
188
+ else if (Array.isArray(w.any)) {
189
+ for (const c of w.any) {
190
+ if (typeof c !== 'string') {
191
+ return `stage '${stageId}': when.any entries must be strings`;
192
+ }
193
+ }
194
+ }
195
+ else {
196
+ return `stage '${stageId}': when object must have 'all' or 'any' array`;
197
+ }
198
+ }
199
+ else if (typeof when !== 'string') {
200
+ return `stage '${stageId}': when must be a string or object with all/any`;
201
+ }
202
+ return null;
203
+ }
204
+ function validateRetryConfig(retry, stageId) {
205
+ if (typeof retry !== 'object' || retry === null || Array.isArray(retry)) {
206
+ return `stage '${stageId}': retry must be an object`;
207
+ }
208
+ const r = retry;
209
+ if (r.attempts !== undefined) {
210
+ if (typeof r.attempts !== 'number' || r.attempts < 1 || r.attempts > 10 || !Number.isInteger(r.attempts)) {
211
+ return `stage '${stageId}': retry.attempts must be an integer 1..10 (got ${String(r.attempts)})`;
212
+ }
213
+ }
214
+ if (r.backoff !== undefined && !['exponential', 'linear', 'fixed'].includes(String(r.backoff))) {
215
+ return `stage '${stageId}': retry.backoff must be one of exponential|linear|fixed (got ${String(r.backoff)})`;
216
+ }
217
+ if (r.retryable_status !== undefined) {
218
+ if (!Array.isArray(r.retryable_status)) {
219
+ return `stage '${stageId}': retry.retryable_status must be an array of HTTP status codes`;
220
+ }
221
+ for (const code of r.retryable_status) {
222
+ if (typeof code !== 'number' || code < 100 || code > 599 || !Number.isInteger(code)) {
223
+ return `stage '${stageId}': retry.retryable_status entries must be integers 100..599 (got ${String(code)})`;
224
+ }
225
+ }
226
+ }
227
+ if (r.initial_ms !== undefined) {
228
+ if (typeof r.initial_ms !== 'number' || r.initial_ms < 0) {
229
+ return `stage '${stageId}': retry.initial_ms must be a non-negative number`;
230
+ }
231
+ }
232
+ return null;
233
+ }
234
+ function validateUsesSyntax(uses, stageId) {
235
+ if (typeof uses === 'string') {
236
+ if (uses.length === 0)
237
+ return `stage '${stageId}': empty 'uses' string`;
238
+ const err = validateUsesEntrySyntax(uses, stageId, 0);
239
+ return err;
240
+ }
241
+ if (Array.isArray(uses)) {
242
+ if (uses.length === 0)
243
+ return `stage '${stageId}': empty 'uses' array`;
244
+ for (let j = 0; j < uses.length; j++) {
245
+ const item = uses[j];
246
+ if (typeof item !== 'string') {
247
+ return `stage '${stageId}': uses[${j}] must be a string (got ${typeof item})`;
248
+ }
249
+ const err = validateUsesEntrySyntax(item, stageId, j);
250
+ if (err)
251
+ return err;
252
+ }
253
+ return null;
254
+ }
255
+ return `stage '${stageId}': 'uses' must be a string or array of strings`;
256
+ }
257
+ function validateUsesEntrySyntax(raw, stageId, idx) {
258
+ const at = raw.lastIndexOf('@');
259
+ if (at === -1) {
260
+ return null;
261
+ }
262
+ if (at === 0)
263
+ return `stage '${stageId}': uses[${idx}] starts with '@' (empty skill id)`;
264
+ if (at === raw.length - 1)
265
+ return `stage '${stageId}': uses[${idx}] ends with '@' (empty version)`;
266
+ const id = raw.slice(0, at);
267
+ const version = raw.slice(at + 1);
268
+ if (!VERSION_HINT_RE.test(version)) {
269
+ return `stage '${stageId}': uses[${idx}] version part '${version}' is not a valid identifier (allowed: alphanumeric, '.', '_', '+', '-')`;
270
+ }
271
+ return null;
272
+ }
273
+ //# sourceMappingURL=pipeline-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-spec.js","sourceRoot":"","sources":["../../src/lib/pipeline-spec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentsmarket/cli",
3
- "version": "0.1.1",
3
+ "version": "0.5.0",
4
4
  "description": "CLI for agentsmarket.world — agent identity, wallet, and skill invocations",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -14,23 +14,31 @@
14
14
  ],
15
15
  "scripts": {
16
16
  "build": "tsc",
17
- "test": "node --test --import tsx/esm tests/*.test.ts",
17
+ "test": "vitest run",
18
18
  "dev": "tsx src/index.ts",
19
19
  "lint": "tsc --noEmit"
20
20
  },
21
21
  "dependencies": {
22
+ "@agentsmarket/generator": "workspace:*",
23
+ "@agentsmarket/pipeline-runtime": "workspace:*",
22
24
  "@modelcontextprotocol/sdk": "^1.30.0",
23
25
  "@noble/curves": "^2.4.0",
24
26
  "@noble/hashes": "^2.4.0",
27
+ "@scure/bip32": "^2.4.0",
28
+ "@scure/bip39": "^2.4.0",
25
29
  "commander": "^12.1.0",
30
+ "ethers": "^6.17.0",
31
+ "js-yaml": "^4.1.0",
26
32
  "zod": "^3.25"
27
33
  },
28
34
  "devDependencies": {
35
+ "@types/js-yaml": "^4.0.9",
29
36
  "@types/node": "^22.0.0",
30
37
  "tsx": "^4.19.0",
31
- "typescript": "^5.6.0"
38
+ "typescript": "^5.6.0",
39
+ "vitest": "^4.1.11"
32
40
  },
33
41
  "engines": {
34
42
  "node": ">=20"
35
43
  }
36
- }
44
+ }
@@ -1,69 +0,0 @@
1
- /**
2
- * Ed25519 key management for agentsmarket agents.
3
- *
4
- * Uses Node.js built-in `crypto` (RFC 8032 compliant). NO external crypto
5
- * dependencies — battle-tested by the Node.js team.
6
- *
7
- * SECURITY: This is the foundation of agent identity. If keys are generated
8
- * incorrectly, agents lose their identity, reputation, and any funds.
9
- * Every function here is unit-tested.
10
- */
11
- import * as crypto from 'node:crypto';
12
- /**
13
- * Pair of Ed25519 keys for an agent.
14
- */
15
- export interface AgentKeypair {
16
- publicKey: crypto.KeyObject;
17
- privateKey: crypto.KeyObject;
18
- }
19
- /**
20
- * Generate a fresh Ed25519 keypair.
21
- * Uses Node's built-in crypto (constant-time, side-channel resistant).
22
- */
23
- export declare function generateKeypair(): AgentKeypair;
24
- /**
25
- * Derive agent_id from public key.
26
- *
27
- * Format: "ed25519:" + base64url(raw 32-byte Ed25519 public key)
28
- * Example: "ed25519:wdlEEYI0rCNkobjR0d1aPJBl6v2HQ4Sqh8C5FZ3mNoE"
29
- *
30
- * The base64url encoding has no padding and uses URL-safe characters.
31
- */
32
- export declare function agentIdFromPublicKey(publicKey: crypto.KeyObject): string;
33
- /**
34
- * Export public key as raw 32-byte buffer.
35
- *
36
- * SPKI DER for Ed25519 ends with the BIT STRING containing the 32-byte key.
37
- * The last 32 bytes of the DER encoding ARE the raw public key.
38
- */
39
- export declare function exportPublicKeyRaw(publicKey: crypto.KeyObject): Buffer;
40
- /**
41
- * Export public key as hex string (64 chars).
42
- * Useful for debugging.
43
- */
44
- export declare function exportPublicKeyHex(publicKey: crypto.KeyObject): string;
45
- /**
46
- * Sign a message with the private key.
47
- *
48
- * Returns 64-byte Ed25519 signature.
49
- *
50
- * Ed25519 doesn't use a separate hash algorithm — first arg to crypto.sign is null.
51
- */
52
- export declare function signMessage(privateKey: crypto.KeyObject, message: Buffer | Uint8Array): Buffer;
53
- /**
54
- * Verify a signature against a public key and message.
55
- * Returns true if valid, false otherwise.
56
- */
57
- export declare function verifySignature(publicKey: crypto.KeyObject, message: Buffer | Uint8Array, signature: Buffer | Uint8Array): boolean;
58
- /**
59
- * Load private key from PEM string (PKCS8 format).
60
- */
61
- export declare function loadPrivateKey(pem: string): crypto.KeyObject;
62
- /**
63
- * Derive public key from private key.
64
- */
65
- export declare function derivePublicKey(privateKey: crypto.KeyObject): crypto.KeyObject;
66
- /**
67
- * Export private key as PEM string (PKCS8 format, standard).
68
- */
69
- export declare function exportPrivateKeyPem(privateKey: crypto.KeyObject): string;
package/dist/lib/keys.js DELETED
@@ -1,85 +0,0 @@
1
- /**
2
- * Ed25519 key management for agentsmarket agents.
3
- *
4
- * Uses Node.js built-in `crypto` (RFC 8032 compliant). NO external crypto
5
- * dependencies — battle-tested by the Node.js team.
6
- *
7
- * SECURITY: This is the foundation of agent identity. If keys are generated
8
- * incorrectly, agents lose their identity, reputation, and any funds.
9
- * Every function here is unit-tested.
10
- */
11
- import * as crypto from 'node:crypto';
12
- /**
13
- * Generate a fresh Ed25519 keypair.
14
- * Uses Node's built-in crypto (constant-time, side-channel resistant).
15
- */
16
- export function generateKeypair() {
17
- const { publicKey, privateKey } = crypto.generateKeyPairSync('ed25519');
18
- return { publicKey, privateKey };
19
- }
20
- /**
21
- * Derive agent_id from public key.
22
- *
23
- * Format: "ed25519:" + base64url(raw 32-byte Ed25519 public key)
24
- * Example: "ed25519:wdlEEYI0rCNkobjR0d1aPJBl6v2HQ4Sqh8C5FZ3mNoE"
25
- *
26
- * The base64url encoding has no padding and uses URL-safe characters.
27
- */
28
- export function agentIdFromPublicKey(publicKey) {
29
- const raw = exportPublicKeyRaw(publicKey);
30
- return 'ed25519:' + raw.toString('base64url');
31
- }
32
- /**
33
- * Export public key as raw 32-byte buffer.
34
- *
35
- * SPKI DER for Ed25519 ends with the BIT STRING containing the 32-byte key.
36
- * The last 32 bytes of the DER encoding ARE the raw public key.
37
- */
38
- export function exportPublicKeyRaw(publicKey) {
39
- const der = publicKey.export({ format: 'der', type: 'spki' });
40
- return Buffer.from(der).subarray(-32);
41
- }
42
- /**
43
- * Export public key as hex string (64 chars).
44
- * Useful for debugging.
45
- */
46
- export function exportPublicKeyHex(publicKey) {
47
- return exportPublicKeyRaw(publicKey).toString('hex');
48
- }
49
- /**
50
- * Sign a message with the private key.
51
- *
52
- * Returns 64-byte Ed25519 signature.
53
- *
54
- * Ed25519 doesn't use a separate hash algorithm — first arg to crypto.sign is null.
55
- */
56
- export function signMessage(privateKey, message) {
57
- const signature = crypto.sign(null, Buffer.from(message), privateKey);
58
- return Buffer.from(signature);
59
- }
60
- /**
61
- * Verify a signature against a public key and message.
62
- * Returns true if valid, false otherwise.
63
- */
64
- export function verifySignature(publicKey, message, signature) {
65
- return crypto.verify(null, Buffer.from(message), publicKey, Buffer.from(signature));
66
- }
67
- /**
68
- * Load private key from PEM string (PKCS8 format).
69
- */
70
- export function loadPrivateKey(pem) {
71
- return crypto.createPrivateKey(pem);
72
- }
73
- /**
74
- * Derive public key from private key.
75
- */
76
- export function derivePublicKey(privateKey) {
77
- return crypto.createPublicKey(privateKey);
78
- }
79
- /**
80
- * Export private key as PEM string (PKCS8 format, standard).
81
- */
82
- export function exportPrivateKeyPem(privateKey) {
83
- return privateKey.export({ format: 'pem', type: 'pkcs8' });
84
- }
85
- //# sourceMappingURL=keys.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/lib/keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAUtC;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACxE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;AACnC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAA2B;IAC9D,MAAM,GAAG,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC1C,OAAO,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAChD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAA2B;IAC5D,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9D,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAA2B;IAC5D,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACvD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,UAA4B,EAAE,OAA4B;IACpF,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;IACtE,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,SAA2B,EAC3B,OAA4B,EAC5B,SAA8B;IAE9B,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AACtF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,UAA4B;IAC1D,OAAO,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAA4B;IAC9D,OAAO,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAW,CAAC;AACvE,CAAC"}
@@ -1,25 +0,0 @@
1
- /**
2
- * Secp256k1 key management for USDC payments (EIP-3009).
3
- *
4
- * Separate from Ed25519 agent identity keys. Agent has BOTH:
5
- * - Ed25519 (agent.key): identity + HTTP request signing
6
- * - secp256k1 (payment.key): USDC payment authorization signing
7
- *
8
- * Both are saved as PKCS8 PEM (mode 0600). Node crypto handles both.
9
- */
10
- import * as crypto from 'node:crypto';
11
- export interface PaymentKeypair {
12
- publicKey: crypto.KeyObject;
13
- privateKey: crypto.KeyObject;
14
- }
15
- export declare function generatePaymentKeypair(): PaymentKeypair;
16
- export declare function exportPaymentPublicKeyRaw(key: crypto.KeyObject): Buffer;
17
- export declare function exportPaymentPublicKeyHex(key: crypto.KeyObject): string;
18
- export declare function exportPaymentAddress(key: crypto.KeyObject): string;
19
- export declare function loadPaymentPrivateKey(pem: string): crypto.KeyObject;
20
- export declare function exportPaymentPrivateKeyPem(privateKey: crypto.KeyObject): string;
21
- /**
22
- * Sign a 32-byte message hash with secp256k1 (used for EIP-3009).
23
- * Returns 65-byte signature: r (32) || s (32) || v (1, value 27 or 28).
24
- */
25
- export declare function signSecp256k1(privateKey: crypto.KeyObject, msgHash: Buffer): Buffer;
@@ -1,55 +0,0 @@
1
- /**
2
- * Secp256k1 key management for USDC payments (EIP-3009).
3
- *
4
- * Separate from Ed25519 agent identity keys. Agent has BOTH:
5
- * - Ed25519 (agent.key): identity + HTTP request signing
6
- * - secp256k1 (payment.key): USDC payment authorization signing
7
- *
8
- * Both are saved as PKCS8 PEM (mode 0600). Node crypto handles both.
9
- */
10
- import * as crypto from 'node:crypto';
11
- export function generatePaymentKeypair() {
12
- const { publicKey, privateKey } = crypto.generateKeyPairSync('ec', { namedCurve: 'secp256k1' });
13
- return { publicKey, privateKey };
14
- }
15
- function toPublicKey(key) {
16
- return key.type === 'private' ? crypto.createPublicKey(key) : key;
17
- }
18
- export function exportPaymentPublicKeyRaw(key) {
19
- const der = toPublicKey(key).export({ format: 'der', type: 'spki' });
20
- return Buffer.from(der).subarray(-65).subarray(1);
21
- }
22
- export function exportPaymentPublicKeyHex(key) {
23
- return '0x' + exportPaymentPublicKeyRaw(key).toString('hex');
24
- }
25
- export function exportPaymentAddress(key) {
26
- const uncompressed = exportPaymentPublicKeyRaw(key);
27
- const hash = crypto.createHash('sha256').update(uncompressed).digest();
28
- return '0x' + hash.subarray(-20).toString('hex');
29
- }
30
- export function loadPaymentPrivateKey(pem) {
31
- return crypto.createPrivateKey(pem);
32
- }
33
- export function exportPaymentPrivateKeyPem(privateKey) {
34
- return privateKey.export({ format: 'pem', type: 'pkcs8' });
35
- }
36
- /**
37
- * Sign a 32-byte message hash with secp256k1 (used for EIP-3009).
38
- * Returns 65-byte signature: r (32) || s (32) || v (1, value 27 or 28).
39
- */
40
- export function signSecp256k1(privateKey, msgHash) {
41
- const sig = crypto.sign('sha256', msgHash, { key: privateKey, dsaEncoding: 'der' });
42
- const der = Buffer.from(sig);
43
- if (der.length < 8)
44
- throw new Error('invalid DER signature');
45
- const rLen = der[3];
46
- const sLen = der[4 + rLen];
47
- const r = der.subarray(4, 4 + rLen);
48
- const sStart = 4 + rLen + 2;
49
- const s = der.subarray(sStart, sStart + sLen);
50
- let rPadded = r.length === 32 ? r : (r.length < 32 ? Buffer.concat([Buffer.alloc(32 - r.length), r]) : r.subarray(-32));
51
- let sPadded = s.length === 32 ? s : (s.length < 32 ? Buffer.concat([Buffer.alloc(32 - s.length), s]) : s.subarray(-32));
52
- const v = 27 + (der[der.length - 1] & 1);
53
- return Buffer.concat([rPadded, sPadded, Buffer.from([v])]);
54
- }
55
- //# sourceMappingURL=payment-keys.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"payment-keys.js","sourceRoot":"","sources":["../../src/lib/payment-keys.ts"],"names":[],"mappings":"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"}
@@ -1,27 +0,0 @@
1
- /**
2
- * EIP-3009 receiveWithAuthorization message builder + signer (CLI side).
3
- *
4
- * Phase 2 MVP: build the typed data for USDC on Base Sepolia, sign with
5
- * secp256k1, submit to server. Server verifies signature, nonce uniqueness,
6
- * and time window.
7
- */
8
- import type { KeyObject } from 'node:crypto';
9
- export interface Eip3009Payload {
10
- from: string;
11
- to: string;
12
- value: string;
13
- validAfter: string;
14
- validBefore: string;
15
- nonce: string;
16
- v: number;
17
- r: string;
18
- s: string;
19
- }
20
- export interface BuildAuthorizationParams {
21
- privateKey: KeyObject;
22
- to: string;
23
- valueUsdcBaseUnits: string | number;
24
- validForSeconds?: number;
25
- }
26
- export declare function buildAndSignAuthorization(params: BuildAuthorizationParams): Eip3009Payload;
27
- export declare function loadPaymentKey(pem: string): KeyObject;