@molted/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/dist/commands/approve.d.ts +8 -0
  2. package/dist/commands/approve.d.ts.map +1 -0
  3. package/dist/commands/approve.js +106 -0
  4. package/dist/commands/approve.js.map +1 -0
  5. package/dist/commands/bids/create.d.ts +8 -0
  6. package/dist/commands/bids/create.d.ts.map +1 -0
  7. package/dist/commands/bids/create.js +70 -0
  8. package/dist/commands/bids/create.js.map +1 -0
  9. package/dist/commands/bids/index.d.ts +8 -0
  10. package/dist/commands/bids/index.d.ts.map +1 -0
  11. package/dist/commands/bids/index.js +11 -0
  12. package/dist/commands/bids/index.js.map +1 -0
  13. package/dist/commands/complete.d.ts +8 -0
  14. package/dist/commands/complete.d.ts.map +1 -0
  15. package/dist/commands/complete.js +82 -0
  16. package/dist/commands/complete.js.map +1 -0
  17. package/dist/commands/init.d.ts +8 -0
  18. package/dist/commands/init.d.ts.map +1 -0
  19. package/dist/commands/init.js +171 -0
  20. package/dist/commands/init.js.map +1 -0
  21. package/dist/commands/jobs/index.d.ts +8 -0
  22. package/dist/commands/jobs/index.d.ts.map +1 -0
  23. package/dist/commands/jobs/index.js +13 -0
  24. package/dist/commands/jobs/index.js.map +1 -0
  25. package/dist/commands/jobs/list.d.ts +8 -0
  26. package/dist/commands/jobs/list.d.ts.map +1 -0
  27. package/dist/commands/jobs/list.js +63 -0
  28. package/dist/commands/jobs/list.js.map +1 -0
  29. package/dist/commands/jobs/view.d.ts +8 -0
  30. package/dist/commands/jobs/view.d.ts.map +1 -0
  31. package/dist/commands/jobs/view.js +62 -0
  32. package/dist/commands/jobs/view.js.map +1 -0
  33. package/dist/commands/status.d.ts +8 -0
  34. package/dist/commands/status.d.ts.map +1 -0
  35. package/dist/commands/status.js +117 -0
  36. package/dist/commands/status.js.map +1 -0
  37. package/dist/index.d.ts +8 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +28 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/lib/api-client.d.ts +140 -0
  42. package/dist/lib/api-client.d.ts.map +1 -0
  43. package/dist/lib/api-client.js +169 -0
  44. package/dist/lib/api-client.js.map +1 -0
  45. package/dist/lib/config.d.ts +96 -0
  46. package/dist/lib/config.d.ts.map +1 -0
  47. package/dist/lib/config.js +150 -0
  48. package/dist/lib/config.js.map +1 -0
  49. package/dist/lib/errors.d.ts +36 -0
  50. package/dist/lib/errors.d.ts.map +1 -0
  51. package/dist/lib/errors.js +71 -0
  52. package/dist/lib/errors.js.map +1 -0
  53. package/dist/lib/output.d.ts +79 -0
  54. package/dist/lib/output.d.ts.map +1 -0
  55. package/dist/lib/output.js +155 -0
  56. package/dist/lib/output.js.map +1 -0
  57. package/dist/lib/validation.d.ts +85 -0
  58. package/dist/lib/validation.d.ts.map +1 -0
  59. package/dist/lib/validation.js +60 -0
  60. package/dist/lib/validation.js.map +1 -0
  61. package/dist/lib/wallet/cdp-provider.d.ts +37 -0
  62. package/dist/lib/wallet/cdp-provider.d.ts.map +1 -0
  63. package/dist/lib/wallet/cdp-provider.js +126 -0
  64. package/dist/lib/wallet/cdp-provider.js.map +1 -0
  65. package/dist/lib/wallet/index.d.ts +26 -0
  66. package/dist/lib/wallet/index.d.ts.map +1 -0
  67. package/dist/lib/wallet/index.js +93 -0
  68. package/dist/lib/wallet/index.js.map +1 -0
  69. package/dist/lib/wallet/local-provider.d.ts +26 -0
  70. package/dist/lib/wallet/local-provider.d.ts.map +1 -0
  71. package/dist/lib/wallet/local-provider.js +84 -0
  72. package/dist/lib/wallet/local-provider.js.map +1 -0
  73. package/dist/lib/wallet/types.d.ts +58 -0
  74. package/dist/lib/wallet/types.d.ts.map +1 -0
  75. package/dist/lib/wallet/types.js +41 -0
  76. package/dist/lib/wallet/types.js.map +1 -0
  77. package/dist/lib/x402/client.d.ts +39 -0
  78. package/dist/lib/x402/client.d.ts.map +1 -0
  79. package/dist/lib/x402/client.js +83 -0
  80. package/dist/lib/x402/client.js.map +1 -0
  81. package/dist/test/config.test.d.ts +2 -0
  82. package/dist/test/config.test.d.ts.map +1 -0
  83. package/dist/test/config.test.js +79 -0
  84. package/dist/test/config.test.js.map +1 -0
  85. package/dist/test/errors.test.d.ts +2 -0
  86. package/dist/test/errors.test.d.ts.map +1 -0
  87. package/dist/test/errors.test.js +71 -0
  88. package/dist/test/errors.test.js.map +1 -0
  89. package/dist/test/validation.test.d.ts +2 -0
  90. package/dist/test/validation.test.d.ts.map +1 -0
  91. package/dist/test/validation.test.js +154 -0
  92. package/dist/test/validation.test.js.map +1 -0
  93. package/dist/test/wallet-types.test.d.ts +2 -0
  94. package/dist/test/wallet-types.test.d.ts.map +1 -0
  95. package/dist/test/wallet-types.test.js +36 -0
  96. package/dist/test/wallet-types.test.js.map +1 -0
  97. package/dist/test/x402.test.d.ts +2 -0
  98. package/dist/test/x402.test.d.ts.map +1 -0
  99. package/dist/test/x402.test.js +114 -0
  100. package/dist/test/x402.test.js.map +1 -0
  101. package/package.json +60 -0
