@agentsmarket/cli 0.1.1 → 0.5.1
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/README.md +1455 -44
- package/dist/commands/balance.js +3 -3
- package/dist/commands/call.d.ts +23 -1
- package/dist/commands/call.js +187 -45
- package/dist/commands/call.js.map +1 -1
- package/dist/commands/info.d.ts +6 -6
- package/dist/commands/info.js +33 -35
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/init.d.ts +11 -7
- package/dist/commands/init.js +36 -38
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.js +2 -2
- package/dist/commands/mcp.js +9 -11
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/pipeline/call.d.ts +18 -0
- package/dist/commands/pipeline/call.js +58 -0
- package/dist/commands/pipeline/call.js.map +1 -0
- package/dist/commands/pipeline/install.d.ts +7 -0
- package/dist/commands/pipeline/install.js +16 -0
- package/dist/commands/pipeline/install.js.map +1 -0
- package/dist/commands/pipeline/publish.d.ts +15 -0
- package/dist/commands/pipeline/publish.js +22 -0
- package/dist/commands/pipeline/publish.js.map +1 -0
- package/dist/commands/publish-openapi.d.ts +16 -0
- package/dist/commands/publish-openapi.js +61 -0
- package/dist/commands/publish-openapi.js.map +1 -0
- package/dist/commands/publish-pipeline.d.ts +15 -0
- package/dist/commands/publish-pipeline.js +141 -0
- package/dist/commands/publish-pipeline.js.map +1 -0
- package/dist/commands/publish.js +37 -42
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/refund.js +15 -17
- package/dist/commands/refund.js.map +1 -1
- package/dist/commands/register.js +6 -27
- package/dist/commands/register.js.map +1 -1
- package/dist/commands/run.d.ts +31 -0
- package/dist/commands/run.js +305 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/scan.js +2 -5
- package/dist/commands/scan.js.map +1 -1
- package/dist/commands/search.js +1 -1
- package/dist/commands/skill/call.d.ts +12 -0
- package/dist/commands/skill/call.js +17 -0
- package/dist/commands/skill/call.js.map +1 -0
- package/dist/commands/skill/install.d.ts +7 -0
- package/dist/commands/skill/install.js +13 -0
- package/dist/commands/skill/install.js.map +1 -0
- package/dist/commands/skill/publish.d.ts +18 -0
- package/dist/commands/skill/publish.js +28 -0
- package/dist/commands/skill/publish.js.map +1 -0
- package/dist/commands/validate.d.ts +20 -0
- package/dist/commands/validate.js +91 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +4 -6
- package/dist/index.js +90 -29
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +12 -13
- package/dist/lib/config.js +27 -27
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/http.d.ts +23 -8
- package/dist/lib/http.js +28 -48
- package/dist/lib/http.js.map +1 -1
- package/dist/lib/identity.d.ts +29 -0
- package/dist/lib/identity.js +57 -0
- package/dist/lib/identity.js.map +1 -0
- package/dist/lib/mcp-install.d.ts +13 -0
- package/dist/lib/mcp-install.js +6 -6
- package/dist/lib/mcp-install.js.map +1 -1
- package/dist/lib/pipeline-spec.d.ts +66 -0
- package/dist/lib/pipeline-spec.js +273 -0
- package/dist/lib/pipeline-spec.js.map +1 -0
- package/package.json +12 -4
- package/dist/lib/keys.d.ts +0 -69
- package/dist/lib/keys.js +0 -85
- package/dist/lib/keys.js.map +0 -1
- package/dist/lib/payment-keys.d.ts +0 -25
- package/dist/lib/payment-keys.js +0 -55
- package/dist/lib/payment-keys.js.map +0 -1
- package/dist/lib/payment.d.ts +0 -27
- package/dist/lib/payment.js +0 -123
- package/dist/lib/payment.js.map +0 -1
package/dist/lib/config.js
CHANGED
|
@@ -3,6 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Stores agent identity + network preference in ~/.config/agentsmarket/
|
|
5
5
|
*
|
|
6
|
+
* Storage layout:
|
|
7
|
+
* mnemonic.txt — 12-word BIP-39 phrase (primary backup, import to Trust Wallet)
|
|
8
|
+
* agent.key — secp256k1 private key hex (convenience, derived from mnemonic)
|
|
9
|
+
* config.json — public info (agent_id, network, created_at)
|
|
10
|
+
*
|
|
6
11
|
* MVP: file-based storage with 0700 dir / 0600 file permissions.
|
|
7
12
|
* Production: migrate to OS keychain (macOS Keychain / Linux libsecret /
|
|
8
13
|
* Windows Credential Manager) via @napi-rs/keyring.
|
|
@@ -12,9 +17,8 @@ import * as path from 'node:path';
|
|
|
12
17
|
import * as os from 'node:os';
|
|
13
18
|
const CONFIG_DIR_NAME = 'agentsmarket';
|
|
14
19
|
const KEY_FILE_NAME = 'agent.key';
|
|
15
|
-
const
|
|
20
|
+
const MNEMONIC_FILE_NAME = 'mnemonic.txt';
|
|
16
21
|
const CONFIG_FILE_NAME = 'config.json';
|
|
17
|
-
/** Returns ~/.config/agentsmarket (platform-correct home dir). */
|
|
18
22
|
export function getConfigDir() {
|
|
19
23
|
const home = os.homedir();
|
|
20
24
|
if (process.platform === 'win32') {
|
|
@@ -23,28 +27,23 @@ export function getConfigDir() {
|
|
|
23
27
|
if (process.platform === 'darwin') {
|
|
24
28
|
return path.join(home, 'Library', 'Application Support', CONFIG_DIR_NAME);
|
|
25
29
|
}
|
|
26
|
-
// Linux / Unix — XDG default
|
|
27
30
|
const xdgConfig = process.env.XDG_CONFIG_HOME ?? path.join(home, '.config');
|
|
28
31
|
return path.join(xdgConfig, CONFIG_DIR_NAME);
|
|
29
32
|
}
|
|
30
33
|
export function getKeyPath() {
|
|
31
34
|
return path.join(getConfigDir(), KEY_FILE_NAME);
|
|
32
35
|
}
|
|
33
|
-
export function
|
|
34
|
-
return path.join(getConfigDir(),
|
|
36
|
+
export function getMnemonicPath() {
|
|
37
|
+
return path.join(getConfigDir(), MNEMONIC_FILE_NAME);
|
|
35
38
|
}
|
|
36
39
|
export function getConfigPath() {
|
|
37
40
|
return path.join(getConfigDir(), CONFIG_FILE_NAME);
|
|
38
41
|
}
|
|
39
|
-
/** Returns existing config or null. */
|
|
40
42
|
export function loadConfig() {
|
|
41
43
|
try {
|
|
42
44
|
const content = fs.readFileSync(getConfigPath(), 'utf-8');
|
|
43
45
|
const parsed = JSON.parse(content);
|
|
44
|
-
if (typeof parsed.agent_id !== 'string' ||
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
47
|
-
if (typeof parsed.payment_address !== 'string' || !/^0x[0-9a-fA-F]{40}$/.test(parsed.payment_address)) {
|
|
46
|
+
if (typeof parsed.agent_id !== 'string' || !/^0x[0-9a-fA-F]{40}$/.test(parsed.agent_id)) {
|
|
48
47
|
return null;
|
|
49
48
|
}
|
|
50
49
|
if (parsed.network !== 'base-sepolia' && parsed.network !== 'base-mainnet') {
|
|
@@ -59,7 +58,6 @@ export function loadConfig() {
|
|
|
59
58
|
return null;
|
|
60
59
|
}
|
|
61
60
|
}
|
|
62
|
-
/** Save config file with 0600 permissions. Creates parent dir if needed. */
|
|
63
61
|
export function saveConfig(config) {
|
|
64
62
|
const dir = getConfigDir();
|
|
65
63
|
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
@@ -68,26 +66,29 @@ export function saveConfig(config) {
|
|
|
68
66
|
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', { mode: 0o600 });
|
|
69
67
|
setPermissions(configPath, 0o600);
|
|
70
68
|
}
|
|
71
|
-
|
|
72
|
-
export function savePrivateKey(pem) {
|
|
69
|
+
export function savePrivateKey(hexPrivateKey) {
|
|
73
70
|
const dir = getConfigDir();
|
|
74
71
|
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
75
72
|
setPermissions(dir, 0o700);
|
|
76
73
|
const keyPath = getKeyPath();
|
|
77
|
-
|
|
74
|
+
const normalized = hexPrivateKey.startsWith('0x') ? hexPrivateKey : '0x' + hexPrivateKey;
|
|
75
|
+
fs.writeFileSync(keyPath, normalized + '\n', { mode: 0o600 });
|
|
78
76
|
setPermissions(keyPath, 0o600);
|
|
79
77
|
}
|
|
80
|
-
|
|
81
|
-
|
|
78
|
+
export function loadPrivateKeyHex() {
|
|
79
|
+
const content = fs.readFileSync(getKeyPath(), 'utf-8').trim();
|
|
80
|
+
return content.startsWith('0x') ? content : '0x' + content;
|
|
81
|
+
}
|
|
82
|
+
export function saveMnemonic(mnemonic) {
|
|
82
83
|
const dir = getConfigDir();
|
|
83
84
|
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
84
85
|
setPermissions(dir, 0o700);
|
|
85
|
-
const
|
|
86
|
-
fs.writeFileSync(
|
|
87
|
-
setPermissions(
|
|
86
|
+
const mnemonicPath = getMnemonicPath();
|
|
87
|
+
fs.writeFileSync(mnemonicPath, mnemonic.trim() + '\n', { mode: 0o600 });
|
|
88
|
+
setPermissions(mnemonicPath, 0o600);
|
|
88
89
|
}
|
|
89
|
-
export function
|
|
90
|
-
return fs.readFileSync(
|
|
90
|
+
export function loadMnemonic() {
|
|
91
|
+
return fs.readFileSync(getMnemonicPath(), 'utf-8').trim();
|
|
91
92
|
}
|
|
92
93
|
export function configExists() {
|
|
93
94
|
return fs.existsSync(getConfigPath());
|
|
@@ -95,18 +96,17 @@ export function configExists() {
|
|
|
95
96
|
export function keyExists() {
|
|
96
97
|
return fs.existsSync(getKeyPath());
|
|
97
98
|
}
|
|
98
|
-
export function
|
|
99
|
-
return fs.existsSync(
|
|
99
|
+
export function mnemonicExists() {
|
|
100
|
+
return fs.existsSync(getMnemonicPath());
|
|
100
101
|
}
|
|
101
|
-
|
|
102
|
-
function setPermissions(path, mode) {
|
|
102
|
+
function setPermissions(filePath, mode) {
|
|
103
103
|
if (process.platform === 'win32')
|
|
104
104
|
return;
|
|
105
105
|
try {
|
|
106
|
-
fs.chmodSync(
|
|
106
|
+
fs.chmodSync(filePath, mode);
|
|
107
107
|
}
|
|
108
108
|
catch {
|
|
109
|
-
//
|
|
109
|
+
// best effort
|
|
110
110
|
}
|
|
111
111
|
}
|
|
112
112
|
//# sourceMappingURL=config.js.map
|
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAa9B,MAAM,eAAe,GAAG,cAAc,CAAC;AACvC,MAAM,aAAa,GAAG,WAAW,CAAC;AAClC,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAC1C,MAAM,gBAAgB,GAAG,aAAa,CAAC;AAEvC,MAAM,UAAU,YAAY;IAC1B,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC1B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,eAAe,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC5E,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,kBAAkB,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,gBAAgB,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAW,CAAC;QAC7C,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,KAAK,cAAc,IAAI,MAAM,CAAC,OAAO,KAAK,cAAc,EAAE,CAAC;YAC3E,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3B,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACtF,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,aAAqB;IAClD,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,GAAG,aAAa,CAAC;IACzF,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9D,OAAO,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,OAAO,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3B,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACxE,cAAc,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,EAAE,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,EAAE,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB,EAAE,IAAY;IACpD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO;IACzC,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;AACH,CAAC"}
|
package/dist/lib/http.d.ts
CHANGED
|
@@ -1,24 +1,39 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Authenticated HTTP client for the marketplace server.
|
|
3
3
|
*
|
|
4
|
-
* Signs
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* Signs requests with EIP-191 personal_sign using the agent's secp256k1 key.
|
|
5
|
+
* Server uses ecrecover to determine caller address.
|
|
6
|
+
*
|
|
7
|
+
* Headers (when requireAuth=true, the default):
|
|
8
|
+
* X-Signature: 0x + 130 hex (65-byte EIP-191 sig: r||s||v)
|
|
9
|
+
* X-Timestamp: unix ms (within 5 min drift)
|
|
9
10
|
* Message: METHOD\nPATH\nTIMESTAMP\nSHA256(BODY)
|
|
11
|
+
*
|
|
12
|
+
* Note: caller address is derived from signature on server side
|
|
13
|
+
* (no X-Agent-ID header needed).
|
|
10
14
|
*/
|
|
15
|
+
export interface ErrorBody {
|
|
16
|
+
error?: string;
|
|
17
|
+
code?: string;
|
|
18
|
+
detail?: string;
|
|
19
|
+
recipient?: string;
|
|
20
|
+
price_usdc?: number;
|
|
21
|
+
chain_id?: number;
|
|
22
|
+
token_address?: string;
|
|
23
|
+
mode?: string;
|
|
24
|
+
hint?: string;
|
|
25
|
+
agent_id?: string;
|
|
26
|
+
}
|
|
11
27
|
export declare class HttpError extends Error {
|
|
12
28
|
readonly status: number;
|
|
13
29
|
readonly code: string;
|
|
14
|
-
|
|
30
|
+
readonly body: ErrorBody;
|
|
31
|
+
constructor(status: number, code: string, message: string, body?: ErrorBody);
|
|
15
32
|
}
|
|
16
|
-
/** Make an authenticated request to the marketplace server. */
|
|
17
33
|
export declare function authedFetch(method: string, path: string, body?: unknown, opts?: {
|
|
18
34
|
baseUrl?: string;
|
|
19
35
|
requireAuth?: boolean;
|
|
20
36
|
}): Promise<Response>;
|
|
21
|
-
/** Convenience: authed JSON request, returns parsed body. */
|
|
22
37
|
export declare function authedJson<T>(method: string, path: string, body?: unknown, opts?: {
|
|
23
38
|
baseUrl?: string;
|
|
24
39
|
requireAuth?: boolean;
|
package/dist/lib/http.js
CHANGED
|
@@ -1,66 +1,40 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Authenticated HTTP client for the marketplace server.
|
|
3
3
|
*
|
|
4
|
-
* Signs
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* Signs requests with EIP-191 personal_sign using the agent's secp256k1 key.
|
|
5
|
+
* Server uses ecrecover to determine caller address.
|
|
6
|
+
*
|
|
7
|
+
* Headers (when requireAuth=true, the default):
|
|
8
|
+
* X-Signature: 0x + 130 hex (65-byte EIP-191 sig: r||s||v)
|
|
9
|
+
* X-Timestamp: unix ms (within 5 min drift)
|
|
9
10
|
* Message: METHOD\nPATH\nTIMESTAMP\nSHA256(BODY)
|
|
11
|
+
*
|
|
12
|
+
* Note: caller address is derived from signature on server side
|
|
13
|
+
* (no X-Agent-ID header needed).
|
|
10
14
|
*/
|
|
11
|
-
import * as crypto from 'node:crypto';
|
|
12
15
|
import { createHash } from 'node:crypto';
|
|
13
|
-
import
|
|
14
|
-
import
|
|
15
|
-
import * as path from 'node:path';
|
|
16
|
-
import { loadConfig } from './config.js';
|
|
17
|
-
import { loadPrivateKey, exportPublicKeyRaw } from './keys.js';
|
|
18
|
-
// Override at runtime with AGENTSMARKET_URL env var (used by smoke.sh, tests, dev).
|
|
16
|
+
import { loadConfig, loadPrivateKeyHex } from './config.js';
|
|
17
|
+
import { signEip191 } from './identity.js';
|
|
19
18
|
const DEFAULT_BASE_URL = 'https://api.agentsmarket.world';
|
|
20
19
|
export class HttpError extends Error {
|
|
21
20
|
status;
|
|
22
21
|
code;
|
|
23
|
-
|
|
22
|
+
body;
|
|
23
|
+
constructor(status, code, message, body = {}) {
|
|
24
24
|
super(message);
|
|
25
25
|
this.status = status;
|
|
26
26
|
this.code = code;
|
|
27
27
|
this.name = 'HttpError';
|
|
28
|
+
this.body = body;
|
|
28
29
|
}
|
|
29
30
|
}
|
|
30
|
-
function
|
|
31
|
-
const home = os.homedir();
|
|
32
|
-
if (process.platform === 'win32') {
|
|
33
|
-
return path.join(home, 'AppData', 'Roaming', 'agentsmarket', 'agent.key');
|
|
34
|
-
}
|
|
35
|
-
if (process.platform === 'darwin') {
|
|
36
|
-
return path.join(home, 'Library', 'Application Support', 'agentsmarket', 'agent.key');
|
|
37
|
-
}
|
|
38
|
-
const xdgConfig = process.env.XDG_CONFIG_HOME ?? path.join(home, '.config');
|
|
39
|
-
return path.join(xdgConfig, 'agentsmarket', 'agent.key');
|
|
40
|
-
}
|
|
41
|
-
function getSigningKey() {
|
|
42
|
-
const config = loadConfig();
|
|
43
|
-
if (!config) {
|
|
44
|
-
throw new Error('Agent not initialized. Run `agentsmarket init` first.');
|
|
45
|
-
}
|
|
46
|
-
const pem = fs.readFileSync(getKeyPath(), 'utf-8');
|
|
47
|
-
const privateKey = loadPrivateKey(pem);
|
|
48
|
-
const publicKey = crypto.createPublicKey(privateKey);
|
|
49
|
-
const raw = exportPublicKeyRaw(publicKey);
|
|
50
|
-
const derivedId = 'ed25519:' + raw.toString('base64url');
|
|
51
|
-
if (derivedId !== config.agent_id) {
|
|
52
|
-
throw new Error(`Key file does not match stored agent_id. Stored: ${config.agent_id}, Derived: ${derivedId}`);
|
|
53
|
-
}
|
|
54
|
-
return { privateKey, agentId: config.agent_id };
|
|
55
|
-
}
|
|
56
|
-
function signRequest(privateKey, method, path, body) {
|
|
31
|
+
async function signRequest(privateKeyHex, method, path, body) {
|
|
57
32
|
const timestamp = Date.now().toString();
|
|
58
33
|
const bodyHash = createHash('sha256').update(body || '').digest('hex');
|
|
59
34
|
const message = `${method}\n${path}\n${timestamp}\n${bodyHash}`;
|
|
60
|
-
const
|
|
61
|
-
return { signature
|
|
35
|
+
const { signature, address } = await signEip191(privateKeyHex, message);
|
|
36
|
+
return { signature, timestamp, address };
|
|
62
37
|
}
|
|
63
|
-
/** Make an authenticated request to the marketplace server. */
|
|
64
38
|
export async function authedFetch(method, path, body, opts = {}) {
|
|
65
39
|
const baseUrl = (opts.baseUrl ?? process.env.AGENTSMARKET_URL ?? DEFAULT_BASE_URL).replace(/\/$/, '');
|
|
66
40
|
const bodyStr = body !== undefined ? JSON.stringify(body) : '';
|
|
@@ -69,9 +43,12 @@ export async function authedFetch(method, path, body, opts = {}) {
|
|
|
69
43
|
'Content-Type': 'application/json',
|
|
70
44
|
};
|
|
71
45
|
if (opts.requireAuth !== false) {
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
|
|
46
|
+
const config = loadConfig();
|
|
47
|
+
if (!config) {
|
|
48
|
+
throw new Error('Agent not initialized. Run `agentsmarket init` first.');
|
|
49
|
+
}
|
|
50
|
+
const privateKey = loadPrivateKeyHex();
|
|
51
|
+
const { signature, timestamp } = await signRequest(privateKey, method, path, bodyStr);
|
|
75
52
|
headers['X-Signature'] = signature;
|
|
76
53
|
headers['X-Timestamp'] = timestamp;
|
|
77
54
|
}
|
|
@@ -83,21 +60,24 @@ export async function authedFetch(method, path, body, opts = {}) {
|
|
|
83
60
|
if (!res.ok) {
|
|
84
61
|
let code = 'UNKNOWN';
|
|
85
62
|
let message = `HTTP ${res.status}`;
|
|
63
|
+
const body = {};
|
|
86
64
|
try {
|
|
87
65
|
const parsed = await res.json();
|
|
66
|
+
Object.assign(body, parsed);
|
|
88
67
|
if (parsed.code)
|
|
89
68
|
code = parsed.code;
|
|
90
69
|
if (parsed.error)
|
|
91
70
|
message = `${parsed.code ?? 'UNKNOWN'}: ${parsed.error}`;
|
|
71
|
+
if (parsed.detail)
|
|
72
|
+
message += ` (${parsed.detail})`;
|
|
92
73
|
}
|
|
93
74
|
catch {
|
|
94
75
|
// not JSON
|
|
95
76
|
}
|
|
96
|
-
throw new HttpError(res.status, code, message);
|
|
77
|
+
throw new HttpError(res.status, code, message, body);
|
|
97
78
|
}
|
|
98
79
|
return res;
|
|
99
80
|
}
|
|
100
|
-
/** Convenience: authed JSON request, returns parsed body. */
|
|
101
81
|
export async function authedJson(method, path, body, opts) {
|
|
102
82
|
const res = await authedFetch(method, path, body, opts);
|
|
103
83
|
return await res.json();
|
package/dist/lib/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent identity: BIP-39 mnemonic → secp256k1 keypair (Ethereum-style).
|
|
3
|
+
*
|
|
4
|
+
* agent_id = 0x<address> (same as payment_address — single identity).
|
|
5
|
+
* Signing format: EIP-191 personal_sign → ecrecover on server.
|
|
6
|
+
*
|
|
7
|
+
* Storage:
|
|
8
|
+
* mnemonic.txt — 12-word phrase (PRIMARY backup, import to Trust Wallet)
|
|
9
|
+
* agent.key — secp256k1 private key hex (convenience, derived from mnemonic)
|
|
10
|
+
*/
|
|
11
|
+
export interface Identity {
|
|
12
|
+
address: string;
|
|
13
|
+
publicKeyHex: string;
|
|
14
|
+
privateKeyHex: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function generateMnemonic(): string;
|
|
17
|
+
export declare function isValidMnemonic(mnemonic: string): boolean;
|
|
18
|
+
export declare function mnemonicToIdentity(mnemonic: string): Identity;
|
|
19
|
+
export declare function addressFromPrivateKey(privateKeyHex: string): string;
|
|
20
|
+
export interface SignedMessage {
|
|
21
|
+
signature: string;
|
|
22
|
+
address: string;
|
|
23
|
+
}
|
|
24
|
+
export declare function signEip191(privateKeyHex: string, message: string): Promise<SignedMessage>;
|
|
25
|
+
export declare function verifyEip191(message: string, signature: string): {
|
|
26
|
+
ok: boolean;
|
|
27
|
+
address?: string;
|
|
28
|
+
error?: string;
|
|
29
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent identity: BIP-39 mnemonic → secp256k1 keypair (Ethereum-style).
|
|
3
|
+
*
|
|
4
|
+
* agent_id = 0x<address> (same as payment_address — single identity).
|
|
5
|
+
* Signing format: EIP-191 personal_sign → ecrecover on server.
|
|
6
|
+
*
|
|
7
|
+
* Storage:
|
|
8
|
+
* mnemonic.txt — 12-word phrase (PRIMARY backup, import to Trust Wallet)
|
|
9
|
+
* agent.key — secp256k1 private key hex (convenience, derived from mnemonic)
|
|
10
|
+
*/
|
|
11
|
+
import { Wallet, HDNodeWallet, verifyMessage } from 'ethers';
|
|
12
|
+
export function generateMnemonic() {
|
|
13
|
+
const wallet = Wallet.createRandom();
|
|
14
|
+
return wallet.mnemonic.phrase;
|
|
15
|
+
}
|
|
16
|
+
export function isValidMnemonic(mnemonic) {
|
|
17
|
+
try {
|
|
18
|
+
HDNodeWallet.fromPhrase(mnemonic);
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function mnemonicToIdentity(mnemonic) {
|
|
26
|
+
const hdNode = HDNodeWallet.fromPhrase(mnemonic);
|
|
27
|
+
return {
|
|
28
|
+
address: hdNode.address,
|
|
29
|
+
publicKeyHex: hdNode.publicKey.slice(2),
|
|
30
|
+
privateKeyHex: hdNode.privateKey.slice(2),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function addressFromPrivateKey(privateKeyHex) {
|
|
34
|
+
const key = privateKeyHex.startsWith('0x') ? privateKeyHex : '0x' + privateKeyHex;
|
|
35
|
+
const wallet = new Wallet(key);
|
|
36
|
+
return wallet.address;
|
|
37
|
+
}
|
|
38
|
+
export async function signEip191(privateKeyHex, message) {
|
|
39
|
+
const key = privateKeyHex.startsWith('0x') ? privateKeyHex : '0x' + privateKeyHex;
|
|
40
|
+
const wallet = new Wallet(key);
|
|
41
|
+
const signature = await wallet.signMessage(message);
|
|
42
|
+
const recovered = verifyMessage(message, signature);
|
|
43
|
+
return { signature, address: recovered };
|
|
44
|
+
}
|
|
45
|
+
export function verifyEip191(message, signature) {
|
|
46
|
+
try {
|
|
47
|
+
if (!signature.startsWith('0x') || signature.length !== 132) {
|
|
48
|
+
return { ok: false, error: 'signature must be 0x + 130 hex chars' };
|
|
49
|
+
}
|
|
50
|
+
const address = verifyMessage(message, signature);
|
|
51
|
+
return { ok: true, address };
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
return { ok: false, error: err.message };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/lib/identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAQ7D,MAAM,UAAU,gBAAgB;IAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;IACrC,OAAO,MAAM,CAAC,QAAS,CAAC,MAAM,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,IAAI,CAAC;QACH,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACjD,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QACvC,aAAa,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,aAAqB;IACzD,MAAM,GAAG,GAAG,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,GAAG,aAAa,CAAC;IAClF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,MAAM,CAAC,OAAO,CAAC;AACxB,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,aAAqB,EAAE,OAAe;IACrE,MAAM,GAAG,GAAG,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,GAAG,aAAa,CAAC;IAClF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACpD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,SAAiB;IAC7D,IAAI,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sCAAsC,EAAE,CAAC;QACtE,CAAC;QACD,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAClD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;IACtD,CAAC;AACH,CAAC"}
|
|
@@ -19,5 +19,18 @@ export type InstallReportEntry = {
|
|
|
19
19
|
action: 'skipped';
|
|
20
20
|
reason: string;
|
|
21
21
|
};
|
|
22
|
+
interface CandidateConfig {
|
|
23
|
+
agent: AgentName;
|
|
24
|
+
path: string;
|
|
25
|
+
}
|
|
26
|
+
export declare function detectCandidates(): CandidateConfig[];
|
|
27
|
+
export declare function stripJsoncComments(input: string): string;
|
|
28
|
+
export declare function readJsonConfig(filePath: string): {
|
|
29
|
+
parsed: Record<string, unknown>;
|
|
30
|
+
hadComments: boolean;
|
|
31
|
+
};
|
|
32
|
+
export declare function sameMcpEntry(a: unknown): boolean;
|
|
33
|
+
export declare function installOne(c: CandidateConfig): InstallReportEntry;
|
|
22
34
|
export declare function installMcpForAll(): InstallReportEntry[];
|
|
23
35
|
export declare function detectAgents(): AgentName[];
|
|
36
|
+
export {};
|
package/dist/lib/mcp-install.js
CHANGED
|
@@ -15,7 +15,7 @@ const MCP_ENTRY = {
|
|
|
15
15
|
command: 'npx',
|
|
16
16
|
args: ['-y', '@agentsmarket/cli', 'mcp'],
|
|
17
17
|
};
|
|
18
|
-
function detectCandidates() {
|
|
18
|
+
export function detectCandidates() {
|
|
19
19
|
const home = os.homedir();
|
|
20
20
|
const found = [];
|
|
21
21
|
const ocJson = path.join(home, '.config', 'opencode', 'opencode.json');
|
|
@@ -44,7 +44,7 @@ function detectCandidates() {
|
|
|
44
44
|
}
|
|
45
45
|
return found;
|
|
46
46
|
}
|
|
47
|
-
function stripJsoncComments(input) {
|
|
47
|
+
export function stripJsoncComments(input) {
|
|
48
48
|
let out = '';
|
|
49
49
|
let i = 0;
|
|
50
50
|
let inString = false;
|
|
@@ -88,13 +88,13 @@ function stripJsoncComments(input) {
|
|
|
88
88
|
}
|
|
89
89
|
return out;
|
|
90
90
|
}
|
|
91
|
-
function readJsonConfig(filePath) {
|
|
91
|
+
export function readJsonConfig(filePath) {
|
|
92
92
|
const raw = fs.readFileSync(filePath, 'utf8');
|
|
93
93
|
const stripped = stripJsoncComments(raw);
|
|
94
94
|
const hadComments = stripped !== raw;
|
|
95
95
|
return { parsed: JSON.parse(stripped), hadComments };
|
|
96
96
|
}
|
|
97
|
-
function sameMcpEntry(a) {
|
|
97
|
+
export function sameMcpEntry(a) {
|
|
98
98
|
if (!a || typeof a !== 'object')
|
|
99
99
|
return false;
|
|
100
100
|
const e = a;
|
|
@@ -107,7 +107,7 @@ function sameMcpEntry(a) {
|
|
|
107
107
|
return false;
|
|
108
108
|
return MCP_ENTRY.args.every((v, i) => args[i] === v);
|
|
109
109
|
}
|
|
110
|
-
function installOne(c) {
|
|
110
|
+
export function installOne(c) {
|
|
111
111
|
const fileExists = fs.existsSync(c.path);
|
|
112
112
|
if (!fileExists) {
|
|
113
113
|
const dir = path.dirname(c.path);
|
|
@@ -125,7 +125,7 @@ function installOne(c) {
|
|
|
125
125
|
parsed = readJsonConfig(c.path).parsed;
|
|
126
126
|
}
|
|
127
127
|
catch (err) {
|
|
128
|
-
const msg = err
|
|
128
|
+
const msg = err.message;
|
|
129
129
|
return { agent: c.agent, action: 'skipped', reason: `parse error: ${msg}` };
|
|
130
130
|
}
|
|
131
131
|
const mcpServers = (parsed.mcpServers ?? {});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-install.js","sourceRoot":"","sources":["../../src/lib/mcp-install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,SAAS,GAAG;IAChB,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,CAAC,IAAI,EAAE,mBAAmB,EAAE,KAAK,CAAC;CACzC,CAAC;AAaF,
|
|
1
|
+
{"version":3,"file":"mcp-install.js","sourceRoot":"","sources":["../../src/lib/mcp-install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,SAAS,GAAG;IAChB,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,CAAC,IAAI,EAAE,mBAAmB,EAAE,KAAK,CAAC;CACzC,CAAC;AAaF,MAAM,UAAU,gBAAgB;IAC9B,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAsB,EAAE,CAAC;IAEpC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACrD,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;SACtE,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;SAC7E,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACzC,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;SACzE,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC1C,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;SACtE,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACpE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,IAAI,QAAQ,EAAE,CAAC;YACb,GAAG,IAAI,EAAE,CAAC;YACV,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;gBACxC,GAAG,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACpB,CAAC,IAAI,CAAC,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,EAAE,KAAK,UAAU;gBAAE,QAAQ,GAAG,KAAK,CAAC;YACxC,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAC7B,QAAQ,GAAG,IAAI,CAAC;YAChB,UAAU,GAAG,EAAE,CAAC;YAChB,GAAG,IAAI,EAAE,CAAC;YACV,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;gBAAE,CAAC,EAAE,CAAC;YAClD,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAC/B,CAAC,IAAI,CAAC,CAAC;YACP,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;gBAAE,CAAC,EAAE,CAAC;YAC5E,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,GAAG,IAAI,EAAE,CAAC;QACV,CAAC,EAAE,CAAC;IACN,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,QAAQ,KAAK,GAAG,CAAC;IACrC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9C,MAAM,CAAC,GAAG,CAA4B,CAAC;IACvC,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;IACpB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxD,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,CAAkB;IAC3C,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG;YACd,UAAU,EAAE;gBACV,YAAY,EAAE,SAAS;aACxB;SACF,CAAC;QACF,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACrG,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/D,CAAC;IAED,IAAI,MAA+B,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAI,GAAa,CAAC,OAAO,CAAC;QACnC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,EAAE,EAAE,CAAC;IAC9E,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAA4B,CAAC;IACxE,IAAI,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC1C,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/D,CAAC;IAED,MAAM,UAAU,GAAG,GAAG,CAAC,CAAC,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;IACrF,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAEpC,UAAU,CAAC,YAAY,GAAG,SAAS,CAAC;IACpC,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;IAE/B,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACvF,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAE5B,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,gBAAgB,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,gBAAgB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
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
|
+
export interface PipelineFileSpec {
|
|
22
|
+
name: string;
|
|
23
|
+
version?: string;
|
|
24
|
+
description?: string;
|
|
25
|
+
inputs?: Record<string, unknown>;
|
|
26
|
+
defaults?: {
|
|
27
|
+
model?: string;
|
|
28
|
+
};
|
|
29
|
+
stages: Array<{
|
|
30
|
+
id: string;
|
|
31
|
+
model?: string;
|
|
32
|
+
system?: string;
|
|
33
|
+
prompt?: string;
|
|
34
|
+
uses?: unknown;
|
|
35
|
+
uses_parallel?: unknown;
|
|
36
|
+
input?: unknown;
|
|
37
|
+
output_format?: string;
|
|
38
|
+
fields?: string[];
|
|
39
|
+
mcp_servers?: string[];
|
|
40
|
+
mcp_tools?: string[];
|
|
41
|
+
working_dir?: string;
|
|
42
|
+
provider?: string;
|
|
43
|
+
retry?: {
|
|
44
|
+
attempts?: number;
|
|
45
|
+
backoff?: 'exponential' | 'linear' | 'fixed';
|
|
46
|
+
retryable_status?: number[];
|
|
47
|
+
initial_ms?: number;
|
|
48
|
+
};
|
|
49
|
+
run_if?: string;
|
|
50
|
+
when?: string | {
|
|
51
|
+
all: string[];
|
|
52
|
+
} | {
|
|
53
|
+
any: string[];
|
|
54
|
+
};
|
|
55
|
+
}>;
|
|
56
|
+
}
|
|
57
|
+
export declare const COST_PER_LLM_CALL_USDC = 0.01;
|
|
58
|
+
export type ValidationResult = {
|
|
59
|
+
ok: true;
|
|
60
|
+
usesStages: string[];
|
|
61
|
+
warnings: string[];
|
|
62
|
+
} | {
|
|
63
|
+
ok: false;
|
|
64
|
+
error: string;
|
|
65
|
+
};
|
|
66
|
+
export declare function validatePipelineSpec(spec: unknown): ValidationResult;
|