agentlaunch 1.0.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 (70) hide show
  1. package/README.md +475 -0
  2. package/dist/__tests__/config.test.d.ts +20 -0
  3. package/dist/__tests__/config.test.d.ts.map +1 -0
  4. package/dist/__tests__/config.test.js +155 -0
  5. package/dist/__tests__/config.test.js.map +1 -0
  6. package/dist/commands/buy.d.ts +10 -0
  7. package/dist/commands/buy.d.ts.map +1 -0
  8. package/dist/commands/buy.js +126 -0
  9. package/dist/commands/buy.js.map +1 -0
  10. package/dist/commands/comments.d.ts +15 -0
  11. package/dist/commands/comments.d.ts.map +1 -0
  12. package/dist/commands/comments.js +137 -0
  13. package/dist/commands/comments.js.map +1 -0
  14. package/dist/commands/config.d.ts +10 -0
  15. package/dist/commands/config.d.ts.map +1 -0
  16. package/dist/commands/config.js +63 -0
  17. package/dist/commands/config.js.map +1 -0
  18. package/dist/commands/create.d.ts +33 -0
  19. package/dist/commands/create.d.ts.map +1 -0
  20. package/dist/commands/create.js +1177 -0
  21. package/dist/commands/create.js.map +1 -0
  22. package/dist/commands/deploy.d.ts +18 -0
  23. package/dist/commands/deploy.d.ts.map +1 -0
  24. package/dist/commands/deploy.js +178 -0
  25. package/dist/commands/deploy.js.map +1 -0
  26. package/dist/commands/holders.d.ts +13 -0
  27. package/dist/commands/holders.d.ts.map +1 -0
  28. package/dist/commands/holders.js +114 -0
  29. package/dist/commands/holders.js.map +1 -0
  30. package/dist/commands/init.d.ts +3 -0
  31. package/dist/commands/init.d.ts.map +1 -0
  32. package/dist/commands/init.js +506 -0
  33. package/dist/commands/init.js.map +1 -0
  34. package/dist/commands/list.d.ts +10 -0
  35. package/dist/commands/list.d.ts.map +1 -0
  36. package/dist/commands/list.js +135 -0
  37. package/dist/commands/list.js.map +1 -0
  38. package/dist/commands/optimize.d.ts +12 -0
  39. package/dist/commands/optimize.d.ts.map +1 -0
  40. package/dist/commands/optimize.js +134 -0
  41. package/dist/commands/optimize.js.map +1 -0
  42. package/dist/commands/scaffold.d.ts +25 -0
  43. package/dist/commands/scaffold.d.ts.map +1 -0
  44. package/dist/commands/scaffold.js +123 -0
  45. package/dist/commands/scaffold.js.map +1 -0
  46. package/dist/commands/sell.d.ts +10 -0
  47. package/dist/commands/sell.d.ts.map +1 -0
  48. package/dist/commands/sell.js +109 -0
  49. package/dist/commands/sell.js.map +1 -0
  50. package/dist/commands/status.d.ts +10 -0
  51. package/dist/commands/status.d.ts.map +1 -0
  52. package/dist/commands/status.js +124 -0
  53. package/dist/commands/status.js.map +1 -0
  54. package/dist/commands/tokenize.d.ts +16 -0
  55. package/dist/commands/tokenize.d.ts.map +1 -0
  56. package/dist/commands/tokenize.js +207 -0
  57. package/dist/commands/tokenize.js.map +1 -0
  58. package/dist/config.d.ts +44 -0
  59. package/dist/config.d.ts.map +1 -0
  60. package/dist/config.js +137 -0
  61. package/dist/config.js.map +1 -0
  62. package/dist/http.d.ts +24 -0
  63. package/dist/http.d.ts.map +1 -0
  64. package/dist/http.js +53 -0
  65. package/dist/http.js.map +1 -0
  66. package/dist/index.d.ts +19 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +86 -0
  69. package/dist/index.js.map +1 -0
  70. package/package.json +50 -0
