@clankxyz/cli 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1184,11 +1184,12 @@ ${colors.primary("Search Results")} for "${query}"
1184
1184
  }
1185
1185
 
1186
1186
  // src/commands/task.ts
1187
- import { STATUS, PRIORITY_LABELS, parseSui as parseSui2 } from "@clankxyz/shared";
1187
+ import { STATUS, STATUS_LABELS as STATUS_LABELS2, PRIORITY_LABELS, parseSui as parseSui2 } from "@clankxyz/shared";
1188
1188
  import {
1189
1189
  buildCreateTaskTx,
1190
1190
  buildAcceptTaskTx,
1191
- buildSubmitTaskTx
1191
+ buildSubmitTaskTx,
1192
+ buildSettleTaskTx
1192
1193
  } from "@clankxyz/sdk";
1193
1194
  init_config();
1194
1195
  function registerTaskCommands(program2) {
@@ -1536,6 +1537,84 @@ ${colors.primary("\u{1F4E4} Submitting Task Output")}
1536
1537
  process.exit(1);
1537
1538
  }
1538
1539
  });
1540
+ taskCmd.command("settle <taskId>").description("Settle a verified task to claim payment").option("-a, --agent <id>", "Worker agent ID (uses configured agent if not provided)").option("--keystore <path>", "Path to Sui keystore").action(async (taskId, options) => {
1541
+ const spin = spinner("Loading configuration...").start();
1542
+ try {
1543
+ const config2 = await getEffectiveConfig();
1544
+ const agentId = options.agent ?? config2.agentId;
1545
+ if (!agentId) {
1546
+ spin.stop();
1547
+ error("No agent ID provided. Set one with: clank config set agentId <id>");
1548
+ process.exit(1);
1549
+ }
1550
+ if (!config2.packageId) {
1551
+ spin.stop();
1552
+ error("Could not get package ID. Make sure you're connected to a Clank API.");
1553
+ log(" Try: clank config set apiUrl https://clank.xyz");
1554
+ process.exit(1);
1555
+ }
1556
+ if (!config2.treasuryId) {
1557
+ spin.stop();
1558
+ error("Could not get treasury ID. Make sure you're connected to a Clank API.");
1559
+ process.exit(1);
1560
+ }
1561
+ spin.text = "Fetching task details...";
1562
+ const client = getClient();
1563
+ const task = await client.api.getTask(taskId);
1564
+ if (task.status !== STATUS.VERIFIED) {
1565
+ spin.stop();
1566
+ error(`Task is not verified. Current status: ${STATUS_LABELS2[task.status] ?? task.status}`);
1567
+ process.exit(1);
1568
+ }
1569
+ if (task.worker?.id !== agentId) {
1570
+ spin.stop();
1571
+ error(`You are not the worker for this task.`);
1572
+ log(` Worker: ${task.worker?.id}`);
1573
+ log(` Your agent: ${agentId}`);
1574
+ process.exit(1);
1575
+ }
1576
+ spin.stop();
1577
+ log(`
1578
+ ${colors.primary("\u{1F4B0} Settling Task")}
1579
+ `);
1580
+ log(` Task: ${formatAddress(taskId)}`);
1581
+ log(` Payment: ${formatSui(task.payment_amount_mist)}`);
1582
+ log(` Skill: ${task.skill.name}
1583
+ `);
1584
+ spin.start("Loading keypair...");
1585
+ const agent = await client.api.getAgent(agentId);
1586
+ const ownerAddress = agent.owner;
1587
+ const keypair = await loadKeypair(options.keystore, ownerAddress);
1588
+ spin.text = "Building transaction...";
1589
+ const txConfig = {
1590
+ packageId: config2.packageId,
1591
+ treasuryId: config2.treasuryId
1592
+ };
1593
+ const tx = buildSettleTaskTx(txConfig, {
1594
+ taskId,
1595
+ agentId
1596
+ });
1597
+ spin.text = "Signing and executing transaction...";
1598
+ const suiClient = getSuiClient();
1599
+ const result = await suiClient.signAndExecuteTransaction({
1600
+ transaction: tx,
1601
+ signer: keypair,
1602
+ options: { showEffects: true }
1603
+ });
1604
+ spin.text = "Waiting for confirmation...";
1605
+ await suiClient.waitForTransaction({ digest: result.digest });
1606
+ spin.stop();
1607
+ success(`Task settled! Payment received.`);
1608
+ log(`
1609
+ ${colors.muted("Transaction:")} ${result.digest}`);
1610
+ log(`
1611
+ ${formatSui(task.payment_amount_mist)} (minus protocol fee) has been transferred to your wallet.`);
1612
+ } catch (err) {
1613
+ spin.stop();
1614
+ error(`Failed to settle task: ${err.message}`);
1615
+ process.exit(1);
1616
+ }
1617
+ });
1539
1618
  taskCmd.command("watch").description("Watch for new available tasks").option("--skill <id>", "Filter by skill ID").option("-i, --interval <seconds>", "Poll interval", "30").action(async (options) => {
1540
1619
  log(`
1541
1620
  ${colors.primary("Watching for tasks...")} (Ctrl+C to stop)
@@ -2370,7 +2449,7 @@ var banner = chalk3.cyan(`
2370
2449
  \u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2557
2371
2450
  \u255A\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D
2372
2451
  `);
2373
- program.name("clank").description("CLI for Clank Protocol - Agent-to-Agent Skills Marketplace").version("0.1.2").addHelpText("beforeAll", banner).option("--json", "Output as JSON").hook("preAction", (thisCommand) => {
2452
+ program.name("clank").description("CLI for Clank Protocol - Agent-to-Agent Skills Marketplace").version("0.1.4").addHelpText("beforeAll", banner).option("--json", "Output as JSON").hook("preAction", (thisCommand) => {
2374
2453
  const opts = thisCommand.opts();
2375
2454
  if (opts.json) {
2376
2455
  const config2 = getConfig();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts","../src/index.ts","../src/commands/config.ts","../src/utils.ts","../src/client.ts","../src/commands/agent.ts","../src/commands/skill.ts","../src/commands/task.ts","../src/commands/health.ts","../src/commands/badge.ts","../src/commands/claim.ts","../src/commands/proposal.ts"],"sourcesContent":["import Conf from \"conf\";\nimport type { Network } from \"@clankxyz/shared\";\n\n// Cache for remote config\nlet cachedRemoteConfig: RemoteConfig | null = null;\n\nexport interface RemoteConfig {\n package_id: string;\n treasury_id?: string;\n network: string;\n api_version: string;\n walrus: {\n aggregator: string;\n publisher: string;\n };\n rpc_urls: {\n mainnet: string;\n testnet: string;\n };\n}\n\nexport interface CliConfig {\n // API configuration\n apiUrl: string;\n apiKey?: string;\n\n // Network configuration\n network: Network;\n rpcUrl?: string;\n packageId?: string;\n\n // Walrus configuration\n walrusAggregator?: string;\n walrusPublisher?: string;\n\n // Agent configuration\n agentId?: string;\n agentName?: string;\n\n // Output preferences\n outputFormat: \"table\" | \"json\";\n}\n\nconst defaults: CliConfig = {\n apiUrl: \"http://localhost:3000\",\n network: \"testnet\",\n outputFormat: \"table\",\n};\n\nconst config = new Conf<CliConfig>({\n projectName: \"clank-cli\",\n projectVersion: \"0.1.0\",\n defaults,\n schema: {\n apiUrl: { type: \"string\" },\n apiKey: { type: \"string\" },\n network: { type: \"string\", enum: [\"mainnet\", \"testnet\", \"devnet\", \"localnet\"] },\n rpcUrl: { type: \"string\" },\n packageId: { type: \"string\" },\n walrusAggregator: { type: \"string\" },\n walrusPublisher: { type: \"string\" },\n agentId: { type: \"string\" },\n agentName: { type: \"string\" },\n outputFormat: { type: \"string\", enum: [\"table\", \"json\"] },\n },\n});\n\nexport function getConfig(): CliConfig {\n return {\n apiUrl: config.get(\"apiUrl\"),\n apiKey: config.get(\"apiKey\"),\n network: config.get(\"network\"),\n rpcUrl: config.get(\"rpcUrl\"),\n packageId: config.get(\"packageId\"),\n walrusAggregator: config.get(\"walrusAggregator\"),\n walrusPublisher: config.get(\"walrusPublisher\"),\n agentId: config.get(\"agentId\"),\n agentName: config.get(\"agentName\"),\n outputFormat: config.get(\"outputFormat\"),\n };\n}\n\nexport function setConfig<K extends keyof CliConfig>(\n key: K,\n value: CliConfig[K]\n): void {\n config.set(key, value);\n}\n\nexport function clearConfig(): void {\n config.clear();\n}\n\nexport function getConfigPath(): string {\n return config.path;\n}\n\n/**\n * Fetch remote configuration from the API.\n * This includes packageId, walrus endpoints, etc.\n * Results are cached for the session.\n */\nexport async function fetchRemoteConfig(): Promise<RemoteConfig | null> {\n if (cachedRemoteConfig) {\n return cachedRemoteConfig;\n }\n\n const apiUrl = config.get(\"apiUrl\");\n if (!apiUrl || apiUrl === \"http://localhost:3000\") {\n return null;\n }\n\n try {\n const response = await fetch(`${apiUrl}/api/config`);\n if (!response.ok) {\n return null;\n }\n cachedRemoteConfig = await response.json();\n return cachedRemoteConfig;\n } catch {\n return null;\n }\n}\n\n/**\n * Get the effective config, merging local settings with remote defaults.\n * Local settings always take precedence.\n */\nexport async function getEffectiveConfig(): Promise<CliConfig & { packageId: string }> {\n const local = getConfig();\n const remote = await fetchRemoteConfig();\n\n return {\n ...local,\n // Use local values if set, otherwise fall back to remote\n packageId: local.packageId || remote?.package_id || \"\",\n walrusAggregator: local.walrusAggregator || remote?.walrus.aggregator,\n walrusPublisher: local.walrusPublisher || remote?.walrus.publisher,\n };\n}\n\nexport { config };\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { registerConfigCommands } from \"./commands/config.js\";\nimport { registerAgentCommands } from \"./commands/agent.js\";\nimport { registerSkillCommands } from \"./commands/skill.js\";\nimport { registerTaskCommands } from \"./commands/task.js\";\nimport { registerHealthCommand } from \"./commands/health.js\";\nimport { registerBadgeCommands } from \"./commands/badge.js\";\nimport { registerClaimCommands } from \"./commands/claim.js\";\nimport { registerProposalCommands } from \"./commands/proposal.js\";\nimport { getConfig } from \"./config.js\";\n\nconst program = new Command();\n\n// ASCII art banner\nconst banner = chalk.cyan(`\n ██████╗██╗ █████╗ ███╗ ██╗██╗ ██╗\n ██╔════╝██║ ██╔══██╗████╗ ██║██║ ██╔╝\n ██║ ██║ ███████║██╔██╗ ██║█████╔╝ \n ██║ ██║ ██╔══██║██║╚██╗██║██╔═██╗ \n ╚██████╗███████╗██║ ██║██║ ╚████║██║ ██╗\n ╚═════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝\n`);\n\nprogram\n .name(\"clank\")\n .description(\"CLI for Clank Protocol - Agent-to-Agent Skills Marketplace\")\n .version(\"0.1.2\")\n .addHelpText(\"beforeAll\", banner)\n .option(\"--json\", \"Output as JSON\")\n .hook(\"preAction\", (thisCommand) => {\n // Set output format if --json flag is used\n const opts = thisCommand.opts();\n if (opts.json) {\n const config = getConfig();\n // Temporarily override for this command\n process.env.CLANK_OUTPUT_FORMAT = \"json\";\n }\n });\n\n// Register all commands\nregisterConfigCommands(program);\nregisterAgentCommands(program);\nregisterSkillCommands(program);\nregisterTaskCommands(program);\nregisterBadgeCommands(program);\nregisterClaimCommands(program);\nregisterProposalCommands(program);\nregisterHealthCommand(program);\n\n// Parse and execute\nprogram.parse();\n","import { Command } from \"commander\";\nimport {\n getConfig,\n setConfig,\n clearConfig,\n getConfigPath,\n type CliConfig,\n} from \"../config.js\";\nimport { log, success, error, colors, table } from \"../utils.js\";\n\nexport function registerConfigCommands(program: Command): void {\n const configCmd = program\n .command(\"config\")\n .description(\"Manage CLI configuration\");\n\n // Show all config\n configCmd\n .command(\"show\")\n .description(\"Show current configuration\")\n .option(\"--json\", \"Output as JSON\")\n .action((options) => {\n const config = getConfig();\n\n if (options.json) {\n console.log(JSON.stringify(config, null, 2));\n return;\n }\n\n log(colors.primary(\"\\nClank CLI Configuration\\n\"));\n log(colors.muted(`Config file: ${getConfigPath()}\\n`));\n\n const rows = Object.entries(config).map(([key, value]) => [\n colors.highlight(key),\n value !== undefined ? String(value) : colors.muted(\"(not set)\"),\n ]);\n\n log(table([\"Key\", \"Value\"], rows));\n log(\"\");\n });\n\n // Get a specific config value\n configCmd\n .command(\"get <key>\")\n .description(\"Get a configuration value\")\n .action((key: keyof CliConfig) => {\n const config = getConfig();\n const value = config[key];\n\n if (value === undefined) {\n error(`Configuration key \"${key}\" is not set`);\n process.exit(1);\n }\n\n log(String(value));\n });\n\n // Set a config value\n configCmd\n .command(\"set <key> <value>\")\n .description(\"Set a configuration value\")\n .action((key: keyof CliConfig, value: string) => {\n const validKeys: (keyof CliConfig)[] = [\n \"apiUrl\",\n \"apiKey\",\n \"network\",\n \"rpcUrl\",\n \"packageId\",\n \"walrusAggregator\",\n \"walrusPublisher\",\n \"agentId\",\n \"agentName\",\n \"outputFormat\",\n ];\n\n if (!validKeys.includes(key)) {\n error(`Invalid configuration key: ${key}`);\n log(`\\nValid keys: ${validKeys.join(\", \")}`);\n process.exit(1);\n }\n\n // Validate specific keys\n if (key === \"network\") {\n const validNetworks = [\"mainnet\", \"testnet\", \"devnet\", \"localnet\"];\n if (!validNetworks.includes(value)) {\n error(`Invalid network: ${value}`);\n log(`Valid networks: ${validNetworks.join(\", \")}`);\n process.exit(1);\n }\n }\n\n if (key === \"outputFormat\") {\n const validFormats = [\"table\", \"json\"];\n if (!validFormats.includes(value)) {\n error(`Invalid output format: ${value}`);\n log(`Valid formats: ${validFormats.join(\", \")}`);\n process.exit(1);\n }\n }\n\n setConfig(key, value as never);\n success(`Set ${key} = ${value}`);\n });\n\n // Unset a config value\n configCmd\n .command(\"unset <key>\")\n .description(\"Unset a configuration value\")\n .action((key: keyof CliConfig) => {\n setConfig(key, undefined as never);\n success(`Unset ${key}`);\n });\n\n // Reset all config\n configCmd\n .command(\"reset\")\n .description(\"Reset all configuration to defaults\")\n .option(\"-y, --yes\", \"Skip confirmation\")\n .action(async (options) => {\n if (!options.yes) {\n const prompts = await import(\"prompts\");\n const { confirm } = await prompts.default({\n type: \"confirm\",\n name: \"confirm\",\n message: \"Reset all configuration to defaults?\",\n initial: false,\n });\n\n if (!confirm) {\n log(\"Cancelled\");\n return;\n }\n }\n\n clearConfig();\n success(\"Configuration reset to defaults\");\n });\n\n // Show config file path\n configCmd\n .command(\"path\")\n .description(\"Show configuration file path\")\n .action(() => {\n log(getConfigPath());\n });\n}\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { getConfig } from \"./config.js\";\n\n// Colors\nexport const colors = {\n primary: chalk.cyan,\n success: chalk.green,\n warning: chalk.yellow,\n error: chalk.red,\n muted: chalk.gray,\n highlight: chalk.bold.white,\n};\n\n// Logging\nexport function log(message: string): void {\n console.log(message);\n}\n\nexport function success(message: string): void {\n console.log(colors.success(\"✓\"), message);\n}\n\nexport function warn(message: string): void {\n console.log(colors.warning(\"⚠\"), message);\n}\n\nexport function error(message: string): void {\n console.error(colors.error(\"✗\"), message);\n}\n\nexport function info(message: string): void {\n console.log(colors.primary(\"ℹ\"), message);\n}\n\n// Spinner\nexport function spinner(text: string) {\n return ora({ text, color: \"cyan\" });\n}\n\n// Formatters\nexport function formatAddress(address: string, length = 8): string {\n if (address.length <= length * 2 + 2) return address;\n return `${address.slice(0, length + 2)}...${address.slice(-length)}`;\n}\n\n// MIST_PER_SUI = 1_000_000_000 (9 decimals)\nconst MIST_PER_SUI = 1_000_000_000;\n\nexport function formatSui(amount: bigint | string): string {\n const value = typeof amount === \"string\" ? BigInt(amount) : amount;\n const sui = Number(value) / MIST_PER_SUI;\n // Show up to 4 decimal places, trim trailing zeros\n const formatted = sui.toFixed(4).replace(/\\.?0+$/, '');\n return `${formatted} SUI`;\n}\n\n\nexport function formatTimestamp(timestamp: bigint | string | number): string {\n const ms = typeof timestamp === \"bigint\" ? Number(timestamp) : Number(timestamp);\n return new Date(ms).toLocaleString();\n}\n\nexport function formatDuration(seconds: number): string {\n if (seconds < 60) return `${seconds}s`;\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m`;\n if (seconds < 86400) return `${Math.floor(seconds / 3600)}h`;\n return `${Math.floor(seconds / 86400)}d`;\n}\n\nexport function formatPercent(value: number | null | undefined): string {\n if (value === null || value === undefined) return \"-\";\n return `${(value * 100).toFixed(1)}%`;\n}\n\n// Table formatting\nexport function table(\n headers: string[],\n rows: string[][],\n options: { maxWidth?: number } = {}\n): string {\n const maxWidth = options.maxWidth ?? 20;\n\n // Calculate column widths\n const widths = headers.map((h, i) =>\n Math.min(\n maxWidth,\n Math.max(h.length, ...rows.map((r) => (r[i] ?? \"\").length))\n )\n );\n\n // Format header\n const headerLine = headers\n .map((h, i) => h.padEnd(widths[i]))\n .join(\" \");\n\n const separator = widths.map((w) => \"-\".repeat(w)).join(\" \");\n\n // Format rows\n const rowLines = rows.map((row) =>\n row.map((cell, i) => (cell ?? \"\").padEnd(widths[i])).join(\" \")\n );\n\n return [\n colors.muted(headerLine),\n colors.muted(separator),\n ...rowLines,\n ].join(\"\\n\");\n}\n\n// JSON output\nexport function jsonOutput(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n\n// Output based on config\nexport function output(data: unknown, tableFormatter?: () => string): void {\n const config = getConfig();\n\n if (config.outputFormat === \"json\") {\n jsonOutput(data);\n } else if (tableFormatter) {\n log(tableFormatter());\n } else {\n jsonOutput(data);\n }\n}\n\n// Prompts\nexport function requireConfig(key: keyof ReturnType<typeof getConfig>): string {\n const config = getConfig();\n const value = config[key];\n\n if (!value) {\n error(`Missing configuration: ${key}`);\n error(`Run: clank config set ${key} <value>`);\n process.exit(1);\n }\n\n return value as string;\n}\n\nexport function requireAgentId(): string {\n return requireConfig(\"agentId\");\n}\n\nexport function requireApiKey(): string {\n return requireConfig(\"apiKey\");\n}\n\n// ============================================================================\n// Sui Client and Keypair Helpers\n// ============================================================================\n\nimport { SuiClient } from \"@mysten/sui/client\";\nimport { Ed25519Keypair } from \"@mysten/sui/keypairs/ed25519\";\nimport { decodeSuiPrivateKey } from \"@mysten/sui/cryptography\";\nimport { FULLNODE_URLS, type Network } from \"@clankxyz/shared\";\n\n/**\n * Get a Sui client based on config\n */\nexport function getSuiClient(): SuiClient {\n const config = getConfig();\n const rpcUrl = config.rpcUrl ?? FULLNODE_URLS[config.network as Network] ?? FULLNODE_URLS.mainnet;\n return new SuiClient({ url: rpcUrl });\n}\n\n/**\n * Load keypair from Sui keystore or custom path\n * @param keystorePath Optional custom keystore path\n * @param ownerAddress Optional owner address to match\n */\nexport async function loadKeypair(\n keystorePath?: string,\n ownerAddress?: string\n): Promise<Ed25519Keypair> {\n const fs = await import(\"fs\");\n const os = await import(\"os\");\n const path = await import(\"path\");\n\n const defaultPath = path.join(os.homedir(), \".sui\", \"sui_config\", \"sui.keystore\");\n const keyPath = keystorePath ?? defaultPath;\n\n if (!fs.existsSync(keyPath)) {\n throw new Error(`Sui keystore not found at: ${keyPath}`);\n }\n\n const keystoreData = fs.readFileSync(keyPath, \"utf-8\");\n const keys: string[] = JSON.parse(keystoreData);\n\n if (keys.length === 0) {\n throw new Error(\"No keys found in Sui keystore\");\n }\n\n // If owner address specified, find matching key\n if (ownerAddress) {\n const normalizedOwner = ownerAddress.toLowerCase();\n for (const encodedKey of keys) {\n try {\n const { secretKey } = decodeSuiPrivateKey(encodedKey);\n const keypair = Ed25519Keypair.fromSecretKey(secretKey);\n const address = keypair.getPublicKey().toSuiAddress().toLowerCase();\n \n if (address === normalizedOwner) {\n return keypair;\n }\n } catch {\n continue;\n }\n }\n throw new Error(`No key found for address: ${ownerAddress}`);\n }\n\n // Otherwise use first key\n const { secretKey } = decodeSuiPrivateKey(keys[0]);\n return Ed25519Keypair.fromSecretKey(secretKey);\n}\n\n/**\n * Load keypair from a .key file (as saved by onboard command)\n */\nexport async function loadKeypairFromFile(filePath: string): Promise<Ed25519Keypair> {\n const fs = await import(\"fs\");\n\n if (!fs.existsSync(filePath)) {\n throw new Error(`Key file not found: ${filePath}`);\n }\n\n const keyData = fs.readFileSync(filePath, \"utf-8\").trim();\n \n // Try to decode as base64 first\n try {\n const secretKey = Buffer.from(keyData, \"base64\");\n return Ed25519Keypair.fromSecretKey(secretKey);\n } catch {\n // Try as hex\n try {\n const secretKey = Buffer.from(keyData, \"hex\");\n return Ed25519Keypair.fromSecretKey(secretKey);\n } catch {\n throw new Error(\"Invalid key format in file\");\n }\n }\n}\n","import { ClankClient } from \"@clankxyz/sdk\";\nimport { getConfig } from \"./config.js\";\n\nlet clientInstance: ClankClient | null = null;\n\nexport function getClient(): ClankClient {\n if (clientInstance) return clientInstance;\n\n const config = getConfig();\n\n clientInstance = new ClankClient({\n apiUrl: config.apiUrl,\n apiKey: config.apiKey,\n network: config.network,\n rpcUrl: config.rpcUrl,\n packageId: config.packageId,\n walrusAggregator: config.walrusAggregator,\n walrusPublisher: config.walrusPublisher,\n agentId: config.agentId,\n });\n\n return clientInstance;\n}\n\nexport function resetClient(): void {\n clientInstance = null;\n}\n","import { Command } from \"commander\";\nimport { execSync } from \"child_process\";\nimport { getClient } from \"../client.js\";\nimport {\n log,\n success,\n error,\n spinner,\n colors,\n table,\n output,\n formatAddress,\n formatTimestamp,\n formatPercent,\n formatSui,\n requireApiKey,\n} from \"../utils.js\";\nimport { getConfig, setConfig } from \"../config.js\";\n\n/**\n * Generate the signature challenge message for linking\n */\nfunction generateSignatureChallenge(\n agentId: string,\n action: string,\n timestamp: number\n): string {\n return `Clank Verification\\n\\nAgent: ${agentId}\\nAction: ${action}\\nTimestamp: ${timestamp}\\n\\nSign this message to verify ownership.`;\n}\n\nexport function registerAgentCommands(program: Command): void {\n const agentCmd = program\n .command(\"agent\")\n .description(\"Manage agents\");\n\n // List agents\n agentCmd\n .command(\"list\")\n .description(\"List all agents\")\n .option(\"-p, --page <number>\", \"Page number\", \"1\")\n .option(\"-l, --limit <number>\", \"Items per page\", \"20\")\n .action(async (options) => {\n const spin = spinner(\"Fetching agents...\").start();\n\n try {\n const client = getClient();\n const result = await client.api.listAgents({\n page: parseInt(options.page),\n limit: parseInt(options.limit),\n });\n\n spin.stop();\n\n output(result, () => {\n const rows = result.data.map((agent) => [\n formatAddress(agent.id),\n formatAddress(agent.owner),\n String(agent.skills_count),\n String(agent.tasks_as_worker),\n formatPercent(agent.stats?.completion_rate),\n ]);\n\n return (\n `\\n${colors.primary(\"Agents\")} (${result.pagination.total} total)\\n\\n` +\n table([\"ID\", \"Owner\", \"Skills\", \"Tasks Done\", \"Success\"], rows) +\n `\\n\\nPage ${result.pagination.page}/${result.pagination.pages}`\n );\n });\n } catch (err) {\n spin.stop();\n error(`Failed to list agents: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Get agent details\n agentCmd\n .command(\"info [id]\")\n .description(\"Get agent details (uses configured agent if no ID)\")\n .action(async (id?: string) => {\n const agentId = id ?? getConfig().agentId;\n\n if (!agentId) {\n error(\"No agent ID provided. Set one with: clank config set agentId <id>\");\n process.exit(1);\n }\n\n const spin = spinner(\"Fetching agent...\").start();\n\n try {\n const client = getClient();\n const agent = await client.api.getAgent(agentId);\n\n spin.stop();\n\n output(agent, () => {\n let output = `\\n${colors.primary(\"Agent Details\")}\\n\\n`;\n output += `${colors.muted(\"ID:\")} ${agent.id}\\n`;\n output += `${colors.muted(\"Owner:\")} ${agent.owner}\\n`;\n output += `${colors.muted(\"Created:\")} ${formatTimestamp(agent.created_at)}\\n`;\n output += `${colors.muted(\"Metadata:\")} ${agent.metadata_uri ?? \"(none)\"}\\n`;\n\n if (agent.skills.length > 0) {\n output += `\\n${colors.primary(\"Skills\")} (${agent.skills.length})\\n\\n`;\n const skillRows = agent.skills.map((s) => [\n s.name,\n s.version,\n formatSui(s.base_price_mist),\n ]);\n output += table([\"Name\", \"Version\", \"Price\"], skillRows);\n }\n\n if (agent.badges.length > 0) {\n output += `\\n\\n${colors.primary(\"Badges\")} (${agent.badges.length})\\n\\n`;\n const badgeRows = agent.badges.map((b) => [\n b.badge_type,\n `Tier ${b.tier}`,\n formatTimestamp(b.earned_at),\n ]);\n output += table([\"Type\", \"Tier\", \"Earned\"], badgeRows);\n }\n\n return output;\n });\n } catch (err) {\n spin.stop();\n error(`Failed to get agent: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Get agent stats\n agentCmd\n .command(\"stats [id]\")\n .description(\"Get agent statistics\")\n .action(async (id?: string) => {\n const agentId = id ?? getConfig().agentId;\n\n if (!agentId) {\n error(\"No agent ID provided\");\n process.exit(1);\n }\n\n const spin = spinner(\"Fetching stats...\").start();\n\n try {\n const client = getClient();\n const stats = await client.api.getAgentStats(agentId);\n\n spin.stop();\n\n output(stats, () => {\n let output = `\\n${colors.primary(\"Agent Statistics\")}\\n\\n`;\n\n output += `${colors.highlight(\"Worker Stats\")}\\n`;\n output += ` Tasks Completed: ${stats.workerTasksCompleted}\\n`;\n output += ` Tasks Failed: ${stats.workerTasksFailed}\\n`;\n output += ` Tasks Expired: ${stats.workerTasksExpired}\\n`;\n output += ` Total Earned: ${formatSui(stats.workerTotalEarnedMist)}\\n`;\n output += ` Completion Rate: ${formatPercent(stats.completionRate)}\\n`;\n\n output += `\\n${colors.highlight(\"Requester Stats\")}\\n`;\n output += ` Tasks Posted: ${stats.requesterTasksPosted}\\n`;\n output += ` Tasks Settled: ${stats.requesterTasksSettled}\\n`;\n output += ` Tasks Cancelled: ${stats.requesterTasksCancelled}\\n`;\n output += ` Tasks Rejected: ${stats.requesterTasksRejected}\\n`;\n output += ` Total Spent: ${formatSui(stats.requesterTotalSpentMist)}\\n`;\n output += ` Rejection Rate: ${formatPercent(stats.rejectionRate)}\\n`;\n\n output += `\\n${colors.highlight(\"Metrics\")}\\n`;\n output += ` Unique Partners: ${stats.uniqueCounterparties}\\n`;\n output += ` Flagged: ${stats.flaggedForAbuse ? colors.error(\"Yes\") : colors.success(\"No\")}\\n`;\n\n return output;\n });\n } catch (err) {\n spin.stop();\n error(`Failed to get stats: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Set current agent\n agentCmd\n .command(\"use <id>\")\n .description(\"Set the current agent for commands\")\n .option(\"-n, --name <name>\", \"Agent name for display\")\n .action((id: string, options) => {\n setConfig(\"agentId\", id);\n if (options.name) {\n setConfig(\"agentName\", options.name);\n }\n success(`Now using agent: ${formatAddress(id)}`);\n });\n\n // Show current agent\n agentCmd\n .command(\"current\")\n .description(\"Show current agent\")\n .action(() => {\n const config = getConfig();\n\n if (!config.agentId) {\n log(\"No agent configured. Use: clank agent use <id>\");\n return;\n }\n\n log(`\\nCurrent Agent:`);\n log(` ID: ${config.agentId}`);\n if (config.agentName) {\n log(` Name: ${config.agentName}`);\n }\n log(\"\");\n });\n\n // Link agent to API key\n agentCmd\n .command(\"link <agent-id>\")\n .description(\"Link an on-chain agent to your API key (requires wallet signature)\")\n .option(\"-k, --api-key <key>\", \"API key to link (uses configured key if not provided)\")\n .option(\"--keystore <path>\", \"Path to sui.keystore file\")\n .action(async (agentId: string, options) => {\n const config = getConfig();\n const apiKey = options.apiKey ?? config.apiKey;\n\n if (!apiKey) {\n error(\"No API key configured. Set one with: clank config set apiKey <key>\");\n process.exit(1);\n }\n\n log(`\\n${colors.primary(\"Linking Agent to API Key\")}\\n`);\n log(`Agent ID: ${formatAddress(agentId)}`);\n\n const spin = spinner(\"Loading Sui keystore...\").start();\n\n try {\n const fs = await import(\"fs\");\n const os = await import(\"os\");\n const path = await import(\"path\");\n\n // Find keystore\n const keystorePath = options.keystore ?? \n path.join(os.homedir(), \".sui\", \"sui_config\", \"sui.keystore\");\n\n if (!fs.existsSync(keystorePath)) {\n spin.stop();\n error(`Sui keystore not found at: ${keystorePath}`);\n log(`\\nMake sure you have sui CLI installed and configured.`);\n log(`Or specify a custom path with: --keystore <path>`);\n process.exit(1);\n }\n\n // Read and parse keystore\n const keystoreData = fs.readFileSync(keystorePath, \"utf-8\");\n const keys: string[] = JSON.parse(keystoreData);\n\n if (keys.length === 0) {\n spin.stop();\n error(\"No keys found in Sui keystore\");\n process.exit(1);\n }\n\n // Import Ed25519Keypair from SDK\n const { Ed25519Keypair } = await import(\"@mysten/sui/keypairs/ed25519\");\n const { decodeSuiPrivateKey } = await import(\"@mysten/sui/cryptography\");\n\n // Try each key to find the owner of the agent\n spin.text = \"Fetching agent info...\";\n\n const agentResponse = await fetch(`${config.apiUrl}/api/agents/${agentId}`);\n if (!agentResponse.ok) {\n spin.stop();\n const data = await agentResponse.json();\n error(`Failed to fetch agent: ${data.error}`);\n log(`\\nMake sure the agent has been indexed. Check: clank health`);\n process.exit(1);\n }\n\n const agentData = await agentResponse.json();\n const ownerAddress = agentData.agent.owner.toLowerCase();\n\n spin.text = \"Finding matching key...\";\n\n let matchingKeypair: InstanceType<typeof Ed25519Keypair> | null = null;\n for (const encodedKey of keys) {\n try {\n const { secretKey } = decodeSuiPrivateKey(encodedKey);\n const keypair = Ed25519Keypair.fromSecretKey(secretKey);\n const address = keypair.getPublicKey().toSuiAddress().toLowerCase();\n \n if (address === ownerAddress) {\n matchingKeypair = keypair;\n break;\n }\n } catch {\n // Skip invalid keys\n continue;\n }\n }\n\n if (!matchingKeypair) {\n spin.stop();\n error(`No key found for agent owner: ${agentData.agent.owner}`);\n log(`\\nYour keystore contains keys for these addresses:`);\n for (const encodedKey of keys) {\n try {\n const { secretKey } = decodeSuiPrivateKey(encodedKey);\n const keypair = Ed25519Keypair.fromSecretKey(secretKey);\n log(` - ${keypair.getPublicKey().toSuiAddress()}`);\n } catch {\n continue;\n }\n }\n log(`\\nMake sure you created the agent with one of these addresses.`);\n process.exit(1);\n }\n\n spin.text = \"Signing verification message...\";\n\n // Generate and sign the message\n const timestamp = Date.now();\n const message = generateSignatureChallenge(agentId, \"link_api_key\", timestamp);\n const messageBytes = new TextEncoder().encode(message);\n \n const { signature } = await matchingKeypair.signPersonalMessage(messageBytes);\n\n spin.text = \"Linking agent to API key...\";\n\n // Call the link API\n const response = await fetch(`${config.apiUrl}/api/agents/link`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": apiKey,\n },\n body: JSON.stringify({\n agent_id: agentId,\n signature,\n timestamp,\n }),\n });\n\n const data = await response.json();\n\n spin.stop();\n\n if (!response.ok) {\n error(`Failed to link agent: ${data.error}`);\n if (data.hint) {\n log(`Hint: ${data.hint}`);\n }\n process.exit(1);\n }\n\n // Save agent ID to config\n setConfig(\"agentId\", agentId);\n\n success(`Agent linked successfully!`);\n log(`\\n Agent ID: ${data.agent_id}`);\n log(` Owner: ${data.agent_owner}`);\n log(`\\nAgent saved to config. Use 'clank agent info' to see details.`);\n } catch (err) {\n spin.stop();\n error(`Failed to link agent: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Link with manual signature (fallback)\n agentCmd\n .command(\"link-with-sig <agent-id> <signature> <timestamp>\")\n .description(\"Link agent with a pre-signed signature\")\n .option(\"-k, --api-key <key>\", \"API key to link\")\n .action(async (agentId: string, signature: string, timestampStr: string, options) => {\n const config = getConfig();\n const apiKey = options.apiKey ?? config.apiKey;\n\n if (!apiKey) {\n error(\"No API key configured\");\n process.exit(1);\n }\n\n const timestamp = parseInt(timestampStr, 10);\n if (isNaN(timestamp)) {\n error(\"Invalid timestamp\");\n process.exit(1);\n }\n\n const spin = spinner(\"Linking agent...\").start();\n\n try {\n const response = await fetch(`${config.apiUrl}/api/agents/link`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": apiKey,\n },\n body: JSON.stringify({\n agent_id: agentId,\n signature,\n timestamp,\n }),\n });\n\n const data = await response.json();\n\n spin.stop();\n\n if (!response.ok) {\n error(`Failed to link agent: ${data.error}`);\n process.exit(1);\n }\n\n setConfig(\"agentId\", agentId);\n success(`Agent linked successfully!`);\n log(`\\n Agent ID: ${data.agent_id}`);\n log(` Owner: ${data.agent_owner}`);\n } catch (err) {\n spin.stop();\n error(`Failed: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Register new API key (manual flow)\n agentCmd\n .command(\"register <name>\")\n .description(\"Register a new API key (manual flow - you create agent separately)\")\n .option(\"-u, --api-url <url>\", \"API URL\", \"https://clank.xyz\")\n .action(async (name: string, options) => {\n const spin = spinner(\"Registering API key...\").start();\n\n try {\n const response = await fetch(`${options.apiUrl}/api/agents/register`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ agent_name: name }),\n });\n\n const data = await response.json();\n\n spin.stop();\n\n if (!response.ok) {\n error(`Failed to register: ${data.error}`);\n process.exit(1);\n }\n\n success(`API key registered!`);\n log(`\\n${colors.warning(\"⚠️ Save this key - it cannot be retrieved later!\")}\\n`);\n log(` API Key: ${colors.highlight(data.api_key)}`);\n log(` Name: ${data.agent_name}`);\n log(`\\nNext steps:`);\n log(` 1. clank config set apiKey ${data.api_key}`);\n log(` 2. clank config set apiUrl ${options.apiUrl}`);\n log(` 3. Create agent on-chain using Sui SDK or CLI`);\n log(` sui client call --package $CLANK_PACKAGE_ID --module agent --function create_and_transfer --args '\"walrus://your-metadata\"'`);\n log(` 4. clank agent link <agent-id>`);\n } catch (err) {\n spin.stop();\n error(`Failed: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Onboard new agent with sponsored gas\n agentCmd\n .command(\"onboard <name>\")\n .description(\"Onboard a new agent with sponsored gas (no SUI required!)\")\n .option(\"-u, --api-url <url>\", \"API URL\", \"https://clank.xyz\")\n .option(\"-m, --metadata <uri>\", \"Metadata URI\")\n .option(\"-k, --keystore <path>\", \"Path to save/load keypair\")\n .option(\"-r, --referral <code>\", \"Referral code from another agent\")\n .option(\"--new-key\", \"Generate a new keypair\")\n .action(async (name: string, options) => {\n const fs = await import(\"fs\");\n const os = await import(\"os\");\n const path = await import(\"path\");\n\n log(`\\n${colors.primary(\"🚀 Sponsored Agent Onboarding\")}\\n`);\n\n // Determine keypair source\n let keypair: InstanceType<typeof import(\"@mysten/sui/keypairs/ed25519\").Ed25519Keypair>;\n let savedKeyPath: string | undefined;\n \n const { Ed25519Keypair } = await import(\"@mysten/sui/keypairs/ed25519\");\n\n if (options.newKey || options.keystore) {\n // Generate new keypair\n const spin = spinner(\"Generating new keypair...\").start();\n keypair = Ed25519Keypair.generate();\n spin.stop();\n\n const address = keypair.getPublicKey().toSuiAddress();\n log(`${colors.success(\"✓\")} Generated new keypair`);\n log(` Address: ${address}\\n`);\n\n // Determine save path\n let keyPath: string;\n if (options.keystore) {\n keyPath = options.keystore;\n } else {\n // Default save location\n const clankDir = path.join(os.homedir(), \".clank\");\n if (!fs.existsSync(clankDir)) {\n fs.mkdirSync(clankDir, { recursive: true });\n }\n keyPath = path.join(clankDir, `${name}.key`);\n }\n\n // Export and save the secret key\n const exported = keypair.getSecretKey();\n fs.writeFileSync(keyPath, exported, { mode: 0o600 });\n savedKeyPath = keyPath;\n log(`${colors.success(\"✓\")} Keypair saved to: ${savedKeyPath}\\n`);\n } else {\n // Try to load from Sui keystore\n const spin = spinner(\"Loading keypair from Sui keystore...\").start();\n \n try {\n const keystorePath = path.join(os.homedir(), \".sui\", \"sui_config\", \"sui.keystore\");\n \n if (!fs.existsSync(keystorePath)) {\n spin.stop();\n error(\"No Sui keystore found. Use --new-key to generate a new keypair.\");\n process.exit(1);\n }\n\n const keystoreData = fs.readFileSync(keystorePath, \"utf-8\");\n const keys: string[] = JSON.parse(keystoreData);\n\n if (keys.length === 0) {\n spin.stop();\n error(\"Sui keystore is empty. Use --new-key to generate a new keypair.\");\n process.exit(1);\n }\n\n // Use the first key (active address)\n const { decodeSuiPrivateKey } = await import(\"@mysten/sui/cryptography\");\n const { secretKey } = decodeSuiPrivateKey(keys[0]);\n keypair = Ed25519Keypair.fromSecretKey(secretKey);\n \n spin.stop();\n log(`${colors.success(\"✓\")} Using keypair from Sui keystore`);\n log(` Address: ${keypair.getPublicKey().toSuiAddress()}\\n`);\n } catch (err) {\n spin.stop();\n error(`Failed to load keystore: ${(err as Error).message}`);\n log(`\\nUse --new-key to generate a fresh keypair instead.`);\n process.exit(1);\n }\n }\n\n // Call the onboard endpoint\n const spin = spinner(\"Creating agent with sponsored gas...\").start();\n\n try {\n const publicKeyBase64 = Buffer.from(keypair.getPublicKey().toRawBytes()).toString(\"base64\");\n\n const response = await fetch(`${options.apiUrl}/api/agents/onboard`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n agent_name: name,\n public_key: publicKeyBase64,\n metadata_uri: options.metadata,\n referral_code: options.referral,\n }),\n });\n\n const data = await response.json();\n\n spin.stop();\n\n if (!response.ok) {\n error(`Failed to onboard: ${data.error}`);\n if (data.hint) {\n log(`Hint: ${data.hint}`);\n }\n process.exit(1);\n }\n\n // Save config\n setConfig(\"apiKey\", data.api_key);\n setConfig(\"apiUrl\", options.apiUrl);\n setConfig(\"agentId\", data.agent_id);\n setConfig(\"agentName\", name);\n\n success(`\\n🎉 Agent onboarded successfully!\\n`);\n log(`${colors.warning(\"⚠️ Save these credentials - they cannot be retrieved later!\")}\\n`);\n log(` ${colors.muted(\"Agent ID:\")} ${data.agent_id}`);\n log(` ${colors.muted(\"Address:\")} ${data.agent_address}`);\n log(` ${colors.muted(\"API Key:\")} ${colors.highlight(data.api_key)}`);\n log(` ${colors.muted(\"Referral Code:\")} ${data.referral_code}`);\n log(` ${colors.muted(\"Transaction:\")} ${data.transaction_digest}`);\n \n if (savedKeyPath) {\n log(` ${colors.muted(\"Private Key:\")} ${savedKeyPath}`);\n }\n\n if (data.referred_by) {\n log(` ${colors.muted(\"Referred By:\")} ${data.referred_by}`);\n }\n\n log(`\\n${colors.primary(\"You're ready to start accepting tasks!\")} 🚀\\n`);\n log(`Quick commands:`);\n log(` clank skill list # See available skills`);\n log(` clank task list # See posted tasks`);\n log(` clank agent info # See your agent details`);\n log(` clank agent referral # Get your referral link`);\n } catch (err) {\n spin.stop();\n error(`Failed: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Get referral info\n agentCmd\n .command(\"referral [id]\")\n .description(\"Get referral info and share link\")\n .action(async (id?: string) => {\n requireApiKey();\n const agentId = id ?? getConfig().agentId;\n\n if (!agentId) {\n error(\"No agent ID provided. Set one with: clank config set agentId <id>\");\n process.exit(1);\n }\n\n const spin = spinner(\"Fetching referral info...\").start();\n\n try {\n const config = getConfig();\n const response = await fetch(`${config.apiUrl}/api/agents/${agentId}/referral`, {\n headers: {\n \"Authorization\": `Bearer ${config.apiKey}`,\n },\n });\n\n const data = await response.json();\n\n spin.stop();\n\n if (!response.ok) {\n error(`Failed to get referral info: ${data.error}`);\n process.exit(1);\n }\n\n output(data, () => {\n let out = `\\n${colors.primary(\"🎁 Referral Program\")}\\n\\n`;\n out += `${colors.highlight(\"Your Referral Code:\")}\\n`;\n out += ` ${colors.success(data.referral.code)}\\n\\n`;\n out += `${colors.highlight(\"Share Link:\")}\\n`;\n out += ` ${data.referral.link}\\n\\n`;\n out += `${colors.highlight(\"CLI Command (for other agents):\")}\\n`;\n out += ` ${data.referral.cli_command}\\n\\n`;\n \n out += `${colors.highlight(\"Program Info:\")}\\n`;\n out += ` ${data.program_info.description}\\n\\n`;\n\n out += `${colors.highlight(\"Your Stats:\")}\\n`;\n out += ` Total Referrals: ${data.stats.total_referrals}\\n`;\n out += ` Active Referrals: ${data.stats.active_referrals}\\n`;\n out += ` Referral Earnings: ${data.stats.referral_earnings_sui} SUI\\n`;\n out += ` Pending Bonus: ${formatSui(data.stats.pending_bonus_mist)}\\n`;\n out += ` Paid Bonus: ${formatSui(data.stats.paid_bonus_mist)}\\n`;\n\n if (data.referred_by) {\n out += `\\n${colors.muted(\"Referred by:\")} ${data.referred_by.name || formatAddress(data.referred_by.agent_id)}\\n`;\n }\n\n if (data.referred_agents.length > 0) {\n out += `\\n${colors.highlight(\"Referred Agents\")} (${data.referred_agents.length})\\n\\n`;\n const rows = data.referred_agents.slice(0, 10).map((r: { name: string | null; agent_id: string; tasks_completed: number; total_earned_mist: string; is_active: boolean }) => [\n r.name || formatAddress(r.agent_id),\n String(r.tasks_completed),\n formatSui(r.total_earned_mist),\n r.is_active ? colors.success(\"Active\") : colors.muted(\"Inactive\"),\n ]);\n out += table([\"Agent\", \"Tasks\", \"Earned\", \"Status\"], rows);\n }\n\n return out;\n });\n } catch (err) {\n spin.stop();\n error(`Failed to get referral info: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { getClient } from \"../client.js\";\nimport { STATUS_LABELS, VERIFICATION_LABELS, VERIFICATION, parseSui, type VerificationType } from \"@clankxyz/shared\";\nimport { buildPublishSkillTx, type TransactionConfig } from \"@clankxyz/sdk\";\nimport {\n log,\n success,\n error,\n spinner,\n colors,\n table,\n output,\n formatAddress,\n formatSui,\n formatTimestamp,\n formatDuration,\n loadKeypair,\n getSuiClient,\n} from \"../utils.js\";\nimport { getConfig, getEffectiveConfig } from \"../config.js\";\n\nexport function registerSkillCommands(program: Command): void {\n const skillCmd = program\n .command(\"skill\")\n .alias(\"skills\")\n .description(\"Manage skills\");\n\n // List skills\n skillCmd\n .command(\"list\")\n .description(\"List available skills\")\n .option(\"-p, --page <number>\", \"Page number\", \"1\")\n .option(\"-l, --limit <number>\", \"Items per page\", \"20\")\n .option(\"-n, --name <name>\", \"Filter by name\")\n .option(\"-a, --agent <id>\", \"Filter by agent ID\")\n .option(\"-v, --verification <type>\", \"Filter by verification type (0-2)\")\n .option(\"--deprecated\", \"Include deprecated skills\")\n .option(\"-s, --sort <field>\", \"Sort by: published_at, name, price\", \"published_at\")\n .option(\"-o, --order <dir>\", \"Sort order: asc, desc\", \"desc\")\n .action(async (options) => {\n const spin = spinner(\"Fetching skills...\").start();\n\n try {\n const client = getClient();\n const result = await client.api.listSkills({\n page: parseInt(options.page),\n limit: parseInt(options.limit),\n name: options.name,\n agentId: options.agent,\n verificationType: options.verification\n ? parseInt(options.verification)\n : undefined,\n includeDeprecated: options.deprecated,\n sortBy: options.sort,\n sortOrder: options.order,\n });\n\n spin.stop();\n\n output(result, () => {\n const rows = result.data.map((skill) => [\n skill.name,\n skill.version,\n formatSui(skill.base_price_mist),\n skill.verification_type_label,\n formatDuration(skill.timeout_seconds),\n String(skill.tasks_count),\n ]);\n\n return (\n `\\n${colors.primary(\"Skills\")} (${result.pagination.total} total)\\n\\n` +\n table([\"Name\", \"Version\", \"Price\", \"Verification\", \"Timeout\", \"Tasks\"], rows) +\n `\\n\\nPage ${result.pagination.page}/${result.pagination.pages}`\n );\n });\n } catch (err) {\n spin.stop();\n error(`Failed to list skills: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Get skill details\n skillCmd\n .command(\"info <id>\")\n .description(\"Get skill details\")\n .action(async (id: string) => {\n const spin = spinner(\"Fetching skill...\").start();\n\n try {\n const client = getClient();\n const skill = await client.api.getSkill(id);\n\n spin.stop();\n\n output(skill, () => {\n let output = `\\n${colors.primary(\"Skill Details\")}\\n\\n`;\n output += `${colors.muted(\"ID:\")} ${skill.id}\\n`;\n output += `${colors.muted(\"Name:\")} ${skill.name}\\n`;\n output += `${colors.muted(\"Version:\")} ${skill.version}\\n`;\n output += `${colors.muted(\"Agent:\")} ${formatAddress(skill.agent.id)}\\n`;\n output += `${colors.muted(\"Price:\")} ${formatSui(skill.base_price_mist)}\\n`;\n output += `${colors.muted(\"Worker Bond:\")} ${formatSui(skill.worker_bond_mist)}\\n`;\n output += `${colors.muted(\"Verification:\")} ${skill.verification_type_label}\\n`;\n output += `${colors.muted(\"Timeout:\")} ${formatDuration(skill.timeout_seconds)}\\n`;\n output += `${colors.muted(\"Published:\")} ${formatTimestamp(skill.published_at)}\\n`;\n output += `${colors.muted(\"Deprecated:\")} ${skill.deprecated ? colors.error(\"Yes\") : colors.success(\"No\")}\\n`;\n\n if (skill.input_schema_hash) {\n output += `${colors.muted(\"Input Schema:\")} ${skill.input_schema_hash.slice(0, 16)}...\\n`;\n }\n if (skill.output_schema_hash) {\n output += `${colors.muted(\"Output Schema:\")} ${skill.output_schema_hash.slice(0, 16)}...\\n`;\n }\n\n output += `\\n${colors.primary(\"Priority Multipliers\")}\\n`;\n const multipliers = skill.priority_multipliers as number[];\n output += ` Standard: ${(multipliers[0] / 10000).toFixed(1)}x\\n`;\n output += ` Priority: ${(multipliers[1] / 10000).toFixed(1)}x\\n`;\n output += ` Urgent: ${(multipliers[2] / 10000).toFixed(1)}x\\n`;\n\n output += `\\n${colors.primary(\"Statistics\")}\\n`;\n output += ` Total Tasks: ${skill.stats.total_tasks}\\n`;\n output += ` Templates: ${skill.stats.templates_count}\\n`;\n\n if (Object.keys(skill.stats.tasks_by_status).length > 0) {\n output += `\\n ${colors.highlight(\"Tasks by Status:\")}\\n`;\n for (const [status, count] of Object.entries(skill.stats.tasks_by_status)) {\n output += ` ${status}: ${count}\\n`;\n }\n }\n\n if (skill.certifications.length > 0) {\n output += `\\n${colors.primary(\"Certifications\")} (${skill.certifications.length})\\n\\n`;\n const certRows = skill.certifications.map((c) => [\n c.certification_type,\n formatAddress(c.certifier_id),\n formatTimestamp(c.certified_at),\n ]);\n output += table([\"Type\", \"Certifier\", \"Certified\"], certRows);\n }\n\n return output;\n });\n } catch (err) {\n spin.stop();\n error(`Failed to get skill: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Publish skill on-chain\n skillCmd\n .command(\"publish\")\n .description(\"Publish a new skill on-chain\")\n .requiredOption(\"-n, --name <name>\", \"Skill name\")\n .requiredOption(\"-v, --version <version>\", \"Skill version (e.g., 1.0.0)\")\n .requiredOption(\"-p, --price <sui>\", \"Base price in SUI (e.g., 0.01)\")\n .option(\"-a, --agent <id>\", \"Agent ID (uses configured agent if not provided)\")\n .option(\"-t, --timeout <seconds>\", \"Timeout in seconds\", \"3600\")\n .option(\"--verification <type>\", \"Verification type: 0=Deterministic, 1=RequesterConfirm, 2=TimeBound\", \"1\")\n .option(\"--input-schema <hash>\", \"SHA256 hash of input JSON schema\")\n .option(\"--output-schema <hash>\", \"SHA256 hash of output JSON schema\")\n .option(\"--worker-bond <sui>\", \"Required worker bond in SUI\", \"0\")\n .option(\"--metadata <uri>\", \"Metadata URI (e.g., walrus://...)\")\n .option(\"--keystore <path>\", \"Path to Sui keystore\")\n .action(async (options) => {\n const spin = spinner(\"Loading configuration...\").start();\n \n try {\n // Get effective config (auto-fetches packageId from API if not set locally)\n const config = await getEffectiveConfig();\n const agentId = options.agent ?? config.agentId;\n \n if (!agentId) {\n spin.stop();\n error(\"No agent ID provided. Set one with: clank config set agentId <id>\");\n process.exit(1);\n }\n\n if (!config.packageId) {\n spin.stop();\n error(\"Could not get package ID. Make sure you're connected to a Clank API.\");\n log(\" Try: clank config set apiUrl https://clank.xyz\");\n process.exit(1);\n }\n\n spin.stop();\n log(`\\n${colors.primary(\"📦 Publishing Skill On-Chain\")}\\n`);\n log(` Name: ${options.name}`);\n log(` Version: ${options.version}`);\n log(` Price: ${options.price} SUI`);\n log(` Verification: ${VERIFICATION_LABELS[parseInt(options.verification) as keyof typeof VERIFICATION_LABELS] ?? options.verification}`);\n log(` Timeout: ${formatDuration(parseInt(options.timeout))}\\n`);\n\n spin.start(\"Loading keypair...\");\n \n // Get agent owner address\n const client = getClient();\n const agent = await client.api.getAgent(agentId);\n const ownerAddress = agent.owner;\n\n // Load keypair matching the agent owner\n const keypair = await loadKeypair(options.keystore, ownerAddress);\n spin.text = \"Building transaction...\";\n\n const txConfig: TransactionConfig = {\n packageId: config.packageId,\n };\n\n const tx = buildPublishSkillTx(txConfig, {\n agentId,\n name: options.name,\n version: options.version,\n verificationType: parseInt(options.verification) as VerificationType,\n basePriceMist: parseSui(options.price),\n workerBondMist: parseSui(options.workerBond ?? \"0\"),\n timeoutSeconds: parseInt(options.timeout),\n inputSchemaHash: options.inputSchema ?? \"\",\n outputSchemaHash: options.outputSchema ?? \"\",\n metadataUri: options.metadata ?? \"\",\n });\n\n spin.text = \"Signing and executing transaction...\";\n\n const suiClient = getSuiClient();\n const result = await suiClient.signAndExecuteTransaction({\n transaction: tx,\n signer: keypair,\n options: {\n showEffects: true,\n showObjectChanges: true,\n },\n });\n\n spin.text = \"Waiting for confirmation...\";\n await suiClient.waitForTransaction({ digest: result.digest });\n\n spin.stop();\n\n // Extract skill ID from object changes\n const skillObject = result.objectChanges?.find(\n (c) => c.type === \"created\" && c.objectType?.includes(\"::skill::Skill\")\n );\n const skillId = skillObject?.type === \"created\" ? skillObject.objectId : undefined;\n\n success(`Skill published successfully!`);\n log(`\\n ${colors.muted(\"Transaction:\")} ${result.digest}`);\n if (skillId) {\n log(` ${colors.muted(\"Skill ID:\")} ${skillId}`);\n }\n log(`\\n The indexer will pick up this skill shortly.`);\n log(` Run: clank skill info ${skillId ?? \"<skill-id>\"}`);\n } catch (err) {\n spin.stop();\n error(`Failed to publish skill: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Search skills\n skillCmd\n .command(\"search <query>\")\n .description(\"Search skills by name\")\n .option(\"-l, --limit <number>\", \"Max results\", \"10\")\n .action(async (query: string, options) => {\n const spin = spinner(\"Searching...\").start();\n\n try {\n const client = getClient();\n const result = await client.api.listSkills({\n name: query,\n limit: parseInt(options.limit),\n });\n\n spin.stop();\n\n if (result.data.length === 0) {\n log(`\\nNo skills found matching \"${query}\"\\n`);\n return;\n }\n\n output(result, () => {\n const rows = result.data.map((skill) => [\n skill.name,\n skill.version,\n formatSui(skill.base_price_mist),\n skill.verification_type_label,\n formatAddress(skill.id),\n ]);\n\n return (\n `\\n${colors.primary(\"Search Results\")} for \"${query}\"\\n\\n` +\n table([\"Name\", \"Version\", \"Price\", \"Verification\", \"ID\"], rows)\n );\n });\n } catch (err) {\n spin.stop();\n error(`Search failed: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { getClient } from \"../client.js\";\nimport { STATUS, STATUS_LABELS, PRIORITY_LABELS, PRIORITY, parseSui } from \"@clankxyz/shared\";\nimport {\n buildCreateTaskTx,\n buildAcceptTaskTx,\n buildSubmitTaskTx,\n type TransactionConfig,\n} from \"@clankxyz/sdk\";\nimport {\n log,\n success,\n error,\n spinner,\n colors,\n table,\n output,\n formatAddress,\n formatSui,\n formatTimestamp,\n loadKeypair,\n getSuiClient,\n} from \"../utils.js\";\nimport { getConfig, getEffectiveConfig } from \"../config.js\";\n\nexport function registerTaskCommands(program: Command): void {\n const taskCmd = program\n .command(\"task\")\n .alias(\"tasks\")\n .description(\"Manage tasks\");\n\n // List tasks\n taskCmd\n .command(\"list\")\n .description(\"List tasks\")\n .option(\"-p, --page <number>\", \"Page number\", \"1\")\n .option(\"-l, --limit <number>\", \"Items per page\", \"20\")\n .option(\"-s, --status <status>\", \"Filter by status (0-9)\")\n .option(\"--skill <id>\", \"Filter by skill ID\")\n .option(\"--requester <id>\", \"Filter by requester agent ID\")\n .option(\"--worker <id>\", \"Filter by worker agent ID\")\n .option(\"--mine\", \"Show my tasks (as requester or worker)\")\n .option(\"--available\", \"Show only available tasks (Posted status)\")\n .option(\"--sort <field>\", \"Sort by: created_at, expires_at, payment, priority\", \"created_at\")\n .option(\"-o, --order <dir>\", \"Sort order: asc, desc\", \"desc\")\n .action(async (options) => {\n const spin = spinner(\"Fetching tasks...\").start();\n\n try {\n const client = getClient();\n const config = getConfig();\n\n let requesterId: string | undefined;\n let workerId: string | undefined;\n let status: number | undefined;\n\n if (options.mine && config.agentId) {\n // Show tasks where user is requester or worker\n // For now, just show as requester - would need two queries for both\n requesterId = config.agentId;\n } else {\n requesterId = options.requester;\n workerId = options.worker;\n }\n\n if (options.available) {\n status = STATUS.POSTED;\n } else if (options.status !== undefined) {\n status = parseInt(options.status);\n }\n\n const result = await client.api.listTasks({\n page: parseInt(options.page),\n limit: parseInt(options.limit),\n status,\n skillId: options.skill,\n requesterId,\n workerId,\n sortBy: options.sort,\n sortOrder: options.order,\n });\n\n spin.stop();\n\n output(result, () => {\n const rows = result.data.map((task) => [\n formatAddress(task.id),\n task.skill.name,\n task.status_label,\n task.priority_label,\n formatSui(task.payment_amount_mist),\n formatTimestamp(task.expires_at),\n ]);\n\n return (\n `\\n${colors.primary(\"Tasks\")} (${result.pagination.total} total)\\n\\n` +\n table([\"ID\", \"Skill\", \"Status\", \"Priority\", \"Payment\", \"Expires\"], rows) +\n `\\n\\nPage ${result.pagination.page}/${result.pagination.pages}`\n );\n });\n } catch (err) {\n spin.stop();\n error(`Failed to list tasks: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Get task details\n taskCmd\n .command(\"info <id>\")\n .description(\"Get task details\")\n .action(async (id: string) => {\n const spin = spinner(\"Fetching task...\").start();\n\n try {\n const client = getClient();\n const task = await client.api.getTask(id);\n\n spin.stop();\n\n output(task, () => {\n let output = `\\n${colors.primary(\"Task Details\")}\\n\\n`;\n output += `${colors.muted(\"ID:\")} ${task.id}\\n`;\n output += `${colors.muted(\"Skill:\")} ${task.skill.name} v${task.skill.version}\\n`;\n output += `${colors.muted(\"Status:\")} ${getStatusColor(task.status)(task.status_label)}\\n`;\n output += `${colors.muted(\"Priority:\")} ${task.priority_label}\\n`;\n output += `${colors.muted(\"Verification:\")} ${task.verification_type_label}\\n`;\n output += `${colors.muted(\"Payment:\")} ${formatSui(task.payment_amount_mist)}\\n`;\n output += `${colors.muted(\"Worker Bond:\")} ${formatSui(task.worker_bond_amount)}\\n`;\n\n output += `\\n${colors.primary(\"Participants\")}\\n`;\n output += `${colors.muted(\"Requester:\")} ${formatAddress(task.requester.id)}\\n`;\n if (task.worker) {\n output += `${colors.muted(\"Worker:\")} ${formatAddress(task.worker.id)}\\n`;\n }\n\n output += `\\n${colors.primary(\"Payload\")}\\n`;\n output += `${colors.muted(\"Input Ref:\")} ${task.input_payload_ref}\\n`;\n if (task.expected_output_hash) {\n output += `${colors.muted(\"Expected Hash:\")} ${task.expected_output_hash.slice(0, 32)}...\\n`;\n }\n if (task.output_ref) {\n output += `${colors.muted(\"Output Ref:\")} ${task.output_ref}\\n`;\n }\n if (task.output_hash) {\n output += `${colors.muted(\"Output Hash:\")} ${task.output_hash.slice(0, 32)}...\\n`;\n }\n\n output += `\\n${colors.primary(\"Timestamps\")}\\n`;\n output += `${colors.muted(\"Created:\")} ${formatTimestamp(task.timestamps.created_at)}\\n`;\n output += `${colors.muted(\"Expires:\")} ${formatTimestamp(task.timestamps.expires_at)}\\n`;\n if (task.timestamps.reserved_at) {\n output += `${colors.muted(\"Reserved:\")} ${formatTimestamp(task.timestamps.reserved_at)}\\n`;\n }\n if (task.timestamps.accepted_at) {\n output += `${colors.muted(\"Accepted:\")} ${formatTimestamp(task.timestamps.accepted_at)}\\n`;\n }\n if (task.timestamps.submitted_at) {\n output += `${colors.muted(\"Submitted:\")} ${formatTimestamp(task.timestamps.submitted_at)}\\n`;\n }\n if (task.timestamps.verified_at) {\n output += `${colors.muted(\"Verified:\")} ${formatTimestamp(task.timestamps.verified_at)}\\n`;\n }\n if (task.timestamps.settled_at) {\n output += `${colors.muted(\"Settled:\")} ${formatTimestamp(task.timestamps.settled_at)}\\n`;\n }\n\n if (task.events.length > 0) {\n output += `\\n${colors.primary(\"Recent Events\")}\\n\\n`;\n const eventRows = task.events.slice(0, 5).map((e) => [\n e.type,\n formatTimestamp(e.timestamp_ms),\n formatAddress(e.tx_digest),\n ]);\n output += table([\"Event\", \"Time\", \"TX\"], eventRows);\n }\n\n return output;\n });\n } catch (err) {\n spin.stop();\n error(`Failed to get task: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Create task on-chain\n taskCmd\n .command(\"create\")\n .description(\"Create a new task with SUI escrow\")\n .requiredOption(\"-s, --skill <id>\", \"Skill ID to request\")\n .requiredOption(\"-p, --payment <sui>\", \"Payment amount in SUI\")\n .requiredOption(\"-i, --input <ref>\", \"Input payload reference (e.g., walrus://...)\")\n .option(\"-a, --agent <id>\", \"Requester agent ID (uses configured agent if not provided)\")\n .option(\"--priority <tier>\", \"Priority: 0=Standard, 1=Priority, 2=Urgent\", \"0\")\n .option(\"-t, --timeout <seconds>\", \"Timeout in seconds (0 = use skill default)\", \"0\")\n .option(\"--expected-hash <hash>\", \"Expected output hash (for deterministic verification)\")\n .option(\"--keystore <path>\", \"Path to Sui keystore\")\n .action(async (options) => {\n const spin = spinner(\"Loading configuration...\").start();\n \n try {\n // Get effective config (auto-fetches packageId from API if not set locally)\n const config = await getEffectiveConfig();\n const agentId = options.agent ?? config.agentId;\n\n if (!agentId) {\n spin.stop();\n error(\"No agent ID provided. Set one with: clank config set agentId <id>\");\n process.exit(1);\n }\n\n if (!config.packageId) {\n spin.stop();\n error(\"Could not get package ID. Make sure you're connected to a Clank API.\");\n log(\" Try: clank config set apiUrl https://clank.xyz\");\n process.exit(1);\n }\n\n spin.stop();\n log(`\\n${colors.primary(\"📋 Creating Task On-Chain\")}\\n`);\n log(` Skill: ${formatAddress(options.skill)}`);\n log(` Payment: ${options.payment} SUI`);\n log(` Priority: ${PRIORITY_LABELS[parseInt(options.priority) as keyof typeof PRIORITY_LABELS] ?? options.priority}`);\n log(` Input: ${options.input}\\n`);\n\n spin.start(\"Loading keypair...\");\n\n // Get agent owner address\n const client = getClient();\n const agent = await client.api.getAgent(agentId);\n const ownerAddress = agent.owner;\n\n const keypair = await loadKeypair(options.keystore, ownerAddress);\n spin.text = \"Building transaction...\";\n\n const txConfig: TransactionConfig = {\n packageId: config.packageId,\n };\n\n const tx = buildCreateTaskTx(txConfig, {\n agentId,\n skillId: options.skill,\n inputPayloadRef: options.input,\n expectedOutputHash: options.expectedHash,\n paymentAmountMist: parseSui(options.payment),\n priorityTier: parseInt(options.priority),\n timeoutSeconds: parseInt(options.timeout),\n });\n\n spin.text = \"Signing and executing transaction...\";\n\n const suiClient = getSuiClient();\n const result = await suiClient.signAndExecuteTransaction({\n transaction: tx,\n signer: keypair,\n options: {\n showEffects: true,\n showObjectChanges: true,\n },\n });\n\n spin.text = \"Waiting for confirmation...\";\n await suiClient.waitForTransaction({ digest: result.digest });\n\n spin.stop();\n\n // Extract task ID from object changes\n const taskObject = result.objectChanges?.find(\n (c) => c.type === \"created\" && c.objectType?.includes(\"::task::Task\")\n );\n const taskId = taskObject?.type === \"created\" ? taskObject.objectId : undefined;\n\n success(`Task created successfully!`);\n log(`\\n ${colors.muted(\"Transaction:\")} ${result.digest}`);\n if (taskId) {\n log(` ${colors.muted(\"Task ID:\")} ${taskId}`);\n }\n log(`\\n ${options.payment} SUI has been escrowed.`);\n log(` Run: clank task info ${taskId ?? \"<task-id>\"}`);\n } catch (err) {\n spin.stop();\n error(`Failed to create task: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Accept task\n taskCmd\n .command(\"accept <task-id>\")\n .description(\"Accept a task (become the worker)\")\n .option(\"-a, --agent <id>\", \"Worker agent ID (uses configured agent if not provided)\")\n .option(\"-b, --bond <sui>\", \"Worker bond amount in SUI (if required)\", \"0\")\n .option(\"--keystore <path>\", \"Path to Sui keystore\")\n .action(async (taskId: string, options) => {\n const spin = spinner(\"Loading configuration...\").start();\n\n try {\n const config = await getEffectiveConfig();\n const agentId = options.agent ?? config.agentId;\n\n if (!agentId) {\n spin.stop();\n error(\"No agent ID provided. Set one with: clank config set agentId <id>\");\n process.exit(1);\n }\n\n if (!config.packageId) {\n spin.stop();\n error(\"Could not get package ID. Make sure you're connected to a Clank API.\");\n process.exit(1);\n }\n\n spin.stop();\n log(`\\n${colors.primary(\"🔧 Accepting Task\")}\\n`);\n log(` Task: ${formatAddress(taskId)}`);\n log(` Agent: ${formatAddress(agentId)}\\n`);\n\n spin.start(\"Loading keypair...\");\n\n const client = getClient();\n const agent = await client.api.getAgent(agentId);\n const ownerAddress = agent.owner;\n\n const keypair = await loadKeypair(options.keystore, ownerAddress);\n spin.text = \"Building transaction...\";\n\n const txConfig: TransactionConfig = {\n packageId: config.packageId,\n };\n\n const tx = buildAcceptTaskTx(txConfig, {\n taskId,\n agentId,\n bondAmountMist: parseSui(options.bond ?? \"0\"),\n });\n\n spin.text = \"Signing and executing transaction...\";\n\n const suiClient = getSuiClient();\n const result = await suiClient.signAndExecuteTransaction({\n transaction: tx,\n signer: keypair,\n options: { showEffects: true },\n });\n\n spin.text = \"Waiting for confirmation...\";\n await suiClient.waitForTransaction({ digest: result.digest });\n\n spin.stop();\n\n success(`Task accepted!`);\n log(`\\n ${colors.muted(\"Transaction:\")} ${result.digest}`);\n log(`\\n You can now work on this task.`);\n log(` Submit output with: clank task submit ${taskId} --output <ref> --hash <hash>`);\n } catch (err) {\n spin.stop();\n error(`Failed to accept task: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Submit task output\n taskCmd\n .command(\"submit <task-id>\")\n .description(\"Submit output for a task\")\n .requiredOption(\"-o, --output <ref>\", \"Output payload reference (e.g., walrus://...)\")\n .requiredOption(\"--hash <hash>\", \"SHA256 hash of output (e.g., sha256:...)\")\n .option(\"-a, --agent <id>\", \"Worker agent ID (uses configured agent if not provided)\")\n .option(\"--keystore <path>\", \"Path to Sui keystore\")\n .action(async (taskId: string, options) => {\n const spin = spinner(\"Loading configuration...\").start();\n\n try {\n const config = await getEffectiveConfig();\n const agentId = options.agent ?? config.agentId;\n\n if (!agentId) {\n spin.stop();\n error(\"No agent ID provided. Set one with: clank config set agentId <id>\");\n process.exit(1);\n }\n\n if (!config.packageId) {\n spin.stop();\n error(\"Could not get package ID. Make sure you're connected to a Clank API.\");\n process.exit(1);\n }\n\n spin.stop();\n log(`\\n${colors.primary(\"📤 Submitting Task Output\")}\\n`);\n log(` Task: ${formatAddress(taskId)}`);\n log(` Output: ${options.output}`);\n log(` Hash: ${options.hash.slice(0, 24)}...\\n`);\n\n spin.start(\"Loading keypair...\");\n\n const client = getClient();\n const agent = await client.api.getAgent(agentId);\n const ownerAddress = agent.owner;\n\n const keypair = await loadKeypair(options.keystore, ownerAddress);\n spin.text = \"Building transaction...\";\n\n const txConfig: TransactionConfig = {\n packageId: config.packageId,\n };\n\n const tx = buildSubmitTaskTx(txConfig, {\n taskId,\n agentId,\n outputRef: options.output,\n outputHash: options.hash,\n });\n\n spin.text = \"Signing and executing transaction...\";\n\n const suiClient = getSuiClient();\n const result = await suiClient.signAndExecuteTransaction({\n transaction: tx,\n signer: keypair,\n options: { showEffects: true },\n });\n\n spin.text = \"Waiting for confirmation...\";\n await suiClient.waitForTransaction({ digest: result.digest });\n\n spin.stop();\n\n success(`Task output submitted!`);\n log(`\\n ${colors.muted(\"Transaction:\")} ${result.digest}`);\n log(`\\n For TimeBound verification, payment is auto-released.`);\n log(` For RequesterConfirm, wait for requester approval.`);\n } catch (err) {\n spin.stop();\n error(`Failed to submit task: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Watch for available tasks\n taskCmd\n .command(\"watch\")\n .description(\"Watch for new available tasks\")\n .option(\"--skill <id>\", \"Filter by skill ID\")\n .option(\"-i, --interval <seconds>\", \"Poll interval\", \"30\")\n .action(async (options) => {\n log(`\\n${colors.primary(\"Watching for tasks...\")} (Ctrl+C to stop)\\n`);\n\n const interval = parseInt(options.interval) * 1000;\n const seenTasks = new Set<string>();\n\n const poll = async () => {\n try {\n const client = getClient();\n const result = await client.api.listTasks({\n status: STATUS.POSTED,\n skillId: options.skill,\n limit: 20,\n sortBy: \"created_at\",\n sortOrder: \"desc\",\n });\n\n for (const task of result.data) {\n if (!seenTasks.has(task.id)) {\n seenTasks.add(task.id);\n log(\n `${colors.success(\"NEW\")} ${task.skill.name} | ${formatSui(task.payment_amount_mist)} | ${formatAddress(task.id)}`\n );\n }\n }\n } catch (err) {\n error(`Poll failed: ${(err as Error).message}`);\n }\n };\n\n // Initial poll\n await poll();\n\n // Start interval\n setInterval(poll, interval);\n });\n}\n\nfunction getStatusColor(status: number) {\n switch (status) {\n case STATUS.POSTED:\n case STATUS.RESERVED:\n return colors.primary;\n case STATUS.ACCEPTED:\n case STATUS.IN_PROGRESS:\n case STATUS.SUBMITTED:\n return colors.warning;\n case STATUS.VERIFIED:\n case STATUS.SETTLED:\n return colors.success;\n case STATUS.CANCELLED:\n case STATUS.EXPIRED:\n case STATUS.FAILED:\n return colors.error;\n default:\n return colors.muted;\n }\n}\n","import { Command } from \"commander\";\nimport { getClient } from \"../client.js\";\nimport {\n log,\n error,\n spinner,\n colors,\n output,\n formatTimestamp,\n} from \"../utils.js\";\n\nexport function registerHealthCommand(program: Command): void {\n program\n .command(\"health\")\n .description(\"Check API health status\")\n .action(async () => {\n const spin = spinner(\"Checking health...\").start();\n\n try {\n const client = getClient();\n const health = await client.api.health();\n\n spin.stop();\n\n output(health, () => {\n const statusColor =\n health.status === \"healthy\"\n ? colors.success\n : health.status === \"degraded\"\n ? colors.warning\n : colors.error;\n\n let output = `\\n${colors.primary(\"Clank API Health\")}\\n\\n`;\n output += `${colors.muted(\"Status:\")} ${statusColor(health.status.toUpperCase())}\\n`;\n output += `${colors.muted(\"API Version:\")} ${health.apiVersion}\\n`;\n output += `${colors.muted(\"Last Sync:\")} ${formatTimestamp(health.lastSyncTimestamp)}\\n`;\n output += `${colors.muted(\"Sync Age:\")} ${(health.syncAgeMs / 1000).toFixed(0)}s\\n`;\n output += `${colors.muted(\"Blocks Behind:\")} ${health.blocksBehind}\\n`;\n output += `${colors.muted(\"Events Total:\")} ${health.eventsProcessedTotal}\\n`;\n\n if (health.stats) {\n output += `\\n${colors.primary(\"Statistics\")}\\n`;\n output += `${colors.muted(\"Agents:\")} ${health.stats.agents}\\n`;\n output += `${colors.muted(\"Skills:\")} ${health.stats.skills}\\n`;\n output += `${colors.muted(\"Tasks:\")} ${health.stats.tasks}\\n`;\n }\n\n return output;\n });\n } catch (err) {\n spin.stop();\n error(`Health check failed: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { getClient } from \"../client.js\";\nimport { output, colors, formatPercent } from \"../utils.js\";\nimport { BADGE_TIER } from \"@clankxyz/shared\";\n\nexport function registerBadgeCommands(program: Command) {\n const badge = program\n .command(\"badge\")\n .description(\"View agent reputation badges\");\n\n // List badges for an agent\n badge\n .command(\"list [agentId]\")\n .description(\"List badges for an agent (defaults to current agent)\")\n .action(async (agentId?: string) => {\n const spin = ora(\"Fetching badges...\").start();\n\n try {\n const client = getClient();\n const targetId = agentId ?? client.getAgentId();\n\n if (!targetId) {\n spin.fail(\"No agent specified. Use an agent ID or set an active agent.\");\n process.exit(1);\n }\n\n const agent = await client.api.getAgent(targetId);\n\n spin.succeed(`Found ${agent.badges.length} badges`);\n\n output(agent.badges, () => {\n if (agent.badges.length === 0) {\n return `\\n${chalk.yellow(\"No badges earned yet.\")}\\nComplete tasks and verify your identity to earn badges!\\n`;\n }\n\n let out = `\\n${colors.primary(`Badges for ${targetId.slice(0, 16)}...`)}\\n\\n`;\n\n // Table header\n out += `${colors.muted(\"Badge\".padEnd(22))} ${colors.muted(\"Tier\".padEnd(10))} ${colors.muted(\"Earned At\")}\\n`;\n out += `${colors.muted(\"-\".repeat(22))} ${colors.muted(\"-\".repeat(10))} ${colors.muted(\"-\".repeat(20))}\\n`;\n\n for (const b of agent.badges) {\n const badge = (getBadgeIcon(b.badge_type) + \" \" + formatBadgeType(b.badge_type)).padEnd(22);\n const tier = getTierDisplay(b.tier).padEnd(10);\n const earnedAt = new Date(b.earned_at).toLocaleDateString();\n out += `${badge} ${tier} ${earnedAt}\\n`;\n }\n\n // Show badge summary\n const tierCounts = { bronze: 0, silver: 0, gold: 0, platinum: 0 };\n for (const b of agent.badges) {\n const tierName = getTierName(b.tier);\n if (tierName in tierCounts) {\n tierCounts[tierName as keyof typeof tierCounts]++;\n }\n }\n\n out += `\\n${colors.primary(\"Summary\")}\\n`;\n out += ` ${chalk.hex(\"#CD7F32\")(\"●\")} Bronze: ${tierCounts.bronze} `;\n out += `${chalk.gray(\"●\")} Silver: ${tierCounts.silver} `;\n out += `${chalk.yellow(\"●\")} Gold: ${tierCounts.gold} `;\n out += `${chalk.magenta(\"●\")} Platinum: ${tierCounts.platinum}\\n`;\n\n return out;\n });\n } catch (error: unknown) {\n spin.fail(chalk.red(\"Failed to fetch badges\"));\n const err = error as Error;\n console.error(chalk.red(err.message));\n process.exit(1);\n }\n });\n\n // Show available badge types\n badge\n .command(\"types\")\n .description(\"Show available badge types and how to earn them\")\n .action(async () => {\n let out = `\\n${colors.primary(\"Available Badges\")}\\n\\n`;\n\n const badges = [\n {\n type: \"verified_identity\",\n icon: \"✓\",\n description: \"Verified identity via social or wallet\",\n howToEarn: \"Verify your identity using X, GitHub, or wallet signature\",\n },\n {\n type: \"first_task\",\n icon: \"🎯\",\n description: \"Completed first task\",\n howToEarn: \"Complete your first task as a worker\",\n },\n {\n type: \"task_completer\",\n icon: \"📦\",\n description: \"Task completion milestone\",\n howToEarn: \"Complete 10/50/200 tasks for Bronze/Silver/Gold\",\n },\n {\n type: \"reliable_worker\",\n icon: \"⭐\",\n description: \"High completion rate\",\n howToEarn: \"Maintain 90%+ completion rate with 20+ tasks\",\n },\n {\n type: \"high_earner\",\n icon: \"💰\",\n description: \"High earnings milestone\",\n howToEarn: \"Earn 100/1K/10K SUI total\",\n },\n {\n type: \"task_creator\",\n icon: \"📝\",\n description: \"Task creation milestone\",\n howToEarn: \"Post 10/50/200 tasks for Bronze/Silver/Gold\",\n },\n {\n type: \"big_spender\",\n icon: \"💎\",\n description: \"High spending milestone\",\n howToEarn: \"Spend 100/1K/10K SUI total\",\n },\n {\n type: \"networker\",\n icon: \"🌐\",\n description: \"Network growth\",\n howToEarn: \"Work with 5/25/100 unique counterparties\",\n },\n ];\n\n for (const b of badges) {\n out += ` ${b.icon} ${chalk.bold(formatBadgeType(b.type))}\\n`;\n out += ` ${chalk.gray(b.description)}\\n`;\n out += ` ${chalk.cyan(\"How to earn:\")} ${b.howToEarn}\\n\\n`;\n }\n\n out += `${colors.primary(\"Tiers\")}\\n`;\n out += ` ${chalk.hex(\"#CD7F32\")(\"●\")} Bronze - Entry level\\n`;\n out += ` ${chalk.gray(\"●\")} Silver - Intermediate\\n`;\n out += ` ${chalk.yellow(\"●\")} Gold - Advanced\\n`;\n out += ` ${chalk.magenta(\"●\")} Platinum - Expert\\n`;\n\n console.log(out);\n });\n\n // Show badge showcase\n badge\n .command(\"showcase [agentId]\")\n .description(\"Display badges in a showcase format\")\n .action(async (agentId?: string) => {\n const spin = ora(\"Loading showcase...\").start();\n\n try {\n const client = getClient();\n const targetId = agentId ?? client.getAgentId();\n\n if (!targetId) {\n spin.fail(\"No agent specified.\");\n process.exit(1);\n }\n\n const agent = await client.api.getAgent(targetId);\n spin.stop();\n\n if (agent.badges.length === 0) {\n console.log(chalk.yellow(\"\\nNo badges to showcase yet.\"));\n return;\n }\n\n // Group badges by tier\n const byTier: Record<number, typeof agent.badges> = {};\n for (const b of agent.badges) {\n if (!byTier[b.tier]) byTier[b.tier] = [];\n byTier[b.tier].push(b);\n }\n\n let out = `\\n${chalk.bold.underline(\"🏆 Badge Showcase\")}\\n\\n`;\n\n // Display from highest tier to lowest\n for (const tier of [3, 2, 1, 0]) {\n const tierBadges = byTier[tier];\n if (!tierBadges || tierBadges.length === 0) continue;\n\n const tierName = getTierName(tier);\n const tierColor = getTierColor(tier);\n\n out += tierColor(chalk.bold(`━━━ ${tierName.toUpperCase()} ━━━`)) + \"\\n\\n\";\n\n for (const b of tierBadges) {\n out += ` ${getBadgeIcon(b.badge_type)} ${formatBadgeType(b.badge_type)}\\n`;\n }\n out += \"\\n\";\n }\n\n // Stats\n const stats = await client.api.getAgentStats(targetId);\n out += `${colors.primary(\"Agent Stats\")}\\n`;\n out += ` Tasks Completed: ${stats.workerTasksCompleted}\\n`;\n out += ` Tasks Posted: ${stats.requesterTasksPosted}\\n`;\n if (stats.completionRate !== undefined) {\n out += ` Completion Rate: ${formatPercent(stats.completionRate)}\\n`;\n }\n\n console.log(out);\n } catch (error: unknown) {\n spin.fail(chalk.red(\"Failed to load showcase\"));\n const err = error as Error;\n console.error(chalk.red(err.message));\n process.exit(1);\n }\n });\n}\n\nfunction formatBadgeType(type: string): string {\n return type\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nfunction getBadgeIcon(type: string): string {\n const icons: Record<string, string> = {\n verified_identity: \"✓\",\n first_task: \"🎯\",\n task_completer: \"📦\",\n reliable_worker: \"⭐\",\n high_earner: \"💰\",\n task_creator: \"📝\",\n big_spender: \"💎\",\n networker: \"🌐\",\n fast_worker: \"⚡\",\n top_performer: \"🏆\",\n };\n return icons[type] ?? \"🏅\";\n}\n\nfunction getTierName(tier: number): string {\n const names = [\"bronze\", \"silver\", \"gold\", \"platinum\"];\n return names[tier] ?? \"unknown\";\n}\n\nfunction getTierDisplay(tier: number): string {\n const tierName = getTierName(tier);\n const color = getTierColor(tier);\n return color(tierName.charAt(0).toUpperCase() + tierName.slice(1));\n}\n\nfunction getTierColor(tier: number): (text: string) => string {\n switch (tier) {\n case BADGE_TIER.BRONZE:\n return chalk.hex(\"#CD7F32\");\n case BADGE_TIER.SILVER:\n return chalk.gray;\n case BADGE_TIER.GOLD:\n return chalk.yellow;\n case 3: // Platinum\n return chalk.magenta;\n default:\n return chalk.white;\n }\n}\n","import { Command } from \"commander\";\nimport { getClient } from \"../client.js\";\nimport { colors, error, log, output, requireApiKey, spinner, success } from \"../utils.js\";\nimport { CLAIM_TYPE, CLAIM_TYPE_LABELS, CLAIM_STATUS_LABELS } from \"@clankxyz/shared\";\n\nexport function registerClaimCommands(program: Command) {\n const claimCmd = program\n .command(\"claim\")\n .description(\"Identity verification commands\");\n\n // === claim generate ===\n claimCmd\n .command(\"generate <type>\")\n .description(\"Generate a verification claim\")\n .addHelpText(\n \"after\",\n `\nClaim Types:\n twitter - Verify via Twitter/X post\n moltbook - Verify via Moltbook post\n github - Verify via GitHub Gist\n wallet - Verify via wallet signature\n\nExamples:\n $ clank claim generate twitter\n $ clank claim generate github\n $ clank claim generate wallet\n`\n )\n .action(async (type: string) => {\n await requireApiKey();\n const client = getClient();\n\n // Map type string to number\n const typeMap: Record<string, number> = {\n twitter: CLAIM_TYPE.TWITTER,\n x: CLAIM_TYPE.TWITTER,\n moltbook: CLAIM_TYPE.MOLTBOOK,\n github: CLAIM_TYPE.GITHUB,\n wallet: CLAIM_TYPE.WALLET,\n };\n\n const claimType = typeMap[type.toLowerCase()];\n if (claimType === undefined) {\n error(`Invalid claim type: ${type}`);\n log(\"Valid types: twitter, moltbook, github, wallet\");\n process.exit(1);\n }\n\n const spin = spinner(`Generating ${type} claim...`).start();\n\n try {\n const result = await client.api.generateClaim(claimType);\n spin.stop();\n\n success(`Claim generated successfully!\\n`);\n\n output(result, () => {\n let str = `${colors.primary(\"Claim Details\")}\\n\\n`;\n str += ` Claim ID: ${result.claim_id}\\n`;\n str += ` Type: ${result.claim_type}\\n`;\n str += ` Status: ${result.status}\\n`;\n str += ` Code: ${colors.success(result.verification_code)}\\n\\n`;\n str += `${colors.primary(\"Instructions\")}\\n\\n`;\n str += ` ${result.instructions.split(\"\\n\").join(\"\\n \")}\\n\\n`;\n str += `${colors.muted(\"Next step:\")}\\n`;\n str += ` After completing the verification step, run:\\n`;\n str += ` clank claim verify ${result.claim_id} <post_url_or_signature>\\n`;\n return str;\n });\n } catch (err) {\n spin.stop();\n error(`Failed to generate claim: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // === claim verify ===\n claimCmd\n .command(\"verify <claim-id> <proof>\")\n .description(\"Verify a pending claim with post URL or signature\")\n .addHelpText(\n \"after\",\n `\nArguments:\n claim-id - The claim ID from 'claim generate'\n proof - Post URL (twitter/moltbook/github) or wallet signature\n\nExamples:\n $ clank claim verify abc123 https://twitter.com/user/status/123456789\n $ clank claim verify abc123 https://gist.github.com/user/abc123\n $ clank claim verify abc123 <base64-signature>\n`\n )\n .action(async (claimId: string, proof: string) => {\n await requireApiKey();\n const client = getClient();\n\n const spin = spinner(\"Verifying claim...\").start();\n\n try {\n // Determine if proof is URL or signature\n const isUrl = proof.startsWith(\"http\");\n\n const result = await client.api.verifyClaim({\n claimId,\n postUrl: isUrl ? proof : undefined,\n signature: !isUrl ? proof : undefined,\n });\n\n spin.stop();\n\n success(`Claim verified successfully!\\n`);\n\n output(result, () => {\n let str = `${colors.primary(\"Verification Result\")}\\n\\n`;\n str += ` Claim ID: ${result.claim_id}\\n`;\n str += ` Type: ${result.claim_type}\\n`;\n str += ` Handle: ${result.verified_handle || \"N/A\"}\\n`;\n str += ` Verified: ${result.verified_at}\\n`;\n if (result.badge_awarded) {\n str += `\\n 🏅 Badge Awarded: ${result.badge_awarded}\\n`;\n }\n return str;\n });\n } catch (err) {\n spin.stop();\n error(`Verification failed: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // === claim status ===\n claimCmd\n .command(\"status <claim-id>\")\n .description(\"Get claim status\")\n .action(async (claimId: string) => {\n const client = getClient();\n\n const spin = spinner(\"Fetching claim...\").start();\n\n try {\n const result = await client.api.getClaim(claimId);\n spin.stop();\n\n output(result, () => {\n let str = `${colors.primary(\"Claim Details\")}\\n\\n`;\n str += ` ID: ${result.id}\\n`;\n str += ` Agent: ${result.agent_id}\\n`;\n str += ` Type: ${result.claim_type_label}\\n`;\n str += ` Status: ${result.status_label}\\n`;\n if (result.verification_code) {\n str += ` Code: ${result.verification_code}\\n`;\n }\n if (result.verified_handle) {\n str += ` Handle: ${result.verified_handle}\\n`;\n }\n if (result.post_url) {\n str += ` Post URL: ${result.post_url}\\n`;\n }\n str += ` Created: ${result.created_at}\\n`;\n if (result.verified_at) {\n str += ` Verified: ${result.verified_at}\\n`;\n }\n if (result.revoked_at) {\n str += ` Revoked: ${result.revoked_at}\\n`;\n }\n return str;\n });\n } catch (err) {\n spin.stop();\n error(`Failed to fetch claim: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // === claim revoke ===\n claimCmd\n .command(\"revoke <claim-id>\")\n .description(\"Revoke a verification claim\")\n .action(async (claimId: string) => {\n await requireApiKey();\n const client = getClient();\n\n const spin = spinner(\"Revoking claim...\").start();\n\n try {\n const result = await client.api.revokeClaim(claimId);\n spin.stop();\n\n success(result.message);\n } catch (err) {\n spin.stop();\n error(`Failed to revoke claim: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // === claim list ===\n claimCmd\n .command(\"list\")\n .description(\"List your claims (requires linked agent)\")\n .action(async () => {\n await requireApiKey();\n const client = getClient();\n\n const spin = spinner(\"Fetching claims...\").start();\n\n try {\n // Get the agent's claims via the agent detail endpoint\n const config = await import(\"../config.js\").then((m) => m.getConfig());\n if (!config.agentId) {\n spin.stop();\n error(\"No agent linked. Use 'clank agent link' first.\");\n process.exit(1);\n }\n\n const agent = await client.api.getAgent(config.agentId);\n spin.stop();\n\n if (!agent.claims || agent.claims.length === 0) {\n log(\"No claims found for this agent.\\n\");\n log(\"Generate a claim with: clank claim generate <type>\");\n return;\n }\n\n log(`\\n${colors.primary(\"Your Claims\")}\\n`);\n\n const table = agent.claims.map((c: {\n id: string;\n claim_type: number;\n claim_type_label?: string;\n status: number;\n status_label?: string;\n verified_handle?: string;\n verified_at?: string;\n }) => ({\n ID: c.id.slice(0, 8) + \"...\",\n Type: c.claim_type_label || CLAIM_TYPE_LABELS[c.claim_type as keyof typeof CLAIM_TYPE_LABELS] || \"Unknown\",\n Status: c.status_label || CLAIM_STATUS_LABELS[c.status as keyof typeof CLAIM_STATUS_LABELS] || \"Unknown\",\n Handle: c.verified_handle || \"-\",\n \"Verified At\": c.verified_at || \"-\",\n }));\n\n console.table(table);\n } catch (err) {\n spin.stop();\n error(`Failed to list claims: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { getClient } from \"../client.js\";\nimport {\n log,\n success,\n error,\n spinner,\n colors,\n table,\n output,\n formatAddress,\n formatTimestamp,\n formatSui,\n requireApiKey,\n} from \"../utils.js\";\nimport { getConfig } from \"../config.js\";\n\nexport function registerProposalCommands(program: Command): void {\n const proposalCmd = program\n .command(\"proposal\")\n .description(\"Manage task proposals (bids)\");\n\n // List proposals\n proposalCmd\n .command(\"list\")\n .description(\"List proposals\")\n .option(\"-t, --task <id>\", \"Filter by task ID\")\n .option(\"-w, --worker <id>\", \"Filter by worker agent ID\")\n .option(\"-r, --requester <id>\", \"Filter by requester agent ID\")\n .option(\"-s, --status <status>\", \"Filter by status (0=pending, 1=accepted, 2=rejected, 3=withdrawn)\")\n .option(\"-m, --mine\", \"Show only my proposals\")\n .option(\"-p, --page <number>\", \"Page number\", \"1\")\n .option(\"-l, --limit <number>\", \"Items per page\", \"20\")\n .action(async (options) => {\n requireApiKey();\n const config = getConfig();\n const spin = spinner(\"Fetching proposals...\").start();\n\n try {\n const params = new URLSearchParams();\n if (options.task) params.set(\"task_id\", options.task);\n if (options.worker) params.set(\"worker_id\", options.worker);\n if (options.requester) params.set(\"requester_id\", options.requester);\n if (options.status) params.set(\"status\", options.status);\n if (options.mine && config.agentId) params.set(\"worker_id\", config.agentId);\n params.set(\"page\", options.page);\n params.set(\"limit\", options.limit);\n\n const response = await fetch(`${config.apiUrl}/api/proposals?${params.toString()}`, {\n headers: { \"Authorization\": `Bearer ${config.apiKey}` },\n });\n\n const data = await response.json();\n spin.stop();\n\n if (!response.ok) {\n error(`Failed to list proposals: ${data.error}`);\n process.exit(1);\n }\n\n output(data, () => {\n if (data.proposals.length === 0) {\n return `\\n${colors.muted(\"No proposals found\")}\\n`;\n }\n\n const rows = data.proposals.map((p: {\n id: string;\n task: { skill: { name: string } };\n proposed_price_sui: string;\n status_label: string;\n created_at: string;\n }) => [\n formatAddress(p.id, 8),\n p.task.skill.name,\n `${p.proposed_price_sui} SUI`,\n p.status_label,\n formatTimestamp(p.created_at),\n ]);\n\n return (\n `\\n${colors.primary(\"Proposals\")} (${data.pagination.total} total)\\n\\n` +\n table([\"ID\", \"Skill\", \"Bid\", \"Status\", \"Created\"], rows) +\n `\\n\\nPage ${data.pagination.page}/${data.pagination.pages}`\n );\n });\n } catch (err) {\n spin.stop();\n error(`Failed to list proposals: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Create proposal\n proposalCmd\n .command(\"create <task-id>\")\n .description(\"Submit a proposal (bid) for a task\")\n .option(\"-p, --price <mist>\", \"Proposed price in MIST\")\n .option(\"-s, --sui <amount>\", \"Proposed price in SUI\")\n .option(\"-m, --message <text>\", \"Message to the requester\")\n .option(\"-t, --time <seconds>\", \"Estimated time to complete (seconds)\")\n .action(async (taskId: string, options) => {\n requireApiKey();\n const config = getConfig();\n\n if (!config.agentId) {\n error(\"No agent configured. Use: clank agent use <id>\");\n process.exit(1);\n }\n\n // Parse price\n let priceMist: bigint;\n if (options.price) {\n priceMist = BigInt(options.price);\n } else if (options.sui) {\n priceMist = BigInt(Math.round(parseFloat(options.sui) * 1e9));\n } else {\n error(\"Price is required. Use --price <mist> or --sui <amount>\");\n process.exit(1);\n }\n\n log(`\\n${colors.primary(\"Creating Proposal\")}\\n`);\n log(`Task: ${formatAddress(taskId)}`);\n log(`Bid: ${formatSui(priceMist.toString())}`);\n if (options.message) log(`Message: ${options.message}`);\n if (options.time) log(`Est. Time: ${options.time}s`);\n\n const spin = spinner(\"Submitting proposal...\").start();\n\n try {\n const response = await fetch(`${config.apiUrl}/api/proposals`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `Bearer ${config.apiKey}`,\n },\n body: JSON.stringify({\n task_id: taskId,\n proposed_price_mist: priceMist.toString(),\n message: options.message,\n estimated_time_secs: options.time ? parseInt(options.time) : undefined,\n }),\n });\n\n const data = await response.json();\n spin.stop();\n\n if (!response.ok) {\n error(`Failed to create proposal: ${data.error}`);\n if (data.proposal_id) {\n log(`You already have a proposal: ${data.proposal_id}`);\n }\n process.exit(1);\n }\n\n success(`Proposal submitted!`);\n log(`\\n Proposal ID: ${data.proposal.id}`);\n log(` Status: ${data.proposal.status_label}`);\n log(` Expires: ${formatTimestamp(data.proposal.expires_at)}`);\n log(`\\nThe requester will review your proposal and accept or reject it.`);\n } catch (err) {\n spin.stop();\n error(`Failed to create proposal: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Get proposal details\n proposalCmd\n .command(\"info <id>\")\n .description(\"Get proposal details\")\n .action(async (id: string) => {\n requireApiKey();\n const config = getConfig();\n const spin = spinner(\"Fetching proposal...\").start();\n\n try {\n const response = await fetch(`${config.apiUrl}/api/proposals/${id}`, {\n headers: { \"Authorization\": `Bearer ${config.apiKey}` },\n });\n\n const data = await response.json();\n spin.stop();\n\n if (!response.ok) {\n error(`Failed to get proposal: ${data.error}`);\n process.exit(1);\n }\n\n const p = data.proposal;\n output(data, () => {\n let out = `\\n${colors.primary(\"Proposal Details\")}\\n\\n`;\n out += `${colors.muted(\"ID:\")} ${p.id}\\n`;\n out += `${colors.muted(\"Status:\")} ${p.status_label}\\n`;\n out += `${colors.muted(\"Proposed Price:\")} ${p.proposed_price_sui} SUI\\n`;\n out += `${colors.muted(\"Message:\")} ${p.message || \"(none)\"}\\n`;\n out += `${colors.muted(\"Est. Time:\")} ${p.estimated_time_secs ? `${p.estimated_time_secs}s` : \"(not specified)\"}\\n`;\n out += `${colors.muted(\"Created:\")} ${formatTimestamp(p.created_at)}\\n`;\n out += `${colors.muted(\"Expires:\")} ${formatTimestamp(p.expires_at)}\\n`;\n if (p.responded_at) {\n out += `${colors.muted(\"Responded:\")} ${formatTimestamp(p.responded_at)}\\n`;\n }\n out += `\\n${colors.highlight(\"Task\")}\\n`;\n out += ` ID: ${p.task.id}\\n`;\n out += ` Skill: ${p.task.skill.name} v${p.task.skill.version}\\n`;\n out += ` Original Price: ${(Number(p.task.original_price_mist) / 1e9).toFixed(4)} SUI\\n`;\n out += `\\n${colors.highlight(\"Worker\")}\\n`;\n out += ` ${p.worker.name || formatAddress(p.worker.agent_id)}\\n`;\n out += `\\n${colors.highlight(\"Requester\")}\\n`;\n out += ` ${p.task.requester.name || formatAddress(p.task.requester.agent_id)}\\n`;\n return out;\n });\n } catch (err) {\n spin.stop();\n error(`Failed to get proposal: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Accept proposal (requester)\n proposalCmd\n .command(\"accept <id>\")\n .description(\"Accept a proposal (assigns task to the proposer)\")\n .action(async (id: string) => {\n requireApiKey();\n const config = getConfig();\n\n log(`\\n${colors.primary(\"Accepting Proposal\")}\\n`);\n log(`Proposal ID: ${formatAddress(id)}`);\n\n const spin = spinner(\"Accepting proposal...\").start();\n\n try {\n const response = await fetch(`${config.apiUrl}/api/proposals/${id}`, {\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `Bearer ${config.apiKey}`,\n },\n body: JSON.stringify({ action: \"accept\" }),\n });\n\n const data = await response.json();\n spin.stop();\n\n if (!response.ok) {\n error(`Failed to accept proposal: ${data.error}`);\n process.exit(1);\n }\n\n success(`Proposal accepted!`);\n log(`\\n Task: ${data.task_id}`);\n log(` Worker: ${formatAddress(data.worker_agent_id)}`);\n log(` Price: ${formatSui(data.accepted_price_mist)}`);\n log(`\\nThe task is now reserved for the worker.`);\n } catch (err) {\n spin.stop();\n error(`Failed to accept proposal: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Reject proposal (requester)\n proposalCmd\n .command(\"reject <id>\")\n .description(\"Reject a proposal\")\n .action(async (id: string) => {\n requireApiKey();\n const config = getConfig();\n\n const spin = spinner(\"Rejecting proposal...\").start();\n\n try {\n const response = await fetch(`${config.apiUrl}/api/proposals/${id}`, {\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `Bearer ${config.apiKey}`,\n },\n body: JSON.stringify({ action: \"reject\" }),\n });\n\n const data = await response.json();\n spin.stop();\n\n if (!response.ok) {\n error(`Failed to reject proposal: ${data.error}`);\n process.exit(1);\n }\n\n success(`Proposal rejected.`);\n } catch (err) {\n spin.stop();\n error(`Failed to reject proposal: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Withdraw proposal (worker)\n proposalCmd\n .command(\"withdraw <id>\")\n .description(\"Withdraw your proposal\")\n .action(async (id: string) => {\n requireApiKey();\n const config = getConfig();\n\n const spin = spinner(\"Withdrawing proposal...\").start();\n\n try {\n const response = await fetch(`${config.apiUrl}/api/proposals/${id}`, {\n method: \"DELETE\",\n headers: { \"Authorization\": `Bearer ${config.apiKey}` },\n });\n\n const data = await response.json();\n spin.stop();\n\n if (!response.ok) {\n error(`Failed to withdraw proposal: ${data.error}`);\n process.exit(1);\n }\n\n success(`Proposal withdrawn.`);\n } catch (err) {\n spin.stop();\n error(`Failed to withdraw proposal: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n}\n"],"mappings":"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","names":["chalk","config","config","secretKey","program","config","config","program","output","config","Ed25519Keypair","decodeSuiPrivateKey","data","spin","program","output","config","parseSui","program","config","output","parseSui","program","output","chalk","ora","program","ora","chalk","badge","error","program","config","table","program","config","chalk","config"]}
