@xpr-agents/openclaw 0.1.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/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +62 -0
- package/dist/index.js.map +1 -0
- package/dist/session.d.ts +24 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +43 -0
- package/dist/session.js.map +1 -0
- package/dist/tools/agent.d.ts +10 -0
- package/dist/tools/agent.d.ts.map +1 -0
- package/dist/tools/agent.js +261 -0
- package/dist/tools/agent.js.map +1 -0
- package/dist/tools/escrow.d.ts +11 -0
- package/dist/tools/escrow.d.ts.map +1 -0
- package/dist/tools/escrow.js +371 -0
- package/dist/tools/escrow.js.map +1 -0
- package/dist/tools/feedback.d.ts +8 -0
- package/dist/tools/feedback.d.ts.map +1 -0
- package/dist/tools/feedback.js +176 -0
- package/dist/tools/feedback.js.map +1 -0
- package/dist/tools/indexer.d.ts +9 -0
- package/dist/tools/indexer.d.ts.map +1 -0
- package/dist/tools/indexer.js +98 -0
- package/dist/tools/indexer.js.map +1 -0
- package/dist/tools/validation.d.ts +10 -0
- package/dist/tools/validation.d.ts.map +1 -0
- package/dist/tools/validation.js +231 -0
- package/dist/tools/validation.js.map +1 -0
- package/dist/types.d.ts +39 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/util/confirm.d.ts +23 -0
- package/dist/util/confirm.d.ts.map +1 -0
- package/dist/util/confirm.js +39 -0
- package/dist/util/confirm.js.map +1 -0
- package/dist/util/validate.d.ts +19 -0
- package/dist/util/validate.d.ts.map +1 -0
- package/dist/util/validate.js +96 -0
- package/dist/util/validate.js.map +1 -0
- package/openclaw.plugin.json +47 -0
- package/package.json +55 -0
- package/skills/xpr-agent-operator/SKILL.md +134 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Indexer query tools (4 tools)
|
|
4
|
+
* All read-only. Query the XPR Agents indexer REST API.
|
|
5
|
+
*
|
|
6
|
+
* xpr_search_agents, xpr_get_events, xpr_get_stats, xpr_indexer_health
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.registerIndexerTools = registerIndexerTools;
|
|
10
|
+
async function fetchIndexer(indexerUrl, path) {
|
|
11
|
+
const url = `${indexerUrl.replace(/\/$/, '')}/api${path}`;
|
|
12
|
+
const response = await fetch(url);
|
|
13
|
+
if (!response.ok) {
|
|
14
|
+
throw new Error(`Indexer request failed: ${response.status} ${response.statusText}`);
|
|
15
|
+
}
|
|
16
|
+
return response.json();
|
|
17
|
+
}
|
|
18
|
+
async function fetchHealth(indexerUrl) {
|
|
19
|
+
const url = `${indexerUrl.replace(/\/$/, '')}/health`;
|
|
20
|
+
const response = await fetch(url);
|
|
21
|
+
return {
|
|
22
|
+
status: response.status,
|
|
23
|
+
...await response.json(),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function registerIndexerTools(api, config) {
|
|
27
|
+
const indexerUrl = config.indexerUrl;
|
|
28
|
+
api.registerTool({
|
|
29
|
+
name: 'xpr_search_agents',
|
|
30
|
+
description: 'Full-text search across agents by account name, display name, or description via the indexer.',
|
|
31
|
+
parameters: {
|
|
32
|
+
type: 'object',
|
|
33
|
+
required: ['query'],
|
|
34
|
+
properties: {
|
|
35
|
+
query: { type: 'string', description: 'Search query string' },
|
|
36
|
+
limit: { type: 'number', description: 'Max results (default 20, max 50)' },
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
handler: async ({ query, limit = 20 }) => {
|
|
40
|
+
if (!query || typeof query !== 'string') {
|
|
41
|
+
throw new Error('query is required');
|
|
42
|
+
}
|
|
43
|
+
const params = new URLSearchParams({
|
|
44
|
+
q: query,
|
|
45
|
+
limit: String(Math.min(limit, 50)),
|
|
46
|
+
});
|
|
47
|
+
return fetchIndexer(indexerUrl, `/search?${params}`);
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
api.registerTool({
|
|
51
|
+
name: 'xpr_get_events',
|
|
52
|
+
description: 'Get recent blockchain events from the indexer. Filter by contract and/or action.',
|
|
53
|
+
parameters: {
|
|
54
|
+
type: 'object',
|
|
55
|
+
properties: {
|
|
56
|
+
contract: {
|
|
57
|
+
type: 'string',
|
|
58
|
+
enum: ['agentcore', 'agentfeed', 'agentvalid', 'agentescrow'],
|
|
59
|
+
description: 'Filter events by contract',
|
|
60
|
+
},
|
|
61
|
+
action: { type: 'string', description: 'Filter events by action name' },
|
|
62
|
+
limit: { type: 'number', description: 'Max results (default 50, max 200)' },
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
handler: async ({ contract, action, limit = 50 }) => {
|
|
66
|
+
const params = new URLSearchParams();
|
|
67
|
+
if (contract)
|
|
68
|
+
params.set('contract', contract);
|
|
69
|
+
if (action)
|
|
70
|
+
params.set('action', action);
|
|
71
|
+
params.set('limit', String(Math.min(limit, 200)));
|
|
72
|
+
return fetchIndexer(indexerUrl, `/events?${params}`);
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
api.registerTool({
|
|
76
|
+
name: 'xpr_get_stats',
|
|
77
|
+
description: 'Get global registry statistics: total agents, active agents, validators, feedback, jobs, etc.',
|
|
78
|
+
parameters: { type: 'object', properties: {} },
|
|
79
|
+
handler: async () => {
|
|
80
|
+
return fetchIndexer(indexerUrl, '/stats');
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
api.registerTool({
|
|
84
|
+
name: 'xpr_indexer_health',
|
|
85
|
+
description: 'Check the health and connection status of the XPR Agents indexer.',
|
|
86
|
+
parameters: { type: 'object', properties: {} },
|
|
87
|
+
handler: async () => {
|
|
88
|
+
try {
|
|
89
|
+
return await fetchHealth(indexerUrl);
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
93
|
+
return { status: 'unreachable', error: message, indexerUrl };
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=indexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../src/tools/indexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation tools (9 tools)
|
|
3
|
+
* Reads: xpr_get_validator, xpr_list_validators, xpr_get_validation,
|
|
4
|
+
* xpr_list_agent_validations, xpr_get_challenge
|
|
5
|
+
* Writes: xpr_register_validator, xpr_submit_validation,
|
|
6
|
+
* xpr_challenge_validation, xpr_stake_validator
|
|
7
|
+
*/
|
|
8
|
+
import type { PluginApi, PluginConfig } from '../types';
|
|
9
|
+
export declare function registerValidationTools(api: PluginApi, config: PluginConfig): void;
|
|
10
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/tools/validation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAaxD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAsPlF"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Validation tools (9 tools)
|
|
4
|
+
* Reads: xpr_get_validator, xpr_list_validators, xpr_get_validation,
|
|
5
|
+
* xpr_list_agent_validations, xpr_get_challenge
|
|
6
|
+
* Writes: xpr_register_validator, xpr_submit_validation,
|
|
7
|
+
* xpr_challenge_validation, xpr_stake_validator
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.registerValidationTools = registerValidationTools;
|
|
11
|
+
const sdk_1 = require("@xpr-agents/sdk");
|
|
12
|
+
const validate_1 = require("../util/validate");
|
|
13
|
+
const confirm_1 = require("../util/confirm");
|
|
14
|
+
function registerValidationTools(api, config) {
|
|
15
|
+
const contracts = config.contracts;
|
|
16
|
+
// ---- READ TOOLS ----
|
|
17
|
+
api.registerTool({
|
|
18
|
+
name: 'xpr_get_validator',
|
|
19
|
+
description: 'Get details for a validator including stake, accuracy score, and specializations.',
|
|
20
|
+
parameters: {
|
|
21
|
+
type: 'object',
|
|
22
|
+
required: ['account'],
|
|
23
|
+
properties: {
|
|
24
|
+
account: { type: 'string', description: 'Validator account name' },
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
handler: async ({ account }) => {
|
|
28
|
+
(0, validate_1.validateAccountName)(account);
|
|
29
|
+
const registry = new sdk_1.ValidationRegistry(config.rpc, undefined, contracts.agentvalid);
|
|
30
|
+
const validator = await registry.getValidator(account);
|
|
31
|
+
if (!validator) {
|
|
32
|
+
return { error: `Validator '${account}' not found` };
|
|
33
|
+
}
|
|
34
|
+
return validator;
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
api.registerTool({
|
|
38
|
+
name: 'xpr_list_validators',
|
|
39
|
+
description: 'List registered validators with optional filtering by active status, minimum stake, and accuracy.',
|
|
40
|
+
parameters: {
|
|
41
|
+
type: 'object',
|
|
42
|
+
properties: {
|
|
43
|
+
limit: { type: 'number', description: 'Max results (default 20, max 100)' },
|
|
44
|
+
active_only: { type: 'boolean', description: 'Only active validators (default true)' },
|
|
45
|
+
min_stake: { type: 'number', description: 'Minimum stake in XPR smallest units' },
|
|
46
|
+
min_accuracy: { type: 'number', description: 'Minimum accuracy score (0-10000)' },
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
handler: async ({ limit = 20, active_only = true, min_stake, min_accuracy }) => {
|
|
50
|
+
const registry = new sdk_1.ValidationRegistry(config.rpc, undefined, contracts.agentvalid);
|
|
51
|
+
const validators = await registry.listValidators({
|
|
52
|
+
limit: Math.min(limit, 100),
|
|
53
|
+
active_only,
|
|
54
|
+
min_stake,
|
|
55
|
+
min_accuracy,
|
|
56
|
+
});
|
|
57
|
+
return { validators, count: validators.length };
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
api.registerTool({
|
|
61
|
+
name: 'xpr_get_validation',
|
|
62
|
+
description: 'Get a specific validation record by ID.',
|
|
63
|
+
parameters: {
|
|
64
|
+
type: 'object',
|
|
65
|
+
required: ['id'],
|
|
66
|
+
properties: {
|
|
67
|
+
id: { type: 'number', description: 'Validation ID' },
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
handler: async ({ id }) => {
|
|
71
|
+
(0, validate_1.validatePositiveInt)(id, 'id');
|
|
72
|
+
const registry = new sdk_1.ValidationRegistry(config.rpc, undefined, contracts.agentvalid);
|
|
73
|
+
const validation = await registry.getValidation(id);
|
|
74
|
+
if (!validation) {
|
|
75
|
+
return { error: `Validation #${id} not found` };
|
|
76
|
+
}
|
|
77
|
+
return validation;
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
api.registerTool({
|
|
81
|
+
name: 'xpr_list_agent_validations',
|
|
82
|
+
description: 'List all validations for a specific agent.',
|
|
83
|
+
parameters: {
|
|
84
|
+
type: 'object',
|
|
85
|
+
required: ['agent'],
|
|
86
|
+
properties: {
|
|
87
|
+
agent: { type: 'string', description: 'Agent account name' },
|
|
88
|
+
limit: { type: 'number', description: 'Max results (default 20, max 100)' },
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
handler: async ({ agent, limit = 20 }) => {
|
|
92
|
+
(0, validate_1.validateAccountName)(agent);
|
|
93
|
+
const registry = new sdk_1.ValidationRegistry(config.rpc, undefined, contracts.agentvalid);
|
|
94
|
+
const validations = await registry.listValidationsForAgent(agent, Math.min(limit, 100));
|
|
95
|
+
return { validations, count: validations.length };
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
api.registerTool({
|
|
99
|
+
name: 'xpr_get_challenge',
|
|
100
|
+
description: 'Get details of a validation challenge by ID, including status, stake, and resolution.',
|
|
101
|
+
parameters: {
|
|
102
|
+
type: 'object',
|
|
103
|
+
required: ['id'],
|
|
104
|
+
properties: {
|
|
105
|
+
id: { type: 'number', description: 'Challenge ID' },
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
handler: async ({ id }) => {
|
|
109
|
+
(0, validate_1.validatePositiveInt)(id, 'id');
|
|
110
|
+
const registry = new sdk_1.ValidationRegistry(config.rpc, undefined, contracts.agentvalid);
|
|
111
|
+
const challenge = await registry.getChallenge(id);
|
|
112
|
+
if (!challenge) {
|
|
113
|
+
return { error: `Challenge #${id} not found` };
|
|
114
|
+
}
|
|
115
|
+
return challenge;
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
// ---- WRITE TOOLS ----
|
|
119
|
+
api.registerTool({
|
|
120
|
+
name: 'xpr_register_validator',
|
|
121
|
+
description: 'Register as a validator. Requires staking separately via xpr_stake_validator.',
|
|
122
|
+
parameters: {
|
|
123
|
+
type: 'object',
|
|
124
|
+
required: ['method', 'specializations'],
|
|
125
|
+
properties: {
|
|
126
|
+
method: { type: 'string', description: 'Validation method description' },
|
|
127
|
+
specializations: {
|
|
128
|
+
type: 'array',
|
|
129
|
+
items: { type: 'string' },
|
|
130
|
+
description: 'List of specialization areas (e.g., ["code-review", "data-analysis"])',
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
handler: async ({ method, specializations }) => {
|
|
135
|
+
if (!config.session)
|
|
136
|
+
throw new Error('Session required: set XPR_ACCOUNT and XPR_PRIVATE_KEY environment variables');
|
|
137
|
+
(0, validate_1.validateRequired)(method, 'method');
|
|
138
|
+
const registry = new sdk_1.ValidationRegistry(config.rpc, config.session, contracts.agentvalid);
|
|
139
|
+
return registry.registerValidator(method, specializations);
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
api.registerTool({
|
|
143
|
+
name: 'xpr_submit_validation',
|
|
144
|
+
description: 'Submit a validation result for an agent\'s job output.',
|
|
145
|
+
parameters: {
|
|
146
|
+
type: 'object',
|
|
147
|
+
required: ['agent', 'job_hash', 'result', 'confidence'],
|
|
148
|
+
properties: {
|
|
149
|
+
agent: { type: 'string', description: 'Agent account being validated' },
|
|
150
|
+
job_hash: { type: 'string', description: 'Hash of the job being validated' },
|
|
151
|
+
result: { type: 'string', enum: ['fail', 'pass', 'partial'], description: 'Validation result' },
|
|
152
|
+
confidence: { type: 'number', description: 'Confidence level 0-100' },
|
|
153
|
+
evidence_uri: { type: 'string', description: 'URI to validation evidence' },
|
|
154
|
+
fee_amount: { type: 'number', description: 'Validation fee in XPR' },
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
handler: async (params) => {
|
|
158
|
+
if (!config.session)
|
|
159
|
+
throw new Error('Session required: set XPR_ACCOUNT and XPR_PRIVATE_KEY environment variables');
|
|
160
|
+
(0, validate_1.validateAccountName)(params.agent, 'agent');
|
|
161
|
+
(0, validate_1.validateRequired)(params.job_hash, 'job_hash');
|
|
162
|
+
(0, validate_1.validateValidationResult)(params.result);
|
|
163
|
+
(0, validate_1.validateConfidence)(params.confidence);
|
|
164
|
+
if (params.evidence_uri)
|
|
165
|
+
(0, validate_1.validateUrl)(params.evidence_uri, 'evidence_uri');
|
|
166
|
+
if (params.fee_amount) {
|
|
167
|
+
(0, validate_1.validateAmount)((0, validate_1.xprToSmallestUnits)(params.fee_amount), config.maxTransferAmount);
|
|
168
|
+
}
|
|
169
|
+
const registry = new sdk_1.ValidationRegistry(config.rpc, config.session, contracts.agentvalid);
|
|
170
|
+
const data = {
|
|
171
|
+
agent: params.agent,
|
|
172
|
+
job_hash: params.job_hash,
|
|
173
|
+
result: params.result,
|
|
174
|
+
confidence: params.confidence,
|
|
175
|
+
evidence_uri: params.evidence_uri,
|
|
176
|
+
};
|
|
177
|
+
if (params.fee_amount) {
|
|
178
|
+
return registry.validateWithFee(data, `${params.fee_amount.toFixed(4)} XPR`);
|
|
179
|
+
}
|
|
180
|
+
return registry.validate(data);
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
api.registerTool({
|
|
184
|
+
name: 'xpr_challenge_validation',
|
|
185
|
+
description: 'Challenge a validation result. Must be funded separately via token transfer with memo "challenge:CHALLENGE_ID".',
|
|
186
|
+
parameters: {
|
|
187
|
+
type: 'object',
|
|
188
|
+
required: ['validation_id', 'reason'],
|
|
189
|
+
properties: {
|
|
190
|
+
validation_id: { type: 'number', description: 'ID of the validation to challenge' },
|
|
191
|
+
reason: { type: 'string', description: 'Reason for the challenge' },
|
|
192
|
+
evidence_uri: { type: 'string', description: 'URI to supporting evidence' },
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
handler: async ({ validation_id, reason, evidence_uri }) => {
|
|
196
|
+
if (!config.session)
|
|
197
|
+
throw new Error('Session required: set XPR_ACCOUNT and XPR_PRIVATE_KEY environment variables');
|
|
198
|
+
(0, validate_1.validatePositiveInt)(validation_id, 'validation_id');
|
|
199
|
+
(0, validate_1.validateRequired)(reason, 'reason');
|
|
200
|
+
if (evidence_uri)
|
|
201
|
+
(0, validate_1.validateUrl)(evidence_uri, 'evidence_uri');
|
|
202
|
+
const registry = new sdk_1.ValidationRegistry(config.rpc, config.session, contracts.agentvalid);
|
|
203
|
+
return registry.challenge(validation_id, reason, evidence_uri);
|
|
204
|
+
},
|
|
205
|
+
});
|
|
206
|
+
api.registerTool({
|
|
207
|
+
name: 'xpr_stake_validator',
|
|
208
|
+
description: 'Stake XPR as a validator. Staked tokens are slashable if validations are successfully challenged.',
|
|
209
|
+
parameters: {
|
|
210
|
+
type: 'object',
|
|
211
|
+
required: ['amount'],
|
|
212
|
+
properties: {
|
|
213
|
+
amount: { type: 'number', description: 'Amount to stake in XPR (e.g., 1000.0)' },
|
|
214
|
+
confirmed: { type: 'boolean', description: 'Set to true to execute after reviewing the confirmation prompt' },
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
handler: async ({ amount, confirmed }) => {
|
|
218
|
+
if (!config.session)
|
|
219
|
+
throw new Error('Session required: set XPR_ACCOUNT and XPR_PRIVATE_KEY environment variables');
|
|
220
|
+
if (amount <= 0)
|
|
221
|
+
throw new Error('amount must be positive');
|
|
222
|
+
(0, validate_1.validateAmount)((0, validate_1.xprToSmallestUnits)(amount), config.maxTransferAmount);
|
|
223
|
+
const confirmation = (0, confirm_1.needsConfirmation)(config.confirmHighRisk, confirmed, 'Stake Validator', { amount: `${amount} XPR`, note: 'Staked tokens are slashable' }, `Stake ${amount} XPR as validator collateral (slashable if challenged successfully)`);
|
|
224
|
+
if (confirmation)
|
|
225
|
+
return confirmation;
|
|
226
|
+
const registry = new sdk_1.ValidationRegistry(config.rpc, config.session, contracts.agentvalid);
|
|
227
|
+
return registry.stake(`${amount.toFixed(4)} XPR`);
|
|
228
|
+
},
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/tools/validation.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal types for the OpenClaw plugin.
|
|
3
|
+
*/
|
|
4
|
+
import type { JsonRpc, ProtonSession } from '@xpr-agents/sdk';
|
|
5
|
+
export interface PluginConfig {
|
|
6
|
+
rpc: JsonRpc;
|
|
7
|
+
session?: ProtonSession;
|
|
8
|
+
network: 'mainnet' | 'testnet';
|
|
9
|
+
rpcEndpoint: string;
|
|
10
|
+
indexerUrl: string;
|
|
11
|
+
contracts: ContractNames;
|
|
12
|
+
confirmHighRisk: boolean;
|
|
13
|
+
maxTransferAmount: number;
|
|
14
|
+
}
|
|
15
|
+
export interface ContractNames {
|
|
16
|
+
agentcore: string;
|
|
17
|
+
agentfeed: string;
|
|
18
|
+
agentvalid: string;
|
|
19
|
+
agentescrow: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ToolDefinition {
|
|
22
|
+
name: string;
|
|
23
|
+
description: string;
|
|
24
|
+
parameters: {
|
|
25
|
+
type: 'object';
|
|
26
|
+
required?: string[];
|
|
27
|
+
properties: Record<string, unknown>;
|
|
28
|
+
};
|
|
29
|
+
handler: (params: any) => Promise<unknown>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* OpenClaw plugin API interface.
|
|
33
|
+
* This matches the OpenClaw extension registration pattern.
|
|
34
|
+
*/
|
|
35
|
+
export interface PluginApi {
|
|
36
|
+
registerTool(tool: ToolDefinition): void;
|
|
37
|
+
getConfig(): Record<string, unknown>;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE9D,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,SAAS,GAAG,SAAS,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,aAAa,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACrC,CAAC;IACF,OAAO,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5C;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAAC;IACzC,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Confirmation gate for high-risk write tools.
|
|
3
|
+
*
|
|
4
|
+
* When confirmHighRisk is enabled and `confirmed` is not true, high-risk
|
|
5
|
+
* tools return a confirmation prompt instead of executing. The agent relays
|
|
6
|
+
* the prompt to the user. On the next call the agent passes confirmed=true
|
|
7
|
+
* and the tool executes normally.
|
|
8
|
+
*/
|
|
9
|
+
export interface ConfirmationResult {
|
|
10
|
+
needs_confirmation: true;
|
|
11
|
+
action: string;
|
|
12
|
+
details: Record<string, unknown>;
|
|
13
|
+
message: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Returns a confirmation prompt if the action has not been confirmed yet.
|
|
17
|
+
* Returns null (proceed) when either:
|
|
18
|
+
* - confirmHighRisk is disabled in config, or
|
|
19
|
+
* - the caller already set confirmed=true
|
|
20
|
+
*/
|
|
21
|
+
export declare function needsConfirmation(confirmHighRisk: boolean, confirmed: boolean | undefined, action: string, details: Record<string, unknown>, message: string): ConfirmationResult | null;
|
|
22
|
+
export declare function formatConfirmation(action: string, details: Record<string, unknown>): string;
|
|
23
|
+
//# sourceMappingURL=confirm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirm.d.ts","sourceRoot":"","sources":["../../src/util/confirm.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,kBAAkB;IACjC,kBAAkB,EAAE,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,OAAO,EACxB,SAAS,EAAE,OAAO,GAAG,SAAS,EAC9B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,EAAE,MAAM,GACd,kBAAkB,GAAG,IAAI,CAW3B;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,CAQR"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Confirmation gate for high-risk write tools.
|
|
4
|
+
*
|
|
5
|
+
* When confirmHighRisk is enabled and `confirmed` is not true, high-risk
|
|
6
|
+
* tools return a confirmation prompt instead of executing. The agent relays
|
|
7
|
+
* the prompt to the user. On the next call the agent passes confirmed=true
|
|
8
|
+
* and the tool executes normally.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.needsConfirmation = needsConfirmation;
|
|
12
|
+
exports.formatConfirmation = formatConfirmation;
|
|
13
|
+
/**
|
|
14
|
+
* Returns a confirmation prompt if the action has not been confirmed yet.
|
|
15
|
+
* Returns null (proceed) when either:
|
|
16
|
+
* - confirmHighRisk is disabled in config, or
|
|
17
|
+
* - the caller already set confirmed=true
|
|
18
|
+
*/
|
|
19
|
+
function needsConfirmation(confirmHighRisk, confirmed, action, details, message) {
|
|
20
|
+
if (!confirmHighRisk || confirmed === true) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
needs_confirmation: true,
|
|
25
|
+
action,
|
|
26
|
+
details,
|
|
27
|
+
message,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function formatConfirmation(action, details) {
|
|
31
|
+
const lines = [`Action: ${action}`];
|
|
32
|
+
for (const [key, value] of Object.entries(details)) {
|
|
33
|
+
if (value !== undefined && value !== null && value !== '') {
|
|
34
|
+
lines.push(` ${key}: ${typeof value === 'object' ? JSON.stringify(value) : value}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return lines.join('\n');
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=confirm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirm.js","sourceRoot":"","sources":["../../src/util/confirm.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAeH,8CAiBC;AAED,gDAWC;AApCD;;;;;GAKG;AACH,SAAgB,iBAAiB,CAC/B,eAAwB,EACxB,SAA8B,EAC9B,MAAc,EACd,OAAgC,EAChC,OAAe;IAEf,IAAI,CAAC,eAAe,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,kBAAkB,EAAE,IAAI;QACxB,MAAM;QACN,OAAO;QACP,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAgB,kBAAkB,CAChC,MAAc,EACd,OAAgC;IAEhC,MAAM,KAAK,GAAG,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC;IACpC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YAC1D,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input validation helpers for OpenClaw tool parameters.
|
|
3
|
+
* Reuses patterns from the SDK's utils.ts.
|
|
4
|
+
*/
|
|
5
|
+
export declare function validateAccountName(name: string, field?: string): void;
|
|
6
|
+
export declare function validateScore(score: number): void;
|
|
7
|
+
export declare function validateConfidence(confidence: number): void;
|
|
8
|
+
export declare function validateUrl(url: string, field?: string): void;
|
|
9
|
+
export declare function validateAmount(amount: number, maxAmount: number): void;
|
|
10
|
+
export declare function validatePositiveInt(value: number, field: string): void;
|
|
11
|
+
export declare function validateRequired(value: unknown, field: string): void;
|
|
12
|
+
export declare function validateValidationResult(result: string): void;
|
|
13
|
+
export declare function validateClientPercent(percent: number): void;
|
|
14
|
+
/**
|
|
15
|
+
* Convert a human-readable XPR amount to smallest units using integer math.
|
|
16
|
+
* Avoids floating-point precision issues (e.g., 0.7 * 10000 = 6999).
|
|
17
|
+
*/
|
|
18
|
+
export declare function xprToSmallestUnits(amount: number): number;
|
|
19
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/util/validate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAAkB,GAAG,IAAI,CAUjF;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAOjD;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAO3D;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,MAAc,GAAG,IAAI,CASpE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAOtE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAItE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIpE;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAI7D;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAO3D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKzD"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Input validation helpers for OpenClaw tool parameters.
|
|
4
|
+
* Reuses patterns from the SDK's utils.ts.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.validateAccountName = validateAccountName;
|
|
8
|
+
exports.validateScore = validateScore;
|
|
9
|
+
exports.validateConfidence = validateConfidence;
|
|
10
|
+
exports.validateUrl = validateUrl;
|
|
11
|
+
exports.validateAmount = validateAmount;
|
|
12
|
+
exports.validatePositiveInt = validatePositiveInt;
|
|
13
|
+
exports.validateRequired = validateRequired;
|
|
14
|
+
exports.validateValidationResult = validateValidationResult;
|
|
15
|
+
exports.validateClientPercent = validateClientPercent;
|
|
16
|
+
exports.xprToSmallestUnits = xprToSmallestUnits;
|
|
17
|
+
function validateAccountName(name, field = 'account') {
|
|
18
|
+
if (!name || typeof name !== 'string') {
|
|
19
|
+
throw new Error(`${field} is required`);
|
|
20
|
+
}
|
|
21
|
+
if (name.length > 12) {
|
|
22
|
+
throw new Error(`${field} must be 12 characters or fewer`);
|
|
23
|
+
}
|
|
24
|
+
if (!/^[a-z1-5.]+$/.test(name)) {
|
|
25
|
+
throw new Error(`${field} must contain only a-z, 1-5, and '.'`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function validateScore(score) {
|
|
29
|
+
if (typeof score !== 'number' || !Number.isInteger(score)) {
|
|
30
|
+
throw new Error('score must be an integer');
|
|
31
|
+
}
|
|
32
|
+
if (score < 1 || score > 5) {
|
|
33
|
+
throw new Error('score must be between 1 and 5');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function validateConfidence(confidence) {
|
|
37
|
+
if (typeof confidence !== 'number' || !Number.isInteger(confidence)) {
|
|
38
|
+
throw new Error('confidence must be an integer');
|
|
39
|
+
}
|
|
40
|
+
if (confidence < 0 || confidence > 100) {
|
|
41
|
+
throw new Error('confidence must be between 0 and 100');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function validateUrl(url, field = 'url') {
|
|
45
|
+
if (!url || typeof url !== 'string') {
|
|
46
|
+
throw new Error(`${field} is required`);
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
new URL(url);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
throw new Error(`${field} must be a valid URL`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function validateAmount(amount, maxAmount) {
|
|
56
|
+
if (typeof amount !== 'number' || amount <= 0) {
|
|
57
|
+
throw new Error('amount must be a positive number');
|
|
58
|
+
}
|
|
59
|
+
if (amount > maxAmount) {
|
|
60
|
+
throw new Error(`amount exceeds maximum allowed (${maxAmount / 10000} XPR)`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function validatePositiveInt(value, field) {
|
|
64
|
+
if (typeof value !== 'number' || !Number.isInteger(value) || value < 0) {
|
|
65
|
+
throw new Error(`${field} must be a non-negative integer`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function validateRequired(value, field) {
|
|
69
|
+
if (value === undefined || value === null || value === '') {
|
|
70
|
+
throw new Error(`${field} is required`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function validateValidationResult(result) {
|
|
74
|
+
if (!['fail', 'pass', 'partial'].includes(result)) {
|
|
75
|
+
throw new Error("result must be 'fail', 'pass', or 'partial'");
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function validateClientPercent(percent) {
|
|
79
|
+
if (typeof percent !== 'number' || !Number.isInteger(percent)) {
|
|
80
|
+
throw new Error('client_percent must be an integer');
|
|
81
|
+
}
|
|
82
|
+
if (percent < 0 || percent > 100) {
|
|
83
|
+
throw new Error('client_percent must be between 0 and 100');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Convert a human-readable XPR amount to smallest units using integer math.
|
|
88
|
+
* Avoids floating-point precision issues (e.g., 0.7 * 10000 = 6999).
|
|
89
|
+
*/
|
|
90
|
+
function xprToSmallestUnits(amount) {
|
|
91
|
+
const str = amount.toFixed(4);
|
|
92
|
+
const [whole, frac = ''] = str.split('.');
|
|
93
|
+
const paddedFrac = frac.padEnd(4, '0').slice(0, 4);
|
|
94
|
+
return parseInt(whole, 10) * 10000 + parseInt(paddedFrac, 10);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/util/validate.ts"],"names":[],"mappings":"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"}
|