duskware 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/README.md +150 -0
- package/dist/commands/credits.d.ts +7 -0
- package/dist/commands/credits.d.ts.map +1 -0
- package/dist/commands/credits.js +220 -0
- package/dist/commands/credits.js.map +1 -0
- package/dist/commands/inference.d.ts +7 -0
- package/dist/commands/inference.d.ts.map +1 -0
- package/dist/commands/inference.js +148 -0
- package/dist/commands/inference.js.map +1 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +158 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/memory.d.ts +7 -0
- package/dist/commands/memory.d.ts.map +1 -0
- package/dist/commands/memory.js +170 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/sandbox.d.ts +7 -0
- package/dist/commands/sandbox.d.ts.map +1 -0
- package/dist/commands/sandbox.js +220 -0
- package/dist/commands/sandbox.js.map +1 -0
- package/dist/commands/skill.d.ts +7 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +255 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/spawn.d.ts +7 -0
- package/dist/commands/spawn.d.ts.map +1 -0
- package/dist/commands/spawn.js +225 -0
- package/dist/commands/spawn.js.map +1 -0
- package/dist/commands/specter.d.ts +7 -0
- package/dist/commands/specter.d.ts.map +1 -0
- package/dist/commands/specter.js +287 -0
- package/dist/commands/specter.js.map +1 -0
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +106 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/trust.d.ts +7 -0
- package/dist/commands/trust.d.ts.map +1 -0
- package/dist/commands/trust.js +230 -0
- package/dist/commands/trust.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/services/contracts.d.ts +40 -0
- package/dist/services/contracts.d.ts.map +1 -0
- package/dist/services/contracts.js +141 -0
- package/dist/services/contracts.js.map +1 -0
- package/dist/services/inference.d.ts +63 -0
- package/dist/services/inference.d.ts.map +1 -0
- package/dist/services/inference.js +118 -0
- package/dist/services/inference.js.map +1 -0
- package/dist/services/wallet.d.ts +35 -0
- package/dist/services/wallet.d.ts.map +1 -0
- package/dist/services/wallet.js +60 -0
- package/dist/services/wallet.js.map +1 -0
- package/dist/services/x402.d.ts +30 -0
- package/dist/services/x402.d.ts.map +1 -0
- package/dist/services/x402.js +92 -0
- package/dist/services/x402.js.map +1 -0
- package/dist/utils/config.d.ts +64 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +93 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/output.d.ts +29 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +100 -0
- package/dist/utils/output.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* duskware skill
|
|
3
|
+
* Skill marketplace operations: mint, list, buy
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import inquirer from 'inquirer';
|
|
7
|
+
import ora from 'ora';
|
|
8
|
+
import { JsonRpcProvider, Contract, Wallet } from 'ethers';
|
|
9
|
+
import * as output from '../utils/output.js';
|
|
10
|
+
import { loadConfig, loadWallet, getRpcUrl, getContractAddresses } from '../utils/config.js';
|
|
11
|
+
import { SKILL_NFT_ABI, ERC20_ABI, waitForTx } from '../services/contracts.js';
|
|
12
|
+
export const skillCommand = new Command('skill')
|
|
13
|
+
.description('Skill marketplace operations');
|
|
14
|
+
// Mint a new skill
|
|
15
|
+
skillCommand
|
|
16
|
+
.command('mint')
|
|
17
|
+
.description('Mint a new skill NFT')
|
|
18
|
+
.option('--name <name>', 'Skill name')
|
|
19
|
+
.option('--description <desc>', 'Skill description')
|
|
20
|
+
.option('--cid <cid>', 'IPFS CID of skill file')
|
|
21
|
+
.option('--price <price>', 'Price in USDC (e.g., 5.00)')
|
|
22
|
+
.action(async (options) => {
|
|
23
|
+
const config = loadConfig();
|
|
24
|
+
const walletConfig = loadWallet();
|
|
25
|
+
if (!config || !walletConfig) {
|
|
26
|
+
output.error('Agent not initialized. Run `duskware init` first.');
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
output.header('Mint New Skill');
|
|
30
|
+
// Interactive prompts
|
|
31
|
+
const answers = await inquirer.prompt([
|
|
32
|
+
{
|
|
33
|
+
type: 'input',
|
|
34
|
+
name: 'name',
|
|
35
|
+
message: 'Skill name:',
|
|
36
|
+
when: !options.name,
|
|
37
|
+
validate: (input) => input.length > 0 || 'Name is required',
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
type: 'input',
|
|
41
|
+
name: 'description',
|
|
42
|
+
message: 'Description:',
|
|
43
|
+
when: !options.description,
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
type: 'input',
|
|
47
|
+
name: 'cid',
|
|
48
|
+
message: 'IPFS CID (skill file):',
|
|
49
|
+
when: !options.cid,
|
|
50
|
+
validate: (input) => input.startsWith('Qm') || input.startsWith('bafy') || 'Invalid IPFS CID',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
type: 'input',
|
|
54
|
+
name: 'price',
|
|
55
|
+
message: 'Price in USDC:',
|
|
56
|
+
default: '1.00',
|
|
57
|
+
when: !options.price,
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
type: 'input',
|
|
61
|
+
name: 'prerequisites',
|
|
62
|
+
message: 'Prerequisite skill IDs (comma-separated, or empty):',
|
|
63
|
+
default: '',
|
|
64
|
+
},
|
|
65
|
+
]);
|
|
66
|
+
const name = options.name || answers.name;
|
|
67
|
+
const description = options.description || answers.description || '';
|
|
68
|
+
const cid = options.cid || answers.cid;
|
|
69
|
+
const priceStr = options.price || answers.price;
|
|
70
|
+
const priceUSDC = BigInt(Math.floor(parseFloat(priceStr) * 1_000_000));
|
|
71
|
+
const prerequisites = answers.prerequisites
|
|
72
|
+
? answers.prerequisites.split(',').map((id) => BigInt(id.trim()))
|
|
73
|
+
: [];
|
|
74
|
+
const spinner = ora('Minting skill...').start();
|
|
75
|
+
try {
|
|
76
|
+
const provider = new JsonRpcProvider(getRpcUrl(config.network));
|
|
77
|
+
const addresses = getContractAddresses(config.network);
|
|
78
|
+
const wallet = new Wallet(walletConfig.privateKey, provider);
|
|
79
|
+
const skillNFT = new Contract(addresses.skillNFT, SKILL_NFT_ABI, wallet);
|
|
80
|
+
const tx = await skillNFT.mintSkill(name, description, cid, priceUSDC, prerequisites);
|
|
81
|
+
const receipt = await waitForTx(tx);
|
|
82
|
+
spinner.succeed('Skill minted');
|
|
83
|
+
output.keyValue('Transaction', output.txHash(receipt.hash));
|
|
84
|
+
output.keyValue('Basescan', output.basescanLink(receipt.hash, config.network));
|
|
85
|
+
output.keyValue('Gas Used', receipt.gasUsed.toString());
|
|
86
|
+
output.success(`Skill "${name}" minted successfully!`);
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
spinner.fail('Minting failed');
|
|
90
|
+
if (err instanceof Error) {
|
|
91
|
+
output.error(err.message);
|
|
92
|
+
}
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
// List skills
|
|
97
|
+
skillCommand
|
|
98
|
+
.command('list')
|
|
99
|
+
.description('List available skills')
|
|
100
|
+
.option('--capability <cap>', 'Filter by capability')
|
|
101
|
+
.option('--limit <n>', 'Maximum skills to show', '20')
|
|
102
|
+
.action(async (options) => {
|
|
103
|
+
const config = loadConfig();
|
|
104
|
+
if (!config) {
|
|
105
|
+
output.error('Agent not initialized. Run `duskware init` first.');
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
output.header('Skill Marketplace');
|
|
109
|
+
try {
|
|
110
|
+
const provider = new JsonRpcProvider(getRpcUrl(config.network));
|
|
111
|
+
const addresses = getContractAddresses(config.network);
|
|
112
|
+
const skillNFT = new Contract(addresses.skillNFT, SKILL_NFT_ABI, provider);
|
|
113
|
+
// Use nextSkillId instead of totalSkills
|
|
114
|
+
const nextSkillId = await skillNFT.nextSkillId();
|
|
115
|
+
const totalCount = Number(nextSkillId) - 1; // Skills are 1-indexed
|
|
116
|
+
const limit = Math.min(parseInt(options.limit), totalCount);
|
|
117
|
+
if (totalCount <= 0) {
|
|
118
|
+
output.info('No skills minted yet.');
|
|
119
|
+
output.info('Be the first! Run `duskware skill mint`');
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const skills = [];
|
|
123
|
+
for (let i = 1; i <= limit; i++) {
|
|
124
|
+
try {
|
|
125
|
+
// Use skills(uint256) instead of getSkillDetails
|
|
126
|
+
const skill = await skillNFT.skills(i);
|
|
127
|
+
// skill returns: [name, description, skillCID, priceUSDC, creatorAgent, usageCount, ratingTotal, ratingCount, isActive, capability]
|
|
128
|
+
if (skill[8]) { // isActive
|
|
129
|
+
const ratingCount = Number(skill[7]);
|
|
130
|
+
const ratingTotal = Number(skill[6]);
|
|
131
|
+
skills.push({
|
|
132
|
+
id: i,
|
|
133
|
+
name: skill[0],
|
|
134
|
+
creator: skill[4],
|
|
135
|
+
price: skill[3],
|
|
136
|
+
usage: skill[5],
|
|
137
|
+
rating: ratingCount > 0 ? Math.round(ratingTotal / ratingCount) : 0,
|
|
138
|
+
capability: skill[9],
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// Skill might not exist
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (skills.length === 0) {
|
|
147
|
+
output.info('No active skills found.');
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
// Filter by capability if specified
|
|
151
|
+
const filteredSkills = options.capability
|
|
152
|
+
? skills.filter(s => s.capability.toLowerCase().includes(options.capability.toLowerCase()))
|
|
153
|
+
: skills;
|
|
154
|
+
// Print table
|
|
155
|
+
output.printTable(['ID', 'Name', 'Creator', 'Price', 'Uses', 'Rating', 'Capability'], filteredSkills.map(s => [
|
|
156
|
+
s.id.toString(),
|
|
157
|
+
s.name.slice(0, 20),
|
|
158
|
+
output.truncateAddress(s.creator),
|
|
159
|
+
output.formatUSDC(s.price),
|
|
160
|
+
s.usage.toString(),
|
|
161
|
+
s.rating > 0 ? `${s.rating}/100` : '-',
|
|
162
|
+
s.capability,
|
|
163
|
+
]));
|
|
164
|
+
console.log();
|
|
165
|
+
output.info(`Showing ${filteredSkills.length} of ${totalCount} skills`);
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
if (err instanceof Error) {
|
|
169
|
+
output.error(`Failed to list skills: ${err.message}`);
|
|
170
|
+
}
|
|
171
|
+
process.exit(1);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
// Buy/license a skill
|
|
175
|
+
skillCommand
|
|
176
|
+
.command('buy <skillId>')
|
|
177
|
+
.description('License a skill')
|
|
178
|
+
.action(async (skillId) => {
|
|
179
|
+
const config = loadConfig();
|
|
180
|
+
const walletConfig = loadWallet();
|
|
181
|
+
if (!config || !walletConfig) {
|
|
182
|
+
output.error('Agent not initialized. Run `duskware init` first.');
|
|
183
|
+
process.exit(1);
|
|
184
|
+
}
|
|
185
|
+
output.header('License Skill');
|
|
186
|
+
try {
|
|
187
|
+
const provider = new JsonRpcProvider(getRpcUrl(config.network));
|
|
188
|
+
const addresses = getContractAddresses(config.network);
|
|
189
|
+
const wallet = new Wallet(walletConfig.privateKey, provider);
|
|
190
|
+
const skillNFT = new Contract(addresses.skillNFT, SKILL_NFT_ABI, wallet);
|
|
191
|
+
const usdc = new Contract(addresses.usdc, ERC20_ABI, wallet);
|
|
192
|
+
// Get skill details using skills(uint256)
|
|
193
|
+
const skill = await skillNFT.skills(skillId);
|
|
194
|
+
// skill returns: [name, description, skillCID, priceUSDC, creatorAgent, usageCount, ratingTotal, ratingCount, isActive, capability]
|
|
195
|
+
const skillName = skill[0];
|
|
196
|
+
const priceUSDC = skill[3];
|
|
197
|
+
const creatorAgent = skill[4];
|
|
198
|
+
const isActive = skill[8];
|
|
199
|
+
if (!isActive) {
|
|
200
|
+
output.error('This skill is not active.');
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
output.keyValue('Skill', skillName);
|
|
204
|
+
output.keyValue('Price', output.formatUSDC(priceUSDC));
|
|
205
|
+
output.keyValue('Creator', output.truncateAddress(creatorAgent));
|
|
206
|
+
// Check if already licensed
|
|
207
|
+
const isLicensed = await skillNFT.isLicensed(walletConfig.address, skillId);
|
|
208
|
+
if (isLicensed) {
|
|
209
|
+
output.warning('You already own this skill!');
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
// Check USDC balance
|
|
213
|
+
const balance = await usdc.balanceOf(walletConfig.address);
|
|
214
|
+
if (balance < priceUSDC) {
|
|
215
|
+
output.error(`Insufficient USDC. Need ${output.formatUSDC(priceUSDC)}, have ${output.formatUSDC(balance)}`);
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
// Confirm purchase
|
|
219
|
+
const { confirm } = await inquirer.prompt([
|
|
220
|
+
{
|
|
221
|
+
type: 'confirm',
|
|
222
|
+
name: 'confirm',
|
|
223
|
+
message: `License "${skillName}" for ${output.formatUSDC(priceUSDC)}?`,
|
|
224
|
+
default: true,
|
|
225
|
+
},
|
|
226
|
+
]);
|
|
227
|
+
if (!confirm) {
|
|
228
|
+
output.info('Cancelled');
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
// Approve USDC if needed
|
|
232
|
+
const allowance = await usdc.allowance(walletConfig.address, addresses.skillNFT);
|
|
233
|
+
if (allowance < priceUSDC) {
|
|
234
|
+
const spinner = ora('Approving USDC...').start();
|
|
235
|
+
const approveTx = await usdc.approve(addresses.skillNFT, priceUSDC);
|
|
236
|
+
await waitForTx(approveTx);
|
|
237
|
+
spinner.succeed('USDC approved');
|
|
238
|
+
}
|
|
239
|
+
// License the skill
|
|
240
|
+
const spinner = ora('Licensing skill...').start();
|
|
241
|
+
const tx = await skillNFT.licenseSkill(skillId);
|
|
242
|
+
const receipt = await waitForTx(tx);
|
|
243
|
+
spinner.succeed('Skill licensed');
|
|
244
|
+
output.keyValue('Transaction', output.txHash(receipt.hash));
|
|
245
|
+
output.keyValue('Basescan', output.basescanLink(receipt.hash, config.network));
|
|
246
|
+
output.success(`You now own "${skillName}"!`);
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
if (err instanceof Error) {
|
|
250
|
+
output.error(`Failed to license skill: ${err.message}`);
|
|
251
|
+
}
|
|
252
|
+
process.exit(1);
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
//# sourceMappingURL=skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../src/commands/spawn.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,YAAY,SA2JrB,CAAC"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* duskware spawn
|
|
3
|
+
* Spawn a child agent with constraints
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import inquirer from 'inquirer';
|
|
7
|
+
import ora from 'ora';
|
|
8
|
+
import { JsonRpcProvider, Contract, Wallet } from 'ethers';
|
|
9
|
+
import * as output from '../utils/output.js';
|
|
10
|
+
import { loadConfig, loadWallet, getRpcUrl, getContractAddresses } from '../utils/config.js';
|
|
11
|
+
import { SPAWN_PROTOCOL_ABI, AGENT_IDENTITY_ABI, ERC20_ABI, waitForTx } from '../services/contracts.js';
|
|
12
|
+
export const spawnCommand = new Command('spawn')
|
|
13
|
+
.description('Spawn a child agent')
|
|
14
|
+
.action(async () => {
|
|
15
|
+
const config = loadConfig();
|
|
16
|
+
const walletConfig = loadWallet();
|
|
17
|
+
if (!config || !walletConfig) {
|
|
18
|
+
output.error('Agent not initialized. Run `duskware init` first.');
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
output.header('Spawn Child Agent');
|
|
22
|
+
try {
|
|
23
|
+
const provider = new JsonRpcProvider(getRpcUrl(config.network));
|
|
24
|
+
const addresses = getContractAddresses(config.network);
|
|
25
|
+
const wallet = new Wallet(walletConfig.privateKey, provider);
|
|
26
|
+
// Check reputation (need 50+ to spawn)
|
|
27
|
+
const agent = new Contract(config.agentAddress, AGENT_IDENTITY_ABI, provider);
|
|
28
|
+
let reputationScore = 0n;
|
|
29
|
+
try {
|
|
30
|
+
reputationScore = await agent.reputationScore();
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// Contract might not be deployed yet
|
|
34
|
+
}
|
|
35
|
+
if (reputationScore < 50n) {
|
|
36
|
+
output.error(`Insufficient reputation to spawn. Need 50, have ${reputationScore}`);
|
|
37
|
+
output.info('Build reputation through attestations first.');
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
output.keyValue('Your Reputation', output.formatReputation(reputationScore));
|
|
41
|
+
// Interactive constraint setup
|
|
42
|
+
const answers = await inquirer.prompt([
|
|
43
|
+
{
|
|
44
|
+
type: 'input',
|
|
45
|
+
name: 'capabilities',
|
|
46
|
+
message: 'Child capabilities (comma-separated):',
|
|
47
|
+
default: 'research',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
type: 'input',
|
|
51
|
+
name: 'dailyLimit',
|
|
52
|
+
message: 'Daily spending limit (USDC):',
|
|
53
|
+
default: '100',
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
type: 'input',
|
|
57
|
+
name: 'maxDepth',
|
|
58
|
+
message: 'Max spawn depth (1-5):',
|
|
59
|
+
default: '3',
|
|
60
|
+
validate: (input) => {
|
|
61
|
+
const n = parseInt(input);
|
|
62
|
+
return (n >= 1 && n <= 5) || 'Must be between 1 and 5';
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
type: 'confirm',
|
|
67
|
+
name: 'revocable',
|
|
68
|
+
message: 'Can you revoke this child?',
|
|
69
|
+
default: true,
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
type: 'input',
|
|
73
|
+
name: 'bootstrap',
|
|
74
|
+
message: 'Bootstrap stake (USDC, min 10):',
|
|
75
|
+
default: '10',
|
|
76
|
+
validate: (input) => parseFloat(input) >= 10 || 'Minimum 10 USDC',
|
|
77
|
+
},
|
|
78
|
+
]);
|
|
79
|
+
const capabilities = answers.capabilities.split(',').map((c) => c.trim());
|
|
80
|
+
const dailyLimit = BigInt(Math.floor(parseFloat(answers.dailyLimit) * 1_000_000));
|
|
81
|
+
const maxDepth = parseInt(answers.maxDepth);
|
|
82
|
+
const revocable = answers.revocable;
|
|
83
|
+
const bootstrap = BigInt(Math.floor(parseFloat(answers.bootstrap) * 1_000_000));
|
|
84
|
+
output.header('Spawn Configuration');
|
|
85
|
+
output.keyValue('Capabilities', capabilities.join(', '));
|
|
86
|
+
output.keyValue('Daily Limit', output.formatUSDC(dailyLimit));
|
|
87
|
+
output.keyValue('Max Spawn Depth', maxDepth.toString());
|
|
88
|
+
output.keyValue('Revocable', revocable ? 'Yes' : 'No');
|
|
89
|
+
output.keyValue('Bootstrap Stake', output.formatUSDC(bootstrap));
|
|
90
|
+
// Check USDC balance
|
|
91
|
+
const usdc = new Contract(addresses.usdc, ERC20_ABI, wallet);
|
|
92
|
+
const balance = await usdc.balanceOf(walletConfig.address);
|
|
93
|
+
// TODO: Get spawn fee from FeeController
|
|
94
|
+
const spawnFee = 0n; // Free during launch period
|
|
95
|
+
const totalRequired = spawnFee + bootstrap;
|
|
96
|
+
if (balance < totalRequired) {
|
|
97
|
+
output.error(`Insufficient USDC. Need ${output.formatUSDC(totalRequired)}, have ${output.formatUSDC(balance)}`);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
// Confirm spawn
|
|
101
|
+
const { confirm } = await inquirer.prompt([
|
|
102
|
+
{
|
|
103
|
+
type: 'confirm',
|
|
104
|
+
name: 'confirm',
|
|
105
|
+
message: `Spawn child agent with ${output.formatUSDC(bootstrap)} bootstrap?`,
|
|
106
|
+
default: true,
|
|
107
|
+
},
|
|
108
|
+
]);
|
|
109
|
+
if (!confirm) {
|
|
110
|
+
output.info('Cancelled');
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
// Approve USDC if needed
|
|
114
|
+
if (totalRequired > 0n) {
|
|
115
|
+
const allowance = await usdc.allowance(walletConfig.address, addresses.spawnProtocol);
|
|
116
|
+
if (allowance < totalRequired) {
|
|
117
|
+
const spinner = ora('Approving USDC...').start();
|
|
118
|
+
const approveTx = await usdc.approve(addresses.spawnProtocol, totalRequired);
|
|
119
|
+
await waitForTx(approveTx);
|
|
120
|
+
spinner.succeed('USDC approved');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Spawn child
|
|
124
|
+
const spinner = ora('Spawning child agent...').start();
|
|
125
|
+
const spawnProtocol = new Contract(addresses.spawnProtocol, SPAWN_PROTOCOL_ABI, wallet);
|
|
126
|
+
const tx = await spawnProtocol.spawn(capabilities, [], // skill allowlist (empty = all allowed)
|
|
127
|
+
dailyLimit, maxDepth, revocable);
|
|
128
|
+
const receipt = await waitForTx(tx);
|
|
129
|
+
spinner.succeed('Child agent spawned');
|
|
130
|
+
// Parse event to get child address
|
|
131
|
+
// In production, we'd parse the AgentSpawned event
|
|
132
|
+
output.keyValue('Transaction', output.txHash(receipt.hash));
|
|
133
|
+
output.keyValue('Basescan', output.basescanLink(receipt.hash, config.network));
|
|
134
|
+
output.success('Child agent created!');
|
|
135
|
+
output.info('The child agent can now operate with the configured constraints.');
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
if (err instanceof Error) {
|
|
139
|
+
output.error(`Failed to spawn: ${err.message}`);
|
|
140
|
+
}
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
// List children
|
|
145
|
+
spawnCommand
|
|
146
|
+
.command('children')
|
|
147
|
+
.description('List your spawned children')
|
|
148
|
+
.action(async () => {
|
|
149
|
+
const config = loadConfig();
|
|
150
|
+
const walletConfig = loadWallet();
|
|
151
|
+
if (!config || !walletConfig) {
|
|
152
|
+
output.error('Agent not initialized. Run `duskware init` first.');
|
|
153
|
+
process.exit(1);
|
|
154
|
+
}
|
|
155
|
+
output.header('Spawned Children');
|
|
156
|
+
try {
|
|
157
|
+
const provider = new JsonRpcProvider(getRpcUrl(config.network));
|
|
158
|
+
const addresses = getContractAddresses(config.network);
|
|
159
|
+
const spawnProtocol = new Contract(addresses.spawnProtocol, SPAWN_PROTOCOL_ABI, provider);
|
|
160
|
+
const children = await spawnProtocol.getChildren(config.agentAddress);
|
|
161
|
+
if (children.length === 0) {
|
|
162
|
+
output.info('No children spawned yet.');
|
|
163
|
+
output.info('Run `duskware spawn` to create your first child agent.');
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
output.keyValue('Total Children', children.length.toString());
|
|
167
|
+
console.log();
|
|
168
|
+
for (const childAddress of children) {
|
|
169
|
+
output.keyValue('Child', output.address(childAddress));
|
|
170
|
+
output.keyValue('Basescan', output.agentLink(childAddress, config.network));
|
|
171
|
+
console.log();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
if (err instanceof Error) {
|
|
176
|
+
output.error(`Failed to list children: ${err.message}`);
|
|
177
|
+
}
|
|
178
|
+
process.exit(1);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
// Revoke child
|
|
182
|
+
spawnCommand
|
|
183
|
+
.command('revoke <childAddress>')
|
|
184
|
+
.description('Revoke a child agent')
|
|
185
|
+
.action(async (childAddress) => {
|
|
186
|
+
const config = loadConfig();
|
|
187
|
+
const walletConfig = loadWallet();
|
|
188
|
+
if (!config || !walletConfig) {
|
|
189
|
+
output.error('Agent not initialized. Run `duskware init` first.');
|
|
190
|
+
process.exit(1);
|
|
191
|
+
}
|
|
192
|
+
output.header('Revoke Child Agent');
|
|
193
|
+
output.keyValue('Child', output.address(childAddress));
|
|
194
|
+
const { confirm } = await inquirer.prompt([
|
|
195
|
+
{
|
|
196
|
+
type: 'confirm',
|
|
197
|
+
name: 'confirm',
|
|
198
|
+
message: 'Are you sure? This cannot be undone.',
|
|
199
|
+
default: false,
|
|
200
|
+
},
|
|
201
|
+
]);
|
|
202
|
+
if (!confirm) {
|
|
203
|
+
output.info('Cancelled');
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
try {
|
|
207
|
+
const provider = new JsonRpcProvider(getRpcUrl(config.network));
|
|
208
|
+
const addresses = getContractAddresses(config.network);
|
|
209
|
+
const wallet = new Wallet(walletConfig.privateKey, provider);
|
|
210
|
+
const spawnProtocol = new Contract(addresses.spawnProtocol, SPAWN_PROTOCOL_ABI, wallet);
|
|
211
|
+
const spinner = ora('Revoking child...').start();
|
|
212
|
+
const tx = await spawnProtocol.revokeChild(childAddress);
|
|
213
|
+
const receipt = await waitForTx(tx);
|
|
214
|
+
spinner.succeed('Child revoked');
|
|
215
|
+
output.keyValue('Transaction', output.txHash(receipt.hash));
|
|
216
|
+
output.keyValue('Basescan', output.basescanLink(receipt.hash, config.network));
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
if (err instanceof Error) {
|
|
220
|
+
output.error(`Failed to revoke: ${err.message}`);
|
|
221
|
+
}
|
|
222
|
+
process.exit(1);
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
//# sourceMappingURL=spawn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/commands/spawn.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specter.d.ts","sourceRoot":"","sources":["../../src/commands/specter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyCpC,eAAO,MAAM,cAAc,SAC6B,CAAC"}
|