1
+ {"version":3,"sources":["../src/config.ts","../src/index.ts","../src/commands/config.ts","../src/utils.ts","../src/client.ts","../src/commands/agent.ts","../src/commands/skill.ts","../src/commands/task.ts","../src/commands/health.ts","../src/commands/badge.ts","../src/commands/claim.ts","../src/commands/proposal.ts"],"sourcesContent":["import Conf from \"conf\";\nimport type { Network } from \"@clankxyz/shared\";\n\n// Cache for remote config\nlet cachedRemoteConfig: RemoteConfig | null = null;\n\nexport interface RemoteConfig {\n package_id: string;\n treasury_id?: string;\n network: string;\n api_version: string;\n walrus: {\n aggregator: string;\n publisher: string;\n };\n rpc_urls: {\n mainnet: string;\n testnet: string;\n };\n}\n\nexport interface CliConfig {\n // API configuration\n apiUrl: string;\n apiKey?: string;\n\n // Network configuration\n network: Network;\n rpcUrl?: string;\n packageId?: string;\n\n // Walrus configuration\n walrusAggregator?: string;\n walrusPublisher?: string;\n\n // Agent configuration\n agentId?: string;\n agentName?: string;\n\n // Output preferences\n outputFormat: \"table\" | \"json\";\n}\n\nconst defaults: CliConfig = {\n apiUrl: \"http://localhost:3000\",\n network: \"testnet\",\n outputFormat: \"table\",\n};\n\nconst config = new Conf<CliConfig>({\n projectName: \"clank-cli\",\n projectVersion: \"0.1.0\",\n defaults,\n schema: {\n apiUrl: { type: \"string\" },\n apiKey: { type: \"string\" },\n network: { type: \"string\", enum: [\"mainnet\", \"testnet\", \"devnet\", \"localnet\"] },\n rpcUrl: { type: \"string\" },\n packageId: { type: \"string\" },\n walrusAggregator: { type: \"string\" },\n walrusPublisher: { type: \"string\" },\n agentId: { type: \"string\" },\n agentName: { type: \"string\" },\n outputFormat: { type: \"string\", enum: [\"table\", \"json\"] },\n },\n});\n\nexport function getConfig(): CliConfig {\n return {\n apiUrl: config.get(\"apiUrl\"),\n apiKey: config.get(\"apiKey\"),\n network: config.get(\"network\"),\n rpcUrl: config.get(\"rpcUrl\"),\n packageId: config.get(\"packageId\"),\n walrusAggregator: config.get(\"walrusAggregator\"),\n walrusPublisher: config.get(\"walrusPublisher\"),\n agentId: config.get(\"agentId\"),\n agentName: config.get(\"agentName\"),\n outputFormat: config.get(\"outputFormat\"),\n };\n}\n\nexport function setConfig<K extends keyof CliConfig>(\n key: K,\n value: CliConfig[K]\n): void {\n config.set(key, value);\n}\n\nexport function clearConfig(): void {\n config.clear();\n}\n\nexport function getConfigPath(): string {\n return config.path;\n}\n\n/**\n * Fetch remote configuration from the API.\n * This includes packageId, walrus endpoints, etc.\n * Results are cached for the session.\n */\nexport async function fetchRemoteConfig(): Promise<RemoteConfig | null> {\n if (cachedRemoteConfig) {\n return cachedRemoteConfig;\n }\n\n const apiUrl = config.get(\"apiUrl\");\n if (!apiUrl || apiUrl === \"http://localhost:3000\") {\n return null;\n }\n\n try {\n const response = await fetch(`${apiUrl}/api/config`);\n if (!response.ok) {\n return null;\n }\n cachedRemoteConfig = await response.json();\n return cachedRemoteConfig;\n } catch {\n return null;\n }\n}\n\n/**\n * Get the effective config, merging local settings with remote defaults.\n * Local settings always take precedence.\n */\nexport async function getEffectiveConfig(): Promise<CliConfig & { packageId: string }> {\n const local = getConfig();\n const remote = await fetchRemoteConfig();\n\n return {\n ...local,\n // Use local values if set, otherwise fall back to remote\n packageId: local.packageId || remote?.package_id || \"\",\n walrusAggregator: local.walrusAggregator || remote?.walrus.aggregator,\n walrusPublisher: local.walrusPublisher || remote?.walrus.publisher,\n };\n}\n\nexport { config };\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { registerConfigCommands } from \"./commands/config.js\";\nimport { registerAgentCommands } from \"./commands/agent.js\";\nimport { registerSkillCommands } from \"./commands/skill.js\";\nimport { registerTaskCommands } from \"./commands/task.js\";\nimport { registerHealthCommand } from \"./commands/health.js\";\nimport { registerBadgeCommands } from \"./commands/badge.js\";\nimport { registerClaimCommands } from \"./commands/claim.js\";\nimport { registerProposalCommands } from \"./commands/proposal.js\";\nimport { getConfig } from \"./config.js\";\n\nconst program = new Command();\n\n// ASCII art banner\nconst banner = chalk.cyan(`\n ██████╗██╗ █████╗ ███╗ ██╗██╗ ██╗\n ██╔════╝██║ ██╔══██╗████╗ ██║██║ ██╔╝\n ██║ ██║ ███████║██╔██╗ ██║█████╔╝ \n ██║ ██║ ██╔══██║██║╚██╗██║██╔═██╗ \n ╚██████╗███████╗██║ ██║██║ ╚████║██║ ██╗\n ╚═════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝\n`);\n\nprogram\n .name(\"clank\")\n .description(\"CLI for Clank Protocol - Agent-to-Agent Skills Marketplace\")\n .version(\"0.1.4\")\n .addHelpText(\"beforeAll\", banner)\n .option(\"--json\", \"Output as JSON\")\n .hook(\"preAction\", (thisCommand) => {\n // Set output format if --json flag is used\n const opts = thisCommand.opts();\n if (opts.json) {\n const config = getConfig();\n // Temporarily override for this command\n process.env.CLANK_OUTPUT_FORMAT = \"json\";\n }\n });\n\n// Register all commands\nregisterConfigCommands(program);\nregisterAgentCommands(program);\nregisterSkillCommands(program);\nregisterTaskCommands(program);\nregisterBadgeCommands(program);\nregisterClaimCommands(program);\nregisterProposalCommands(program);\nregisterHealthCommand(program);\n\n// Parse and execute\nprogram.parse();\n","import { Command } from \"commander\";\nimport {\n getConfig,\n setConfig,\n clearConfig,\n getConfigPath,\n type CliConfig,\n} from \"../config.js\";\nimport { log, success, error, colors, table } from \"../utils.js\";\n\nexport function registerConfigCommands(program: Command): void {\n const configCmd = program\n .command(\"config\")\n .description(\"Manage CLI configuration\");\n\n // Show all config\n configCmd\n .command(\"show\")\n .description(\"Show current configuration\")\n .option(\"--json\", \"Output as JSON\")\n .action((options) => {\n const config = getConfig();\n\n if (options.json) {\n console.log(JSON.stringify(config, null, 2));\n return;\n }\n\n log(colors.primary(\"\\nClank CLI Configuration\\n\"));\n log(colors.muted(`Config file: ${getConfigPath()}\\n`));\n\n const rows = Object.entries(config).map(([key, value]) => [\n colors.highlight(key),\n value !== undefined ? String(value) : colors.muted(\"(not set)\"),\n ]);\n\n log(table([\"Key\", \"Value\"], rows));\n log(\"\");\n });\n\n // Get a specific config value\n configCmd\n .command(\"get <key>\")\n .description(\"Get a configuration value\")\n .action((key: keyof CliConfig) => {\n const config = getConfig();\n const value = config[key];\n\n if (value === undefined) {\n error(`Configuration key \"${key}\" is not set`);\n process.exit(1);\n }\n\n log(String(value));\n });\n\n // Set a config value\n configCmd\n .command(\"set <key> <value>\")\n .description(\"Set a configuration value\")\n .action((key: keyof CliConfig, value: string) => {\n const validKeys: (keyof CliConfig)[] = [\n \"apiUrl\",\n \"apiKey\",\n \"network\",\n \"rpcUrl\",\n \"packageId\",\n \"walrusAggregator\",\n \"walrusPublisher\",\n \"agentId\",\n \"agentName\",\n \"outputFormat\",\n ];\n\n if (!validKeys.includes(key)) {\n error(`Invalid configuration key: ${key}`);\n log(`\\nValid keys: ${validKeys.join(\", \")}`);\n process.exit(1);\n }\n\n // Validate specific keys\n if (key === \"network\") {\n const validNetworks = [\"mainnet\", \"testnet\", \"devnet\", \"localnet\"];\n if (!validNetworks.includes(value)) {\n error(`Invalid network: ${value}`);\n log(`Valid networks: ${validNetworks.join(\", \")}`);\n process.exit(1);\n }\n }\n\n if (key === \"outputFormat\") {\n const validFormats = [\"table\", \"json\"];\n if (!validFormats.includes(value)) {\n error(`Invalid output format: ${value}`);\n log(`Valid formats: ${validFormats.join(\", \")}`);\n process.exit(1);\n }\n }\n\n setConfig(key, value as never);\n success(`Set ${key} = ${value}`);\n });\n\n // Unset a config value\n configCmd\n .command(\"unset <key>\")\n .description(\"Unset a configuration value\")\n .action((key: keyof CliConfig) => {\n setConfig(key, undefined as never);\n success(`Unset ${key}`);\n });\n\n // Reset all config\n configCmd\n .command(\"reset\")\n .description(\"Reset all configuration to defaults\")\n .option(\"-y, --yes\", \"Skip confirmation\")\n .action(async (options) => {\n if (!options.yes) {\n const prompts = await import(\"prompts\");\n const { confirm } = await prompts.default({\n type: \"confirm\",\n name: \"confirm\",\n message: \"Reset all configuration to defaults?\",\n initial: false,\n });\n\n if (!confirm) {\n log(\"Cancelled\");\n return;\n }\n }\n\n clearConfig();\n success(\"Configuration reset to defaults\");\n });\n\n // Show config file path\n configCmd\n .command(\"path\")\n .description(\"Show configuration file path\")\n .action(() => {\n log(getConfigPath());\n });\n}\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { getConfig } from \"./config.js\";\n\n// Colors\nexport const colors = {\n primary: chalk.cyan,\n success: chalk.green,\n warning: chalk.yellow,\n error: chalk.red,\n muted: chalk.gray,\n highlight: chalk.bold.white,\n};\n\n// Logging\nexport function log(message: string): void {\n console.log(message);\n}\n\nexport function success(message: string): void {\n console.log(colors.success(\"✓\"), message);\n}\n\nexport function warn(message: string): void {\n console.log(colors.warning(\"⚠\"), message);\n}\n\nexport function error(message: string): void {\n console.error(colors.error(\"✗\"), message);\n}\n\nexport function info(message: string): void {\n console.log(colors.primary(\"ℹ\"), message);\n}\n\n// Spinner\nexport function spinner(text: string) {\n return ora({ text, color: \"cyan\" });\n}\n\n// Formatters\nexport function formatAddress(address: string, length = 8): string {\n if (address.length <= length * 2 + 2) return address;\n return `${address.slice(0, length + 2)}...${address.slice(-length)}`;\n}\n\n// MIST_PER_SUI = 1_000_000_000 (9 decimals)\nconst MIST_PER_SUI = 1_000_000_000;\n\nexport function formatSui(amount: bigint | string): string {\n const value = typeof amount === \"string\" ? BigInt(amount) : amount;\n const sui = Number(value) / MIST_PER_SUI;\n // Show up to 4 decimal places, trim trailing zeros\n const formatted = sui.toFixed(4).replace(/\\.?0+$/, '');\n return `${formatted} SUI`;\n}\n\n\nexport function formatTimestamp(timestamp: bigint | string | number): string {\n const ms = typeof timestamp === \"bigint\" ? Number(timestamp) : Number(timestamp);\n return new Date(ms).toLocaleString();\n}\n\nexport function formatDuration(seconds: number): string {\n if (seconds < 60) return `${seconds}s`;\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m`;\n if (seconds < 86400) return `${Math.floor(seconds / 3600)}h`;\n return `${Math.floor(seconds / 86400)}d`;\n}\n\nexport function formatPercent(value: number | null | undefined): string {\n if (value === null || value === undefined) return \"-\";\n return `${(value * 100).toFixed(1)}%`;\n}\n\n// Table formatting\nexport function table(\n headers: string[],\n rows: string[][],\n options: { maxWidth?: number } = {}\n): string {\n const maxWidth = options.maxWidth ?? 20;\n\n // Calculate column widths\n const widths = headers.map((h, i) =>\n Math.min(\n maxWidth,\n Math.max(h.length, ...rows.map((r) => (r[i] ?? \"\").length))\n )\n );\n\n // Format header\n const headerLine = headers\n .map((h, i) => h.padEnd(widths[i]))\n .join(\" \");\n\n const separator = widths.map((w) => \"-\".repeat(w)).join(\" \");\n\n // Format rows\n const rowLines = rows.map((row) =>\n row.map((cell, i) => (cell ?? \"\").padEnd(widths[i])).join(\" \")\n );\n\n return [\n colors.muted(headerLine),\n colors.muted(separator),\n ...rowLines,\n ].join(\"\\n\");\n}\n\n// JSON output\nexport function jsonOutput(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n\n// Output based on config\nexport function output(data: unknown, tableFormatter?: () => string): void {\n const config = getConfig();\n\n if (config.outputFormat === \"json\") {\n jsonOutput(data);\n } else if (tableFormatter) {\n log(tableFormatter());\n } else {\n jsonOutput(data);\n }\n}\n\n// Prompts\nexport function requireConfig(key: keyof ReturnType<typeof getConfig>): string {\n const config = getConfig();\n const value = config[key];\n\n if (!value) {\n error(`Missing configuration: ${key}`);\n error(`Run: clank config set ${key} <value>`);\n process.exit(1);\n }\n\n return value as string;\n}\n\nexport function requireAgentId(): string {\n return requireConfig(\"agentId\");\n}\n\nexport function requireApiKey(): string {\n return requireConfig(\"apiKey\");\n}\n\n// ============================================================================\n// Sui Client and Keypair Helpers\n// ============================================================================\n\nimport { SuiClient } from \"@mysten/sui/client\";\nimport { Ed25519Keypair } from \"@mysten/sui/keypairs/ed25519\";\nimport { decodeSuiPrivateKey } from \"@mysten/sui/cryptography\";\nimport { FULLNODE_URLS, type Network } from \"@clankxyz/shared\";\n\n/**\n * Get a Sui client based on config\n */\nexport function getSuiClient(): SuiClient {\n const config = getConfig();\n const rpcUrl = config.rpcUrl ?? FULLNODE_URLS[config.network as Network] ?? FULLNODE_URLS.mainnet;\n return new SuiClient({ url: rpcUrl });\n}\n\n/**\n * Load keypair from Sui keystore or custom path\n * @param keystorePath Optional custom keystore path\n * @param ownerAddress Optional owner address to match\n */\nexport async function loadKeypair(\n keystorePath?: string,\n ownerAddress?: string\n): Promise<Ed25519Keypair> {\n const fs = await import(\"fs\");\n const os = await import(\"os\");\n const path = await import(\"path\");\n\n const defaultPath = path.join(os.homedir(), \".sui\", \"sui_config\", \"sui.keystore\");\n const keyPath = keystorePath ?? defaultPath;\n\n if (!fs.existsSync(keyPath)) {\n throw new Error(`Sui keystore not found at: ${keyPath}`);\n }\n\n const keystoreData = fs.readFileSync(keyPath, \"utf-8\");\n const keys: string[] = JSON.parse(keystoreData);\n\n if (keys.length === 0) {\n throw new Error(\"No keys found in Sui keystore\");\n }\n\n // If owner address specified, find matching key\n if (ownerAddress) {\n const normalizedOwner = ownerAddress.toLowerCase();\n for (const encodedKey of keys) {\n try {\n const { secretKey } = decodeSuiPrivateKey(encodedKey);\n const keypair = Ed25519Keypair.fromSecretKey(secretKey);\n const address = keypair.getPublicKey().toSuiAddress().toLowerCase();\n \n if (address === normalizedOwner) {\n return keypair;\n }\n } catch {\n continue;\n }\n }\n throw new Error(`No key found for address: ${ownerAddress}`);\n }\n\n // Otherwise use first key\n const { secretKey } = decodeSuiPrivateKey(keys[0]);\n return Ed25519Keypair.fromSecretKey(secretKey);\n}\n\n/**\n * Load keypair from a .key file (as saved by onboard command)\n */\nexport async function loadKeypairFromFile(filePath: string): Promise<Ed25519Keypair> {\n const fs = await import(\"fs\");\n\n if (!fs.existsSync(filePath)) {\n throw new Error(`Key file not found: ${filePath}`);\n }\n\n const keyData = fs.readFileSync(filePath, \"utf-8\").trim();\n \n // Try to decode as base64 first\n try {\n const secretKey = Buffer.from(keyData, \"base64\");\n return Ed25519Keypair.fromSecretKey(secretKey);\n } catch {\n // Try as hex\n try {\n const secretKey = Buffer.from(keyData, \"hex\");\n return Ed25519Keypair.fromSecretKey(secretKey);\n } catch {\n throw new Error(\"Invalid key format in file\");\n }\n }\n}\n","import { ClankClient } from \"@clankxyz/sdk\";\nimport { getConfig } from \"./config.js\";\n\nlet clientInstance: ClankClient | null = null;\n\nexport function getClient(): ClankClient {\n if (clientInstance) return clientInstance;\n\n const config = getConfig();\n\n clientInstance = new ClankClient({\n apiUrl: config.apiUrl,\n apiKey: config.apiKey,\n network: config.network,\n rpcUrl: config.rpcUrl,\n packageId: config.packageId,\n walrusAggregator: config.walrusAggregator,\n walrusPublisher: config.walrusPublisher,\n agentId: config.agentId,\n });\n\n return clientInstance;\n}\n\nexport function resetClient(): void {\n clientInstance = null;\n}\n","import { Command } from \"commander\";\nimport { execSync } from \"child_process\";\nimport { getClient } from \"../client.js\";\nimport {\n log,\n success,\n error,\n spinner,\n colors,\n table,\n output,\n formatAddress,\n formatTimestamp,\n formatPercent,\n formatSui,\n requireApiKey,\n} from \"../utils.js\";\nimport { getConfig, setConfig } from \"../config.js\";\n\n/**\n * Generate the signature challenge message for linking\n */\nfunction generateSignatureChallenge(\n agentId: string,\n action: string,\n timestamp: number\n): string {\n return `Clank Verification\\n\\nAgent: ${agentId}\\nAction: ${action}\\nTimestamp: ${timestamp}\\n\\nSign this message to verify ownership.`;\n}\n\nexport function registerAgentCommands(program: Command): void {\n const agentCmd = program\n .command(\"agent\")\n .description(\"Manage agents\");\n\n // List agents\n agentCmd\n .command(\"list\")\n .description(\"List all agents\")\n .option(\"-p, --page <number>\", \"Page number\", \"1\")\n .option(\"-l, --limit <number>\", \"Items per page\", \"20\")\n .action(async (options) => {\n const spin = spinner(\"Fetching agents...\").start();\n\n try {\n const client = getClient();\n const result = await client.api.listAgents({\n page: parseInt(options.page),\n limit: parseInt(options.limit),\n });\n\n spin.stop();\n\n output(result, () => {\n const rows = result.data.map((agent) => [\n formatAddress(agent.id),\n formatAddress(agent.owner),\n String(agent.skills_count),\n String(agent.tasks_as_worker),\n formatPercent(agent.stats?.completion_rate),\n ]);\n\n return (\n `\\n${colors.primary(\"Agents\")} (${result.pagination.total} total)\\n\\n` +\n table([\"ID\", \"Owner\", \"Skills\", \"Tasks Done\", \"Success\"], rows) +\n `\\n\\nPage ${result.pagination.page}/${result.pagination.pages}`\n );\n });\n } catch (err) {\n spin.stop();\n error(`Failed to list agents: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Get agent details\n agentCmd\n .command(\"info [id]\")\n .description(\"Get agent details (uses configured agent if no ID)\")\n .action(async (id?: string) => {\n const agentId = id ?? getConfig().agentId;\n\n if (!agentId) {\n error(\"No agent ID provided. Set one with: clank config set agentId <id>\");\n process.exit(1);\n }\n\n const spin = spinner(\"Fetching agent...\").start();\n\n try {\n const client = getClient();\n const agent = await client.api.getAgent(agentId);\n\n spin.stop();\n\n output(agent, () => {\n let output = `\\n${colors.primary(\"Agent Details\")}\\n\\n`;\n output += `${colors.muted(\"ID:\")} ${agent.id}\\n`;\n output += `${colors.muted(\"Owner:\")} ${agent.owner}\\n`;\n output += `${colors.muted(\"Created:\")} ${formatTimestamp(agent.created_at)}\\n`;\n output += `${colors.muted(\"Metadata:\")} ${agent.metadata_uri ?? \"(none)\"}\\n`;\n\n if (agent.skills.length > 0) {\n output += `\\n${colors.primary(\"Skills\")} (${agent.skills.length})\\n\\n`;\n const skillRows = agent.skills.map((s) => [\n s.name,\n s.version,\n formatSui(s.base_price_mist),\n ]);\n output += table([\"Name\", \"Version\", \"Price\"], skillRows);\n }\n\n if (agent.badges.length > 0) {\n output += `\\n\\n${colors.primary(\"Badges\")} (${agent.badges.length})\\n\\n`;\n const badgeRows = agent.badges.map((b) => [\n b.badge_type,\n `Tier ${b.tier}`,\n formatTimestamp(b.earned_at),\n ]);\n output += table([\"Type\", \"Tier\", \"Earned\"], badgeRows);\n }\n\n return output;\n });\n } catch (err) {\n spin.stop();\n error(`Failed to get agent: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Get agent stats\n agentCmd\n .command(\"stats [id]\")\n .description(\"Get agent statistics\")\n .action(async (id?: string) => {\n const agentId = id ?? getConfig().agentId;\n\n if (!agentId) {\n error(\"No agent ID provided\");\n process.exit(1);\n }\n\n const spin = spinner(\"Fetching stats...\").start();\n\n try {\n const client = getClient();\n const stats = await client.api.getAgentStats(agentId);\n\n spin.stop();\n\n output(stats, () => {\n let output = `\\n${colors.primary(\"Agent Statistics\")}\\n\\n`;\n\n output += `${colors.highlight(\"Worker Stats\")}\\n`;\n output += ` Tasks Completed: ${stats.workerTasksCompleted}\\n`;\n output += ` Tasks Failed: ${stats.workerTasksFailed}\\n`;\n output += ` Tasks Expired: ${stats.workerTasksExpired}\\n`;\n output += ` Total Earned: ${formatSui(stats.workerTotalEarnedMist)}\\n`;\n output += ` Completion Rate: ${formatPercent(stats.completionRate)}\\n`;\n\n output += `\\n${colors.highlight(\"Requester Stats\")}\\n`;\n output += ` Tasks Posted: ${stats.requesterTasksPosted}\\n`;\n output += ` Tasks Settled: ${stats.requesterTasksSettled}\\n`;\n output += ` Tasks Cancelled: ${stats.requesterTasksCancelled}\\n`;\n output += ` Tasks Rejected: ${stats.requesterTasksRejected}\\n`;\n output += ` Total Spent: ${formatSui(stats.requesterTotalSpentMist)}\\n`;\n output += ` Rejection Rate: ${formatPercent(stats.rejectionRate)}\\n`;\n\n output += `\\n${colors.highlight(\"Metrics\")}\\n`;\n output += ` Unique Partners: ${stats.uniqueCounterparties}\\n`;\n output += ` Flagged: ${stats.flaggedForAbuse ? colors.error(\"Yes\") : colors.success(\"No\")}\\n`;\n\n return output;\n });\n } catch (err) {\n spin.stop();\n error(`Failed to get stats: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Set current agent\n agentCmd\n .command(\"use <id>\")\n .description(\"Set the current agent for commands\")\n .option(\"-n, --name <name>\", \"Agent name for display\")\n .action((id: string, options) => {\n setConfig(\"agentId\", id);\n if (options.name) {\n setConfig(\"agentName\", options.name);\n }\n success(`Now using agent: ${formatAddress(id)}`);\n });\n\n // Show current agent\n agentCmd\n .command(\"current\")\n .description(\"Show current agent\")\n .action(() => {\n const config = getConfig();\n\n if (!config.agentId) {\n log(\"No agent configured. Use: clank agent use <id>\");\n return;\n }\n\n log(`\\nCurrent Agent:`);\n log(` ID: ${config.agentId}`);\n if (config.agentName) {\n log(` Name: ${config.agentName}`);\n }\n log(\"\");\n });\n\n // Link agent to API key\n agentCmd\n .command(\"link <agent-id>\")\n .description(\"Link an on-chain agent to your API key (requires wallet signature)\")\n .option(\"-k, --api-key <key>\", \"API key to link (uses configured key if not provided)\")\n .option(\"--keystore <path>\", \"Path to sui.keystore file\")\n .action(async (agentId: string, options) => {\n const config = getConfig();\n const apiKey = options.apiKey ?? config.apiKey;\n\n if (!apiKey) {\n error(\"No API key configured. Set one with: clank config set apiKey <key>\");\n process.exit(1);\n }\n\n log(`\\n${colors.primary(\"Linking Agent to API Key\")}\\n`);\n log(`Agent ID: ${formatAddress(agentId)}`);\n\n const spin = spinner(\"Loading Sui keystore...\").start();\n\n try {\n const fs = await import(\"fs\");\n const os = await import(\"os\");\n const path = await import(\"path\");\n\n // Find keystore\n const keystorePath = options.keystore ?? \n path.join(os.homedir(), \".sui\", \"sui_config\", \"sui.keystore\");\n\n if (!fs.existsSync(keystorePath)) {\n spin.stop();\n error(`Sui keystore not found at: ${keystorePath}`);\n log(`\\nMake sure you have sui CLI installed and configured.`);\n log(`Or specify a custom path with: --keystore <path>`);\n process.exit(1);\n }\n\n // Read and parse keystore\n const keystoreData = fs.readFileSync(keystorePath, \"utf-8\");\n const keys: string[] = JSON.parse(keystoreData);\n\n if (keys.length === 0) {\n spin.stop();\n error(\"No keys found in Sui keystore\");\n process.exit(1);\n }\n\n // Import Ed25519Keypair from SDK\n const { Ed25519Keypair } = await import(\"@mysten/sui/keypairs/ed25519\");\n const { decodeSuiPrivateKey } = await import(\"@mysten/sui/cryptography\");\n\n // Try each key to find the owner of the agent\n spin.text = \"Fetching agent info...\";\n\n const agentResponse = await fetch(`${config.apiUrl}/api/agents/${agentId}`);\n if (!agentResponse.ok) {\n spin.stop();\n const data = await agentResponse.json();\n error(`Failed to fetch agent: ${data.error}`);\n log(`\\nMake sure the agent has been indexed. Check: clank health`);\n process.exit(1);\n }\n\n const agentData = await agentResponse.json();\n const ownerAddress = agentData.agent.owner.toLowerCase();\n\n spin.text = \"Finding matching key...\";\n\n let matchingKeypair: InstanceType<typeof Ed25519Keypair> | null = null;\n for (const encodedKey of keys) {\n try {\n const { secretKey } = decodeSuiPrivateKey(encodedKey);\n const keypair = Ed25519Keypair.fromSecretKey(secretKey);\n const address = keypair.getPublicKey().toSuiAddress().toLowerCase();\n \n if (address === ownerAddress) {\n matchingKeypair = keypair;\n break;\n }\n } catch {\n // Skip invalid keys\n continue;\n }\n }\n\n if (!matchingKeypair) {\n spin.stop();\n error(`No key found for agent owner: ${agentData.agent.owner}`);\n log(`\\nYour keystore contains keys for these addresses:`);\n for (const encodedKey of keys) {\n try {\n const { secretKey } = decodeSuiPrivateKey(encodedKey);\n const keypair = Ed25519Keypair.fromSecretKey(secretKey);\n log(` - ${keypair.getPublicKey().toSuiAddress()}`);\n } catch {\n continue;\n }\n }\n log(`\\nMake sure you created the agent with one of these addresses.`);\n process.exit(1);\n }\n\n spin.text = \"Signing verification message...\";\n\n // Generate and sign the message\n const timestamp = Date.now();\n const message = generateSignatureChallenge(agentId, \"link_api_key\", timestamp);\n const messageBytes = new TextEncoder().encode(message);\n \n const { signature } = await matchingKeypair.signPersonalMessage(messageBytes);\n\n spin.text = \"Linking agent to API key...\";\n\n // Call the link API\n const response = await fetch(`${config.apiUrl}/api/agents/link`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": apiKey,\n },\n body: JSON.stringify({\n agent_id: agentId,\n signature,\n timestamp,\n }),\n });\n\n const data = await response.json();\n\n spin.stop();\n\n if (!response.ok) {\n error(`Failed to link agent: ${data.error}`);\n if (data.hint) {\n log(`Hint: ${data.hint}`);\n }\n process.exit(1);\n }\n\n // Save agent ID to config\n setConfig(\"agentId\", agentId);\n\n success(`Agent linked successfully!`);\n log(`\\n Agent ID: ${data.agent_id}`);\n log(` Owner: ${data.agent_owner}`);\n log(`\\nAgent saved to config. Use 'clank agent info' to see details.`);\n } catch (err) {\n spin.stop();\n error(`Failed to link agent: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Link with manual signature (fallback)\n agentCmd\n .command(\"link-with-sig <agent-id> <signature> <timestamp>\")\n .description(\"Link agent with a pre-signed signature\")\n .option(\"-k, --api-key <key>\", \"API key to link\")\n .action(async (agentId: string, signature: string, timestampStr: string, options) => {\n const config = getConfig();\n const apiKey = options.apiKey ?? config.apiKey;\n\n if (!apiKey) {\n error(\"No API key configured\");\n process.exit(1);\n }\n\n const timestamp = parseInt(timestampStr, 10);\n if (isNaN(timestamp)) {\n error(\"Invalid timestamp\");\n process.exit(1);\n }\n\n const spin = spinner(\"Linking agent...\").start();\n\n try {\n const response = await fetch(`${config.apiUrl}/api/agents/link`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": apiKey,\n },\n body: JSON.stringify({\n agent_id: agentId,\n signature,\n timestamp,\n }),\n });\n\n const data = await response.json();\n\n spin.stop();\n\n if (!response.ok) {\n error(`Failed to link agent: ${data.error}`);\n process.exit(1);\n }\n\n setConfig(\"agentId\", agentId);\n success(`Agent linked successfully!`);\n log(`\\n Agent ID: ${data.agent_id}`);\n log(` Owner: ${data.agent_owner}`);\n } catch (err) {\n spin.stop();\n error(`Failed: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Register new API key (manual flow)\n agentCmd\n .command(\"register <name>\")\n .description(\"Register a new API key (manual flow - you create agent separately)\")\n .option(\"-u, --api-url <url>\", \"API URL\", \"https://clank.xyz\")\n .action(async (name: string, options) => {\n const spin = spinner(\"Registering API key...\").start();\n\n try {\n const response = await fetch(`${options.apiUrl}/api/agents/register`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ agent_name: name }),\n });\n\n const data = await response.json();\n\n spin.stop();\n\n if (!response.ok) {\n error(`Failed to register: ${data.error}`);\n process.exit(1);\n }\n\n success(`API key registered!`);\n log(`\\n${colors.warning(\"⚠️ Save this key - it cannot be retrieved later!\")}\\n`);\n log(` API Key: ${colors.highlight(data.api_key)}`);\n log(` Name: ${data.agent_name}`);\n log(`\\nNext steps:`);\n log(` 1. clank config set apiKey ${data.api_key}`);\n log(` 2. clank config set apiUrl ${options.apiUrl}`);\n log(` 3. Create agent on-chain using Sui SDK or CLI`);\n log(` sui client call --package $CLANK_PACKAGE_ID --module agent --function create_and_transfer --args '\"walrus://your-metadata\"'`);\n log(` 4. clank agent link <agent-id>`);\n } catch (err) {\n spin.stop();\n error(`Failed: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Onboard new agent with sponsored gas\n agentCmd\n .command(\"onboard <name>\")\n .description(\"Onboard a new agent with sponsored gas (no SUI required!)\")\n .option(\"-u, --api-url <url>\", \"API URL\", \"https://clank.xyz\")\n .option(\"-m, --metadata <uri>\", \"Metadata URI\")\n .option(\"-k, --keystore <path>\", \"Path to save/load keypair\")\n .option(\"-r, --referral <code>\", \"Referral code from another agent\")\n .option(\"--new-key\", \"Generate a new keypair\")\n .action(async (name: string, options) => {\n const fs = await import(\"fs\");\n const os = await import(\"os\");\n const path = await import(\"path\");\n\n log(`\\n${colors.primary(\"🚀 Sponsored Agent Onboarding\")}\\n`);\n\n // Determine keypair source\n let keypair: InstanceType<typeof import(\"@mysten/sui/keypairs/ed25519\").Ed25519Keypair>;\n let savedKeyPath: string | undefined;\n \n const { Ed25519Keypair } = await import(\"@mysten/sui/keypairs/ed25519\");\n\n if (options.newKey || options.keystore) {\n // Generate new keypair\n const spin = spinner(\"Generating new keypair...\").start();\n keypair = Ed25519Keypair.generate();\n spin.stop();\n\n const address = keypair.getPublicKey().toSuiAddress();\n log(`${colors.success(\"✓\")} Generated new keypair`);\n log(` Address: ${address}\\n`);\n\n // Determine save path\n let keyPath: string;\n if (options.keystore) {\n keyPath = options.keystore;\n } else {\n // Default save location\n const clankDir = path.join(os.homedir(), \".clank\");\n if (!fs.existsSync(clankDir)) {\n fs.mkdirSync(clankDir, { recursive: true });\n }\n keyPath = path.join(clankDir, `${name}.key`);\n }\n\n // Export and save the secret key\n const exported = keypair.getSecretKey();\n fs.writeFileSync(keyPath, exported, { mode: 0o600 });\n savedKeyPath = keyPath;\n log(`${colors.success(\"✓\")} Keypair saved to: ${savedKeyPath}\\n`);\n } else {\n // Try to load from Sui keystore\n const spin = spinner(\"Loading keypair from Sui keystore...\").start();\n \n try {\n const keystorePath = path.join(os.homedir(), \".sui\", \"sui_config\", \"sui.keystore\");\n \n if (!fs.existsSync(keystorePath)) {\n spin.stop();\n error(\"No Sui keystore found. Use --new-key to generate a new keypair.\");\n process.exit(1);\n }\n\n const keystoreData = fs.readFileSync(keystorePath, \"utf-8\");\n const keys: string[] = JSON.parse(keystoreData);\n\n if (keys.length === 0) {\n spin.stop();\n error(\"Sui keystore is empty. Use --new-key to generate a new keypair.\");\n process.exit(1);\n }\n\n // Use the first key (active address)\n const { decodeSuiPrivateKey } = await import(\"@mysten/sui/cryptography\");\n const { secretKey } = decodeSuiPrivateKey(keys[0]);\n keypair = Ed25519Keypair.fromSecretKey(secretKey);\n \n spin.stop();\n log(`${colors.success(\"✓\")} Using keypair from Sui keystore`);\n log(` Address: ${keypair.getPublicKey().toSuiAddress()}\\n`);\n } catch (err) {\n spin.stop();\n error(`Failed to load keystore: ${(err as Error).message}`);\n log(`\\nUse --new-key to generate a fresh keypair instead.`);\n process.exit(1);\n }\n }\n\n // Call the onboard endpoint\n const spin = spinner(\"Creating agent with sponsored gas...\").start();\n\n try {\n const publicKeyBase64 = Buffer.from(keypair.getPublicKey().toRawBytes()).toString(\"base64\");\n\n const response = await fetch(`${options.apiUrl}/api/agents/onboard`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n agent_name: name,\n public_key: publicKeyBase64,\n metadata_uri: options.metadata,\n referral_code: options.referral,\n }),\n });\n\n const data = await response.json();\n\n spin.stop();\n\n if (!response.ok) {\n error(`Failed to onboard: ${data.error}`);\n if (data.hint) {\n log(`Hint: ${data.hint}`);\n }\n process.exit(1);\n }\n\n // Save config\n setConfig(\"apiKey\", data.api_key);\n setConfig(\"apiUrl\", options.apiUrl);\n setConfig(\"agentId\", data.agent_id);\n setConfig(\"agentName\", name);\n\n success(`\\n🎉 Agent onboarded successfully!\\n`);\n log(`${colors.warning(\"⚠️ Save these credentials - they cannot be retrieved later!\")}\\n`);\n log(` ${colors.muted(\"Agent ID:\")} ${data.agent_id}`);\n log(` ${colors.muted(\"Address:\")} ${data.agent_address}`);\n log(` ${colors.muted(\"API Key:\")} ${colors.highlight(data.api_key)}`);\n log(` ${colors.muted(\"Referral Code:\")} ${data.referral_code}`);\n log(` ${colors.muted(\"Transaction:\")} ${data.transaction_digest}`);\n \n if (savedKeyPath) {\n log(` ${colors.muted(\"Private Key:\")} ${savedKeyPath}`);\n }\n\n if (data.referred_by) {\n log(` ${colors.muted(\"Referred By:\")} ${data.referred_by}`);\n }\n\n log(`\\n${colors.primary(\"You're ready to start accepting tasks!\")} 🚀\\n`);\n log(`Quick commands:`);\n log(` clank skill list # See available skills`);\n log(` clank task list # See posted tasks`);\n log(` clank agent info # See your agent details`);\n log(` clank agent referral # Get your referral link`);\n } catch (err) {\n spin.stop();\n error(`Failed: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Get referral info\n agentCmd\n .command(\"referral [id]\")\n .description(\"Get referral info and share link\")\n .action(async (id?: string) => {\n requireApiKey();\n const agentId = id ?? getConfig().agentId;\n\n if (!agentId) {\n error(\"No agent ID provided. Set one with: clank config set agentId <id>\");\n process.exit(1);\n }\n\n const spin = spinner(\"Fetching referral info...\").start();\n\n try {\n const config = getConfig();\n const response = await fetch(`${config.apiUrl}/api/agents/${agentId}/referral`, {\n headers: {\n \"Authorization\": `Bearer ${config.apiKey}`,\n },\n });\n\n const data = await response.json();\n\n spin.stop();\n\n if (!response.ok) {\n error(`Failed to get referral info: ${data.error}`);\n process.exit(1);\n }\n\n output(data, () => {\n let out = `\\n${colors.primary(\"🎁 Referral Program\")}\\n\\n`;\n out += `${colors.highlight(\"Your Referral Code:\")}\\n`;\n out += ` ${colors.success(data.referral.code)}\\n\\n`;\n out += `${colors.highlight(\"Share Link:\")}\\n`;\n out += ` ${data.referral.link}\\n\\n`;\n out += `${colors.highlight(\"CLI Command (for other agents):\")}\\n`;\n out += ` ${data.referral.cli_command}\\n\\n`;\n \n out += `${colors.highlight(\"Program Info:\")}\\n`;\n out += ` ${data.program_info.description}\\n\\n`;\n\n out += `${colors.highlight(\"Your Stats:\")}\\n`;\n out += ` Total Referrals: ${data.stats.total_referrals}\\n`;\n out += ` Active Referrals: ${data.stats.active_referrals}\\n`;\n out += ` Referral Earnings: ${data.stats.referral_earnings_sui} SUI\\n`;\n out += ` Pending Bonus: ${formatSui(data.stats.pending_bonus_mist)}\\n`;\n out += ` Paid Bonus: ${formatSui(data.stats.paid_bonus_mist)}\\n`;\n\n if (data.referred_by) {\n out += `\\n${colors.muted(\"Referred by:\")} ${data.referred_by.name || formatAddress(data.referred_by.agent_id)}\\n`;\n }\n\n if (data.referred_agents.length > 0) {\n out += `\\n${colors.highlight(\"Referred Agents\")} (${data.referred_agents.length})\\n\\n`;\n const rows = data.referred_agents.slice(0, 10).map((r: { name: string | null; agent_id: string; tasks_completed: number; total_earned_mist: string; is_active: boolean }) => [\n r.name || formatAddress(r.agent_id),\n String(r.tasks_completed),\n formatSui(r.total_earned_mist),\n r.is_active ? colors.success(\"Active\") : colors.muted(\"Inactive\"),\n ]);\n out += table([\"Agent\", \"Tasks\", \"Earned\", \"Status\"], rows);\n }\n\n return out;\n });\n } catch (err) {\n spin.stop();\n error(`Failed to get referral info: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { getClient } from \"../client.js\";\nimport { STATUS_LABELS, VERIFICATION_LABELS, VERIFICATION, parseSui, type VerificationType } from \"@clankxyz/shared\";\nimport { buildPublishSkillTx, type TransactionConfig } from \"@clankxyz/sdk\";\nimport {\n log,\n success,\n error,\n spinner,\n colors,\n table,\n output,\n formatAddress,\n formatSui,\n formatTimestamp,\n formatDuration,\n loadKeypair,\n getSuiClient,\n} from \"../utils.js\";\nimport { getConfig, getEffectiveConfig } from \"../config.js\";\n\nexport function registerSkillCommands(program: Command): void {\n const skillCmd = program\n .command(\"skill\")\n .alias(\"skills\")\n .description(\"Manage skills\");\n\n // List skills\n skillCmd\n .command(\"list\")\n .description(\"List available skills\")\n .option(\"-p, --page <number>\", \"Page number\", \"1\")\n .option(\"-l, --limit <number>\", \"Items per page\", \"20\")\n .option(\"-n, --name <name>\", \"Filter by name\")\n .option(\"-a, --agent <id>\", \"Filter by agent ID\")\n .option(\"-v, --verification <type>\", \"Filter by verification type (0-2)\")\n .option(\"--deprecated\", \"Include deprecated skills\")\n .option(\"-s, --sort <field>\", \"Sort by: published_at, name, price\", \"published_at\")\n .option(\"-o, --order <dir>\", \"Sort order: asc, desc\", \"desc\")\n .action(async (options) => {\n const spin = spinner(\"Fetching skills...\").start();\n\n try {\n const client = getClient();\n const result = await client.api.listSkills({\n page: parseInt(options.page),\n limit: parseInt(options.limit),\n name: options.name,\n agentId: options.agent,\n verificationType: options.verification\n ? parseInt(options.verification)\n : undefined,\n includeDeprecated: options.deprecated,\n sortBy: options.sort,\n sortOrder: options.order,\n });\n\n spin.stop();\n\n output(result, () => {\n const rows = result.data.map((skill) => [\n skill.name,\n skill.version,\n formatSui(skill.base_price_mist),\n skill.verification_type_label,\n formatDuration(skill.timeout_seconds),\n String(skill.tasks_count),\n ]);\n\n return (\n `\\n${colors.primary(\"Skills\")} (${result.pagination.total} total)\\n\\n` +\n table([\"Name\", \"Version\", \"Price\", \"Verification\", \"Timeout\", \"Tasks\"], rows) +\n `\\n\\nPage ${result.pagination.page}/${result.pagination.pages}`\n );\n });\n } catch (err) {\n spin.stop();\n error(`Failed to list skills: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Get skill details\n skillCmd\n .command(\"info <id>\")\n .description(\"Get skill details\")\n .action(async (id: string) => {\n const spin = spinner(\"Fetching skill...\").start();\n\n try {\n const client = getClient();\n const skill = await client.api.getSkill(id);\n\n spin.stop();\n\n output(skill, () => {\n let output = `\\n${colors.primary(\"Skill Details\")}\\n\\n`;\n output += `${colors.muted(\"ID:\")} ${skill.id}\\n`;\n output += `${colors.muted(\"Name:\")} ${skill.name}\\n`;\n output += `${colors.muted(\"Version:\")} ${skill.version}\\n`;\n output += `${colors.muted(\"Agent:\")} ${formatAddress(skill.agent.id)}\\n`;\n output += `${colors.muted(\"Price:\")} ${formatSui(skill.base_price_mist)}\\n`;\n output += `${colors.muted(\"Worker Bond:\")} ${formatSui(skill.worker_bond_mist)}\\n`;\n output += `${colors.muted(\"Verification:\")} ${skill.verification_type_label}\\n`;\n output += `${colors.muted(\"Timeout:\")} ${formatDuration(skill.timeout_seconds)}\\n`;\n output += `${colors.muted(\"Published:\")} ${formatTimestamp(skill.published_at)}\\n`;\n output += `${colors.muted(\"Deprecated:\")} ${skill.deprecated ? colors.error(\"Yes\") : colors.success(\"No\")}\\n`;\n\n if (skill.input_schema_hash) {\n output += `${colors.muted(\"Input Schema:\")} ${skill.input_schema_hash.slice(0, 16)}...\\n`;\n }\n if (skill.output_schema_hash) {\n output += `${colors.muted(\"Output Schema:\")} ${skill.output_schema_hash.slice(0, 16)}...\\n`;\n }\n\n output += `\\n${colors.primary(\"Priority Multipliers\")}\\n`;\n const multipliers = skill.priority_multipliers as number[];\n output += ` Standard: ${(multipliers[0] / 10000).toFixed(1)}x\\n`;\n output += ` Priority: ${(multipliers[1] / 10000).toFixed(1)}x\\n`;\n output += ` Urgent: ${(multipliers[2] / 10000).toFixed(1)}x\\n`;\n\n output += `\\n${colors.primary(\"Statistics\")}\\n`;\n output += ` Total Tasks: ${skill.stats.total_tasks}\\n`;\n output += ` Templates: ${skill.stats.templates_count}\\n`;\n\n if (Object.keys(skill.stats.tasks_by_status).length > 0) {\n output += `\\n ${colors.highlight(\"Tasks by Status:\")}\\n`;\n for (const [status, count] of Object.entries(skill.stats.tasks_by_status)) {\n output += ` ${status}: ${count}\\n`;\n }\n }\n\n if (skill.certifications.length > 0) {\n output += `\\n${colors.primary(\"Certifications\")} (${skill.certifications.length})\\n\\n`;\n const certRows = skill.certifications.map((c) => [\n c.certification_type,\n formatAddress(c.certifier_id),\n formatTimestamp(c.certified_at),\n ]);\n output += table([\"Type\", \"Certifier\", \"Certified\"], certRows);\n }\n\n return output;\n });\n } catch (err) {\n spin.stop();\n error(`Failed to get skill: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Publish skill on-chain\n skillCmd\n .command(\"publish\")\n .description(\"Publish a new skill on-chain\")\n .requiredOption(\"-n, --name <name>\", \"Skill name\")\n .requiredOption(\"-v, --version <version>\", \"Skill version (e.g., 1.0.0)\")\n .requiredOption(\"-p, --price <sui>\", \"Base price in SUI (e.g., 0.01)\")\n .option(\"-a, --agent <id>\", \"Agent ID (uses configured agent if not provided)\")\n .option(\"-t, --timeout <seconds>\", \"Timeout in seconds\", \"3600\")\n .option(\"--verification <type>\", \"Verification type: 0=Deterministic, 1=RequesterConfirm, 2=TimeBound\", \"1\")\n .option(\"--input-schema <hash>\", \"SHA256 hash of input JSON schema\")\n .option(\"--output-schema <hash>\", \"SHA256 hash of output JSON schema\")\n .option(\"--worker-bond <sui>\", \"Required worker bond in SUI\", \"0\")\n .option(\"--metadata <uri>\", \"Metadata URI (e.g., walrus://...)\")\n .option(\"--keystore <path>\", \"Path to Sui keystore\")\n .action(async (options) => {\n const spin = spinner(\"Loading configuration...\").start();\n \n try {\n // Get effective config (auto-fetches packageId from API if not set locally)\n const config = await getEffectiveConfig();\n const agentId = options.agent ?? config.agentId;\n \n if (!agentId) {\n spin.stop();\n error(\"No agent ID provided. Set one with: clank config set agentId <id>\");\n process.exit(1);\n }\n\n if (!config.packageId) {\n spin.stop();\n error(\"Could not get package ID. Make sure you're connected to a Clank API.\");\n log(\" Try: clank config set apiUrl https://clank.xyz\");\n process.exit(1);\n }\n\n spin.stop();\n log(`\\n${colors.primary(\"📦 Publishing Skill On-Chain\")}\\n`);\n log(` Name: ${options.name}`);\n log(` Version: ${options.version}`);\n log(` Price: ${options.price} SUI`);\n log(` Verification: ${VERIFICATION_LABELS[parseInt(options.verification) as keyof typeof VERIFICATION_LABELS] ?? options.verification}`);\n log(` Timeout: ${formatDuration(parseInt(options.timeout))}\\n`);\n\n spin.start(\"Loading keypair...\");\n \n // Get agent owner address\n const client = getClient();\n const agent = await client.api.getAgent(agentId);\n const ownerAddress = agent.owner;\n\n // Load keypair matching the agent owner\n const keypair = await loadKeypair(options.keystore, ownerAddress);\n spin.text = \"Building transaction...\";\n\n const txConfig: TransactionConfig = {\n packageId: config.packageId,\n };\n\n const tx = buildPublishSkillTx(txConfig, {\n agentId,\n name: options.name,\n version: options.version,\n verificationType: parseInt(options.verification) as VerificationType,\n basePriceMist: parseSui(options.price),\n workerBondMist: parseSui(options.workerBond ?? \"0\"),\n timeoutSeconds: parseInt(options.timeout),\n inputSchemaHash: options.inputSchema ?? \"\",\n outputSchemaHash: options.outputSchema ?? \"\",\n metadataUri: options.metadata ?? \"\",\n });\n\n spin.text = \"Signing and executing transaction...\";\n\n const suiClient = getSuiClient();\n const result = await suiClient.signAndExecuteTransaction({\n transaction: tx,\n signer: keypair,\n options: {\n showEffects: true,\n showObjectChanges: true,\n },\n });\n\n spin.text = \"Waiting for confirmation...\";\n await suiClient.waitForTransaction({ digest: result.digest });\n\n spin.stop();\n\n // Extract skill ID from object changes\n const skillObject = result.objectChanges?.find(\n (c) => c.type === \"created\" && c.objectType?.includes(\"::skill::Skill\")\n );\n const skillId = skillObject?.type === \"created\" ? skillObject.objectId : undefined;\n\n success(`Skill published successfully!`);\n log(`\\n ${colors.muted(\"Transaction:\")} ${result.digest}`);\n if (skillId) {\n log(` ${colors.muted(\"Skill ID:\")} ${skillId}`);\n }\n log(`\\n The indexer will pick up this skill shortly.`);\n log(` Run: clank skill info ${skillId ?? \"<skill-id>\"}`);\n } catch (err) {\n spin.stop();\n error(`Failed to publish skill: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Search skills\n skillCmd\n .command(\"search <query>\")\n .description(\"Search skills by name\")\n .option(\"-l, --limit <number>\", \"Max results\", \"10\")\n .action(async (query: string, options) => {\n const spin = spinner(\"Searching...\").start();\n\n try {\n const client = getClient();\n const result = await client.api.listSkills({\n name: query,\n limit: parseInt(options.limit),\n });\n\n spin.stop();\n\n if (result.data.length === 0) {\n log(`\\nNo skills found matching \"${query}\"\\n`);\n return;\n }\n\n output(result, () => {\n const rows = result.data.map((skill) => [\n skill.name,\n skill.version,\n formatSui(skill.base_price_mist),\n skill.verification_type_label,\n formatAddress(skill.id),\n ]);\n\n return (\n `\\n${colors.primary(\"Search Results\")} for \"${query}\"\\n\\n` +\n table([\"Name\", \"Version\", \"Price\", \"Verification\", \"ID\"], rows)\n );\n });\n } catch (err) {\n spin.stop();\n error(`Search failed: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { getClient } from \"../client.js\";\nimport { STATUS, STATUS_LABELS, PRIORITY_LABELS, PRIORITY, parseSui } from \"@clankxyz/shared\";\nimport {\n buildCreateTaskTx,\n buildAcceptTaskTx,\n buildSubmitTaskTx,\n buildSettleTaskTx,\n type TransactionConfig,\n} from \"@clankxyz/sdk\";\nimport {\n log,\n success,\n error,\n spinner,\n colors,\n table,\n output,\n formatAddress,\n formatSui,\n formatTimestamp,\n loadKeypair,\n getSuiClient,\n} from \"../utils.js\";\nimport { getConfig, getEffectiveConfig } from \"../config.js\";\n\nexport function registerTaskCommands(program: Command): void {\n const taskCmd = program\n .command(\"task\")\n .alias(\"tasks\")\n .description(\"Manage tasks\");\n\n // List tasks\n taskCmd\n .command(\"list\")\n .description(\"List tasks\")\n .option(\"-p, --page <number>\", \"Page number\", \"1\")\n .option(\"-l, --limit <number>\", \"Items per page\", \"20\")\n .option(\"-s, --status <status>\", \"Filter by status (0-9)\")\n .option(\"--skill <id>\", \"Filter by skill ID\")\n .option(\"--requester <id>\", \"Filter by requester agent ID\")\n .option(\"--worker <id>\", \"Filter by worker agent ID\")\n .option(\"--mine\", \"Show my tasks (as requester or worker)\")\n .option(\"--available\", \"Show only available tasks (Posted status)\")\n .option(\"--sort <field>\", \"Sort by: created_at, expires_at, payment, priority\", \"created_at\")\n .option(\"-o, --order <dir>\", \"Sort order: asc, desc\", \"desc\")\n .action(async (options) => {\n const spin = spinner(\"Fetching tasks...\").start();\n\n try {\n const client = getClient();\n const config = getConfig();\n\n let requesterId: string | undefined;\n let workerId: string | undefined;\n let status: number | undefined;\n\n if (options.mine && config.agentId) {\n // Show tasks where user is requester or worker\n // For now, just show as requester - would need two queries for both\n requesterId = config.agentId;\n } else {\n requesterId = options.requester;\n workerId = options.worker;\n }\n\n if (options.available) {\n status = STATUS.POSTED;\n } else if (options.status !== undefined) {\n status = parseInt(options.status);\n }\n\n const result = await client.api.listTasks({\n page: parseInt(options.page),\n limit: parseInt(options.limit),\n status,\n skillId: options.skill,\n requesterId,\n workerId,\n sortBy: options.sort,\n sortOrder: options.order,\n });\n\n spin.stop();\n\n output(result, () => {\n const rows = result.data.map((task) => [\n formatAddress(task.id),\n task.skill.name,\n task.status_label,\n task.priority_label,\n formatSui(task.payment_amount_mist),\n formatTimestamp(task.expires_at),\n ]);\n\n return (\n `\\n${colors.primary(\"Tasks\")} (${result.pagination.total} total)\\n\\n` +\n table([\"ID\", \"Skill\", \"Status\", \"Priority\", \"Payment\", \"Expires\"], rows) +\n `\\n\\nPage ${result.pagination.page}/${result.pagination.pages}`\n );\n });\n } catch (err) {\n spin.stop();\n error(`Failed to list tasks: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Get task details\n taskCmd\n .command(\"info <id>\")\n .description(\"Get task details\")\n .action(async (id: string) => {\n const spin = spinner(\"Fetching task...\").start();\n\n try {\n const client = getClient();\n const task = await client.api.getTask(id);\n\n spin.stop();\n\n output(task, () => {\n let output = `\\n${colors.primary(\"Task Details\")}\\n\\n`;\n output += `${colors.muted(\"ID:\")} ${task.id}\\n`;\n output += `${colors.muted(\"Skill:\")} ${task.skill.name} v${task.skill.version}\\n`;\n output += `${colors.muted(\"Status:\")} ${getStatusColor(task.status)(task.status_label)}\\n`;\n output += `${colors.muted(\"Priority:\")} ${task.priority_label}\\n`;\n output += `${colors.muted(\"Verification:\")} ${task.verification_type_label}\\n`;\n output += `${colors.muted(\"Payment:\")} ${formatSui(task.payment_amount_mist)}\\n`;\n output += `${colors.muted(\"Worker Bond:\")} ${formatSui(task.worker_bond_amount)}\\n`;\n\n output += `\\n${colors.primary(\"Participants\")}\\n`;\n output += `${colors.muted(\"Requester:\")} ${formatAddress(task.requester.id)}\\n`;\n if (task.worker) {\n output += `${colors.muted(\"Worker:\")} ${formatAddress(task.worker.id)}\\n`;\n }\n\n output += `\\n${colors.primary(\"Payload\")}\\n`;\n output += `${colors.muted(\"Input Ref:\")} ${task.input_payload_ref}\\n`;\n if (task.expected_output_hash) {\n output += `${colors.muted(\"Expected Hash:\")} ${task.expected_output_hash.slice(0, 32)}...\\n`;\n }\n if (task.output_ref) {\n output += `${colors.muted(\"Output Ref:\")} ${task.output_ref}\\n`;\n }\n if (task.output_hash) {\n output += `${colors.muted(\"Output Hash:\")} ${task.output_hash.slice(0, 32)}...\\n`;\n }\n\n output += `\\n${colors.primary(\"Timestamps\")}\\n`;\n output += `${colors.muted(\"Created:\")} ${formatTimestamp(task.timestamps.created_at)}\\n`;\n output += `${colors.muted(\"Expires:\")} ${formatTimestamp(task.timestamps.expires_at)}\\n`;\n if (task.timestamps.reserved_at) {\n output += `${colors.muted(\"Reserved:\")} ${formatTimestamp(task.timestamps.reserved_at)}\\n`;\n }\n if (task.timestamps.accepted_at) {\n output += `${colors.muted(\"Accepted:\")} ${formatTimestamp(task.timestamps.accepted_at)}\\n`;\n }\n if (task.timestamps.submitted_at) {\n output += `${colors.muted(\"Submitted:\")} ${formatTimestamp(task.timestamps.submitted_at)}\\n`;\n }\n if (task.timestamps.verified_at) {\n output += `${colors.muted(\"Verified:\")} ${formatTimestamp(task.timestamps.verified_at)}\\n`;\n }\n if (task.timestamps.settled_at) {\n output += `${colors.muted(\"Settled:\")} ${formatTimestamp(task.timestamps.settled_at)}\\n`;\n }\n\n if (task.events.length > 0) {\n output += `\\n${colors.primary(\"Recent Events\")}\\n\\n`;\n const eventRows = task.events.slice(0, 5).map((e) => [\n e.type,\n formatTimestamp(e.timestamp_ms),\n formatAddress(e.tx_digest),\n ]);\n output += table([\"Event\", \"Time\", \"TX\"], eventRows);\n }\n\n return output;\n });\n } catch (err) {\n spin.stop();\n error(`Failed to get task: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Create task on-chain\n taskCmd\n .command(\"create\")\n .description(\"Create a new task with SUI escrow\")\n .requiredOption(\"-s, --skill <id>\", \"Skill ID to request\")\n .requiredOption(\"-p, --payment <sui>\", \"Payment amount in SUI\")\n .requiredOption(\"-i, --input <ref>\", \"Input payload reference (e.g., walrus://...)\")\n .option(\"-a, --agent <id>\", \"Requester agent ID (uses configured agent if not provided)\")\n .option(\"--priority <tier>\", \"Priority: 0=Standard, 1=Priority, 2=Urgent\", \"0\")\n .option(\"-t, --timeout <seconds>\", \"Timeout in seconds (0 = use skill default)\", \"0\")\n .option(\"--expected-hash <hash>\", \"Expected output hash (for deterministic verification)\")\n .option(\"--keystore <path>\", \"Path to Sui keystore\")\n .action(async (options) => {\n const spin = spinner(\"Loading configuration...\").start();\n \n try {\n // Get effective config (auto-fetches packageId from API if not set locally)\n const config = await getEffectiveConfig();\n const agentId = options.agent ?? config.agentId;\n\n if (!agentId) {\n spin.stop();\n error(\"No agent ID provided. Set one with: clank config set agentId <id>\");\n process.exit(1);\n }\n\n if (!config.packageId) {\n spin.stop();\n error(\"Could not get package ID. Make sure you're connected to a Clank API.\");\n log(\" Try: clank config set apiUrl https://clank.xyz\");\n process.exit(1);\n }\n\n spin.stop();\n log(`\\n${colors.primary(\"📋 Creating Task On-Chain\")}\\n`);\n log(` Skill: ${formatAddress(options.skill)}`);\n log(` Payment: ${options.payment} SUI`);\n log(` Priority: ${PRIORITY_LABELS[parseInt(options.priority) as keyof typeof PRIORITY_LABELS] ?? options.priority}`);\n log(` Input: ${options.input}\\n`);\n\n spin.start(\"Loading keypair...\");\n\n // Get agent owner address\n const client = getClient();\n const agent = await client.api.getAgent(agentId);\n const ownerAddress = agent.owner;\n\n const keypair = await loadKeypair(options.keystore, ownerAddress);\n spin.text = \"Building transaction...\";\n\n const txConfig: TransactionConfig = {\n packageId: config.packageId,\n };\n\n const tx = buildCreateTaskTx(txConfig, {\n agentId,\n skillId: options.skill,\n inputPayloadRef: options.input,\n expectedOutputHash: options.expectedHash,\n paymentAmountMist: parseSui(options.payment),\n priorityTier: parseInt(options.priority),\n timeoutSeconds: parseInt(options.timeout),\n });\n\n spin.text = \"Signing and executing transaction...\";\n\n const suiClient = getSuiClient();\n const result = await suiClient.signAndExecuteTransaction({\n transaction: tx,\n signer: keypair,\n options: {\n showEffects: true,\n showObjectChanges: true,\n },\n });\n\n spin.text = \"Waiting for confirmation...\";\n await suiClient.waitForTransaction({ digest: result.digest });\n\n spin.stop();\n\n // Extract task ID from object changes\n const taskObject = result.objectChanges?.find(\n (c) => c.type === \"created\" && c.objectType?.includes(\"::task::Task\")\n );\n const taskId = taskObject?.type === \"created\" ? taskObject.objectId : undefined;\n\n success(`Task created successfully!`);\n log(`\\n ${colors.muted(\"Transaction:\")} ${result.digest}`);\n if (taskId) {\n log(` ${colors.muted(\"Task ID:\")} ${taskId}`);\n }\n log(`\\n ${options.payment} SUI has been escrowed.`);\n log(` Run: clank task info ${taskId ?? \"<task-id>\"}`);\n } catch (err) {\n spin.stop();\n error(`Failed to create task: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Accept task\n taskCmd\n .command(\"accept <task-id>\")\n .description(\"Accept a task (become the worker)\")\n .option(\"-a, --agent <id>\", \"Worker agent ID (uses configured agent if not provided)\")\n .option(\"-b, --bond <sui>\", \"Worker bond amount in SUI (if required)\", \"0\")\n .option(\"--keystore <path>\", \"Path to Sui keystore\")\n .action(async (taskId: string, options) => {\n const spin = spinner(\"Loading configuration...\").start();\n\n try {\n const config = await getEffectiveConfig();\n const agentId = options.agent ?? config.agentId;\n\n if (!agentId) {\n spin.stop();\n error(\"No agent ID provided. Set one with: clank config set agentId <id>\");\n process.exit(1);\n }\n\n if (!config.packageId) {\n spin.stop();\n error(\"Could not get package ID. Make sure you're connected to a Clank API.\");\n process.exit(1);\n }\n\n spin.stop();\n log(`\\n${colors.primary(\"🔧 Accepting Task\")}\\n`);\n log(` Task: ${formatAddress(taskId)}`);\n log(` Agent: ${formatAddress(agentId)}\\n`);\n\n spin.start(\"Loading keypair...\");\n\n const client = getClient();\n const agent = await client.api.getAgent(agentId);\n const ownerAddress = agent.owner;\n\n const keypair = await loadKeypair(options.keystore, ownerAddress);\n spin.text = \"Building transaction...\";\n\n const txConfig: TransactionConfig = {\n packageId: config.packageId,\n };\n\n const tx = buildAcceptTaskTx(txConfig, {\n taskId,\n agentId,\n bondAmountMist: parseSui(options.bond ?? \"0\"),\n });\n\n spin.text = \"Signing and executing transaction...\";\n\n const suiClient = getSuiClient();\n const result = await suiClient.signAndExecuteTransaction({\n transaction: tx,\n signer: keypair,\n options: { showEffects: true },\n });\n\n spin.text = \"Waiting for confirmation...\";\n await suiClient.waitForTransaction({ digest: result.digest });\n\n spin.stop();\n\n success(`Task accepted!`);\n log(`\\n ${colors.muted(\"Transaction:\")} ${result.digest}`);\n log(`\\n You can now work on this task.`);\n log(` Submit output with: clank task submit ${taskId} --output <ref> --hash <hash>`);\n } catch (err) {\n spin.stop();\n error(`Failed to accept task: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Submit task output\n taskCmd\n .command(\"submit <task-id>\")\n .description(\"Submit output for a task\")\n .requiredOption(\"-o, --output <ref>\", \"Output payload reference (e.g., walrus://...)\")\n .requiredOption(\"--hash <hash>\", \"SHA256 hash of output (e.g., sha256:...)\")\n .option(\"-a, --agent <id>\", \"Worker agent ID (uses configured agent if not provided)\")\n .option(\"--keystore <path>\", \"Path to Sui keystore\")\n .action(async (taskId: string, options) => {\n const spin = spinner(\"Loading configuration...\").start();\n\n try {\n const config = await getEffectiveConfig();\n const agentId = options.agent ?? config.agentId;\n\n if (!agentId) {\n spin.stop();\n error(\"No agent ID provided. Set one with: clank config set agentId <id>\");\n process.exit(1);\n }\n\n if (!config.packageId) {\n spin.stop();\n error(\"Could not get package ID. Make sure you're connected to a Clank API.\");\n process.exit(1);\n }\n\n spin.stop();\n log(`\\n${colors.primary(\"📤 Submitting Task Output\")}\\n`);\n log(` Task: ${formatAddress(taskId)}`);\n log(` Output: ${options.output}`);\n log(` Hash: ${options.hash.slice(0, 24)}...\\n`);\n\n spin.start(\"Loading keypair...\");\n\n const client = getClient();\n const agent = await client.api.getAgent(agentId);\n const ownerAddress = agent.owner;\n\n const keypair = await loadKeypair(options.keystore, ownerAddress);\n spin.text = \"Building transaction...\";\n\n const txConfig: TransactionConfig = {\n packageId: config.packageId,\n };\n\n const tx = buildSubmitTaskTx(txConfig, {\n taskId,\n agentId,\n outputRef: options.output,\n outputHash: options.hash,\n });\n\n spin.text = \"Signing and executing transaction...\";\n\n const suiClient = getSuiClient();\n const result = await suiClient.signAndExecuteTransaction({\n transaction: tx,\n signer: keypair,\n options: { showEffects: true },\n });\n\n spin.text = \"Waiting for confirmation...\";\n await suiClient.waitForTransaction({ digest: result.digest });\n\n spin.stop();\n\n success(`Task output submitted!`);\n log(`\\n ${colors.muted(\"Transaction:\")} ${result.digest}`);\n log(`\\n For TimeBound verification, payment is auto-released.`);\n log(` For RequesterConfirm, wait for requester approval.`);\n } catch (err) {\n spin.stop();\n error(`Failed to submit task: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Settle a verified task (claim payment)\n taskCmd\n .command(\"settle <taskId>\")\n .description(\"Settle a verified task to claim payment\")\n .option(\"-a, --agent <id>\", \"Worker agent ID (uses configured agent if not provided)\")\n .option(\"--keystore <path>\", \"Path to Sui keystore\")\n .action(async (taskId: string, options) => {\n const spin = spinner(\"Loading configuration...\").start();\n\n try {\n // Get effective config (auto-fetches packageId from API if not set locally)\n const config = await getEffectiveConfig();\n const agentId = options.agent ?? config.agentId;\n\n if (!agentId) {\n spin.stop();\n error(\"No agent ID provided. Set one with: clank config set agentId <id>\");\n process.exit(1);\n }\n\n if (!config.packageId) {\n spin.stop();\n error(\"Could not get package ID. Make sure you're connected to a Clank API.\");\n log(\" Try: clank config set apiUrl https://clank.xyz\");\n process.exit(1);\n }\n\n if (!config.treasuryId) {\n spin.stop();\n error(\"Could not get treasury ID. Make sure you're connected to a Clank API.\");\n process.exit(1);\n }\n\n // Get task details first\n spin.text = \"Fetching task details...\";\n const client = getClient();\n const task = await client.api.getTask(taskId);\n\n if (task.status !== STATUS.VERIFIED) {\n spin.stop();\n error(`Task is not verified. Current status: ${STATUS_LABELS[task.status as keyof typeof STATUS_LABELS] ?? task.status}`);\n process.exit(1);\n }\n\n if (task.worker?.id !== agentId) {\n spin.stop();\n error(`You are not the worker for this task.`);\n log(` Worker: ${task.worker?.id}`);\n log(` Your agent: ${agentId}`);\n process.exit(1);\n }\n\n spin.stop();\n log(`\\n${colors.primary(\"💰 Settling Task\")}\\n`);\n log(` Task: ${formatAddress(taskId)}`);\n log(` Payment: ${formatSui(task.payment_amount_mist)}`);\n log(` Skill: ${task.skill.name}\\n`);\n\n spin.start(\"Loading keypair...\");\n\n // Get agent owner address\n const agent = await client.api.getAgent(agentId);\n const ownerAddress = agent.owner;\n\n const keypair = await loadKeypair(options.keystore, ownerAddress);\n spin.text = \"Building transaction...\";\n\n const txConfig: TransactionConfig = {\n packageId: config.packageId,\n treasuryId: config.treasuryId,\n };\n\n const tx = buildSettleTaskTx(txConfig, {\n taskId,\n agentId,\n });\n\n spin.text = \"Signing and executing transaction...\";\n\n const suiClient = getSuiClient();\n const result = await suiClient.signAndExecuteTransaction({\n transaction: tx,\n signer: keypair,\n options: { showEffects: true },\n });\n\n spin.text = \"Waiting for confirmation...\";\n await suiClient.waitForTransaction({ digest: result.digest });\n\n spin.stop();\n\n success(`Task settled! Payment received.`);\n log(`\\n ${colors.muted(\"Transaction:\")} ${result.digest}`);\n log(`\\n ${formatSui(task.payment_amount_mist)} (minus protocol fee) has been transferred to your wallet.`);\n } catch (err) {\n spin.stop();\n error(`Failed to settle task: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Watch for available tasks\n taskCmd\n .command(\"watch\")\n .description(\"Watch for new available tasks\")\n .option(\"--skill <id>\", \"Filter by skill ID\")\n .option(\"-i, --interval <seconds>\", \"Poll interval\", \"30\")\n .action(async (options) => {\n log(`\\n${colors.primary(\"Watching for tasks...\")} (Ctrl+C to stop)\\n`);\n\n const interval = parseInt(options.interval) * 1000;\n const seenTasks = new Set<string>();\n\n const poll = async () => {\n try {\n const client = getClient();\n const result = await client.api.listTasks({\n status: STATUS.POSTED,\n skillId: options.skill,\n limit: 20,\n sortBy: \"created_at\",\n sortOrder: \"desc\",\n });\n\n for (const task of result.data) {\n if (!seenTasks.has(task.id)) {\n seenTasks.add(task.id);\n log(\n `${colors.success(\"NEW\")} ${task.skill.name} | ${formatSui(task.payment_amount_mist)} | ${formatAddress(task.id)}`\n );\n }\n }\n } catch (err) {\n error(`Poll failed: ${(err as Error).message}`);\n }\n };\n\n // Initial poll\n await poll();\n\n // Start interval\n setInterval(poll, interval);\n });\n}\n\nfunction getStatusColor(status: number) {\n switch (status) {\n case STATUS.POSTED:\n case STATUS.RESERVED:\n return colors.primary;\n case STATUS.ACCEPTED:\n case STATUS.IN_PROGRESS:\n case STATUS.SUBMITTED:\n return colors.warning;\n case STATUS.VERIFIED:\n case STATUS.SETTLED:\n return colors.success;\n case STATUS.CANCELLED:\n case STATUS.EXPIRED:\n case STATUS.FAILED:\n return colors.error;\n default:\n return colors.muted;\n }\n}\n","import { Command } from \"commander\";\nimport { getClient } from \"../client.js\";\nimport {\n log,\n error,\n spinner,\n colors,\n output,\n formatTimestamp,\n} from \"../utils.js\";\n\nexport function registerHealthCommand(program: Command): void {\n program\n .command(\"health\")\n .description(\"Check API health status\")\n .action(async () => {\n const spin = spinner(\"Checking health...\").start();\n\n try {\n const client = getClient();\n const health = await client.api.health();\n\n spin.stop();\n\n output(health, () => {\n const statusColor =\n health.status === \"healthy\"\n ? colors.success\n : health.status === \"degraded\"\n ? colors.warning\n : colors.error;\n\n let output = `\\n${colors.primary(\"Clank API Health\")}\\n\\n`;\n output += `${colors.muted(\"Status:\")} ${statusColor(health.status.toUpperCase())}\\n`;\n output += `${colors.muted(\"API Version:\")} ${health.apiVersion}\\n`;\n output += `${colors.muted(\"Last Sync:\")} ${formatTimestamp(health.lastSyncTimestamp)}\\n`;\n output += `${colors.muted(\"Sync Age:\")} ${(health.syncAgeMs / 1000).toFixed(0)}s\\n`;\n output += `${colors.muted(\"Blocks Behind:\")} ${health.blocksBehind}\\n`;\n output += `${colors.muted(\"Events Total:\")} ${health.eventsProcessedTotal}\\n`;\n\n if (health.stats) {\n output += `\\n${colors.primary(\"Statistics\")}\\n`;\n output += `${colors.muted(\"Agents:\")} ${health.stats.agents}\\n`;\n output += `${colors.muted(\"Skills:\")} ${health.stats.skills}\\n`;\n output += `${colors.muted(\"Tasks:\")} ${health.stats.tasks}\\n`;\n }\n\n return output;\n });\n } catch (err) {\n spin.stop();\n error(`Health check failed: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { getClient } from \"../client.js\";\nimport { output, colors, formatPercent } from \"../utils.js\";\nimport { BADGE_TIER } from \"@clankxyz/shared\";\n\nexport function registerBadgeCommands(program: Command) {\n const badge = program\n .command(\"badge\")\n .description(\"View agent reputation badges\");\n\n // List badges for an agent\n badge\n .command(\"list [agentId]\")\n .description(\"List badges for an agent (defaults to current agent)\")\n .action(async (agentId?: string) => {\n const spin = ora(\"Fetching badges...\").start();\n\n try {\n const client = getClient();\n const targetId = agentId ?? client.getAgentId();\n\n if (!targetId) {\n spin.fail(\"No agent specified. Use an agent ID or set an active agent.\");\n process.exit(1);\n }\n\n const agent = await client.api.getAgent(targetId);\n\n spin.succeed(`Found ${agent.badges.length} badges`);\n\n output(agent.badges, () => {\n if (agent.badges.length === 0) {\n return `\\n${chalk.yellow(\"No badges earned yet.\")}\\nComplete tasks and verify your identity to earn badges!\\n`;\n }\n\n let out = `\\n${colors.primary(`Badges for ${targetId.slice(0, 16)}...`)}\\n\\n`;\n\n // Table header\n out += `${colors.muted(\"Badge\".padEnd(22))} ${colors.muted(\"Tier\".padEnd(10))} ${colors.muted(\"Earned At\")}\\n`;\n out += `${colors.muted(\"-\".repeat(22))} ${colors.muted(\"-\".repeat(10))} ${colors.muted(\"-\".repeat(20))}\\n`;\n\n for (const b of agent.badges) {\n const badge = (getBadgeIcon(b.badge_type) + \" \" + formatBadgeType(b.badge_type)).padEnd(22);\n const tier = getTierDisplay(b.tier).padEnd(10);\n const earnedAt = new Date(b.earned_at).toLocaleDateString();\n out += `${badge} ${tier} ${earnedAt}\\n`;\n }\n\n // Show badge summary\n const tierCounts = { bronze: 0, silver: 0, gold: 0, platinum: 0 };\n for (const b of agent.badges) {\n const tierName = getTierName(b.tier);\n if (tierName in tierCounts) {\n tierCounts[tierName as keyof typeof tierCounts]++;\n }\n }\n\n out += `\\n${colors.primary(\"Summary\")}\\n`;\n out += ` ${chalk.hex(\"#CD7F32\")(\"●\")} Bronze: ${tierCounts.bronze} `;\n out += `${chalk.gray(\"●\")} Silver: ${tierCounts.silver} `;\n out += `${chalk.yellow(\"●\")} Gold: ${tierCounts.gold} `;\n out += `${chalk.magenta(\"●\")} Platinum: ${tierCounts.platinum}\\n`;\n\n return out;\n });\n } catch (error: unknown) {\n spin.fail(chalk.red(\"Failed to fetch badges\"));\n const err = error as Error;\n console.error(chalk.red(err.message));\n process.exit(1);\n }\n });\n\n // Show available badge types\n badge\n .command(\"types\")\n .description(\"Show available badge types and how to earn them\")\n .action(async () => {\n let out = `\\n${colors.primary(\"Available Badges\")}\\n\\n`;\n\n const badges = [\n {\n type: \"verified_identity\",\n icon: \"✓\",\n description: \"Verified identity via social or wallet\",\n howToEarn: \"Verify your identity using X, GitHub, or wallet signature\",\n },\n {\n type: \"first_task\",\n icon: \"🎯\",\n description: \"Completed first task\",\n howToEarn: \"Complete your first task as a worker\",\n },\n {\n type: \"task_completer\",\n icon: \"📦\",\n description: \"Task completion milestone\",\n howToEarn: \"Complete 10/50/200 tasks for Bronze/Silver/Gold\",\n },\n {\n type: \"reliable_worker\",\n icon: \"⭐\",\n description: \"High completion rate\",\n howToEarn: \"Maintain 90%+ completion rate with 20+ tasks\",\n },\n {\n type: \"high_earner\",\n icon: \"💰\",\n description: \"High earnings milestone\",\n howToEarn: \"Earn 100/1K/10K SUI total\",\n },\n {\n type: \"task_creator\",\n icon: \"📝\",\n description: \"Task creation milestone\",\n howToEarn: \"Post 10/50/200 tasks for Bronze/Silver/Gold\",\n },\n {\n type: \"big_spender\",\n icon: \"💎\",\n description: \"High spending milestone\",\n howToEarn: \"Spend 100/1K/10K SUI total\",\n },\n {\n type: \"networker\",\n icon: \"🌐\",\n description: \"Network growth\",\n howToEarn: \"Work with 5/25/100 unique counterparties\",\n },\n ];\n\n for (const b of badges) {\n out += ` ${b.icon} ${chalk.bold(formatBadgeType(b.type))}\\n`;\n out += ` ${chalk.gray(b.description)}\\n`;\n out += ` ${chalk.cyan(\"How to earn:\")} ${b.howToEarn}\\n\\n`;\n }\n\n out += `${colors.primary(\"Tiers\")}\\n`;\n out += ` ${chalk.hex(\"#CD7F32\")(\"●\")} Bronze - Entry level\\n`;\n out += ` ${chalk.gray(\"●\")} Silver - Intermediate\\n`;\n out += ` ${chalk.yellow(\"●\")} Gold - Advanced\\n`;\n out += ` ${chalk.magenta(\"●\")} Platinum - Expert\\n`;\n\n console.log(out);\n });\n\n // Show badge showcase\n badge\n .command(\"showcase [agentId]\")\n .description(\"Display badges in a showcase format\")\n .action(async (agentId?: string) => {\n const spin = ora(\"Loading showcase...\").start();\n\n try {\n const client = getClient();\n const targetId = agentId ?? client.getAgentId();\n\n if (!targetId) {\n spin.fail(\"No agent specified.\");\n process.exit(1);\n }\n\n const agent = await client.api.getAgent(targetId);\n spin.stop();\n\n if (agent.badges.length === 0) {\n console.log(chalk.yellow(\"\\nNo badges to showcase yet.\"));\n return;\n }\n\n // Group badges by tier\n const byTier: Record<number, typeof agent.badges> = {};\n for (const b of agent.badges) {\n if (!byTier[b.tier]) byTier[b.tier] = [];\n byTier[b.tier].push(b);\n }\n\n let out = `\\n${chalk.bold.underline(\"🏆 Badge Showcase\")}\\n\\n`;\n\n // Display from highest tier to lowest\n for (const tier of [3, 2, 1, 0]) {\n const tierBadges = byTier[tier];\n if (!tierBadges || tierBadges.length === 0) continue;\n\n const tierName = getTierName(tier);\n const tierColor = getTierColor(tier);\n\n out += tierColor(chalk.bold(`━━━ ${tierName.toUpperCase()} ━━━`)) + \"\\n\\n\";\n\n for (const b of tierBadges) {\n out += ` ${getBadgeIcon(b.badge_type)} ${formatBadgeType(b.badge_type)}\\n`;\n }\n out += \"\\n\";\n }\n\n // Stats\n const stats = await client.api.getAgentStats(targetId);\n out += `${colors.primary(\"Agent Stats\")}\\n`;\n out += ` Tasks Completed: ${stats.workerTasksCompleted}\\n`;\n out += ` Tasks Posted: ${stats.requesterTasksPosted}\\n`;\n if (stats.completionRate !== undefined) {\n out += ` Completion Rate: ${formatPercent(stats.completionRate)}\\n`;\n }\n\n console.log(out);\n } catch (error: unknown) {\n spin.fail(chalk.red(\"Failed to load showcase\"));\n const err = error as Error;\n console.error(chalk.red(err.message));\n process.exit(1);\n }\n });\n}\n\nfunction formatBadgeType(type: string): string {\n return type\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nfunction getBadgeIcon(type: string): string {\n const icons: Record<string, string> = {\n verified_identity: \"✓\",\n first_task: \"🎯\",\n task_completer: \"📦\",\n reliable_worker: \"⭐\",\n high_earner: \"💰\",\n task_creator: \"📝\",\n big_spender: \"💎\",\n networker: \"🌐\",\n fast_worker: \"⚡\",\n top_performer: \"🏆\",\n };\n return icons[type] ?? \"🏅\";\n}\n\nfunction getTierName(tier: number): string {\n const names = [\"bronze\", \"silver\", \"gold\", \"platinum\"];\n return names[tier] ?? \"unknown\";\n}\n\nfunction getTierDisplay(tier: number): string {\n const tierName = getTierName(tier);\n const color = getTierColor(tier);\n return color(tierName.charAt(0).toUpperCase() + tierName.slice(1));\n}\n\nfunction getTierColor(tier: number): (text: string) => string {\n switch (tier) {\n case BADGE_TIER.BRONZE:\n return chalk.hex(\"#CD7F32\");\n case BADGE_TIER.SILVER:\n return chalk.gray;\n case BADGE_TIER.GOLD:\n return chalk.yellow;\n case 3: // Platinum\n return chalk.magenta;\n default:\n return chalk.white;\n }\n}\n","import { Command } from \"commander\";\nimport { getClient } from \"../client.js\";\nimport { colors, error, log, output, requireApiKey, spinner, success } from \"../utils.js\";\nimport { CLAIM_TYPE, CLAIM_TYPE_LABELS, CLAIM_STATUS_LABELS } from \"@clankxyz/shared\";\n\nexport function registerClaimCommands(program: Command) {\n const claimCmd = program\n .command(\"claim\")\n .description(\"Identity verification commands\");\n\n // === claim generate ===\n claimCmd\n .command(\"generate <type>\")\n .description(\"Generate a verification claim\")\n .addHelpText(\n \"after\",\n `\nClaim Types:\n twitter - Verify via Twitter/X post\n moltbook - Verify via Moltbook post\n github - Verify via GitHub Gist\n wallet - Verify via wallet signature\n\nExamples:\n $ clank claim generate twitter\n $ clank claim generate github\n $ clank claim generate wallet\n`\n )\n .action(async (type: string) => {\n await requireApiKey();\n const client = getClient();\n\n // Map type string to number\n const typeMap: Record<string, number> = {\n twitter: CLAIM_TYPE.TWITTER,\n x: CLAIM_TYPE.TWITTER,\n moltbook: CLAIM_TYPE.MOLTBOOK,\n github: CLAIM_TYPE.GITHUB,\n wallet: CLAIM_TYPE.WALLET,\n };\n\n const claimType = typeMap[type.toLowerCase()];\n if (claimType === undefined) {\n error(`Invalid claim type: ${type}`);\n log(\"Valid types: twitter, moltbook, github, wallet\");\n process.exit(1);\n }\n\n const spin = spinner(`Generating ${type} claim...`).start();\n\n try {\n const result = await client.api.generateClaim(claimType);\n spin.stop();\n\n success(`Claim generated successfully!\\n`);\n\n output(result, () => {\n let str = `${colors.primary(\"Claim Details\")}\\n\\n`;\n str += ` Claim ID: ${result.claim_id}\\n`;\n str += ` Type: ${result.claim_type}\\n`;\n str += ` Status: ${result.status}\\n`;\n str += ` Code: ${colors.success(result.verification_code)}\\n\\n`;\n str += `${colors.primary(\"Instructions\")}\\n\\n`;\n str += ` ${result.instructions.split(\"\\n\").join(\"\\n \")}\\n\\n`;\n str += `${colors.muted(\"Next step:\")}\\n`;\n str += ` After completing the verification step, run:\\n`;\n str += ` clank claim verify ${result.claim_id} <post_url_or_signature>\\n`;\n return str;\n });\n } catch (err) {\n spin.stop();\n error(`Failed to generate claim: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // === claim verify ===\n claimCmd\n .command(\"verify <claim-id> <proof>\")\n .description(\"Verify a pending claim with post URL or signature\")\n .addHelpText(\n \"after\",\n `\nArguments:\n claim-id - The claim ID from 'claim generate'\n proof - Post URL (twitter/moltbook/github) or wallet signature\n\nExamples:\n $ clank claim verify abc123 https://twitter.com/user/status/123456789\n $ clank claim verify abc123 https://gist.github.com/user/abc123\n $ clank claim verify abc123 <base64-signature>\n`\n )\n .action(async (claimId: string, proof: string) => {\n await requireApiKey();\n const client = getClient();\n\n const spin = spinner(\"Verifying claim...\").start();\n\n try {\n // Determine if proof is URL or signature\n const isUrl = proof.startsWith(\"http\");\n\n const result = await client.api.verifyClaim({\n claimId,\n postUrl: isUrl ? proof : undefined,\n signature: !isUrl ? proof : undefined,\n });\n\n spin.stop();\n\n success(`Claim verified successfully!\\n`);\n\n output(result, () => {\n let str = `${colors.primary(\"Verification Result\")}\\n\\n`;\n str += ` Claim ID: ${result.claim_id}\\n`;\n str += ` Type: ${result.claim_type}\\n`;\n str += ` Handle: ${result.verified_handle || \"N/A\"}\\n`;\n str += ` Verified: ${result.verified_at}\\n`;\n if (result.badge_awarded) {\n str += `\\n 🏅 Badge Awarded: ${result.badge_awarded}\\n`;\n }\n return str;\n });\n } catch (err) {\n spin.stop();\n error(`Verification failed: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // === claim status ===\n claimCmd\n .command(\"status <claim-id>\")\n .description(\"Get claim status\")\n .action(async (claimId: string) => {\n const client = getClient();\n\n const spin = spinner(\"Fetching claim...\").start();\n\n try {\n const result = await client.api.getClaim(claimId);\n spin.stop();\n\n output(result, () => {\n let str = `${colors.primary(\"Claim Details\")}\\n\\n`;\n str += ` ID: ${result.id}\\n`;\n str += ` Agent: ${result.agent_id}\\n`;\n str += ` Type: ${result.claim_type_label}\\n`;\n str += ` Status: ${result.status_label}\\n`;\n if (result.verification_code) {\n str += ` Code: ${result.verification_code}\\n`;\n }\n if (result.verified_handle) {\n str += ` Handle: ${result.verified_handle}\\n`;\n }\n if (result.post_url) {\n str += ` Post URL: ${result.post_url}\\n`;\n }\n str += ` Created: ${result.created_at}\\n`;\n if (result.verified_at) {\n str += ` Verified: ${result.verified_at}\\n`;\n }\n if (result.revoked_at) {\n str += ` Revoked: ${result.revoked_at}\\n`;\n }\n return str;\n });\n } catch (err) {\n spin.stop();\n error(`Failed to fetch claim: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // === claim revoke ===\n claimCmd\n .command(\"revoke <claim-id>\")\n .description(\"Revoke a verification claim\")\n .action(async (claimId: string) => {\n await requireApiKey();\n const client = getClient();\n\n const spin = spinner(\"Revoking claim...\").start();\n\n try {\n const result = await client.api.revokeClaim(claimId);\n spin.stop();\n\n success(result.message);\n } catch (err) {\n spin.stop();\n error(`Failed to revoke claim: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // === claim list ===\n claimCmd\n .command(\"list\")\n .description(\"List your claims (requires linked agent)\")\n .action(async () => {\n await requireApiKey();\n const client = getClient();\n\n const spin = spinner(\"Fetching claims...\").start();\n\n try {\n // Get the agent's claims via the agent detail endpoint\n const config = await import(\"../config.js\").then((m) => m.getConfig());\n if (!config.agentId) {\n spin.stop();\n error(\"No agent linked. Use 'clank agent link' first.\");\n process.exit(1);\n }\n\n const agent = await client.api.getAgent(config.agentId);\n spin.stop();\n\n if (!agent.claims || agent.claims.length === 0) {\n log(\"No claims found for this agent.\\n\");\n log(\"Generate a claim with: clank claim generate <type>\");\n return;\n }\n\n log(`\\n${colors.primary(\"Your Claims\")}\\n`);\n\n const table = agent.claims.map((c: {\n id: string;\n claim_type: number;\n claim_type_label?: string;\n status: number;\n status_label?: string;\n verified_handle?: string;\n verified_at?: string;\n }) => ({\n ID: c.id.slice(0, 8) + \"...\",\n Type: c.claim_type_label || CLAIM_TYPE_LABELS[c.claim_type as keyof typeof CLAIM_TYPE_LABELS] || \"Unknown\",\n Status: c.status_label || CLAIM_STATUS_LABELS[c.status as keyof typeof CLAIM_STATUS_LABELS] || \"Unknown\",\n Handle: c.verified_handle || \"-\",\n \"Verified At\": c.verified_at || \"-\",\n }));\n\n console.table(table);\n } catch (err) {\n spin.stop();\n error(`Failed to list claims: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { getClient } from \"../client.js\";\nimport {\n log,\n success,\n error,\n spinner,\n colors,\n table,\n output,\n formatAddress,\n formatTimestamp,\n formatSui,\n requireApiKey,\n} from \"../utils.js\";\nimport { getConfig } from \"../config.js\";\n\nexport function registerProposalCommands(program: Command): void {\n const proposalCmd = program\n .command(\"proposal\")\n .description(\"Manage task proposals (bids)\");\n\n // List proposals\n proposalCmd\n .command(\"list\")\n .description(\"List proposals\")\n .option(\"-t, --task <id>\", \"Filter by task ID\")\n .option(\"-w, --worker <id>\", \"Filter by worker agent ID\")\n .option(\"-r, --requester <id>\", \"Filter by requester agent ID\")\n .option(\"-s, --status <status>\", \"Filter by status (0=pending, 1=accepted, 2=rejected, 3=withdrawn)\")\n .option(\"-m, --mine\", \"Show only my proposals\")\n .option(\"-p, --page <number>\", \"Page number\", \"1\")\n .option(\"-l, --limit <number>\", \"Items per page\", \"20\")\n .action(async (options) => {\n requireApiKey();\n const config = getConfig();\n const spin = spinner(\"Fetching proposals...\").start();\n\n try {\n const params = new URLSearchParams();\n if (options.task) params.set(\"task_id\", options.task);\n if (options.worker) params.set(\"worker_id\", options.worker);\n if (options.requester) params.set(\"requester_id\", options.requester);\n if (options.status) params.set(\"status\", options.status);\n if (options.mine && config.agentId) params.set(\"worker_id\", config.agentId);\n params.set(\"page\", options.page);\n params.set(\"limit\", options.limit);\n\n const response = await fetch(`${config.apiUrl}/api/proposals?${params.toString()}`, {\n headers: { \"Authorization\": `Bearer ${config.apiKey}` },\n });\n\n const data = await response.json();\n spin.stop();\n\n if (!response.ok) {\n error(`Failed to list proposals: ${data.error}`);\n process.exit(1);\n }\n\n output(data, () => {\n if (data.proposals.length === 0) {\n return `\\n${colors.muted(\"No proposals found\")}\\n`;\n }\n\n const rows = data.proposals.map((p: {\n id: string;\n task: { skill: { name: string } };\n proposed_price_sui: string;\n status_label: string;\n created_at: string;\n }) => [\n formatAddress(p.id, 8),\n p.task.skill.name,\n `${p.proposed_price_sui} SUI`,\n p.status_label,\n formatTimestamp(p.created_at),\n ]);\n\n return (\n `\\n${colors.primary(\"Proposals\")} (${data.pagination.total} total)\\n\\n` +\n table([\"ID\", \"Skill\", \"Bid\", \"Status\", \"Created\"], rows) +\n `\\n\\nPage ${data.pagination.page}/${data.pagination.pages}`\n );\n });\n } catch (err) {\n spin.stop();\n error(`Failed to list proposals: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Create proposal\n proposalCmd\n .command(\"create <task-id>\")\n .description(\"Submit a proposal (bid) for a task\")\n .option(\"-p, --price <mist>\", \"Proposed price in MIST\")\n .option(\"-s, --sui <amount>\", \"Proposed price in SUI\")\n .option(\"-m, --message <text>\", \"Message to the requester\")\n .option(\"-t, --time <seconds>\", \"Estimated time to complete (seconds)\")\n .action(async (taskId: string, options) => {\n requireApiKey();\n const config = getConfig();\n\n if (!config.agentId) {\n error(\"No agent configured. Use: clank agent use <id>\");\n process.exit(1);\n }\n\n // Parse price\n let priceMist: bigint;\n if (options.price) {\n priceMist = BigInt(options.price);\n } else if (options.sui) {\n priceMist = BigInt(Math.round(parseFloat(options.sui) * 1e9));\n } else {\n error(\"Price is required. Use --price <mist> or --sui <amount>\");\n process.exit(1);\n }\n\n log(`\\n${colors.primary(\"Creating Proposal\")}\\n`);\n log(`Task: ${formatAddress(taskId)}`);\n log(`Bid: ${formatSui(priceMist.toString())}`);\n if (options.message) log(`Message: ${options.message}`);\n if (options.time) log(`Est. Time: ${options.time}s`);\n\n const spin = spinner(\"Submitting proposal...\").start();\n\n try {\n const response = await fetch(`${config.apiUrl}/api/proposals`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `Bearer ${config.apiKey}`,\n },\n body: JSON.stringify({\n task_id: taskId,\n proposed_price_mist: priceMist.toString(),\n message: options.message,\n estimated_time_secs: options.time ? parseInt(options.time) : undefined,\n }),\n });\n\n const data = await response.json();\n spin.stop();\n\n if (!response.ok) {\n error(`Failed to create proposal: ${data.error}`);\n if (data.proposal_id) {\n log(`You already have a proposal: ${data.proposal_id}`);\n }\n process.exit(1);\n }\n\n success(`Proposal submitted!`);\n log(`\\n Proposal ID: ${data.proposal.id}`);\n log(` Status: ${data.proposal.status_label}`);\n log(` Expires: ${formatTimestamp(data.proposal.expires_at)}`);\n log(`\\nThe requester will review your proposal and accept or reject it.`);\n } catch (err) {\n spin.stop();\n error(`Failed to create proposal: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Get proposal details\n proposalCmd\n .command(\"info <id>\")\n .description(\"Get proposal details\")\n .action(async (id: string) => {\n requireApiKey();\n const config = getConfig();\n const spin = spinner(\"Fetching proposal...\").start();\n\n try {\n const response = await fetch(`${config.apiUrl}/api/proposals/${id}`, {\n headers: { \"Authorization\": `Bearer ${config.apiKey}` },\n });\n\n const data = await response.json();\n spin.stop();\n\n if (!response.ok) {\n error(`Failed to get proposal: ${data.error}`);\n process.exit(1);\n }\n\n const p = data.proposal;\n output(data, () => {\n let out = `\\n${colors.primary(\"Proposal Details\")}\\n\\n`;\n out += `${colors.muted(\"ID:\")} ${p.id}\\n`;\n out += `${colors.muted(\"Status:\")} ${p.status_label}\\n`;\n out += `${colors.muted(\"Proposed Price:\")} ${p.proposed_price_sui} SUI\\n`;\n out += `${colors.muted(\"Message:\")} ${p.message || \"(none)\"}\\n`;\n out += `${colors.muted(\"Est. Time:\")} ${p.estimated_time_secs ? `${p.estimated_time_secs}s` : \"(not specified)\"}\\n`;\n out += `${colors.muted(\"Created:\")} ${formatTimestamp(p.created_at)}\\n`;\n out += `${colors.muted(\"Expires:\")} ${formatTimestamp(p.expires_at)}\\n`;\n if (p.responded_at) {\n out += `${colors.muted(\"Responded:\")} ${formatTimestamp(p.responded_at)}\\n`;\n }\n out += `\\n${colors.highlight(\"Task\")}\\n`;\n out += ` ID: ${p.task.id}\\n`;\n out += ` Skill: ${p.task.skill.name} v${p.task.skill.version}\\n`;\n out += ` Original Price: ${(Number(p.task.original_price_mist) / 1e9).toFixed(4)} SUI\\n`;\n out += `\\n${colors.highlight(\"Worker\")}\\n`;\n out += ` ${p.worker.name || formatAddress(p.worker.agent_id)}\\n`;\n out += `\\n${colors.highlight(\"Requester\")}\\n`;\n out += ` ${p.task.requester.name || formatAddress(p.task.requester.agent_id)}\\n`;\n return out;\n });\n } catch (err) {\n spin.stop();\n error(`Failed to get proposal: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Accept proposal (requester)\n proposalCmd\n .command(\"accept <id>\")\n .description(\"Accept a proposal (assigns task to the proposer)\")\n .action(async (id: string) => {\n requireApiKey();\n const config = getConfig();\n\n log(`\\n${colors.primary(\"Accepting Proposal\")}\\n`);\n log(`Proposal ID: ${formatAddress(id)}`);\n\n const spin = spinner(\"Accepting proposal...\").start();\n\n try {\n const response = await fetch(`${config.apiUrl}/api/proposals/${id}`, {\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `Bearer ${config.apiKey}`,\n },\n body: JSON.stringify({ action: \"accept\" }),\n });\n\n const data = await response.json();\n spin.stop();\n\n if (!response.ok) {\n error(`Failed to accept proposal: ${data.error}`);\n process.exit(1);\n }\n\n success(`Proposal accepted!`);\n log(`\\n Task: ${data.task_id}`);\n log(` Worker: ${formatAddress(data.worker_agent_id)}`);\n log(` Price: ${formatSui(data.accepted_price_mist)}`);\n log(`\\nThe task is now reserved for the worker.`);\n } catch (err) {\n spin.stop();\n error(`Failed to accept proposal: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Reject proposal (requester)\n proposalCmd\n .command(\"reject <id>\")\n .description(\"Reject a proposal\")\n .action(async (id: string) => {\n requireApiKey();\n const config = getConfig();\n\n const spin = spinner(\"Rejecting proposal...\").start();\n\n try {\n const response = await fetch(`${config.apiUrl}/api/proposals/${id}`, {\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `Bearer ${config.apiKey}`,\n },\n body: JSON.stringify({ action: \"reject\" }),\n });\n\n const data = await response.json();\n spin.stop();\n\n if (!response.ok) {\n error(`Failed to reject proposal: ${data.error}`);\n process.exit(1);\n }\n\n success(`Proposal rejected.`);\n } catch (err) {\n spin.stop();\n error(`Failed to reject proposal: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\n // Withdraw proposal (worker)\n proposalCmd\n .command(\"withdraw <id>\")\n .description(\"Withdraw your proposal\")\n .action(async (id: string) => {\n requireApiKey();\n const config = getConfig();\n\n const spin = spinner(\"Withdrawing proposal...\").start();\n\n try {\n const response = await fetch(`${config.apiUrl}/api/proposals/${id}`, {\n method: \"DELETE\",\n headers: { \"Authorization\": `Bearer ${config.apiKey}` },\n });\n\n const data = await response.json();\n spin.stop();\n\n if (!response.ok) {\n error(`Failed to withdraw proposal: ${data.error}`);\n process.exit(1);\n }\n\n success(`Proposal withdrawn.`);\n } catch (err) {\n spin.stop();\n error(`Failed to withdraw proposal: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n}\n"],"mappings":"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","names":["chalk","config","config","secretKey","program","config","config","program","output","config","Ed25519Keypair","decodeSuiPrivateKey","data","spin","program","output","config","STATUS_LABELS","parseSui","program","config","output","parseSui","STATUS_LABELS","program","output","chalk","ora","program","ora","chalk","badge","error","program","config","table","program","config","chalk","config"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clankxyz/cli",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "CLI tool for Clank Protocol - Agent-to-Agent Skills Marketplace",
5
5
  "type": "module",
6
6
  "bin": {
@@ -17,8 +17,8 @@
17
17
  "conf": "^13.0.0",
18
18
  "ora": "^8.0.0",
19
19
  "prompts": "^2.4.2",
20
- "@clankxyz/sdk": "0.1.0",
21
- "@clankxyz/shared": "0.1.0"
20
+ "@clankxyz/sdk": "0.1.1",
21
+ "@clankxyz/shared": "0.1.1"
22
22
  },
23
23
  "devDependencies": {
24
24
  "@types/node": "^20",
@@ -34,9 +34,10 @@
34
34
  "cli"
35
35
  ],
36
36
  "license": "MIT",
37
+ "homepage": "https://clank.xyz",
37
38
  "repository": {
38
39
  "type": "git",
39
- "url": "https://github.com/clankxyz/clankxyz"
40
+ "url": "https://github.com/mission69b/clankxyz"
40
41
  },
41
42
  "scripts": {
42
43
  "build": "tsup",