@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.
Files changed (54) hide show
  1. package/README.md +226 -0
  2. package/dist/abi.d.ts +408 -0
  3. package/dist/abi.d.ts.map +1 -0
  4. package/dist/abi.js +283 -0
  5. package/dist/abi.js.map +1 -0
  6. package/dist/client.d.ts +19 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +34 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/commands/agent.d.ts +10 -0
  11. package/dist/commands/agent.d.ts.map +1 -0
  12. package/dist/commands/agent.js +106 -0
  13. package/dist/commands/agent.js.map +1 -0
  14. package/dist/commands/agentd.d.ts +35 -0
  15. package/dist/commands/agentd.d.ts.map +1 -0
  16. package/dist/commands/agentd.js +336 -0
  17. package/dist/commands/agentd.js.map +1 -0
  18. package/dist/commands/init.d.ts +5 -0
  19. package/dist/commands/init.d.ts.map +1 -0
  20. package/dist/commands/init.js +25 -0
  21. package/dist/commands/init.js.map +1 -0
  22. package/dist/commands/project.d.ts +16 -0
  23. package/dist/commands/project.d.ts.map +1 -0
  24. package/dist/commands/project.js +222 -0
  25. package/dist/commands/project.js.map +1 -0
  26. package/dist/commands/search.d.ts +14 -0
  27. package/dist/commands/search.d.ts.map +1 -0
  28. package/dist/commands/search.js +141 -0
  29. package/dist/commands/search.js.map +1 -0
  30. package/dist/commands/status.d.ts +5 -0
  31. package/dist/commands/status.d.ts.map +1 -0
  32. package/dist/commands/status.js +44 -0
  33. package/dist/commands/status.js.map +1 -0
  34. package/dist/commands/token.d.ts +46 -0
  35. package/dist/commands/token.d.ts.map +1 -0
  36. package/dist/commands/token.js +410 -0
  37. package/dist/commands/token.js.map +1 -0
  38. package/dist/commands/version.d.ts +12 -0
  39. package/dist/commands/version.d.ts.map +1 -0
  40. package/dist/commands/version.js +134 -0
  41. package/dist/commands/version.js.map +1 -0
  42. package/dist/commands/watch.d.ts +16 -0
  43. package/dist/commands/watch.d.ts.map +1 -0
  44. package/dist/commands/watch.js +175 -0
  45. package/dist/commands/watch.js.map +1 -0
  46. package/dist/config.d.ts +42 -0
  47. package/dist/config.d.ts.map +1 -0
  48. package/dist/config.js +94 -0
  49. package/dist/config.js.map +1 -0
  50. package/dist/index.d.ts +23 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +258 -0
  53. package/dist/index.js.map +1 -0
  54. 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":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;;AAsOH,8BAmJC;AAvXD,2BAA4D;AAC5D,+BAAoC;AACpC,+BAAwE;AACxE,4CAIqB;AACrB,4CAAmE;AACnE,sCAAwC;AA4BxC,iFAAiF;AAEjF,MAAM,UAAU,GAAG,IAAA,cAAO,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,oBAAoB,CAAC,CAAA;AAE/D,SAAS,SAAS;IAChB,IAAI,CAAC,IAAA,eAAU,EAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAA;IACxC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,UAAU,EAAE,OAAO,CAAC,CAAgB,CAAA;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,KAAkB;IACnC,IAAA,kBAAa,EAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAA;AAC3E,CAAC;AAED,iFAAiF;AAEjF,SAAS,EAAE;IACT,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AAChE,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,IAA6B;IAC5D,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAA;AAC/E,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,KAAa,EAAE,GAAW,EAAE,QAAiB,EAAE,KAAc;IAC5F,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,IAAI,GAAG,iBAAK,KAAK,eAAG,IAAI,EAAE,EAAE,IAAI,iBAAK,KAAK,GAAG,EAAE,CAAC,CAAA;IAC3E,CAAC;SAAM,IAAI,KAAK,EAAE,CAAC;QACjB,QAAQ,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;IAC1B,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,KAAK,UAAU,cAAc,CAC3B,YAAkD,EAClD,eAAwB,EACxB,KAAK,GAAG,GAAG;IAEX,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC;QAC1C,OAAO,EAAO,eAAe;QAC7B,GAAG,EAAW,qBAAY;QAC1B,YAAY,EAAE,kBAAkB;QAChC,IAAI,EAAU,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;KAClC,CAAc,CAAA;IAEf,OAAQ,GAAsC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACvD,EAAE,EAAa,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9B,KAAK,EAAU,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,EAAW,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAChC,WAAW,EAAI,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QAC7C,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;QAC/C,QAAQ,EAAO,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACrC,YAAY,EAAG,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QACxC,SAAS,EAAM,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;KACtC,CAAC,CAAC,CAAA;AACL,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,YAAkD,EAClD,OAAgB;IAEhB,OAAO,YAAY,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;AAC7C,CAAC;AAED,iFAAiF;AAEjF,KAAK,UAAU,QAAQ,CAAC,IASvB;IACC,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAExG,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,GAAW,EAAE,KAAa,EAAE,EAAE;QACtE,IAAI,CAAC,KAAK;YAAE,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;IAC1D,CAAC,CAAA;IAED,IAAI,CAAC;QACH,oBAAoB;QACpB,GAAG,CAAC,GAAG,EAAE,gBAAI,EAAE,4BAA4B,EAAE,gBAAgB,CAAC,CAAA;QAC9D,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,YAAY,EAAE,eAAe,CAAC,CAAA;QACjE,MAAM,SAAS,GAAG,GAAG,gBAAI,GAAG,KAAK,CAAC,MAAM,GAAG,iBAAK,SAAS,CAAA;QACzD,GAAG,CAAC,GAAG,EAAE,iBAAK,EAAE,SAAS,SAAS,WAAW,EAAE,eAAe,CAAC,CAAA;QAE/D,eAAe;QACf,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAA;QAClD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,GAAG,CAAC,GAAG,EAAE,kBAAM,EAAE,UAAU,SAAS,iDAAiD,SAAS,UAAU,EAAE,gBAAgB,CAAC,CAAA;QAC7H,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,GAAG,EAAE,iBAAK,EAAE,SAAS,gBAAI,GAAG,SAAS,GAAG,iBAAK,QAAQ,IAAI,CAAC,EAAE,cAAc,IAAI,CAAC,YAAY,GAAG,EAAE,YAAY,CAAC,CAAA;QACnH,CAAC;QAED,uBAAuB;QACvB,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,YAAY,EAAE,aAAa,CAAC,CAAA;QAC7D,MAAM,MAAM,GAAI,IAAA,kBAAW,EAAC,OAAO,CAAC,CAAA;QACpC,MAAM,MAAM,GAAI,OAAO,GAAG,IAAA,iBAAU,EAAC,MAAM,CAAC,CAAA;QAC5C,IAAI,MAAM,EAAE,CAAC;YACX,GAAG,CAAC,GAAG,EAAE,kBAAM,EAAE,oBAAoB,kBAAM,GAAG,MAAM,OAAO,iBAAK,qCAAqC,EAAE,aAAa,CAAC,CAAA;QACvH,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,GAAG,EAAE,iBAAK,EAAE,gBAAgB,iBAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,iBAAK,EAAE,EAAE,YAAY,CAAC,CAAA;QACpG,CAAC;QAED,mBAAmB;QACnB,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAA;QAC1D,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,UAAU;iBACpB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;iBAC/D,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YACd,GAAG,CAAC,GAAG,EAAE,gBAAI,EAAE,cAAc,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,gBAAI,GAAG,CAAC,CAAC,IAAI,GAAG,iBAAK,GAAG,eAAG,KAAK,CAAC,CAAC,YAAY,IAAI,iBAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;QACxI,CAAC;QAED,kBAAkB;QAClB,KAAK,CAAC,QAAQ,GAAK,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QAC3C,KAAK,CAAC,MAAM,IAAO,CAAC,CAAA;QACpB,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,MAAM,CAAA;QAC/B,KAAK,CAAC,OAAO,GAAM,CAAC,MAAM,CAAA;QAC1B,KAAK,CAAC,KAAK,GAAQ,KAAK,CAAA;QAExB,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,CAAA;IACvD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACtD,GAAG,CAAC,GAAG,EAAE,eAAG,EAAE,gBAAgB,GAAG,EAAE,EAAE,aAAa,CAAC,CAAA;QACnD,KAAK,CAAC,MAAM,IAAI,CAAC,CAAA;QACjB,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAA;IACzD,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,SAAS,eAAe;IACtB,OAAO,CAAC,GAAG,EAAE,CAAA;IACb,MAAM,KAAK,GAAG,SAAS,EAAE,CAAA;IACzB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAA,gBAAI,EAAC,0DAA0D,CAAC,CAAA;QAChE,IAAA,gBAAI,EAAC,aAAa,UAAU,EAAE,CAAC,CAAA;QAC/B,OAAO,CAAC,GAAG,EAAE,CAAA;QACb,OAAM;IACR,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,gBAAI,6BAA6B,iBAAK,EAAE,CAAC,CAAA;IAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IAClC,IAAA,gBAAI,EAAC,gBAAgB,gBAAI,GAAG,KAAK,CAAC,SAAS,GAAG,iBAAK,EAAE,CAAC,CAAA;IACtD,IAAA,gBAAI,EAAC,gBAAgB,eAAG,GAAG,KAAK,CAAC,MAAM,GAAG,iBAAK,EAAE,CAAC,CAAA;IAClD,IAAA,gBAAI,EAAC,gBAAgB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;IACrC,IAAA,gBAAI,EAAC,gBAAgB,KAAK,CAAC,SAAS,EAAE,CAAC,CAAA;IACvC,IAAA,gBAAI,EAAC,gBAAgB,KAAK,CAAC,QAAQ,IAAI,OAAO,EAAE,CAAC,CAAA;IACjD,IAAA,gBAAI,EAAC,gBAAgB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;IACpC,IAAA,gBAAI,EAAC,gBAAgB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAA;IACxC,IAAA,gBAAI,EAAC,gBAAgB,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAG,GAAG,KAAK,CAAC,MAAM,GAAG,iBAAK,CAAC,CAAC,CAAC,iBAAK,GAAG,GAAG,GAAG,iBAAK,EAAE,CAAC,CAAA;IAC3F,IAAA,gBAAI,EAAC,gBAAgB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAK,GAAG,OAAO,GAAG,iBAAK,CAAC,CAAC,CAAC,kBAAM,GAAG,MAAM,GAAG,iBAAK,EAAE,CAAC,CAAA;IACzF,OAAO,CAAC,GAAG,EAAE,CAAA;AACf,CAAC;AAED,iFAAiF;AAEjF,SAAS,cAAc;IACrB,OAAO,CAAC,GAAG,EAAE,CAAA;IACb,MAAM,KAAK,GAAG,SAAS,EAAE,CAAA;IACzB,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QACnC,IAAA,gBAAI,EAAC,kDAAkD,CAAC,CAAA;QACxD,OAAO,CAAC,GAAG,EAAE,CAAA;QACb,OAAM;IACR,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,gBAAI,qBAAqB,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,iBAAK,EAAE,CAAC,CAAA;IACxE,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IAClC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,CAAA;IAC3F,OAAO,CAAC,GAAG,CAAC,KAAK,eAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,iBAAK,EAAE,CAAC,CAAA;IAEhD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,CAAC,CAAC,aAAa;YACxB,CAAC,CAAC,gBAAI,GAAG,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,iBAAK;YAC7C,CAAC,CAAC,eAAG,GAAG,MAAM,GAAG,iBAAK,CAAA;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IACzF,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAA;IACb,IAAA,gBAAI,EAAC,iBAAiB,KAAK,CAAC,QAAQ,IAAI,OAAO,EAAE,CAAC,CAAA;IAClD,OAAO,CAAC,GAAG,EAAE,CAAA;AACf,CAAC;AAED,iFAAiF;AAE1E,KAAK,UAAU,SAAS,CAAC,IAAc;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAA;IAE9B,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QAAC,eAAe,EAAE,CAAC;QAAC,OAAM;IAAC,CAAC;IACnD,IAAI,GAAG,KAAK,OAAO,EAAG,CAAC;QAAC,cAAc,EAAE,CAAC;QAAE,OAAM;IAAC,CAAC;IACnD,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,IAAA,iBAAK,EAAC,2BAA2B,GAAG,2CAA2C,CAAC,CAAA;IAClF,CAAC;IAED,+EAA+E;IAC/E,MAAM,SAAS,GAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAChC,MAAM,OAAO,GAAM,CAAC,CAAS,EAAsB,EAAE;QACnD,MAAM,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QAC9B,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACpE,CAAC,CAAA;IACD,MAAM,OAAO,GAAM,CAAC,CAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;IAEvD,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,OAAO,EAAE,EAAE,CAAC,CAAA;IACjG,MAAM,MAAM,GAAO,OAAO,CAAC,WAAW,CAAC,CAAA;IACvC,MAAM,KAAK,GAAQ,OAAO,CAAC,SAAS,CAAC,CAAA;IACrC,MAAM,QAAQ,GAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;IACpC,MAAM,IAAI,GAAS,OAAO,CAAC,QAAQ,CAAC,CAAA;IAEpC,+EAA+E;IAC/E,MAAM,GAAG,GAAQ,IAAA,sBAAU,GAAE,CAAA;IAC7B,MAAM,KAAK,GAAM,qBAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAEvC,MAAM,SAAS,GAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAA;IAC1D,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,EAAE,CAAA;IAE9D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,IAAA,iBAAK,EAAC,yGAAyG,CAAC,CAAA;IAClH,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACpB,IAAA,iBAAK,EAAC,gDAAgD,GAAG,CAAC,OAAO,gDAAgD,CAAC,CAAA;IACpH,CAAC;IAED,8EAA8E;IAC9E,IAAI,aAAa,GAAY,4CAA4C,CAAA;IACzE,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,IAAA,6BAAiB,EAAC,GAAG,CAAC,CAAA;QACjC,MAAM,EAAE,GAAG,IAAA,6BAAiB,EAAC,GAAG,CAAC,CAAA;QACjC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,YAAY,EAAE,CAAA;QACtC,aAAa,GAAG,IAAI,CAAA;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC,MAAM;YAAE,IAAA,iBAAK,EAAC,8EAA8E,CAAC,CAAA;IACpG,CAAC;IAED,MAAM,YAAY,GAAG,IAAA,6BAAiB,EAAC,GAAG,CAAC,CAAA;IAE3C,8EAA8E;IAC9E,MAAM,KAAK,GAAgB,SAAS,EAAE,IAAI;QACxC,SAAS,EAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,QAAQ,EAAI,IAAI;QAChB,MAAM,EAAM,CAAC;QACb,UAAU,EAAE,CAAC;QACb,MAAM,EAAM,CAAC;QACb,SAAS,EAAG,SAAS;QACrB,MAAM,EAAM,aAAa;QACzB,OAAO,EAAK,GAAG,CAAC,OAAO;QACvB,OAAO,EAAK,IAAI;QAChB,KAAK,EAAO,EAAE;KACf,CAAA;IAED,+EAA+E;IAC/E,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,EAAE,CAAA;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,gBAAI,oBAAoB,iBAAK,KAAK,eAAG,SAAS,iBAAK,EAAE,CAAC,CAAA;QACvE,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAClC,IAAA,gBAAI,EAAC,aAAa,gBAAI,GAAG,SAAS,GAAG,iBAAK,EAAE,CAAC,CAAA;QAC7C,IAAA,gBAAI,EAAC,aAAa,eAAG,GAAG,aAAa,GAAG,iBAAK,EAAE,CAAC,CAAA;QAChD,IAAA,gBAAI,EAAC,aAAa,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;QAChC,IAAA,gBAAI,EAAC,aAAa,UAAU,IAAI,CAAC,CAAA;QACjC,IAAA,gBAAI,EAAC,aAAa,MAAM,EAAE,CAAC,CAAA;QAC3B,IAAA,gBAAI,EAAC,aAAa,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAA;QACjD,OAAO,CAAC,GAAG,EAAE,CAAA;QACb,IAAA,gBAAI,EAAC,aAAa,UAAU,EAAE,CAAC,CAAA;QAC/B,OAAO,CAAC,GAAG,EAAE,CAAA;IACf,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,cAAc,EAAE;YACvB,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI;SACzE,CAAC,CAAA;IACJ,CAAC;IAED,6EAA6E;IAC7E,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE;QACvB,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,eAAG,aAAa,KAAK,CAAC,MAAM,GAAG,CAAC,sCAAsC,iBAAK,EAAE,CAAC,CAAA;QACjG,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC;YAC5B,KAAK;YACL,eAAe,EAAE,KAAK,CAAC,QAAmB;YAC1C,aAAa;YACb,YAAY;YACZ,SAAS;YACT,QAAQ;YACR,KAAK;YACL,MAAM;SACP,CAAC,CAAA;QACF,SAAS,CAAC,KAAK,CAAC,CAAA;QAChB,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;QAC7G,CAAC;IACH,CAAC,CAAA;IAED,6EAA6E;IAC7E,MAAM,KAAK,EAAE,CAAA;IAEb,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,EAAE,CAAA;YACb,IAAA,mBAAO,EAAC,sDAAsD,GAAG,UAAU,CAAC,CAAA;YAC5E,OAAO,CAAC,GAAG,EAAE,CAAA;QACf,CAAC;QACD,OAAM;IACR,CAAC;IAED,kBAAkB;IAClB,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;QACxB,IAAA,gBAAI,EAAC,gBAAgB,UAAU,GAAG,IAAI,4BAA4B,CAAC,CAAA;IACrE,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACnC,MAAM,KAAK,EAAE,CAAA;QACb,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;YACxB,IAAA,gBAAI,EAAC,gBAAgB,UAAU,GAAG,IAAI,KAAK,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC,EAAE,UAAU,CAAC,CAAA;IAEd,oBAAoB;IACpB,MAAM,QAAQ,GAAG,CAAC,MAAc,EAAE,EAAE;QAClC,aAAa,CAAC,KAAK,CAAC,CAAA;QACpB,SAAS,CAAC,KAAK,CAAC,CAAA;QAChB,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;QAC1G,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,EAAE,CAAA;YACb,IAAA,gBAAI,EAAC,GAAG,MAAM,sCAAsC,CAAC,CAAA;YACrD,IAAA,mBAAO,EAAC,uBAAuB,KAAK,CAAC,MAAM,kBAAkB,KAAK,CAAC,UAAU,WAAW,KAAK,CAAC,MAAM,UAAU,CAAC,CAAA;YAC/G,OAAO,CAAC,GAAG,EAAE,CAAA;QACf,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAA;IAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC/C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAA;AAClD,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * inkd init — scaffold inkd.config.json in the current directory
3
+ */
4
+ export declare function cmdInit(args: string[]): Promise<void>;
5
+ //# sourceMappingURL=init.d.ts.map
@@ -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