@@ -0,0 +1,8 @@
1
+ /**
2
+ * molted approve
3
+ *
4
+ * Approve or reject a job completion with x402 payment flow.
5
+ */
6
+ import { Command } from "commander";
7
+ export declare const approveCommand: Command;
8
+ //# sourceMappingURL=approve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approve.d.ts","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,eAAO,MAAM,cAAc,SAyHvB,CAAC"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * molted approve
3
+ *
4
+ * Approve or reject a job completion with x402 payment flow.
5
+ */
6
+ import { Command } from "commander";
7
+ import { loadConfig, requireApiKey } from "../lib/config.js";
8
+ import { createApiClient } from "../lib/api-client.js";
9
+ import { createWalletFromConfig } from "../lib/wallet/index.js";
10
+ import { isPaymentRequired, validatePaymentRequirement, executePayment, formatUSDCAmount, } from "../lib/x402/client.js";
11
+ import { handleError, ValidationError, PaymentError } from "../lib/errors.js";
12
+ import * as output from "../lib/output.js";
13
+ export const approveCommand = new Command("approve")
14
+ .description("Approve or reject a job completion")
15
+ .requiredOption("--job <jobId>", "Job ID")
16
+ .option("--reject", "Reject the completion instead of approving")
17
+ .action(async (options) => {
18
+ try {
19
+ const config = await loadConfig();
20
+ const apiKey = requireApiKey();
21
+ const client = createApiClient(config, apiKey);
22
+ const jobId = options.job;
23
+ const shouldReject = options.reject;
24
+ // Validate job ID format
25
+ const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
26
+ if (!uuidRegex.test(jobId)) {
27
+ throw new ValidationError("Invalid job ID format");
28
+ }
29
+ if (shouldReject) {
30
+ // Rejection flow - no payment needed
31
+ const spin = output.spinner("Rejecting completion...");
32
+ spin.start();
33
+ const response = await client.approve({
34
+ job_id: jobId,
35
+ approved: false,
36
+ });
37
+ if (isPaymentRequired(response)) {
38
+ throw new PaymentError("Unexpected payment required for rejection");
39
+ }
40
+ spin.succeed("Completion rejected.");
41
+ console.log();
42
+ output.keyValue("Job ID", jobId);
43
+ output.info("No payment was processed.");
44
+ return;
45
+ }
46
+ // Approval flow with x402 payment
47
+ // Step 1: Initial request (will return 402)
48
+ const spin = output.spinner("Initiating approval...");
49
+ spin.start();
50
+ const initialResponse = await client.approve({
51
+ job_id: jobId,
52
+ approved: true,
53
+ });
54
+ // Check if we got a success response (payment already processed)
55
+ if (!isPaymentRequired(initialResponse)) {
56
+ spin.succeed("Job already approved and paid!");
57
+ console.log();
58
+ if ("payment_tx_hash" in initialResponse) {
59
+ output.keyValue("TX Hash", initialResponse.payment_tx_hash || "N/A");
60
+ }
61
+ return;
62
+ }
63
+ // Step 2: Validate payment requirement
64
+ spin.text = "Processing payment requirement...";
65
+ const paymentResponse = initialResponse;
66
+ const requirement = validatePaymentRequirement(paymentResponse);
67
+ const amountFormatted = formatUSDCAmount(BigInt(requirement.amount));
68
+ spin.info(`Payment required: ${amountFormatted} USDC to ${output.truncateAddress(requirement.payTo)}`);
69
+ // Step 3: Initialize wallet and send payment
70
+ spin.text = "Initializing wallet...";
71
+ spin.start();
72
+ const wallet = await createWalletFromConfig(config);
73
+ spin.text = `Sending ${amountFormatted} USDC...`;
74
+ const txHash = await executePayment(wallet, requirement);
75
+ spin.succeed(`Payment sent! TX: ${output.truncateAddress(txHash)}`);
76
+ // Step 4: Retry with payment header
77
+ const verifySpinner = output.spinner("Verifying payment...");
78
+ verifySpinner.start();
79
+ const finalResponse = await client.approve({
80
+ job_id: jobId,
81
+ approved: true,
82
+ }, txHash);
83
+ if (isPaymentRequired(finalResponse)) {
84
+ verifySpinner.fail("Payment verification failed");
85
+ throw new PaymentError("Payment was sent but verification failed. TX Hash: " + txHash);
86
+ }
87
+ verifySpinner.succeed("Payment verified!");
88
+ // Display success
89
+ console.log();
90
+ output.divider();
91
+ console.log();
92
+ output.success("Job approved and paid!");
93
+ console.log();
94
+ output.keyValue("Job ID", jobId);
95
+ output.keyValue("Amount", `${amountFormatted} USDC`);
96
+ output.keyValue("Paid To", requirement.payTo);
97
+ output.keyValue("TX Hash", txHash);
98
+ output.keyValue("Network", config.network);
99
+ console.log();
100
+ output.muted(`View transaction: https://sepolia.basescan.org/tx/${txHash}`);
101
+ }
102
+ catch (error) {
103
+ handleError(error);
104
+ }
105
+ });
106
+ //# sourceMappingURL=approve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approve.js","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * molted bids create
3
+ *
4
+ * Bid on an open job.
5
+ */
6
+ import { Command } from "commander";
7
+ export declare const createBidCommand: Command;
8
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/bids/create.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,eAAO,MAAM,gBAAgB,SAiDzB,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * molted bids create
3
+ *
4
+ * Bid on an open job.
5
+ */
6
+ import { Command } from "commander";
7
+ import { loadConfig, requireApiKey } from "../../lib/config.js";
8
+ import { createApiClient } from "../../lib/api-client.js";
9
+ import { handleError, ValidationError } from "../../lib/errors.js";
10
+ import * as output from "../../lib/output.js";
11
+ /**
12
+ * Read from stdin
13
+ */
14
+ async function readStdin() {
15
+ return new Promise((resolve, reject) => {
16
+ let data = "";
17
+ process.stdin.setEncoding("utf8");
18
+ process.stdin.on("data", (chunk) => {
19
+ data += chunk;
20
+ });
21
+ process.stdin.on("end", () => {
22
+ resolve(data.trim());
23
+ });
24
+ process.stdin.on("error", reject);
25
+ });
26
+ }
27
+ export const createBidCommand = new Command("create")
28
+ .description("Create a bid on a job")
29
+ .requiredOption("--job <jobId>", "Job ID to bid on")
30
+ .option("--message <text>", "Bid message (use '-' to read from stdin)")
31
+ .action(async (options) => {
32
+ try {
33
+ const config = await loadConfig();
34
+ const apiKey = requireApiKey();
35
+ const client = createApiClient(config, apiKey);
36
+ const jobId = options.job;
37
+ let message = options.message;
38
+ // Handle stdin input
39
+ if (message === "-") {
40
+ output.info("Reading message from stdin...");
41
+ message = await readStdin();
42
+ }
43
+ // Validate job ID format
44
+ const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
45
+ if (!uuidRegex.test(jobId)) {
46
+ throw new ValidationError("Invalid job ID format");
47
+ }
48
+ const spin = output.spinner("Creating bid...");
49
+ spin.start();
50
+ const bid = await client.createBid({
51
+ job_id: jobId,
52
+ message: message || undefined,
53
+ });
54
+ spin.succeed("Bid created successfully!");
55
+ console.log();
56
+ output.keyValue("Bid ID", bid.id);
57
+ output.keyValue("Job ID", bid.job_id);
58
+ output.keyValue("Status", bid.status);
59
+ output.keyValue("Created", output.formatDate(bid.created_at));
60
+ if (bid.message) {
61
+ console.log();
62
+ output.header("Message");
63
+ console.log(bid.message);
64
+ }
65
+ }
66
+ catch (error) {
67
+ handleError(error);
68
+ }
69
+ });
70
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/bids/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * molted bids
3
+ *
4
+ * Bid-related commands.
5
+ */
6
+ import { Command } from "commander";
7
+ export declare const bidsCommand: Command;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/bids/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,WAAW,SAEO,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * molted bids
3
+ *
4
+ * Bid-related commands.
5
+ */
6
+ import { Command } from "commander";
7
+ import { createBidCommand } from "./create.js";
8
+ export const bidsCommand = new Command("bids")
9
+ .description("Bid management commands")
10
+ .addCommand(createBidCommand);
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/bids/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,yBAAyB,CAAC;KACtC,UAAU,CAAC,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * molted complete
3
+ *
4
+ * Submit completion proof for a job.
5
+ */
6
+ import { Command } from "commander";
7
+ export declare const completeCommand: Command;
8
+ //# sourceMappingURL=complete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complete.d.ts","sourceRoot":"","sources":["../../src/commands/complete.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBpC,eAAO,MAAM,eAAe,SA6DxB,CAAC"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * molted complete
3
+ *
4
+ * Submit completion proof for a job.
5
+ */
6
+ import { Command } from "commander";
7
+ import * as fs from "fs/promises";
8
+ import { loadConfig, requireApiKey } from "../lib/config.js";
9
+ import { createApiClient } from "../lib/api-client.js";
10
+ import { handleError, ValidationError, MoltedError } from "../lib/errors.js";
11
+ import * as output from "../lib/output.js";
12
+ /**
13
+ * Read from stdin
14
+ */
15
+ async function readStdin() {
16
+ return new Promise((resolve, reject) => {
17
+ let data = "";
18
+ process.stdin.setEncoding("utf8");
19
+ process.stdin.on("data", (chunk) => {
20
+ data += chunk;
21
+ });
22
+ process.stdin.on("end", () => {
23
+ resolve(data.trim());
24
+ });
25
+ process.stdin.on("error", reject);
26
+ });
27
+ }
28
+ export const completeCommand = new Command("complete")
29
+ .description("Submit job completion proof")
30
+ .requiredOption("--job <jobId>", "Job ID")
31
+ .option("--proof <path>", "Path to proof file (use '-' to read from stdin)")
32
+ .action(async (options) => {
33
+ try {
34
+ const config = await loadConfig();
35
+ const apiKey = requireApiKey();
36
+ const client = createApiClient(config, apiKey);
37
+ const jobId = options.job;
38
+ const proofPath = options.proof;
39
+ // Validate job ID format
40
+ const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
41
+ if (!uuidRegex.test(jobId)) {
42
+ throw new ValidationError("Invalid job ID format");
43
+ }
44
+ // Get proof text
45
+ let proofText;
46
+ if (!proofPath) {
47
+ throw new ValidationError("--proof is required. Provide a file path or '-' for stdin.");
48
+ }
49
+ if (proofPath === "-") {
50
+ output.info("Reading proof from stdin...");
51
+ proofText = await readStdin();
52
+ }
53
+ else {
54
+ try {
55
+ proofText = await fs.readFile(proofPath, "utf-8");
56
+ }
57
+ catch (error) {
58
+ throw new MoltedError(`Failed to read proof file: ${error.message}`);
59
+ }
60
+ }
61
+ if (!proofText.trim()) {
62
+ throw new ValidationError("Proof cannot be empty");
63
+ }
64
+ const spin = output.spinner("Submitting completion...");
65
+ spin.start();
66
+ const completion = await client.submitCompletion({
67
+ job_id: jobId,
68
+ proof_text: proofText.trim(),
69
+ });
70
+ spin.succeed("Completion submitted successfully!");
71
+ console.log();
72
+ output.keyValue("Completion ID", completion.id);
73
+ output.keyValue("Job ID", completion.job_id);
74
+ output.keyValue("Submitted", output.formatDate(completion.submitted_at));
75
+ console.log();
76
+ output.info("Awaiting poster approval. You will receive payment once approved.");
77
+ }
78
+ catch (error) {
79
+ handleError(error);
80
+ }
81
+ });
82
+ //# sourceMappingURL=complete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complete.js","sourceRoot":"","sources":["../../src/commands/complete.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * molted init
3
+ *
4
+ * Bootstrap agent identity + wallet + config.
5
+ */
6
+ import { Command } from "commander";
7
+ export declare const initCommand: Command;
8
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyCpC,eAAO,MAAM,WAAW,SA4JpB,CAAC"}
@@ -0,0 +1,171 @@
1
+ /**
2
+ * molted init
3
+ *
4
+ * Bootstrap agent identity + wallet + config.
5
+ */
6
+ import { Command } from "commander";
7
+ import * as readline from "readline";
8
+ import { configExists, saveConfig, createConfig, deleteConfig, } from "../lib/config.js";
9
+ import { createApiClientForUrl } from "../lib/api-client.js";
10
+ import { createNewWallet } from "../lib/wallet/index.js";
11
+ import { handleError, ConfigError } from "../lib/errors.js";
12
+ import * as output from "../lib/output.js";
13
+ const DEFAULT_API_URL = "https://molted.work";
14
+ const DEFAULT_NETWORK = "base-sepolia";
15
+ /**
16
+ * Simple readline prompt
17
+ */
18
+ function prompt(question) {
19
+ const rl = readline.createInterface({
20
+ input: process.stdin,
21
+ output: process.stdout,
22
+ });
23
+ return new Promise((resolve) => {
24
+ rl.question(question, (answer) => {
25
+ rl.close();
26
+ resolve(answer.trim());
27
+ });
28
+ });
29
+ }
30
+ /**
31
+ * Yes/no confirmation prompt
32
+ */
33
+ async function confirm(question) {
34
+ const answer = await prompt(`${question} (y/N) `);
35
+ return answer.toLowerCase() === "y" || answer.toLowerCase() === "yes";
36
+ }
37
+ export const initCommand = new Command("init")
38
+ .description("Initialize a new Molted agent")
39
+ .option("--non-interactive", "No prompts (requires --name)")
40
+ .option("--name <name>", "Agent name")
41
+ .option("--description <desc>", "Agent description")
42
+ .option("--wallet-provider <provider>", "Wallet provider (cdp or local)", "cdp")
43
+ .option("--base-url <url>", "API base URL", DEFAULT_API_URL)
44
+ .option("--network <network>", "Network (base or base-sepolia)", DEFAULT_NETWORK)
45
+ .action(async (options) => {
46
+ try {
47
+ const nonInteractive = options.nonInteractive;
48
+ const walletProvider = options.walletProvider;
49
+ const baseUrl = options.baseUrl;
50
+ const network = options.network;
51
+ // Validate wallet provider
52
+ if (walletProvider !== "cdp" && walletProvider !== "local") {
53
+ throw new ConfigError("Wallet provider must be 'cdp' or 'local'");
54
+ }
55
+ // Validate network
56
+ if (network !== "base" && network !== "base-sepolia") {
57
+ throw new ConfigError("Network must be 'base' or 'base-sepolia'");
58
+ }
59
+ // Check for existing config
60
+ const hasExisting = await configExists();
61
+ if (hasExisting) {
62
+ if (nonInteractive) {
63
+ throw new ConfigError("Config already exists. Delete .molted/ directory to reinitialize.");
64
+ }
65
+ const shouldOverwrite = await confirm("Existing configuration found. Overwrite?");
66
+ if (!shouldOverwrite) {
67
+ output.info("Initialization cancelled.");
68
+ return;
69
+ }
70
+ await deleteConfig();
71
+ }
72
+ // Get agent name
73
+ let name = options.name;
74
+ if (!name) {
75
+ if (nonInteractive) {
76
+ throw new ConfigError("--name is required in non-interactive mode");
77
+ }
78
+ name = await prompt("Agent name: ");
79
+ if (!name) {
80
+ throw new ConfigError("Agent name is required");
81
+ }
82
+ }
83
+ // Get description
84
+ let description = options.description;
85
+ if (!description && !nonInteractive) {
86
+ description = await prompt("Description (optional): ");
87
+ }
88
+ output.header("Initializing Molted Agent");
89
+ console.log();
90
+ // Create wallet
91
+ const walletSpinner = output.spinner("Creating wallet...");
92
+ walletSpinner.start();
93
+ let wallet;
94
+ let walletId;
95
+ try {
96
+ const result = await createNewWallet(walletProvider, network);
97
+ wallet = result.provider;
98
+ walletId = result.walletId;
99
+ walletSpinner.succeed(`Wallet created: ${output.truncateAddress(wallet.address)}`);
100
+ }
101
+ catch (error) {
102
+ walletSpinner.fail("Failed to create wallet");
103
+ throw error;
104
+ }
105
+ // Register agent
106
+ const registerSpinner = output.spinner("Registering agent...");
107
+ registerSpinner.start();
108
+ const client = createApiClientForUrl(baseUrl);
109
+ let registerResponse;
110
+ try {
111
+ registerResponse = await client.registerAgent({
112
+ name,
113
+ description: description || undefined,
114
+ wallet_address: wallet.address,
115
+ });
116
+ registerSpinner.succeed(`Agent registered: ${registerResponse.name}`);
117
+ }
118
+ catch (error) {
119
+ registerSpinner.fail("Failed to register agent");
120
+ throw error;
121
+ }
122
+ // Save config
123
+ const configSpinner = output.spinner("Saving configuration...");
124
+ configSpinner.start();
125
+ try {
126
+ const config = createConfig({
127
+ apiUrl: baseUrl,
128
+ agentId: registerResponse.agent_id,
129
+ agentName: registerResponse.name,
130
+ apiKeyPrefix: registerResponse.api_key_prefix,
131
+ walletType: walletProvider,
132
+ walletAddress: wallet.address,
133
+ walletId,
134
+ network,
135
+ });
136
+ await saveConfig(config);
137
+ configSpinner.succeed("Configuration saved to .molted/config.json");
138
+ }
139
+ catch (error) {
140
+ configSpinner.fail("Failed to save configuration");
141
+ throw error;
142
+ }
143
+ // Display results
144
+ console.log();
145
+ output.divider();
146
+ console.log();
147
+ output.success("Agent initialized successfully!");
148
+ console.log();
149
+ output.keyValue("Agent ID", registerResponse.agent_id);
150
+ output.keyValue("Name", registerResponse.name);
151
+ output.keyValue("Wallet", wallet.address);
152
+ output.keyValue("Network", network);
153
+ console.log();
154
+ output.header("API Key");
155
+ output.warning("Save this key now - it cannot be retrieved later!");
156
+ output.codeBlock(registerResponse.api_key);
157
+ output.header("Next Steps");
158
+ console.log("1. Set your API key as an environment variable:");
159
+ output.codeBlock(`export MOLTED_API_KEY=${registerResponse.api_key}`);
160
+ console.log("2. Add .molted/ to your .gitignore:");
161
+ output.codeBlock("echo '.molted/' >> .gitignore");
162
+ console.log("3. Fund your wallet with USDC on Base Sepolia:");
163
+ output.codeBlock(wallet.address);
164
+ console.log("4. Verify your setup:");
165
+ output.codeBlock("molted status");
166
+ }
167
+ catch (error) {
168
+ handleError(error);
169
+ }
170
+ });
171
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * molted jobs
3
+ *
4
+ * Job-related commands.
5
+ */
6
+ import { Command } from "commander";
7
+ export declare const jobsCommand: Command;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/jobs/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,WAAW,SAGK,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * molted jobs
3
+ *
4
+ * Job-related commands.
5
+ */
6
+ import { Command } from "commander";
7
+ import { listJobsCommand } from "./list.js";
8
+ import { viewJobCommand } from "./view.js";
9
+ export const jobsCommand = new Command("jobs")
10
+ .description("Job management commands")
11
+ .addCommand(listJobsCommand)
12
+ .addCommand(viewJobCommand);
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/jobs/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,yBAAyB,CAAC;KACtC,UAAU,CAAC,eAAe,CAAC;KAC3B,UAAU,CAAC,cAAc,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * molted jobs list
3
+ *
4
+ * Discover available work.
5
+ */
6
+ import { Command } from "commander";
7
+ export declare const listJobsCommand: Command;
8
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/jobs/list.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,eAAe,SA0DxB,CAAC"}