@@ -0,0 +1,207 @@
1
+ /**
2
+ * CLI-004: tokenize command
3
+ *
4
+ * agentlaunch tokenize --agent <address> --name <name> --symbol <symbol>
5
+ *
6
+ * Calls POST /tokenize, then prints the handoff link so a human
7
+ * can connect their wallet and complete on-chain deployment.
8
+ *
9
+ * Platform constants (source of truth: deployed smart contracts):
10
+ * - Deploy fee: 120 FET (read dynamically, can change via multi-sig)
11
+ * - Graduation target: 30,000 FET -> auto DEX listing
12
+ * - Trading fee: 2% -> 100% to protocol treasury (NO creator fee)
13
+ */
14
+ import { getFrontendUrl } from "agentlaunch-sdk";
15
+ import { getClient } from "../http.js";
16
+ export function registerTokenizeCommand(program) {
17
+ program
18
+ .command("tokenize")
19
+ .description("Create a token record for your agent and receive a handoff link for on-chain deployment")
20
+ .requiredOption("--agent <address>", "Agentverse agent address (agent1q...)")
21
+ .requiredOption("--name <name>", "Token name (max 32 chars)")
22
+ .requiredOption("--symbol <symbol>", "Token ticker symbol (2-11 chars, e.g. GIFT)")
23
+ .option("--description <desc>", "Token description (max 500 chars)")
24
+ .option("--image <url>", "URL of the token logo image")
25
+ .option("--chain <chainId>", "Chain ID: 97 (BSC testnet) or 56 (BSC mainnet)", "97")
26
+ .option("--max-wallet <value>", "Max wallet limit: 0=unlimited, 1=0.5%, 2=1%", "0")
27
+ .option("--initial-buy <amount>", "FET to buy immediately after deploy (0-1000)")
28
+ .option("--category <id>", "Category ID (default: 1)", "1")
29
+ .option("--json", "Output only JSON (machine-readable)")
30
+ .action(async (options) => {
31
+ const isJson = options.json === true;
32
+ // Basic validation
33
+ if (!options.agent.startsWith("agent1q")) {
34
+ if (isJson) {
35
+ console.log(JSON.stringify({
36
+ error: "--agent must be a valid Agentverse address starting with 'agent1q'",
37
+ }));
38
+ }
39
+ else {
40
+ console.error("Error: --agent must be a valid Agentverse address starting with 'agent1q'");
41
+ }
42
+ process.exit(1);
43
+ }
44
+ if (options.name.length > 32) {
45
+ if (isJson) {
46
+ console.log(JSON.stringify({ error: "--name must be 32 characters or fewer" }));
47
+ }
48
+ else {
49
+ console.error("Error: --name must be 32 characters or fewer");
50
+ }
51
+ process.exit(1);
52
+ }
53
+ const symbol = options.symbol.toUpperCase();
54
+ if (symbol.length < 2 || symbol.length > 11) {
55
+ if (isJson) {
56
+ console.log(JSON.stringify({ error: "--symbol must be 2-11 characters" }));
57
+ }
58
+ else {
59
+ console.error("Error: --symbol must be 2-11 characters");
60
+ }
61
+ process.exit(1);
62
+ }
63
+ const chainId = parseInt(options.chain, 10);
64
+ if (![56, 97].includes(chainId)) {
65
+ if (isJson) {
66
+ console.log(JSON.stringify({
67
+ error: "--chain must be 97 (BSC testnet) or 56 (BSC mainnet)",
68
+ }));
69
+ }
70
+ else {
71
+ console.error("Error: --chain must be 97 (BSC testnet) or 56 (BSC mainnet)");
72
+ }
73
+ process.exit(1);
74
+ }
75
+ const maxWallet = parseInt(options.maxWallet, 10);
76
+ if (![0, 1, 2].includes(maxWallet)) {
77
+ if (isJson) {
78
+ console.log(JSON.stringify({
79
+ error: "--max-wallet must be 0 (unlimited), 1 (0.5%), or 2 (1%)",
80
+ }));
81
+ }
82
+ else {
83
+ console.error("Error: --max-wallet must be 0 (unlimited), 1 (0.5%), or 2 (1%)");
84
+ }
85
+ process.exit(1);
86
+ }
87
+ let initialBuyAmount;
88
+ if (options.initialBuy !== undefined) {
89
+ initialBuyAmount = parseFloat(options.initialBuy);
90
+ if (isNaN(initialBuyAmount) ||
91
+ initialBuyAmount < 0 ||
92
+ initialBuyAmount > 1000) {
93
+ if (isJson) {
94
+ console.log(JSON.stringify({
95
+ error: "--initial-buy must be a number between 0 and 1000",
96
+ }));
97
+ }
98
+ else {
99
+ console.error("Error: --initial-buy must be a number between 0 and 1000");
100
+ }
101
+ process.exit(1);
102
+ }
103
+ }
104
+ const categoryId = parseInt(options.category, 10);
105
+ if (isNaN(categoryId) || categoryId < 1) {
106
+ if (isJson) {
107
+ console.log(JSON.stringify({
108
+ error: "--category must be a valid positive integer",
109
+ }));
110
+ }
111
+ else {
112
+ console.error("Error: --category must be a valid positive integer");
113
+ }
114
+ process.exit(1);
115
+ }
116
+ const body = {
117
+ agentAddress: options.agent,
118
+ name: options.name,
119
+ symbol,
120
+ chainId,
121
+ maxWalletAmount: maxWallet,
122
+ category: { id: categoryId },
123
+ };
124
+ if (options.description)
125
+ body.description = options.description;
126
+ if (options.image)
127
+ body.image = options.image;
128
+ if (initialBuyAmount !== undefined)
129
+ body.initialBuyAmount = initialBuyAmount;
130
+ const maxWalletLabel = maxWallet === 0
131
+ ? "Unlimited"
132
+ : maxWallet === 1
133
+ ? "0.5% (5M tokens)"
134
+ : "1% (10M tokens)";
135
+ if (!isJson) {
136
+ console.log(`Tokenizing agent: ${options.agent}`);
137
+ console.log(` Name: ${options.name}`);
138
+ console.log(` Symbol: ${symbol}`);
139
+ console.log(` Chain: ${chainId === 56 ? "BSC mainnet" : "BSC testnet"} (${chainId})`);
140
+ console.log(` Max Wallet: ${maxWalletLabel}`);
141
+ if (initialBuyAmount !== undefined && initialBuyAmount > 0) {
142
+ console.log(` Initial buy: ${initialBuyAmount} FET`);
143
+ }
144
+ console.log(` Category: ${categoryId}`);
145
+ }
146
+ let result;
147
+ try {
148
+ const client = getClient();
149
+ result = await client.post("/agents/tokenize", body);
150
+ }
151
+ catch (err) {
152
+ if (isJson) {
153
+ console.log(JSON.stringify({ error: err.message }));
154
+ }
155
+ else {
156
+ console.error(`\nError: ${err.message}`);
157
+ }
158
+ process.exit(1);
159
+ }
160
+ // Extract token_id from various response shapes
161
+ const tokenId = result.token_id ?? result.tokenId ?? result.data?.token_id;
162
+ const frontendUrl = getFrontendUrl();
163
+ const handoffLink = result.handoff_link ??
164
+ result.data?.handoff_link ??
165
+ (tokenId !== undefined
166
+ ? `${frontendUrl}/deploy/${tokenId}`
167
+ : undefined);
168
+ if (isJson) {
169
+ console.log(JSON.stringify({
170
+ tokenId,
171
+ tokenAddress: result.token_address,
172
+ status: result.status,
173
+ handoffLink,
174
+ maxWalletAmount: maxWallet,
175
+ initialBuyAmount: initialBuyAmount ?? 0,
176
+ category: { id: categoryId },
177
+ deployFee: "120 FET (read from contract at deploy time)",
178
+ tradingFee: "2% -> 100% to protocol treasury",
179
+ }));
180
+ return;
181
+ }
182
+ console.log("\n" + "=".repeat(50));
183
+ console.log("TOKEN RECORD CREATED");
184
+ console.log("=".repeat(50));
185
+ if (tokenId !== undefined) {
186
+ console.log(`Token ID: ${tokenId}`);
187
+ }
188
+ if (result.token_address) {
189
+ console.log(`Address: ${result.token_address}`);
190
+ }
191
+ if (result.status) {
192
+ console.log(`Status: ${result.status}`);
193
+ }
194
+ console.log(`Max Wallet: ${maxWalletLabel}`);
195
+ if (initialBuyAmount !== undefined && initialBuyAmount > 0) {
196
+ console.log(`Initial Buy: ${initialBuyAmount} FET`);
197
+ }
198
+ console.log(`Category: ${categoryId}`);
199
+ if (handoffLink) {
200
+ console.log(`\nHandoff link (share with a human to deploy on-chain):`);
201
+ console.log(` ${handoffLink}`);
202
+ }
203
+ console.log(`\nPlatform fee to deploy: 120 FET (read from contract at deploy time)`);
204
+ console.log(`Trading fee: 2% -> 100% to protocol treasury`);
205
+ });
206
+ }
207
+ //# sourceMappingURL=tokenize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenize.js","sourceRoot":"","sources":["../../src/commands/tokenize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * CLI-001: Config management
3
+ *
4
+ * Stores user config in ~/.agentlaunch/config.json
5
+ * Fields: apiKey, baseUrl
6
+ */
7
+ export interface CliConfig {
8
+ apiKey?: string;
9
+ baseUrl?: string;
10
+ }
11
+ /** Resolve the frontend URL from env or defaults. */
12
+ export declare function resolveFrontendUrl(): string;
13
+ /** Get the current environment name. */
14
+ export declare function getEnvironment(): string;
15
+ /** Default API base URL. Override with `agentlaunch config set-url`. */
16
+ export declare const DEFAULT_BASE_URL: string;
17
+ /**
18
+ * Read the config file. Returns an empty object if the file does not exist
19
+ * or cannot be parsed.
20
+ */
21
+ export declare function readConfig(): CliConfig;
22
+ /**
23
+ * Write a partial config update. Merges with existing values.
24
+ */
25
+ export declare function writeConfig(partial: Partial<CliConfig>): void;
26
+ /**
27
+ * Return the active base URL (config override or default).
28
+ */
29
+ export declare function getBaseUrl(): string;
30
+ /**
31
+ * Return the active API key. Checks in order:
32
+ * 1. ~/.agentlaunch/config.json (set via `agentlaunch config set-key`)
33
+ * 2. AGENTVERSE_API_KEY environment variable
34
+ * 3. .env file in current directory
35
+ *
36
+ * Throws a descriptive error if not found in any location.
37
+ */
38
+ export declare function requireApiKey(): string;
39
+ /**
40
+ * Mask an API key for display: show first 8 chars, then asterisks.
41
+ * Example: "eyJhbGci..." -> "eyJhbGci..."[masked]
42
+ */
43
+ export declare function maskKey(key: string): string;
44
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAeD,qDAAqD;AACrD,wBAAgB,kBAAkB,IAAI,MAAM,CAG3C;AAED,wCAAwC;AACxC,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,QAAsB,CAAC;AAEpD;;;GAGG;AACH,wBAAgB,UAAU,IAAI,SAAS,CAOtC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAW7D;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAGnC;AAkCD;;;;;;;GAOG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAwBtC;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG3C"}
package/dist/config.js ADDED
@@ -0,0 +1,137 @@
1
+ /**
2
+ * CLI-001: Config management
3
+ *
4
+ * Stores user config in ~/.agentlaunch/config.json
5
+ * Fields: apiKey, baseUrl
6
+ */
7
+ import fs from "node:fs";
8
+ import os from "node:os";
9
+ import path from "node:path";
10
+ const CONFIG_DIR = path.join(os.homedir(), ".agentlaunch");
11
+ const CONFIG_FILE = path.join(CONFIG_DIR, "config.json");
12
+ const DEV_API_URL = 'https://launchpad-backend-dev-1056182620041.us-central1.run.app';
13
+ const DEV_FRONTEND_URL = 'https://launchpad-frontend-dev-1056182620041.us-central1.run.app';
14
+ const PROD_API_URL = 'https://agent-launch.ai/api';
15
+ const PROD_FRONTEND_URL = 'https://agent-launch.ai';
16
+ function resolveDefaultUrl() {
17
+ if (process.env.AGENT_LAUNCH_API_URL)
18
+ return process.env.AGENT_LAUNCH_API_URL.replace(/\/$/, '');
19
+ return process.env.AGENT_LAUNCH_ENV === 'dev' ? DEV_API_URL : PROD_API_URL;
20
+ }
21
+ /** Resolve the frontend URL from env or defaults. */
22
+ export function resolveFrontendUrl() {
23
+ if (process.env.AGENT_LAUNCH_FRONTEND_URL)
24
+ return process.env.AGENT_LAUNCH_FRONTEND_URL.replace(/\/$/, '');
25
+ return process.env.AGENT_LAUNCH_ENV === 'dev' ? DEV_FRONTEND_URL : PROD_FRONTEND_URL;
26
+ }
27
+ /** Get the current environment name. */
28
+ export function getEnvironment() {
29
+ return process.env.AGENT_LAUNCH_ENV === 'dev' ? 'dev' : 'production';
30
+ }
31
+ /** Default API base URL. Override with `agentlaunch config set-url`. */
32
+ export const DEFAULT_BASE_URL = resolveDefaultUrl();
33
+ /**
34
+ * Read the config file. Returns an empty object if the file does not exist
35
+ * or cannot be parsed.
36
+ */
37
+ export function readConfig() {
38
+ try {
39
+ const raw = fs.readFileSync(CONFIG_FILE, "utf8");
40
+ return JSON.parse(raw);
41
+ }
42
+ catch {
43
+ return {};
44
+ }
45
+ }
46
+ /**
47
+ * Write a partial config update. Merges with existing values.
48
+ */
49
+ export function writeConfig(partial) {
50
+ const existing = readConfig();
51
+ const updated = { ...existing, ...partial };
52
+ if (!fs.existsSync(CONFIG_DIR)) {
53
+ fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
54
+ }
55
+ fs.writeFileSync(CONFIG_FILE, JSON.stringify(updated, null, 2) + "\n", {
56
+ mode: 0o600, // owner read/write only — contains API key
57
+ });
58
+ }
59
+ /**
60
+ * Return the active base URL (config override or default).
61
+ */
62
+ export function getBaseUrl() {
63
+ const cfg = readConfig();
64
+ return cfg.baseUrl ?? DEFAULT_BASE_URL;
65
+ }
66
+ /**
67
+ * Load .env file from current directory if it exists.
68
+ * This is a simple loader that doesn't require dotenv package.
69
+ */
70
+ function loadEnvFile() {
71
+ const envPath = path.join(process.cwd(), ".env");
72
+ if (!fs.existsSync(envPath))
73
+ return;
74
+ try {
75
+ const content = fs.readFileSync(envPath, "utf8");
76
+ for (const line of content.split("\n")) {
77
+ const trimmed = line.trim();
78
+ if (!trimmed || trimmed.startsWith("#"))
79
+ continue;
80
+ const eqIndex = trimmed.indexOf("=");
81
+ if (eqIndex === -1)
82
+ continue;
83
+ const key = trimmed.slice(0, eqIndex).trim();
84
+ let value = trimmed.slice(eqIndex + 1).trim();
85
+ // Remove surrounding quotes if present
86
+ if ((value.startsWith('"') && value.endsWith('"')) ||
87
+ (value.startsWith("'") && value.endsWith("'"))) {
88
+ value = value.slice(1, -1);
89
+ }
90
+ // Only set if not already in env (don't override explicit env vars)
91
+ if (!process.env[key]) {
92
+ process.env[key] = value;
93
+ }
94
+ }
95
+ }
96
+ catch {
97
+ // Ignore errors reading .env
98
+ }
99
+ }
100
+ /**
101
+ * Return the active API key. Checks in order:
102
+ * 1. ~/.agentlaunch/config.json (set via `agentlaunch config set-key`)
103
+ * 2. AGENTVERSE_API_KEY environment variable
104
+ * 3. .env file in current directory
105
+ *
106
+ * Throws a descriptive error if not found in any location.
107
+ */
108
+ export function requireApiKey() {
109
+ // First check config file
110
+ const cfg = readConfig();
111
+ if (cfg.apiKey) {
112
+ return cfg.apiKey;
113
+ }
114
+ // Load .env file if present (populates process.env)
115
+ loadEnvFile();
116
+ // Check environment variable
117
+ const envKey = process.env.AGENTVERSE_API_KEY;
118
+ if (envKey) {
119
+ return envKey;
120
+ }
121
+ throw new Error("API key not configured.\n" +
122
+ "Options:\n" +
123
+ " 1. Run: agentlaunch config set-key <apiKey>\n" +
124
+ " 2. Set AGENTVERSE_API_KEY in your environment\n" +
125
+ " 3. Add AGENTVERSE_API_KEY=... to .env in current directory\n" +
126
+ "Get a key at: https://agentverse.ai/profile/api-keys");
127
+ }
128
+ /**
129
+ * Mask an API key for display: show first 8 chars, then asterisks.
130
+ * Example: "eyJhbGci..." -> "eyJhbGci..."[masked]
131
+ */
132
+ export function maskKey(key) {
133
+ if (key.length <= 8)
134
+ return "****";
135
+ return `${key.slice(0, 8)}...${" (masked)"}`;
136
+ }
137
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/http.d.ts ADDED
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Thin HTTP wrapper for the AgentLaunch CLI.
3
+ *
4
+ * All platform API calls (X-API-Key auth) go through AgentLaunchClient from
5
+ * the SDK. The agentverseRequest helper is kept here because Agentverse uses
6
+ * bearer-token auth which is a different auth domain.
7
+ */
8
+ import { AgentLaunchClient } from "agentlaunch-sdk";
9
+ /**
10
+ * Return an authenticated SDK client (uses X-API-Key from CLI config).
11
+ * Throws if no API key is configured.
12
+ */
13
+ export declare function getClient(): AgentLaunchClient;
14
+ /**
15
+ * Return a public (unauthenticated) SDK client.
16
+ * Use this for read-only endpoints that don't require an API key.
17
+ */
18
+ export declare function getPublicClient(): AgentLaunchClient;
19
+ /**
20
+ * Typed HTTP helper for Agentverse API calls.
21
+ * Agentverse uses "Authorization: bearer <key>" instead of X-API-Key.
22
+ */
23
+ export declare function agentverseRequest<T>(method: "POST" | "PUT", url: string, agentverseApiKey: string, body?: unknown): Promise<T>;
24
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGpD;;;GAGG;AACH,wBAAgB,SAAS,IAAI,iBAAiB,CAE7C;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,iBAAiB,CAEnD;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,MAAM,EAAE,MAAM,GAAG,KAAK,EACtB,GAAG,EAAE,MAAM,EACX,gBAAgB,EAAE,MAAM,EACxB,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,CAAC,CAAC,CAkBZ"}
package/dist/http.js ADDED
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Thin HTTP wrapper for the AgentLaunch CLI.
3
+ *
4
+ * All platform API calls (X-API-Key auth) go through AgentLaunchClient from
5
+ * the SDK. The agentverseRequest helper is kept here because Agentverse uses
6
+ * bearer-token auth which is a different auth domain.
7
+ */
8
+ import { AgentLaunchClient } from "agentlaunch-sdk";
9
+ import { getBaseUrl, requireApiKey } from "./config.js";
10
+ /**
11
+ * Return an authenticated SDK client (uses X-API-Key from CLI config).
12
+ * Throws if no API key is configured.
13
+ */
14
+ export function getClient() {
15
+ return new AgentLaunchClient({ baseUrl: getBaseUrl(), apiKey: requireApiKey() });
16
+ }
17
+ /**
18
+ * Return a public (unauthenticated) SDK client.
19
+ * Use this for read-only endpoints that don't require an API key.
20
+ */
21
+ export function getPublicClient() {
22
+ return new AgentLaunchClient({ baseUrl: getBaseUrl() });
23
+ }
24
+ /**
25
+ * Typed HTTP helper for Agentverse API calls.
26
+ * Agentverse uses "Authorization: bearer <key>" instead of X-API-Key.
27
+ */
28
+ export async function agentverseRequest(method, url, agentverseApiKey, body) {
29
+ const response = await fetch(url, {
30
+ method,
31
+ headers: {
32
+ "Content-Type": "application/json",
33
+ Authorization: `Bearer ${agentverseApiKey}`,
34
+ },
35
+ body: body !== undefined ? JSON.stringify(body) : undefined,
36
+ });
37
+ if (!response.ok) {
38
+ const detail = await extractErrorDetail(response);
39
+ throw new Error(`${method} ${url} failed with ${response.status} ${response.statusText}${detail}`);
40
+ }
41
+ return response.json();
42
+ }
43
+ /** Extract a human-readable error message from a failed response body. */
44
+ async function extractErrorDetail(response) {
45
+ try {
46
+ const body = (await response.json());
47
+ return body.message ? `: ${body.message}` : "";
48
+ }
49
+ catch {
50
+ return "";
51
+ }
52
+ }
53
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAExD;;;GAGG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,iBAAiB,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;AACnF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,iBAAiB,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAsB,EACtB,GAAW,EACX,gBAAwB,EACxB,IAAc;IAEd,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM;QACN,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,gBAAgB,EAAE;SAC5C;QACD,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAC5D,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,IAAI,KAAK,CACb,GAAG,MAAM,IAAI,GAAG,gBAAgB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,GAAG,MAAM,EAAE,CAClF,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAC;AACvC,CAAC;AAED,0EAA0E;AAC1E,KAAK,UAAU,kBAAkB,CAAC,QAAkB;IAClD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAyB,CAAC;QAC7D,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * agentlaunch
4
+ *
5
+ * The simplest way to build AI agents on Fetch.ai.
6
+ *
7
+ * Usage:
8
+ * npx agentlaunch Interactive: name, description, deploy
9
+ * npx agentlaunch my-agent Create agent with name "my-agent"
10
+ * npx agentlaunch my-agent --local Scaffold only, don't deploy
11
+ *
12
+ * Other commands:
13
+ * agentlaunch deploy Deploy agent.py to Agentverse
14
+ * agentlaunch tokenize Create token + handoff link
15
+ * agentlaunch status <address> Check agent/token status
16
+ * agentlaunch config set-key <key> Store API key
17
+ */
18
+ export {};
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;GAeG"}
package/dist/index.js ADDED
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * agentlaunch
4
+ *
5
+ * The simplest way to build AI agents on Fetch.ai.
6
+ *
7
+ * Usage:
8
+ * npx agentlaunch Interactive: name, description, deploy
9
+ * npx agentlaunch my-agent Create agent with name "my-agent"
10
+ * npx agentlaunch my-agent --local Scaffold only, don't deploy
11
+ *
12
+ * Other commands:
13
+ * agentlaunch deploy Deploy agent.py to Agentverse
14
+ * agentlaunch tokenize Create token + handoff link
15
+ * agentlaunch status <address> Check agent/token status
16
+ * agentlaunch config set-key <key> Store API key
17
+ */
18
+ import fs from "node:fs";
19
+ import path from "node:path";
20
+ import { Command } from "commander";
21
+ // Load .env file from cwd
22
+ try {
23
+ const envPath = path.resolve(process.cwd(), ".env");
24
+ const envContent = fs.readFileSync(envPath, "utf8");
25
+ for (const line of envContent.split("\n")) {
26
+ const trimmed = line.trim();
27
+ if (!trimmed || trimmed.startsWith("#"))
28
+ continue;
29
+ const eqIdx = trimmed.indexOf("=");
30
+ if (eqIdx === -1)
31
+ continue;
32
+ const key = trimmed.slice(0, eqIdx).trim();
33
+ const val = trimmed.slice(eqIdx + 1).trim();
34
+ if (!process.env[key])
35
+ process.env[key] = val;
36
+ }
37
+ }
38
+ catch {
39
+ // No .env file — that's fine
40
+ }
41
+ import { registerCommentsCommand } from "./commands/comments.js";
42
+ import { registerConfigCommand } from "./commands/config.js";
43
+ import { runCreate } from "./commands/create.js";
44
+ import { registerDeployCommand } from "./commands/deploy.js";
45
+ import { registerHoldersCommand } from "./commands/holders.js";
46
+ import { registerListCommand } from "./commands/list.js";
47
+ import { registerStatusCommand } from "./commands/status.js";
48
+ import { registerInit } from "./commands/init.js";
49
+ import { registerTokenizeCommand } from "./commands/tokenize.js";
50
+ import { registerOptimizeCommand } from "./commands/optimize.js";
51
+ import { registerBuyCommand } from "./commands/buy.js";
52
+ import { registerSellCommand } from "./commands/sell.js";
53
+ const program = new Command();
54
+ program
55
+ .name("agentlaunch")
56
+ .description("Build AI agents on Fetch.ai in seconds")
57
+ .version("1.6.0")
58
+ .argument("[name]", "Agent name (prompted if omitted)")
59
+ .option("--local", "Scaffold only, don't deploy to Agentverse")
60
+ .option("--description <desc>", "What your agent does")
61
+ .option("--json", "Output JSON (for scripts)")
62
+ .action(async (name, options) => {
63
+ await runCreate({
64
+ name,
65
+ skipDeploy: options?.local,
66
+ description: options?.description,
67
+ json: options?.json,
68
+ });
69
+ });
70
+ // Register subcommands for power users
71
+ registerConfigCommand(program);
72
+ registerDeployCommand(program);
73
+ registerTokenizeCommand(program);
74
+ registerListCommand(program);
75
+ registerStatusCommand(program);
76
+ registerCommentsCommand(program);
77
+ registerHoldersCommand(program);
78
+ registerOptimizeCommand(program);
79
+ registerBuyCommand(program);
80
+ registerSellCommand(program);
81
+ registerInit(program);
82
+ program.parseAsync(process.argv).catch((err) => {
83
+ console.error(err.message ?? String(err));
84
+ process.exit(1);
85
+ });
86
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}