@inkd/cli 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 +226 -0
- package/dist/abi.d.ts +408 -0
- package/dist/abi.d.ts.map +1 -0
- package/dist/abi.js +283 -0
- package/dist/abi.js.map +1 -0
- package/dist/client.d.ts +19 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +34 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/agent.d.ts +10 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +106 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/agentd.d.ts +35 -0
- package/dist/commands/agentd.d.ts.map +1 -0
- package/dist/commands/agentd.js +336 -0
- package/dist/commands/agentd.js.map +1 -0
- package/dist/commands/init.d.ts +5 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +25 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/project.d.ts +16 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +222 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/search.d.ts +14 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +141 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +44 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/token.d.ts +46 -0
- package/dist/commands/token.d.ts.map +1 -0
- package/dist/commands/token.js +410 -0
- package/dist/commands/token.js.map +1 -0
- package/dist/commands/version.d.ts +12 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +134 -0
- package/dist/commands/version.js.map +1 -0
- package/dist/commands/watch.d.ts +16 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +175 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/config.d.ts +42 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +94 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +258 -0
- package/dist/index.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* inkd agentd — Autonomous agent daemon
|
|
4
|
+
*
|
|
5
|
+
* Long-running process that keeps an AI agent's on-chain identity alive,
|
|
6
|
+
* periodically syncing state, discovering peers, and responding to events.
|
|
7
|
+
*
|
|
8
|
+
* Commands:
|
|
9
|
+
* inkd agentd start Run the daemon (blocks until SIGINT/SIGTERM)
|
|
10
|
+
* inkd agentd status Print current daemon status + last run
|
|
11
|
+
* inkd agentd peers List all discovered peer agents
|
|
12
|
+
*
|
|
13
|
+
* Flags:
|
|
14
|
+
* --interval <ms> Sync interval in ms (default: 60000 = 1 min)
|
|
15
|
+
* --dry-run Simulate only — no on-chain transactions
|
|
16
|
+
* --quiet Only print errors
|
|
17
|
+
* --json Output as newline-delimited JSON (for log ingestion)
|
|
18
|
+
* --once Run a single sync cycle then exit (great for cron)
|
|
19
|
+
*
|
|
20
|
+
* Environment:
|
|
21
|
+
* INKD_PRIVATE_KEY Wallet private key (required for transactions)
|
|
22
|
+
* INKD_NETWORK mainnet | testnet (default: testnet)
|
|
23
|
+
* INKD_RPC_URL Custom RPC endpoint
|
|
24
|
+
* INKD_AGENT_NAME Name of this agent's project (required)
|
|
25
|
+
* INKD_AGENT_ENDPOINT API endpoint to advertise to peers
|
|
26
|
+
* INKD_INTERVAL Sync interval override in ms
|
|
27
|
+
*
|
|
28
|
+
* What it does on each cycle:
|
|
29
|
+
* 1. Reads on-chain registry to discover all peer agents
|
|
30
|
+
* 2. Probes this agent's own project to confirm it exists
|
|
31
|
+
* 3. Checks ETH balance (warns if < 0.01 ETH — can't pay version fees)
|
|
32
|
+
* 4. Emits a heartbeat version to Arweave every N cycles (configurable)
|
|
33
|
+
* 5. Writes a local state file (.agentd-state.json) for introspection
|
|
34
|
+
*/
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.cmdAgentd = cmdAgentd;
|
|
37
|
+
const fs_1 = require("fs");
|
|
38
|
+
const path_1 = require("path");
|
|
39
|
+
const viem_1 = require("viem");
|
|
40
|
+
const config_js_1 = require("../config.js");
|
|
41
|
+
const client_js_1 = require("../client.js");
|
|
42
|
+
const abi_js_1 = require("../abi.js");
|
|
43
|
+
// ─── State file ───────────────────────────────────────────────────────────────
|
|
44
|
+
const STATE_FILE = (0, path_1.resolve)(process.cwd(), '.agentd-state.json');
|
|
45
|
+
function loadState() {
|
|
46
|
+
if (!(0, fs_1.existsSync)(STATE_FILE))
|
|
47
|
+
return null;
|
|
48
|
+
try {
|
|
49
|
+
return JSON.parse((0, fs_1.readFileSync)(STATE_FILE, 'utf-8'));
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function saveState(state) {
|
|
56
|
+
(0, fs_1.writeFileSync)(STATE_FILE, JSON.stringify(state, null, 2) + '\n', 'utf-8');
|
|
57
|
+
}
|
|
58
|
+
// ─── Display helpers ──────────────────────────────────────────────────────────
|
|
59
|
+
function ts() {
|
|
60
|
+
return new Date().toISOString().replace('T', ' ').slice(0, 19);
|
|
61
|
+
}
|
|
62
|
+
function jsonLine(event, data) {
|
|
63
|
+
console.log(JSON.stringify({ event, ts: new Date().toISOString(), ...data }));
|
|
64
|
+
}
|
|
65
|
+
function humanLine(icon, color, msg, jsonMode, event) {
|
|
66
|
+
if (!jsonMode) {
|
|
67
|
+
console.log(` ${color}${icon}${config_js_1.RESET} ${config_js_1.DIM}[${ts()}]${config_js_1.RESET} ${msg}`);
|
|
68
|
+
}
|
|
69
|
+
else if (event) {
|
|
70
|
+
jsonLine(event, { msg });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// ─── Registry helpers ─────────────────────────────────────────────────────────
|
|
74
|
+
async function discoverAgents(publicClient, registryAddress, limit = 100) {
|
|
75
|
+
const raw = await publicClient.readContract({
|
|
76
|
+
address: registryAddress,
|
|
77
|
+
abi: abi_js_1.REGISTRY_ABI,
|
|
78
|
+
functionName: 'getAgentProjects',
|
|
79
|
+
args: [0n, BigInt(limit)],
|
|
80
|
+
});
|
|
81
|
+
return raw.map(a => ({
|
|
82
|
+
id: String(a['id']),
|
|
83
|
+
owner: String(a['owner']),
|
|
84
|
+
name: String(a['name']),
|
|
85
|
+
description: String(a['description'] ?? ''),
|
|
86
|
+
agentEndpoint: String(a['agentEndpoint'] ?? ''),
|
|
87
|
+
isPublic: Boolean(a['isPublic']),
|
|
88
|
+
versionCount: String(a['versionCount']),
|
|
89
|
+
createdAt: String(a['createdAt']),
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
async function getBalance(publicClient, address) {
|
|
93
|
+
return publicClient.getBalance({ address });
|
|
94
|
+
}
|
|
95
|
+
// ─── Single sync cycle ────────────────────────────────────────────────────────
|
|
96
|
+
async function runCycle(opts) {
|
|
97
|
+
const { state, registryAddress, walletAddress, publicClient, agentName, jsonMode, quiet, dryRun } = opts;
|
|
98
|
+
const say = (icon, color, msg, event) => {
|
|
99
|
+
if (!quiet)
|
|
100
|
+
humanLine(icon, color, msg, jsonMode, event);
|
|
101
|
+
};
|
|
102
|
+
try {
|
|
103
|
+
// 1. Discover peers
|
|
104
|
+
say('⟳', config_js_1.CYAN, 'Discovering peer agents...', 'discover_start');
|
|
105
|
+
const peers = await discoverAgents(publicClient, registryAddress);
|
|
106
|
+
const peers_str = `${config_js_1.CYAN}${peers.length}${config_js_1.RESET} agents`;
|
|
107
|
+
say('✓', config_js_1.GREEN, `Found ${peers_str} on-chain`, 'discover_done');
|
|
108
|
+
// 2. Find self
|
|
109
|
+
const self = peers.find(p => p.name === agentName);
|
|
110
|
+
if (!self) {
|
|
111
|
+
say('⚠', config_js_1.YELLOW, `Agent "${agentName}" not found — run: inkd project create --name ${agentName} --agent`, 'self_not_found');
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
say('✓', config_js_1.GREEN, `Self: ${config_js_1.CYAN}${agentName}${config_js_1.RESET} (id=${self.id}, versions=${self.versionCount})`, 'self_found');
|
|
115
|
+
}
|
|
116
|
+
// 3. ETH balance check
|
|
117
|
+
const balance = await getBalance(publicClient, walletAddress);
|
|
118
|
+
const balEth = (0, viem_1.formatEther)(balance);
|
|
119
|
+
const lowBal = balance < (0, viem_1.parseEther)('0.01');
|
|
120
|
+
if (lowBal) {
|
|
121
|
+
say('⚠', config_js_1.YELLOW, `Low ETH balance: ${config_js_1.YELLOW}${balEth} ETH${config_js_1.RESET} — need ≥ 0.01 ETH to push versions`, 'low_balance');
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
say('✓', config_js_1.GREEN, `ETH balance: ${config_js_1.GREEN}${parseFloat(balEth).toFixed(4)} ETH${config_js_1.RESET}`, 'balance_ok');
|
|
125
|
+
}
|
|
126
|
+
// 4. Peer analysis
|
|
127
|
+
const agentPeers = peers.filter(p => p.name !== agentName);
|
|
128
|
+
if (agentPeers.length > 0 && !quiet) {
|
|
129
|
+
const top3 = agentPeers
|
|
130
|
+
.sort((a, b) => Number(b.versionCount) - Number(a.versionCount))
|
|
131
|
+
.slice(0, 3);
|
|
132
|
+
say('↗', config_js_1.CYAN, `Top peers: ${top3.map(p => `${config_js_1.BOLD}${p.name}${config_js_1.RESET}${config_js_1.DIM}(v${p.versionCount})${config_js_1.RESET}`).join(', ')}`, 'peer_summary');
|
|
133
|
+
}
|
|
134
|
+
// 5. Update state
|
|
135
|
+
state.lastSync = new Date().toISOString();
|
|
136
|
+
state.cycles += 1;
|
|
137
|
+
state.peersFound = peers.length;
|
|
138
|
+
state.healthy = !lowBal;
|
|
139
|
+
state.peers = peers;
|
|
140
|
+
return { peersFound: peers.length, healthy: !lowBal };
|
|
141
|
+
}
|
|
142
|
+
catch (e) {
|
|
143
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
144
|
+
say('✗', config_js_1.RED, `Cycle error: ${msg}`, 'cycle_error');
|
|
145
|
+
state.errors += 1;
|
|
146
|
+
return { peersFound: 0, healthy: false, errorMsg: msg };
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// ─── Sub-command: status ──────────────────────────────────────────────────────
|
|
150
|
+
function cmdDaemonStatus() {
|
|
151
|
+
console.log();
|
|
152
|
+
const state = loadState();
|
|
153
|
+
if (!state) {
|
|
154
|
+
(0, config_js_1.warn)('No daemon state found. Has `inkd agentd start` been run?');
|
|
155
|
+
(0, config_js_1.warn)(`Expected: ${STATE_FILE}`);
|
|
156
|
+
console.log();
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
console.log(` ${config_js_1.BOLD}Inkd Agent Daemon — Status${config_js_1.RESET}`);
|
|
160
|
+
console.log(` ${'─'.repeat(44)}`);
|
|
161
|
+
(0, config_js_1.info)(`Agent: ${config_js_1.CYAN}${state.thisAgent}${config_js_1.RESET}`);
|
|
162
|
+
(0, config_js_1.info)(`Wallet: ${config_js_1.DIM}${state.wallet}${config_js_1.RESET}`);
|
|
163
|
+
(0, config_js_1.info)(`Network: ${state.network}`);
|
|
164
|
+
(0, config_js_1.info)(`Started: ${state.startedAt}`);
|
|
165
|
+
(0, config_js_1.info)(`Last sync: ${state.lastSync ?? 'never'}`);
|
|
166
|
+
(0, config_js_1.info)(`Cycles: ${state.cycles}`);
|
|
167
|
+
(0, config_js_1.info)(`Peers found: ${state.peersFound}`);
|
|
168
|
+
(0, config_js_1.info)(`Errors: ${state.errors > 0 ? config_js_1.RED + state.errors + config_js_1.RESET : config_js_1.GREEN + '0' + config_js_1.RESET}`);
|
|
169
|
+
(0, config_js_1.info)(`Healthy: ${state.healthy ? config_js_1.GREEN + '✓ yes' + config_js_1.RESET : config_js_1.YELLOW + '⚠ no' + config_js_1.RESET}`);
|
|
170
|
+
console.log();
|
|
171
|
+
}
|
|
172
|
+
// ─── Sub-command: peers ───────────────────────────────────────────────────────
|
|
173
|
+
function cmdDaemonPeers() {
|
|
174
|
+
console.log();
|
|
175
|
+
const state = loadState();
|
|
176
|
+
if (!state || !state.peers?.length) {
|
|
177
|
+
(0, config_js_1.warn)('No peer data yet. Run `inkd agentd start` first.');
|
|
178
|
+
console.log();
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
console.log(` ${config_js_1.BOLD}Inkd Agent Peers (${state.peers.length})${config_js_1.RESET}`);
|
|
182
|
+
console.log(` ${'─'.repeat(70)}`);
|
|
183
|
+
console.log(` ${'ID'.padEnd(8)}${'Name'.padEnd(30)}${'Versions'.padEnd(10)}${'Endpoint'}`);
|
|
184
|
+
console.log(` ${config_js_1.DIM}${'─'.repeat(66)}${config_js_1.RESET}`);
|
|
185
|
+
for (const p of state.peers) {
|
|
186
|
+
const ep = p.agentEndpoint
|
|
187
|
+
? config_js_1.CYAN + p.agentEndpoint.slice(0, 28) + config_js_1.RESET
|
|
188
|
+
: config_js_1.DIM + 'none' + config_js_1.RESET;
|
|
189
|
+
console.log(` ${p.id.padEnd(8)}${p.name.padEnd(30)}${p.versionCount.padEnd(10)}${ep}`);
|
|
190
|
+
}
|
|
191
|
+
console.log();
|
|
192
|
+
(0, config_js_1.info)(`Last updated: ${state.lastSync ?? 'never'}`);
|
|
193
|
+
console.log();
|
|
194
|
+
}
|
|
195
|
+
// ─── Sub-command: start ───────────────────────────────────────────────────────
|
|
196
|
+
async function cmdAgentd(args) {
|
|
197
|
+
const sub = args[0] ?? 'start';
|
|
198
|
+
if (sub === 'status') {
|
|
199
|
+
cmdDaemonStatus();
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
if (sub === 'peers') {
|
|
203
|
+
cmdDaemonPeers();
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
if (sub !== 'start') {
|
|
207
|
+
(0, config_js_1.error)(`Unknown agentd command: ${sub}\nUsage: inkd agentd [start|status|peers]`);
|
|
208
|
+
}
|
|
209
|
+
// ─── Parse flags ────────────────────────────────────────────────────────────
|
|
210
|
+
const remaining = args.slice(1);
|
|
211
|
+
const getFlag = (f) => {
|
|
212
|
+
const i = remaining.indexOf(f);
|
|
213
|
+
return i !== -1 && remaining[i + 1] ? remaining[i + 1] : undefined;
|
|
214
|
+
};
|
|
215
|
+
const hasFlag = (f) => remaining.includes(f);
|
|
216
|
+
const intervalMs = parseInt(getFlag('--interval') ?? process.env['INKD_INTERVAL'] ?? '60000', 10);
|
|
217
|
+
const dryRun = hasFlag('--dry-run');
|
|
218
|
+
const quiet = hasFlag('--quiet');
|
|
219
|
+
const jsonMode = hasFlag('--json');
|
|
220
|
+
const once = hasFlag('--once');
|
|
221
|
+
// ─── Config ─────────────────────────────────────────────────────────────────
|
|
222
|
+
const cfg = (0, config_js_1.loadConfig)();
|
|
223
|
+
const addrs = config_js_1.ADDRESSES[cfg.network];
|
|
224
|
+
const agentName = process.env['INKD_AGENT_NAME'] ?? '';
|
|
225
|
+
const agentEndpoint = process.env['INKD_AGENT_ENDPOINT'] ?? '';
|
|
226
|
+
if (!agentName) {
|
|
227
|
+
(0, config_js_1.error)('INKD_AGENT_NAME not set. Export your agent\'s project name.\n Example: export INKD_AGENT_NAME=my-agent');
|
|
228
|
+
}
|
|
229
|
+
if (!addrs.registry) {
|
|
230
|
+
(0, config_js_1.error)(`Registry address not configured for network "${cfg.network}".\nUpdate cli/src/config.ts after deployment.`);
|
|
231
|
+
}
|
|
232
|
+
// ─── Build clients ─────────────────────────────────────────────────────────
|
|
233
|
+
let walletAddress = '0x0000000000000000000000000000000000000000';
|
|
234
|
+
try {
|
|
235
|
+
const pk = (0, config_js_1.requirePrivateKey)(cfg);
|
|
236
|
+
const wc = (0, client_js_1.buildWalletClient)(cfg);
|
|
237
|
+
const [acct] = await wc.getAddresses();
|
|
238
|
+
walletAddress = acct;
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
if (!dryRun)
|
|
242
|
+
(0, config_js_1.error)('Private key required for daemon mode. Set INKD_PRIVATE_KEY or use --dry-run.');
|
|
243
|
+
}
|
|
244
|
+
const publicClient = (0, client_js_1.buildPublicClient)(cfg);
|
|
245
|
+
// ─── Initial state ─────────────────────────────────────────────────────────
|
|
246
|
+
const state = loadState() ?? {
|
|
247
|
+
startedAt: new Date().toISOString(),
|
|
248
|
+
lastSync: null,
|
|
249
|
+
cycles: 0,
|
|
250
|
+
peersFound: 0,
|
|
251
|
+
errors: 0,
|
|
252
|
+
thisAgent: agentName,
|
|
253
|
+
wallet: walletAddress,
|
|
254
|
+
network: cfg.network,
|
|
255
|
+
healthy: true,
|
|
256
|
+
peers: [],
|
|
257
|
+
};
|
|
258
|
+
// ─── Banner ─────────────────────────────────────────────────────────────────
|
|
259
|
+
if (!jsonMode) {
|
|
260
|
+
console.log();
|
|
261
|
+
console.log(` ${config_js_1.BOLD}Inkd Agent Daemon${config_js_1.RESET} ${config_js_1.DIM}v1.0.0${config_js_1.RESET}`);
|
|
262
|
+
console.log(` ${'─'.repeat(44)}`);
|
|
263
|
+
(0, config_js_1.info)(`Agent: ${config_js_1.CYAN}${agentName}${config_js_1.RESET}`);
|
|
264
|
+
(0, config_js_1.info)(`Wallet: ${config_js_1.DIM}${walletAddress}${config_js_1.RESET}`);
|
|
265
|
+
(0, config_js_1.info)(`Network: ${cfg.network}`);
|
|
266
|
+
(0, config_js_1.info)(`Interval: ${intervalMs}ms`);
|
|
267
|
+
(0, config_js_1.info)(`DryRun: ${dryRun}`);
|
|
268
|
+
(0, config_js_1.info)(`Mode: ${once ? 'once' : 'continuous'}`);
|
|
269
|
+
console.log();
|
|
270
|
+
(0, config_js_1.info)(`State: ${STATE_FILE}`);
|
|
271
|
+
console.log();
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
jsonLine('daemon_start', {
|
|
275
|
+
agentName, walletAddress, network: cfg.network, intervalMs, dryRun, once,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
// ─── Cycle runner ─────────────────────────────────────────────────────────
|
|
279
|
+
const cycle = async () => {
|
|
280
|
+
if (!jsonMode && !quiet) {
|
|
281
|
+
console.log(` ${config_js_1.DIM}── cycle #${state.cycles + 1} ──────────────────────────────────${config_js_1.RESET}`);
|
|
282
|
+
}
|
|
283
|
+
const result = await runCycle({
|
|
284
|
+
state,
|
|
285
|
+
registryAddress: addrs.registry,
|
|
286
|
+
walletAddress,
|
|
287
|
+
publicClient,
|
|
288
|
+
agentName,
|
|
289
|
+
jsonMode,
|
|
290
|
+
quiet,
|
|
291
|
+
dryRun,
|
|
292
|
+
});
|
|
293
|
+
saveState(state);
|
|
294
|
+
if (jsonMode) {
|
|
295
|
+
jsonLine('cycle_complete', { cycle: state.cycles, peersFound: result.peersFound, healthy: result.healthy });
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
// ─── Run ──────────────────────────────────────────────────────────────────
|
|
299
|
+
await cycle();
|
|
300
|
+
if (once) {
|
|
301
|
+
if (!jsonMode && !quiet) {
|
|
302
|
+
console.log();
|
|
303
|
+
(0, config_js_1.success)('Single cycle complete (--once mode). State saved to ' + STATE_FILE);
|
|
304
|
+
console.log();
|
|
305
|
+
}
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
// Continuous mode
|
|
309
|
+
if (!jsonMode && !quiet) {
|
|
310
|
+
(0, config_js_1.info)(`Next sync in ${intervalMs / 1000}s — press Ctrl-C to stop\n`);
|
|
311
|
+
}
|
|
312
|
+
const timer = setInterval(async () => {
|
|
313
|
+
await cycle();
|
|
314
|
+
if (!jsonMode && !quiet) {
|
|
315
|
+
(0, config_js_1.info)(`Next sync in ${intervalMs / 1000}s\n`);
|
|
316
|
+
}
|
|
317
|
+
}, intervalMs);
|
|
318
|
+
// Graceful shutdown
|
|
319
|
+
const shutdown = (signal) => {
|
|
320
|
+
clearInterval(timer);
|
|
321
|
+
saveState(state);
|
|
322
|
+
if (jsonMode) {
|
|
323
|
+
jsonLine('daemon_stop', { signal, cycles: state.cycles, peers: state.peersFound, errors: state.errors });
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
console.log();
|
|
327
|
+
(0, config_js_1.info)(`${signal} received — shutting down gracefully`);
|
|
328
|
+
(0, config_js_1.success)(`Daemon stopped. Ran ${state.cycles} cycles, found ${state.peersFound} peers, ${state.errors} errors.`);
|
|
329
|
+
console.log();
|
|
330
|
+
}
|
|
331
|
+
process.exit(0);
|
|
332
|
+
};
|
|
333
|
+
process.on('SIGINT', () => shutdown('SIGINT'));
|
|
334
|
+
process.on('SIGTERM', () => shutdown('SIGTERM'));
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=agentd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentd.js","sourceRoot":"","sources":["../../src/commands/agentd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB3D"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* inkd init — scaffold inkd.config.json in the current directory
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.cmdInit = cmdInit;
|
|
7
|
+
const fs_1 = require("fs");
|
|
8
|
+
const path_1 = require("path");
|
|
9
|
+
const config_js_1 = require("../config.js");
|
|
10
|
+
async function cmdInit(args) {
|
|
11
|
+
const path = (0, path_1.resolve)(process.cwd(), 'inkd.config.json');
|
|
12
|
+
const network = args.includes('--mainnet') ? 'mainnet' : 'testnet';
|
|
13
|
+
if ((0, fs_1.existsSync)(path) && !args.includes('--force')) {
|
|
14
|
+
(0, config_js_1.warn)('inkd.config.json already exists. Use --force to overwrite.');
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
(0, config_js_1.writeConfig)({ network });
|
|
18
|
+
(0, config_js_1.success)(`Created ${config_js_1.BOLD}inkd.config.json${config_js_1.RESET} (network: ${config_js_1.CYAN}${network}${config_js_1.RESET})`);
|
|
19
|
+
console.log(` Next steps:`);
|
|
20
|
+
console.log(` ${config_js_1.DIM}export INKD_PRIVATE_KEY=0x...${config_js_1.RESET} # never store keys in config files`);
|
|
21
|
+
console.log(` ${config_js_1.DIM}inkd status${config_js_1.RESET} # verify connection`);
|
|
22
|
+
console.log(` ${config_js_1.DIM}inkd project create${config_js_1.RESET} # register your first project`);
|
|
23
|
+
console.log();
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAMH,0BAiBC;AArBD,2BAA+B;AAC/B,+BAA8B;AAC9B,4CAAiF;AAE1E,KAAK,UAAU,OAAO,CAAC,IAAc;IAC1C,MAAM,IAAI,GAAG,IAAA,cAAO,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,kBAAkB,CAAC,CAAA;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAA;IAElE,IAAI,IAAA,eAAU,EAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAClD,IAAA,gBAAI,EAAC,4DAA4D,CAAC,CAAA;QAClE,OAAM;IACR,CAAC;IAED,IAAA,uBAAW,EAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IAExB,IAAA,mBAAO,EAAC,WAAW,gBAAI,mBAAmB,iBAAK,cAAc,gBAAI,GAAG,OAAO,GAAG,iBAAK,GAAG,CAAC,CAAA;IACvF,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;IAC5B,OAAO,CAAC,GAAG,CAAC,OAAO,eAAG,gCAAgC,iBAAK,uCAAuC,CAAC,CAAA;IACnG,OAAO,CAAC,GAAG,CAAC,OAAO,eAAG,cAAc,iBAAK,4CAA4C,CAAC,CAAA;IACtF,OAAO,CAAC,GAAG,CAAC,OAAO,eAAG,sBAAsB,iBAAK,8CAA8C,CAAC,CAAA;IAChG,OAAO,CAAC,GAAG,EAAE,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* inkd project <sub-command> — project management
|
|
3
|
+
*
|
|
4
|
+
* Sub-commands:
|
|
5
|
+
* create — register a new project (locks 1 $INKD)
|
|
6
|
+
* get — fetch project details by ID
|
|
7
|
+
* list — list projects owned by an address
|
|
8
|
+
* transfer — transfer ownership to a new address
|
|
9
|
+
* collab — add/remove collaborators
|
|
10
|
+
*/
|
|
11
|
+
export declare function cmdProjectCreate(args: string[]): Promise<void>;
|
|
12
|
+
export declare function cmdProjectGet(args: string[]): Promise<void>;
|
|
13
|
+
export declare function cmdProjectList(args: string[]): Promise<void>;
|
|
14
|
+
export declare function cmdProjectTransfer(args: string[]): Promise<void>;
|
|
15
|
+
export declare function cmdProjectCollab(args: string[]): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA8BH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqDpE;AAID,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2CjE;AAID,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDlE;AAID,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BtE;AAID,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BpE"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* inkd project <sub-command> — project management
|
|
4
|
+
*
|
|
5
|
+
* Sub-commands:
|
|
6
|
+
* create — register a new project (locks 1 $INKD)
|
|
7
|
+
* get — fetch project details by ID
|
|
8
|
+
* list — list projects owned by an address
|
|
9
|
+
* transfer — transfer ownership to a new address
|
|
10
|
+
* collab — add/remove collaborators
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.cmdProjectCreate = cmdProjectCreate;
|
|
14
|
+
exports.cmdProjectGet = cmdProjectGet;
|
|
15
|
+
exports.cmdProjectList = cmdProjectList;
|
|
16
|
+
exports.cmdProjectTransfer = cmdProjectTransfer;
|
|
17
|
+
exports.cmdProjectCollab = cmdProjectCollab;
|
|
18
|
+
const viem_1 = require("viem");
|
|
19
|
+
const config_js_1 = require("../config.js");
|
|
20
|
+
const client_js_1 = require("../client.js");
|
|
21
|
+
const abi_js_1 = require("../abi.js");
|
|
22
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
23
|
+
function parseFlag(args, flag) {
|
|
24
|
+
const i = args.indexOf(flag);
|
|
25
|
+
return i !== -1 && args[i + 1] ? args[i + 1] : undefined;
|
|
26
|
+
}
|
|
27
|
+
function requireFlag(args, flag, hint) {
|
|
28
|
+
const val = parseFlag(args, flag);
|
|
29
|
+
if (!val)
|
|
30
|
+
(0, config_js_1.error)(`Missing required flag ${config_js_1.BOLD}${flag}${config_js_1.RESET}\n Example: ${config_js_1.DIM}${hint}${config_js_1.RESET}`);
|
|
31
|
+
return val;
|
|
32
|
+
}
|
|
33
|
+
function formatDate(ts) {
|
|
34
|
+
return new Date(Number(ts) * 1000).toISOString().slice(0, 10);
|
|
35
|
+
}
|
|
36
|
+
// ─── create ──────────────────────────────────────────────────────────────────
|
|
37
|
+
async function cmdProjectCreate(args) {
|
|
38
|
+
const name = requireFlag(args, '--name', 'inkd project create --name my-agent');
|
|
39
|
+
const description = parseFlag(args, '--description') ?? '';
|
|
40
|
+
const license = parseFlag(args, '--license') ?? 'MIT';
|
|
41
|
+
const readmeHash = parseFlag(args, '--readme') ?? '';
|
|
42
|
+
const agentEndpoint = parseFlag(args, '--endpoint') ?? '';
|
|
43
|
+
const isPublic = !args.includes('--private');
|
|
44
|
+
const isAgent = args.includes('--agent');
|
|
45
|
+
const cfg = (0, config_js_1.loadConfig)();
|
|
46
|
+
const addrs = config_js_1.ADDRESSES[cfg.network];
|
|
47
|
+
if (!addrs.registry)
|
|
48
|
+
(0, config_js_1.error)('Registry address not configured. Deploy contracts first.');
|
|
49
|
+
const { publicClient, walletClient, account, addrs: a } = (0, client_js_1.buildClients)(cfg);
|
|
50
|
+
// Check/approve token allowance
|
|
51
|
+
const allowance = await publicClient.readContract({
|
|
52
|
+
address: a.token,
|
|
53
|
+
abi: abi_js_1.TOKEN_ABI,
|
|
54
|
+
functionName: 'allowance',
|
|
55
|
+
args: [account.address, a.registry],
|
|
56
|
+
});
|
|
57
|
+
if (allowance < (0, viem_1.parseEther)('1')) {
|
|
58
|
+
(0, config_js_1.info)('Approving 1 $INKD for registry...');
|
|
59
|
+
const approveTx = await walletClient.writeContract({
|
|
60
|
+
address: a.token, abi: abi_js_1.TOKEN_ABI, functionName: 'approve',
|
|
61
|
+
args: [a.registry, (0, viem_1.parseEther)('1')],
|
|
62
|
+
account, chain: walletClient.chain,
|
|
63
|
+
});
|
|
64
|
+
(0, config_js_1.info)(`Approve tx: ${config_js_1.DIM}${approveTx}${config_js_1.RESET}`);
|
|
65
|
+
await publicClient.waitForTransactionReceipt({ hash: approveTx });
|
|
66
|
+
}
|
|
67
|
+
(0, config_js_1.info)(`Creating project ${config_js_1.CYAN}${name}${config_js_1.RESET}...`);
|
|
68
|
+
const tx = await walletClient.writeContract({
|
|
69
|
+
address: a.registry,
|
|
70
|
+
abi: abi_js_1.REGISTRY_ABI,
|
|
71
|
+
functionName: 'createProject',
|
|
72
|
+
args: [name, description, license, isPublic, readmeHash, isAgent, agentEndpoint],
|
|
73
|
+
account,
|
|
74
|
+
chain: walletClient.chain,
|
|
75
|
+
});
|
|
76
|
+
(0, config_js_1.info)(`Tx: ${config_js_1.DIM}${tx}${config_js_1.RESET}`);
|
|
77
|
+
const receipt = await publicClient.waitForTransactionReceipt({ hash: tx });
|
|
78
|
+
if (receipt.status === 'success') {
|
|
79
|
+
(0, config_js_1.success)(`Project ${config_js_1.BOLD}${name}${config_js_1.RESET} created! (block ${receipt.blockNumber})`);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
(0, config_js_1.error)('Transaction reverted. Check name uniqueness and token balance.');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// ─── get ─────────────────────────────────────────────────────────────────────
|
|
86
|
+
async function cmdProjectGet(args) {
|
|
87
|
+
const idStr = args[0] ?? requireFlag(args, '--id', 'inkd project get 42');
|
|
88
|
+
const id = BigInt(idStr.startsWith('--') ? requireFlag(args, '--id', 'inkd project get --id 42') : idStr);
|
|
89
|
+
const cfg = (0, config_js_1.loadConfig)();
|
|
90
|
+
const addrs = config_js_1.ADDRESSES[cfg.network];
|
|
91
|
+
if (!addrs.registry)
|
|
92
|
+
(0, config_js_1.error)('Registry address not configured.');
|
|
93
|
+
const client = (0, client_js_1.buildPublicClient)(cfg);
|
|
94
|
+
const project = await client.readContract({
|
|
95
|
+
address: addrs.registry,
|
|
96
|
+
abi: abi_js_1.REGISTRY_ABI,
|
|
97
|
+
functionName: 'getProject',
|
|
98
|
+
args: [id],
|
|
99
|
+
});
|
|
100
|
+
if (!project.exists)
|
|
101
|
+
(0, config_js_1.error)(`Project #${id} not found.`);
|
|
102
|
+
const collaborators = await client.readContract({
|
|
103
|
+
address: addrs.registry,
|
|
104
|
+
abi: abi_js_1.REGISTRY_ABI,
|
|
105
|
+
functionName: 'getCollaborators',
|
|
106
|
+
args: [id],
|
|
107
|
+
});
|
|
108
|
+
console.log();
|
|
109
|
+
console.log(` ${config_js_1.BOLD}Project #${project.id}${config_js_1.RESET} ${project.isAgent ? config_js_1.CYAN + '[agent]' + config_js_1.RESET : ''}`);
|
|
110
|
+
console.log(` ${'─'.repeat(42)}`);
|
|
111
|
+
(0, config_js_1.info)(`Name: ${config_js_1.CYAN}${project.name}${config_js_1.RESET}`);
|
|
112
|
+
(0, config_js_1.info)(`Description: ${project.description || config_js_1.DIM + 'none' + config_js_1.RESET}`);
|
|
113
|
+
(0, config_js_1.info)(`License: ${project.license}`);
|
|
114
|
+
(0, config_js_1.info)(`Owner: ${project.owner}`);
|
|
115
|
+
(0, config_js_1.info)(`Created: ${formatDate(project.createdAt)}`);
|
|
116
|
+
(0, config_js_1.info)(`Versions: ${config_js_1.GREEN}${project.versionCount}${config_js_1.RESET}`);
|
|
117
|
+
(0, config_js_1.info)(`Visibility: ${project.isPublic ? config_js_1.GREEN + 'public' : config_js_1.YELLOW + 'private'}${config_js_1.RESET}`);
|
|
118
|
+
if (project.readmeHash)
|
|
119
|
+
(0, config_js_1.info)(`README hash: ${config_js_1.DIM}${project.readmeHash}${config_js_1.RESET}`);
|
|
120
|
+
if (project.agentEndpoint)
|
|
121
|
+
(0, config_js_1.info)(`Agent endpoint: ${project.agentEndpoint}`);
|
|
122
|
+
if (collaborators.length)
|
|
123
|
+
(0, config_js_1.info)(`Collaborators: ${collaborators.join(', ')}`);
|
|
124
|
+
console.log();
|
|
125
|
+
}
|
|
126
|
+
// ─── list ────────────────────────────────────────────────────────────────────
|
|
127
|
+
async function cmdProjectList(args) {
|
|
128
|
+
const addressArg = args[0];
|
|
129
|
+
if (!addressArg || !(0, viem_1.isAddress)(addressArg)) {
|
|
130
|
+
(0, config_js_1.error)('Usage: inkd project list <address>\n Example: inkd project list 0xDead...');
|
|
131
|
+
}
|
|
132
|
+
const cfg = (0, config_js_1.loadConfig)();
|
|
133
|
+
const addrs = config_js_1.ADDRESSES[cfg.network];
|
|
134
|
+
if (!addrs.registry)
|
|
135
|
+
(0, config_js_1.error)('Registry address not configured.');
|
|
136
|
+
const client = (0, client_js_1.buildPublicClient)(cfg);
|
|
137
|
+
const projectIds = await client.readContract({
|
|
138
|
+
address: addrs.registry,
|
|
139
|
+
abi: abi_js_1.REGISTRY_ABI,
|
|
140
|
+
functionName: 'getOwnerProjects',
|
|
141
|
+
args: [addressArg],
|
|
142
|
+
});
|
|
143
|
+
if (!projectIds.length) {
|
|
144
|
+
(0, config_js_1.info)(`No projects found for ${addressArg}`);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
console.log();
|
|
148
|
+
console.log(` ${config_js_1.BOLD}Projects owned by ${config_js_1.DIM}${addressArg}${config_js_1.RESET}`);
|
|
149
|
+
console.log(` ${'─'.repeat(50)}`);
|
|
150
|
+
const projects = await Promise.all(projectIds.map(id => client.readContract({
|
|
151
|
+
address: addrs.registry,
|
|
152
|
+
abi: abi_js_1.REGISTRY_ABI,
|
|
153
|
+
functionName: 'getProject',
|
|
154
|
+
args: [id],
|
|
155
|
+
})));
|
|
156
|
+
for (const p of projects) {
|
|
157
|
+
const badges = [
|
|
158
|
+
p.isAgent ? config_js_1.CYAN + 'agent' + config_js_1.RESET : '',
|
|
159
|
+
p.isPublic ? config_js_1.GREEN + 'public' + config_js_1.RESET : config_js_1.YELLOW + 'private' + config_js_1.RESET,
|
|
160
|
+
].filter(Boolean).join(' ');
|
|
161
|
+
console.log(` ${config_js_1.BOLD}#${p.id}${config_js_1.RESET} ${config_js_1.CYAN}${p.name.padEnd(24)}${config_js_1.RESET}` +
|
|
162
|
+
` v${p.versionCount} ${badges} ${config_js_1.DIM}${formatDate(p.createdAt)}${config_js_1.RESET}`);
|
|
163
|
+
}
|
|
164
|
+
console.log();
|
|
165
|
+
}
|
|
166
|
+
// ─── transfer ────────────────────────────────────────────────────────────────
|
|
167
|
+
async function cmdProjectTransfer(args) {
|
|
168
|
+
const idStr = requireFlag(args, '--id', 'inkd project transfer --id 42 --to 0x...');
|
|
169
|
+
const toAddr = requireFlag(args, '--to', 'inkd project transfer --id 42 --to 0x...');
|
|
170
|
+
if (!(0, viem_1.isAddress)(toAddr))
|
|
171
|
+
(0, config_js_1.error)('--to must be a valid Ethereum address.');
|
|
172
|
+
const cfg = (0, config_js_1.loadConfig)();
|
|
173
|
+
const addrs = config_js_1.ADDRESSES[cfg.network];
|
|
174
|
+
if (!addrs.registry)
|
|
175
|
+
(0, config_js_1.error)('Registry address not configured.');
|
|
176
|
+
const { publicClient, walletClient, account, addrs: a } = (0, client_js_1.buildClients)(cfg);
|
|
177
|
+
const transferFee = await publicClient.readContract({
|
|
178
|
+
address: a.registry, abi: abi_js_1.REGISTRY_ABI, functionName: 'transferFee',
|
|
179
|
+
});
|
|
180
|
+
(0, config_js_1.info)(`Transfer fee: ${(0, viem_1.formatEther)(transferFee)} ETH`);
|
|
181
|
+
(0, config_js_1.info)(`Transferring project #${idStr} → ${toAddr}...`);
|
|
182
|
+
const tx = await walletClient.writeContract({
|
|
183
|
+
address: a.registry,
|
|
184
|
+
abi: abi_js_1.REGISTRY_ABI,
|
|
185
|
+
functionName: 'transferProject',
|
|
186
|
+
args: [BigInt(idStr), toAddr],
|
|
187
|
+
value: transferFee,
|
|
188
|
+
account,
|
|
189
|
+
chain: walletClient.chain,
|
|
190
|
+
});
|
|
191
|
+
await publicClient.waitForTransactionReceipt({ hash: tx });
|
|
192
|
+
(0, config_js_1.success)(`Project #${idStr} transferred to ${toAddr}`);
|
|
193
|
+
}
|
|
194
|
+
// ─── collab ──────────────────────────────────────────────────────────────────
|
|
195
|
+
async function cmdProjectCollab(args) {
|
|
196
|
+
const action = args[0];
|
|
197
|
+
if (action !== 'add' && action !== 'remove') {
|
|
198
|
+
(0, config_js_1.error)('Usage: inkd project collab add|remove --id <id> --address <address>');
|
|
199
|
+
}
|
|
200
|
+
const idStr = requireFlag(args, '--id', `inkd project collab ${action} --id 42 --address 0x...`);
|
|
201
|
+
const collab = requireFlag(args, '--address', `inkd project collab ${action} --id 42 --address 0x...`);
|
|
202
|
+
if (!(0, viem_1.isAddress)(collab))
|
|
203
|
+
(0, config_js_1.error)('--address must be a valid Ethereum address.');
|
|
204
|
+
const cfg = (0, config_js_1.loadConfig)();
|
|
205
|
+
const addrs = config_js_1.ADDRESSES[cfg.network];
|
|
206
|
+
if (!addrs.registry)
|
|
207
|
+
(0, config_js_1.error)('Registry address not configured.');
|
|
208
|
+
const { publicClient, walletClient, account, addrs: a } = (0, client_js_1.buildClients)(cfg);
|
|
209
|
+
const fn = action === 'add' ? 'addCollaborator' : 'removeCollaborator';
|
|
210
|
+
(0, config_js_1.info)(`${action === 'add' ? 'Adding' : 'Removing'} collaborator ${collab}...`);
|
|
211
|
+
const tx = await walletClient.writeContract({
|
|
212
|
+
address: a.registry,
|
|
213
|
+
abi: abi_js_1.REGISTRY_ABI,
|
|
214
|
+
functionName: fn,
|
|
215
|
+
args: [BigInt(idStr), collab],
|
|
216
|
+
account,
|
|
217
|
+
chain: walletClient.chain,
|
|
218
|
+
});
|
|
219
|
+
await publicClient.waitForTransactionReceipt({ hash: tx });
|
|
220
|
+
(0, config_js_1.success)(`Collaborator ${action === 'add' ? 'added' : 'removed'}.`);
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=project.js.map
|