duskware 0.1.0 → 0.2.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
CHANGED
|
@@ -6,32 +6,118 @@ CLI for Duskware - Sovereign Onchain Runtime for AI Agents on Base.
|
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
8
|
npm install -g duskware
|
|
9
|
-
# or
|
|
9
|
+
# or run directly with npx
|
|
10
10
|
npx duskware
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
## Quick Start
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
|
-
# Initialize a new agent
|
|
17
|
-
duskware init
|
|
16
|
+
# Initialize a new agent identity
|
|
17
|
+
npx duskware init
|
|
18
18
|
|
|
19
|
-
#
|
|
20
|
-
duskware
|
|
19
|
+
# Add credits (requires USDC on Base)
|
|
20
|
+
npx duskware credits topup 10
|
|
21
|
+
|
|
22
|
+
# Run AI inference
|
|
23
|
+
npx duskware inference prompt "Hello, I am an autonomous agent"
|
|
24
|
+
|
|
25
|
+
# Check your status
|
|
26
|
+
npx duskware status
|
|
21
27
|
```
|
|
22
28
|
|
|
23
29
|
## Commands
|
|
24
30
|
|
|
31
|
+
### Credits (Unified Balance)
|
|
32
|
+
|
|
33
|
+
Duskware uses a unified credits system. Deposit USDC once, use across all services.
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# Check your credits balance
|
|
37
|
+
duskware credits balance
|
|
38
|
+
|
|
39
|
+
# Top up credits ($5, $10, $25, $50, or $100)
|
|
40
|
+
duskware credits topup 10
|
|
41
|
+
|
|
42
|
+
# View transaction history
|
|
43
|
+
duskware credits transactions
|
|
44
|
+
|
|
45
|
+
# View usage breakdown by service
|
|
46
|
+
duskware credits usage
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Inference
|
|
50
|
+
|
|
51
|
+
Access Claude, GPT, and other frontier models. Paid from your credits balance.
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# Send inference request (uses claude-4.5-sonnet by default)
|
|
55
|
+
duskware inference prompt "What is the meaning of life?"
|
|
56
|
+
|
|
57
|
+
# Specify a different model
|
|
58
|
+
duskware inference prompt "Hello" --model claude-4.5-haiku
|
|
59
|
+
|
|
60
|
+
# List available models and pricing
|
|
61
|
+
duskware inference models
|
|
62
|
+
|
|
63
|
+
# Check credits balance
|
|
64
|
+
duskware inference balance
|
|
65
|
+
|
|
66
|
+
# Check inference proxy health
|
|
67
|
+
duskware inference health
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Available Models:**
|
|
71
|
+
| Model | Price |
|
|
72
|
+
|-------|-------|
|
|
73
|
+
| claude-4.5-haiku | $0.01 |
|
|
74
|
+
| claude-4.5-sonnet | $0.05 |
|
|
75
|
+
| claude-4.5-opus | $0.25 |
|
|
76
|
+
| gpt-5.2 | $0.10 |
|
|
77
|
+
| gpt-5-mini | $0.03 |
|
|
78
|
+
|
|
25
79
|
### Agent Identity
|
|
26
80
|
|
|
27
81
|
```bash
|
|
28
|
-
# Deploy new AgentIdentity contract
|
|
29
|
-
duskware init
|
|
82
|
+
# Deploy new AgentIdentity contract on Base
|
|
83
|
+
duskware init
|
|
30
84
|
|
|
31
85
|
# Show agent status
|
|
32
86
|
duskware status
|
|
33
87
|
```
|
|
34
88
|
|
|
89
|
+
### Sandboxes
|
|
90
|
+
|
|
91
|
+
Persistent Linux environments for autonomous agents.
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
# List your sandboxes
|
|
95
|
+
duskware sandbox list
|
|
96
|
+
|
|
97
|
+
# Create a new sandbox
|
|
98
|
+
duskware sandbox create my-agent --tier starter
|
|
99
|
+
|
|
100
|
+
# Execute command in sandbox
|
|
101
|
+
duskware sandbox exec <sandboxId> "echo hello"
|
|
102
|
+
|
|
103
|
+
# Stop sandbox (sleep mode - preserves state)
|
|
104
|
+
duskware sandbox stop <sandboxId>
|
|
105
|
+
|
|
106
|
+
# Delete sandbox
|
|
107
|
+
duskware sandbox delete <sandboxId>
|
|
108
|
+
|
|
109
|
+
# View available tiers and pricing
|
|
110
|
+
duskware sandbox tiers
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**Sandbox Tiers:**
|
|
114
|
+
| Tier | vCPU | Memory | Disk | Price |
|
|
115
|
+
|------|------|--------|------|-------|
|
|
116
|
+
| starter | 1 | 512 MB | 5 GB | $5/mo |
|
|
117
|
+
| medium | 2 | 2 GB | 20 GB | $10/mo |
|
|
118
|
+
| power | 4 | 8 GB | 50 GB | $25/mo |
|
|
119
|
+
| pro | 8 | 16 GB | 100 GB | $50/mo |
|
|
120
|
+
|
|
35
121
|
### Skills
|
|
36
122
|
|
|
37
123
|
```bash
|
|
@@ -62,7 +148,7 @@ duskware spawn revoke <childAddress>
|
|
|
62
148
|
### Trust
|
|
63
149
|
|
|
64
150
|
```bash
|
|
65
|
-
# Submit attestation
|
|
151
|
+
# Submit attestation (score 1-100)
|
|
66
152
|
duskware trust attest <agentAddress> <score> --context "Great work"
|
|
67
153
|
|
|
68
154
|
# Get trust score
|
|
@@ -89,20 +175,23 @@ duskware memory read
|
|
|
89
175
|
duskware memory version
|
|
90
176
|
```
|
|
91
177
|
|
|
92
|
-
###
|
|
178
|
+
### Specter (Autonomous Agents)
|
|
93
179
|
|
|
94
180
|
```bash
|
|
95
|
-
#
|
|
96
|
-
duskware
|
|
181
|
+
# Initialize specter configuration
|
|
182
|
+
duskware specter init
|
|
97
183
|
|
|
98
|
-
#
|
|
99
|
-
duskware
|
|
184
|
+
# Start autonomous agent
|
|
185
|
+
duskware specter start
|
|
100
186
|
|
|
101
|
-
# Check
|
|
102
|
-
duskware
|
|
187
|
+
# Check status
|
|
188
|
+
duskware specter status
|
|
189
|
+
|
|
190
|
+
# Stop agent
|
|
191
|
+
duskware specter stop
|
|
103
192
|
|
|
104
|
-
#
|
|
105
|
-
duskware
|
|
193
|
+
# View logs
|
|
194
|
+
duskware specter logs
|
|
106
195
|
```
|
|
107
196
|
|
|
108
197
|
## Configuration
|
|
@@ -116,34 +205,25 @@ Config files are stored in `~/.duskware/`:
|
|
|
116
205
|
└── memory/ # Local memory cache
|
|
117
206
|
```
|
|
118
207
|
|
|
119
|
-
##
|
|
208
|
+
## Network
|
|
120
209
|
|
|
121
|
-
|
|
122
|
-
- **Base Mainnet**: `--network mainnet`
|
|
210
|
+
Duskware runs on **Base Mainnet** by default.
|
|
123
211
|
|
|
124
|
-
|
|
212
|
+
- **USDC Contract**: `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913`
|
|
213
|
+
- **Chain ID**: 8453
|
|
125
214
|
|
|
126
|
-
|
|
127
|
-
- USDC: `0x036CbD53842c5426634e7929541eC2318f3dCF7e`
|
|
215
|
+
## Payment
|
|
128
216
|
|
|
129
|
-
|
|
130
|
-
- USDC
|
|
217
|
+
All payments are processed via the x402 protocol through OpenX402.ai facilitator:
|
|
218
|
+
- USDC on Base Mainnet
|
|
219
|
+
- EIP-3009 gasless transfers
|
|
220
|
+
- Payments go directly to Duskware treasury
|
|
131
221
|
|
|
132
|
-
##
|
|
222
|
+
## Links
|
|
133
223
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
npm
|
|
137
|
-
|
|
138
|
-
# Build
|
|
139
|
-
npm run build
|
|
140
|
-
|
|
141
|
-
# Watch mode
|
|
142
|
-
npm run dev
|
|
143
|
-
|
|
144
|
-
# Run tests
|
|
145
|
-
npm test
|
|
146
|
-
```
|
|
224
|
+
- **Dashboard**: https://duskware.xyz
|
|
225
|
+
- **Documentation**: https://docs.duskware.xyz
|
|
226
|
+
- **npm**: https://www.npmjs.com/package/duskware
|
|
147
227
|
|
|
148
228
|
## License
|
|
149
229
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inference.d.ts","sourceRoot":"","sources":["../../src/commands/inference.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"inference.d.ts","sourceRoot":"","sources":["../../src/commands/inference.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqCpC,eAAO,MAAM,gBAAgB,SACsB,CAAC"}
|
|
@@ -1,25 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* duskware inference
|
|
3
|
-
* AI inference via
|
|
3
|
+
* AI inference via Duskware Credits (unified balance)
|
|
4
4
|
*/
|
|
5
5
|
import { Command } from 'commander';
|
|
6
6
|
import ora from 'ora';
|
|
7
|
-
import { wrapFetchWithPayment, createSigner } from 'x402-fetch';
|
|
8
7
|
import * as output from '../utils/output.js';
|
|
9
8
|
import { loadConfig, loadWallet } from '../utils/config.js';
|
|
10
9
|
// Inference proxy URL
|
|
11
10
|
const INFERENCE_URL = process.env.INFERENCE_URL || 'https://duskware-inference.fly.dev';
|
|
12
|
-
//
|
|
13
|
-
const
|
|
14
|
-
// Max payment amount (0.50 USDC in base units - 6 decimals)
|
|
15
|
-
const MAX_PAYMENT = BigInt(500000);
|
|
11
|
+
// Credits API URL
|
|
12
|
+
const CREDITS_API_URL = process.env.CREDITS_API_URL || 'https://duskware-credits-api.fly.dev';
|
|
16
13
|
export const inferenceCommand = new Command('inference')
|
|
17
|
-
.description('AI inference via
|
|
14
|
+
.description('AI inference via Duskware Credits');
|
|
18
15
|
// Send inference request
|
|
19
16
|
inferenceCommand
|
|
20
17
|
.command('prompt <text>')
|
|
21
|
-
.description('Send a prompt
|
|
22
|
-
.option('-m, --model <model>', 'Model to use', 'claude-
|
|
18
|
+
.description('Send a prompt using Duskware Credits')
|
|
19
|
+
.option('-m, --model <model>', 'Model to use', 'claude-4.5-sonnet')
|
|
23
20
|
.option('--max-tokens <n>', 'Maximum tokens', '1000')
|
|
24
21
|
.option('--system <text>', 'System prompt')
|
|
25
22
|
.action(async (text, options) => {
|
|
@@ -33,30 +30,40 @@ inferenceCommand
|
|
|
33
30
|
output.keyValue('Model', options.model);
|
|
34
31
|
output.keyValue('Max Tokens', options.maxTokens);
|
|
35
32
|
output.keyValue('Agent', config.agentAddress);
|
|
36
|
-
const spinner = ora('
|
|
33
|
+
const spinner = ora('Checking credits balance...').start();
|
|
37
34
|
try {
|
|
38
|
-
//
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
35
|
+
// Check balance first
|
|
36
|
+
const balanceRes = await fetch(`${CREDITS_API_URL}/balance/${config.agentAddress}`);
|
|
37
|
+
const balanceData = await balanceRes.json();
|
|
38
|
+
spinner.text = `Balance: ${balanceData.balance || '$0.00'} - Sending inference request...`;
|
|
42
39
|
// Build messages array
|
|
43
40
|
const messages = [];
|
|
44
41
|
if (options.system) {
|
|
45
42
|
messages.push({ role: 'system', content: options.system });
|
|
46
43
|
}
|
|
47
44
|
messages.push({ role: 'user', content: text });
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const response = await x402Fetch(`${INFERENCE_URL}/inference/${options.model}`, {
|
|
45
|
+
// Make request with address for prepaid credits
|
|
46
|
+
const response = await fetch(`${INFERENCE_URL}/inference/${options.model}`, {
|
|
51
47
|
method: 'POST',
|
|
52
48
|
headers: { 'Content-Type': 'application/json' },
|
|
53
49
|
body: JSON.stringify({
|
|
54
50
|
messages,
|
|
55
51
|
maxTokens: parseInt(options.maxTokens),
|
|
52
|
+
address: config.agentAddress,
|
|
56
53
|
}),
|
|
57
54
|
});
|
|
58
55
|
if (!response.ok) {
|
|
59
56
|
const errorData = await response.json().catch(() => ({}));
|
|
57
|
+
if (response.status === 402) {
|
|
58
|
+
spinner.fail('Payment required');
|
|
59
|
+
output.error('Insufficient credits balance');
|
|
60
|
+
output.keyValue('Required', errorData.price || 'Unknown');
|
|
61
|
+
output.keyValue('Current Balance', errorData.currentBalance || '$0.00');
|
|
62
|
+
console.log();
|
|
63
|
+
output.info('Top up your credits:');
|
|
64
|
+
output.info(' duskware credits deposit <amount>');
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
60
67
|
throw new Error(errorData.error || `Request failed: ${response.status}`);
|
|
61
68
|
}
|
|
62
69
|
const result = await response.json();
|
|
@@ -68,8 +75,12 @@ inferenceCommand
|
|
|
68
75
|
output.keyValue('Model', result.model);
|
|
69
76
|
output.keyValue('Tokens', `${result.usage.totalTokens} (${result.usage.promptTokens} prompt + ${result.usage.completionTokens} completion)`);
|
|
70
77
|
if (result.payment) {
|
|
71
|
-
output.keyValue('
|
|
72
|
-
output.keyValue('
|
|
78
|
+
output.keyValue('Cost', result.payment.amount);
|
|
79
|
+
output.keyValue('Payment Method', result.payment.method);
|
|
80
|
+
}
|
|
81
|
+
// Show remaining balance
|
|
82
|
+
if (result.balance) {
|
|
83
|
+
output.keyValue('Remaining Balance', result.balance);
|
|
73
84
|
}
|
|
74
85
|
}
|
|
75
86
|
catch (err) {
|
|
@@ -78,11 +89,10 @@ inferenceCommand
|
|
|
78
89
|
if (err.message.includes('fetch') || err.message.includes('ECONNREFUSED')) {
|
|
79
90
|
output.warning('Inference proxy not available.');
|
|
80
91
|
output.info(`Make sure the proxy is running at ${INFERENCE_URL}`);
|
|
81
|
-
output.info('Run: cd inference-proxy && npm run dev');
|
|
82
92
|
}
|
|
83
93
|
else if (err.message.includes('insufficient') || err.message.includes('balance')) {
|
|
84
|
-
output.error('Insufficient
|
|
85
|
-
output.info('
|
|
94
|
+
output.error('Insufficient credits balance.');
|
|
95
|
+
output.info('Top up with: duskware credits deposit <amount>');
|
|
86
96
|
}
|
|
87
97
|
else {
|
|
88
98
|
output.error(err.message);
|
|
@@ -107,19 +117,19 @@ inferenceCommand
|
|
|
107
117
|
spinner.stop();
|
|
108
118
|
output.printTable(['Model ID', 'Name', 'Provider', 'Price'], models.map(m => [m.id, m.name, m.provider, m.pricePerRequest]));
|
|
109
119
|
console.log();
|
|
110
|
-
output.info(
|
|
111
|
-
output.info('
|
|
120
|
+
output.info('Payment: Automatic via Duskware Credits');
|
|
121
|
+
output.info('Top up: duskware credits deposit <amount>');
|
|
112
122
|
}
|
|
113
123
|
catch {
|
|
114
124
|
spinner.stop();
|
|
115
125
|
output.warning('Inference proxy not available. Showing default models:');
|
|
116
126
|
console.log();
|
|
117
127
|
const defaultModels = [
|
|
118
|
-
{ id: 'claude-
|
|
119
|
-
{ id: 'claude-
|
|
120
|
-
{ id: 'claude-
|
|
121
|
-
{ id: 'gpt-
|
|
122
|
-
{ id: 'gpt-
|
|
128
|
+
{ id: 'claude-4.5-haiku', name: 'Claude 4.5 Haiku', provider: 'anthropic', price: '$0.01' },
|
|
129
|
+
{ id: 'claude-4.5-sonnet', name: 'Claude 4.5 Sonnet', provider: 'anthropic', price: '$0.05' },
|
|
130
|
+
{ id: 'claude-4.5-opus', name: 'Claude 4.5 Opus', provider: 'anthropic', price: '$0.25' },
|
|
131
|
+
{ id: 'gpt-5.2', name: 'GPT-5.2', provider: 'openai', price: '$0.10' },
|
|
132
|
+
{ id: 'gpt-5-mini', name: 'GPT-5 Mini', provider: 'openai', price: '$0.03' },
|
|
123
133
|
];
|
|
124
134
|
output.printTable(['Model ID', 'Name', 'Provider', 'Price'], defaultModels.map(m => [m.id, m.name, m.provider, m.price]));
|
|
125
135
|
}
|
|
@@ -135,8 +145,8 @@ inferenceCommand
|
|
|
135
145
|
const data = await response.json();
|
|
136
146
|
output.keyValue('Status', data.status === 'ok' ? '✓ Healthy' : '✗ Unhealthy');
|
|
137
147
|
output.keyValue('Version', data.version);
|
|
138
|
-
output.keyValue('Facilitator', data.facilitator);
|
|
139
148
|
output.keyValue('Network', data.network);
|
|
149
|
+
output.keyValue('Min Deposit', data.minDeposit || '$5.00');
|
|
140
150
|
output.keyValue('Timestamp', data.timestamp);
|
|
141
151
|
}
|
|
142
152
|
catch {
|
|
@@ -145,4 +155,33 @@ inferenceCommand
|
|
|
145
155
|
process.exit(1);
|
|
146
156
|
}
|
|
147
157
|
});
|
|
158
|
+
// Check credits balance
|
|
159
|
+
inferenceCommand
|
|
160
|
+
.command('balance')
|
|
161
|
+
.description('Check your Duskware Credits balance')
|
|
162
|
+
.action(async () => {
|
|
163
|
+
const config = loadConfig();
|
|
164
|
+
if (!config) {
|
|
165
|
+
output.error('Agent not initialized. Run `duskware init` first.');
|
|
166
|
+
process.exit(1);
|
|
167
|
+
}
|
|
168
|
+
output.header('Duskware Credits');
|
|
169
|
+
const spinner = ora('Fetching balance...').start();
|
|
170
|
+
try {
|
|
171
|
+
const response = await fetch(`${CREDITS_API_URL}/balance/${config.agentAddress}`);
|
|
172
|
+
const data = await response.json();
|
|
173
|
+
spinner.stop();
|
|
174
|
+
output.keyValue('Address', data.address);
|
|
175
|
+
output.keyValue('Balance', data.balance || '$0.00');
|
|
176
|
+
output.keyValue('Total Deposited', data.totalDeposited || '$0.00');
|
|
177
|
+
output.keyValue('Total Spent', data.totalSpent || '$0.00');
|
|
178
|
+
console.log();
|
|
179
|
+
output.info('Top up: duskware credits deposit <amount>');
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
spinner.fail('Failed to fetch balance');
|
|
183
|
+
output.error('Credits API not reachable');
|
|
184
|
+
process.exit(1);
|
|
185
|
+
}
|
|
186
|
+
});
|
|
148
187
|
//# sourceMappingURL=inference.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inference.js","sourceRoot":"","sources":["../../src/commands/inference.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,
|
|
1
|
+
{"version":3,"file":"inference.js","sourceRoot":"","sources":["../../src/commands/inference.ts"],"names":[],"mappings":"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"}
|