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.
- package/README.md +475 -0
- package/dist/__tests__/config.test.d.ts +20 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +155 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/commands/buy.d.ts +10 -0
- package/dist/commands/buy.d.ts.map +1 -0
- package/dist/commands/buy.js +126 -0
- package/dist/commands/buy.js.map +1 -0
- package/dist/commands/comments.d.ts +15 -0
- package/dist/commands/comments.d.ts.map +1 -0
- package/dist/commands/comments.js +137 -0
- package/dist/commands/comments.js.map +1 -0
- package/dist/commands/config.d.ts +10 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +63 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/create.d.ts +33 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +1177 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/deploy.d.ts +18 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +178 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/holders.d.ts +13 -0
- package/dist/commands/holders.d.ts.map +1 -0
- package/dist/commands/holders.js +114 -0
- package/dist/commands/holders.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +506 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +10 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +135 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/optimize.d.ts +12 -0
- package/dist/commands/optimize.d.ts.map +1 -0
- package/dist/commands/optimize.js +134 -0
- package/dist/commands/optimize.js.map +1 -0
- package/dist/commands/scaffold.d.ts +25 -0
- package/dist/commands/scaffold.d.ts.map +1 -0
- package/dist/commands/scaffold.js +123 -0
- package/dist/commands/scaffold.js.map +1 -0
- package/dist/commands/sell.d.ts +10 -0
- package/dist/commands/sell.d.ts.map +1 -0
- package/dist/commands/sell.js +109 -0
- package/dist/commands/sell.js.map +1 -0
- package/dist/commands/status.d.ts +10 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +124 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/tokenize.d.ts +16 -0
- package/dist/commands/tokenize.d.ts.map +1 -0
- package/dist/commands/tokenize.js +207 -0
- package/dist/commands/tokenize.js.map +1 -0
- package/dist/config.d.ts +44 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +137 -0
- package/dist/config.js.map +1 -0
- package/dist/http.d.ts +24 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +53 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +86 -0
- package/dist/index.js.map +1 -0
- 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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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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
|
package/dist/http.js.map
ADDED
|
@@ -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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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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"}
|