@flarestudio/fcc-workbench 1.0.19 → 1.0.21
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 +49 -28
- package/dist/index.js +83 -14
- package/dist/index.js.map +1 -1
- package/dist/modules/config.d.ts +3 -0
- package/dist/modules/config.js +7 -2
- package/dist/modules/config.js.map +1 -1
- package/dist/modules/docker.d.ts +3 -0
- package/dist/modules/docker.js +50 -3
- package/dist/modules/docker.js.map +1 -1
- package/dist/modules/doctor.d.ts +14 -0
- package/dist/modules/doctor.js +65 -0
- package/dist/modules/doctor.js.map +1 -0
- package/dist/modules/net.d.ts +2 -0
- package/dist/modules/net.js +41 -0
- package/dist/modules/net.js.map +1 -0
- package/dist/modules/officialTools.d.ts +7 -0
- package/dist/modules/officialTools.js +278 -0
- package/dist/modules/officialTools.js.map +1 -0
- package/dist/modules/runner.d.ts +19 -0
- package/dist/modules/runner.js +374 -0
- package/dist/modules/runner.js.map +1 -0
- package/dist/modules/scaffold.d.ts +1 -1
- package/dist/modules/scaffold.js +67 -64
- package/dist/modules/scaffold.js.map +1 -1
- package/dist/modules/state.d.ts +12 -0
- package/dist/modules/state.js +32 -0
- package/dist/modules/state.js.map +1 -0
- package/dist/modules/version.d.ts +1 -0
- package/dist/modules/version.js +31 -0
- package/dist/modules/version.js.map +1 -0
- package/dist/templates/index.js +10 -11
- package/dist/templates/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { input, select, confirm } from '@inquirer/prompts';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import { runDoctor } from './doctor.js';
|
|
5
|
+
import * as stateStore from './state.js';
|
|
6
|
+
import * as scaffold from './scaffold.js';
|
|
7
|
+
import * as config from './config.js';
|
|
8
|
+
import * as docker from './docker.js';
|
|
9
|
+
import * as contract from './contract.js';
|
|
10
|
+
import { checkTcp, isPortFree } from './net.js';
|
|
11
|
+
import * as officialTools from './officialTools.js';
|
|
12
|
+
import * as tee from './tee.js';
|
|
13
|
+
function randomBytes32Hex() {
|
|
14
|
+
const hex = Array.from({ length: 64 }, () => Math.floor(Math.random() * 16).toString(16)).join('');
|
|
15
|
+
return `0x${hex}`;
|
|
16
|
+
}
|
|
17
|
+
export function parseProfile(value) {
|
|
18
|
+
const v = value.trim().toLowerCase();
|
|
19
|
+
if (v === 'coston2' || v === 'mainnet')
|
|
20
|
+
return v;
|
|
21
|
+
throw new Error(`Unknown profile "${value}". Expected: coston2 | mainnet`);
|
|
22
|
+
}
|
|
23
|
+
function stepsForProfile(profile) {
|
|
24
|
+
const steps = [
|
|
25
|
+
{
|
|
26
|
+
id: 'doctor',
|
|
27
|
+
title: 'Preflight checks',
|
|
28
|
+
requiresDoctorOk: false,
|
|
29
|
+
run: async () => {
|
|
30
|
+
const report = await runDoctor();
|
|
31
|
+
if (!report.ok) {
|
|
32
|
+
throw new Error('Doctor checks failed. Run `flare-fcc doctor` to see details.');
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
id: 'init_project',
|
|
38
|
+
title: 'Initialize project (scaffold)',
|
|
39
|
+
run: async ({ state }) => {
|
|
40
|
+
const name = await input({ message: 'Project folder name:', default: 'my-fcc-agent' });
|
|
41
|
+
const language = await select({
|
|
42
|
+
message: 'Extension language:',
|
|
43
|
+
choices: [
|
|
44
|
+
{ name: 'TypeScript (Node.js)', value: 'typescript' },
|
|
45
|
+
{ name: 'Python', value: 'python' },
|
|
46
|
+
{ name: 'Go', value: 'go' },
|
|
47
|
+
],
|
|
48
|
+
default: 'typescript',
|
|
49
|
+
});
|
|
50
|
+
const projectDir = await scaffold.createAgent(name, language);
|
|
51
|
+
state.outputs.projectDir = projectDir;
|
|
52
|
+
state.outputs.language = language;
|
|
53
|
+
await stateStore.saveState(state);
|
|
54
|
+
process.chdir(projectDir);
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
id: 'configure',
|
|
59
|
+
title: 'Configure environment (Coston2)',
|
|
60
|
+
run: async ({ state }) => {
|
|
61
|
+
const language = state.outputs.language ||
|
|
62
|
+
(await select({
|
|
63
|
+
message: 'Extension language:',
|
|
64
|
+
choices: [
|
|
65
|
+
{ name: 'TypeScript (Node.js)', value: 'typescript' },
|
|
66
|
+
{ name: 'Python', value: 'python' },
|
|
67
|
+
{ name: 'Go', value: 'go' },
|
|
68
|
+
],
|
|
69
|
+
default: 'typescript',
|
|
70
|
+
}));
|
|
71
|
+
const pkeyRaw = await input({ message: 'Your EVM Private Key (Hex):' });
|
|
72
|
+
const pkey = pkeyRaw.trim().replace(/\s+/g, '');
|
|
73
|
+
const derivedOwner = contract.getAddressFromKey(pkey);
|
|
74
|
+
const initialOwner = await input({ message: 'Initial Owner Address:', default: derivedOwner });
|
|
75
|
+
const keyMatchesOwner = await contract.verifyKeyMatchesOwner(pkey, initialOwner);
|
|
76
|
+
if (!keyMatchesOwner) {
|
|
77
|
+
throw new Error(`PRIVATE_KEY does not match INITIAL_OWNER.\nPrivate key resolves to ${derivedOwner}, but INITIAL_OWNER is ${initialOwner}.`);
|
|
78
|
+
}
|
|
79
|
+
const rpcUrl = await input({
|
|
80
|
+
message: 'Coston2 RPC URL:',
|
|
81
|
+
default: 'https://coston2-api.flare.network/ext/C/rpc',
|
|
82
|
+
});
|
|
83
|
+
config.writeEnv({ LANGUAGE: language, PRIVATE_KEY: pkey, INITIAL_OWNER: initialOwner, RPC_URL: rpcUrl });
|
|
84
|
+
// ext-proxy/tee-node expects EXTENSION_ID to be set to a 32-byte value.
|
|
85
|
+
// This placeholder is replaced after `register-ext` returns the real ID.
|
|
86
|
+
config.writeEnv({ EXTENSION_ID: randomBytes32Hex() });
|
|
87
|
+
console.log(chalk.gray('\next-proxy needs access to a Flare-hosted Coston2 indexer database (MySQL). ' +
|
|
88
|
+
'Credentials are not public; request them from the Flare team (your IP may need whitelisting).'));
|
|
89
|
+
const dbHost = await input({ message: 'Flare Indexer DB Host (ext-proxy):', default: '34.38.42.208' });
|
|
90
|
+
const dbPort = await input({ message: 'DB Port:', default: '3306' });
|
|
91
|
+
const dbUser = await input({ message: 'DB User:' });
|
|
92
|
+
const dbPass = await input({ message: 'DB Password:' });
|
|
93
|
+
config.writeProxyToml({ dbHost, dbPort, dbUser, dbPass });
|
|
94
|
+
const normalProxyUrl = await input({
|
|
95
|
+
message: 'Flare NORMAL proxy URL (FTDC):',
|
|
96
|
+
default: 'https://tee-proxy-coston2-1.flare.rocks',
|
|
97
|
+
});
|
|
98
|
+
config.writeEnv({ NORMAL_PROXY_URL: normalProxyUrl });
|
|
99
|
+
const parsedPort = Number(dbPort);
|
|
100
|
+
if (!Number.isFinite(parsedPort) || parsedPort <= 0) {
|
|
101
|
+
throw new Error(`Invalid DB port "${dbPort}".`);
|
|
102
|
+
}
|
|
103
|
+
await checkTcp(dbHost, parsedPort, 7000);
|
|
104
|
+
state.outputs.initialOwner = initialOwner;
|
|
105
|
+
await stateStore.saveState(state);
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
id: 'local_stack_up',
|
|
110
|
+
title: 'Start stack (proxy + extension)',
|
|
111
|
+
run: async () => {
|
|
112
|
+
const internalPortFree = await isPortFree(6675, '0.0.0.0');
|
|
113
|
+
const externalPortFree = await isPortFree(6676, '0.0.0.0');
|
|
114
|
+
if (!internalPortFree || !externalPortFree) {
|
|
115
|
+
const users = await docker.findContainersUsingHostPorts([6675, 6676]);
|
|
116
|
+
const detail = users.length ? `\nIn use by:\n- ${users.join('\n- ')}` : '';
|
|
117
|
+
throw new Error(`Ports 6675/6676 are already in use.${detail}\n\n` +
|
|
118
|
+
'Stop the other running FCC stack (run `docker compose down` in that project folder), then retry.');
|
|
119
|
+
}
|
|
120
|
+
await docker.runDockerCompose(['up', '-d', '--build']);
|
|
121
|
+
console.log(chalk.gray('Waiting for ext-proxy /info on http://localhost:6676 ...'));
|
|
122
|
+
try {
|
|
123
|
+
await docker.fetchProxyInfo('http://localhost:6676', 80, 3000);
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
const logs = await docker.tailServiceLogs('ext-proxy', 200);
|
|
127
|
+
if (logs) {
|
|
128
|
+
console.error(chalk.red('\next-proxy logs (tail):\n'));
|
|
129
|
+
console.error(logs);
|
|
130
|
+
}
|
|
131
|
+
throw err;
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
];
|
|
136
|
+
if (profile === 'mainnet') {
|
|
137
|
+
steps.push({
|
|
138
|
+
id: 'mainnet_notice',
|
|
139
|
+
title: 'Mainnet (not available yet)',
|
|
140
|
+
run: async () => {
|
|
141
|
+
throw new Error('Mainnet profile is reserved for future use. Use --profile coston2 for now.');
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
steps.push({
|
|
147
|
+
id: 'deploy_instruction_sender',
|
|
148
|
+
title: 'Deploy InstructionSender (Coston2)',
|
|
149
|
+
run: async () => {
|
|
150
|
+
const env = config.loadEnv();
|
|
151
|
+
if (!env.PRIVATE_KEY || !env.INITIAL_OWNER) {
|
|
152
|
+
throw new Error('Missing PRIVATE_KEY/INITIAL_OWNER in .env.');
|
|
153
|
+
}
|
|
154
|
+
const derivedOwner = contract.getAddressFromKey(env.PRIVATE_KEY);
|
|
155
|
+
const keyMatchesOwner = await contract.verifyKeyMatchesOwner(env.PRIVATE_KEY, env.INITIAL_OWNER);
|
|
156
|
+
if (!keyMatchesOwner) {
|
|
157
|
+
throw new Error(`PRIVATE_KEY does not match INITIAL_OWNER in .env.\nPrivate key resolves to ${derivedOwner}, but INITIAL_OWNER is ${env.INITIAL_OWNER}.`);
|
|
158
|
+
}
|
|
159
|
+
if (env.INSTRUCTION_SENDER) {
|
|
160
|
+
console.log(chalk.gray(`INSTRUCTION_SENDER already set: ${env.INSTRUCTION_SENDER}`));
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const ok = await confirm({
|
|
164
|
+
message: 'Deploy InstructionSender on Coston2 now? (sends an on-chain transaction)',
|
|
165
|
+
default: true,
|
|
166
|
+
});
|
|
167
|
+
if (!ok) {
|
|
168
|
+
throw new Error('Deployment cancelled.');
|
|
169
|
+
}
|
|
170
|
+
console.log(chalk.gray('Deploying InstructionSender using Flare official tool...'));
|
|
171
|
+
const output = await officialTools.runGoTool('deploy-contract', env, [], true);
|
|
172
|
+
const address = officialTools.parseLastAddress(output);
|
|
173
|
+
config.writeEnv({ INSTRUCTION_SENDER: address });
|
|
174
|
+
console.log(chalk.green('\n✔ InstructionSender deployed:'), address);
|
|
175
|
+
},
|
|
176
|
+
}, {
|
|
177
|
+
id: 'register_extension',
|
|
178
|
+
title: 'Register extension (Coston2)',
|
|
179
|
+
run: async () => {
|
|
180
|
+
const env = config.loadEnv();
|
|
181
|
+
if (!env.PRIVATE_KEY || !env.INITIAL_OWNER) {
|
|
182
|
+
throw new Error('Missing PRIVATE_KEY/INITIAL_OWNER in .env. Run onboard configure step again.');
|
|
183
|
+
}
|
|
184
|
+
if (!env.INSTRUCTION_SENDER) {
|
|
185
|
+
console.log(chalk.yellow('INSTRUCTION_SENDER is not set yet. Run `flare-fcc deploy` first, then rerun onboarding with `flare-fcc resume`.'));
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
console.log(chalk.gray('Registering extension using Flare official tool (requires running proxy on :6676)...'));
|
|
189
|
+
const output = await officialTools.runGoTool('register-extension', env, ['-instructionSender', env.INSTRUCTION_SENDER], true);
|
|
190
|
+
const id = officialTools.parseExtensionId(output);
|
|
191
|
+
config.writeEnv({ EXTENSION_ID: id });
|
|
192
|
+
console.log(chalk.green('\n✔ Extension Registered! ID:'), id);
|
|
193
|
+
console.log(chalk.gray('\nRestarting stack to apply the real EXTENSION_ID...'));
|
|
194
|
+
await docker.stopStack();
|
|
195
|
+
await docker.runDockerCompose(['up', '-d', '--build']);
|
|
196
|
+
console.log(chalk.gray('Waiting for ext-proxy /info on http://localhost:6676 ...'));
|
|
197
|
+
await docker.fetchProxyInfo('http://localhost:6676', 80, 3000);
|
|
198
|
+
},
|
|
199
|
+
}, {
|
|
200
|
+
id: 'allow_tee_version',
|
|
201
|
+
title: 'Allow TEE version (Coston2)',
|
|
202
|
+
run: async () => {
|
|
203
|
+
const env = config.loadEnv();
|
|
204
|
+
if (!env.PRIVATE_KEY || !env.EXTENSION_ID) {
|
|
205
|
+
throw new Error('Missing PRIVATE_KEY/EXTENSION_ID in .env.');
|
|
206
|
+
}
|
|
207
|
+
console.log(chalk.gray('Allowing TEE version using Flare official tool...'));
|
|
208
|
+
await officialTools.runGoTool('allow-tee-version', env, ['-p', 'http://localhost:6676', '-version', 'v0.1.0']);
|
|
209
|
+
console.log(chalk.green('\n✔ TEE version allowed.'));
|
|
210
|
+
},
|
|
211
|
+
}, {
|
|
212
|
+
id: 'start_tunnel',
|
|
213
|
+
title: 'Start tunnel (Cloudflared)',
|
|
214
|
+
run: async () => {
|
|
215
|
+
const env = config.loadEnv();
|
|
216
|
+
if (env.TUNNEL_URL) {
|
|
217
|
+
console.log(chalk.gray(`TUNNEL_URL already set: ${env.TUNNEL_URL}`));
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
console.log(chalk.cyan('Starting cloudflared tunnel for ext-proxy external port (6676)...'));
|
|
221
|
+
const url = await new Promise((resolve, reject) => {
|
|
222
|
+
tee.startTunnel(6676, (u) => resolve(u), (err) => reject(err));
|
|
223
|
+
});
|
|
224
|
+
config.writeEnv({ TUNNEL_URL: url });
|
|
225
|
+
console.log(chalk.green(`\n✔ Tunnel active at: ${url}`));
|
|
226
|
+
},
|
|
227
|
+
}, {
|
|
228
|
+
id: 'register_tee',
|
|
229
|
+
title: 'Register TEE machine (Coston2)',
|
|
230
|
+
run: async () => {
|
|
231
|
+
const env = config.loadEnv();
|
|
232
|
+
if (!env.EXTENSION_ID || !env.TUNNEL_URL) {
|
|
233
|
+
throw new Error('Missing EXTENSION_ID/TUNNEL_URL in .env.');
|
|
234
|
+
}
|
|
235
|
+
if (!env.NORMAL_PROXY_URL) {
|
|
236
|
+
throw new Error('Missing NORMAL_PROXY_URL in .env (FTDC proxy URL).');
|
|
237
|
+
}
|
|
238
|
+
console.log(chalk.gray('Registering TEE machine using Flare official tool...'));
|
|
239
|
+
// Store register-tee state inside this project so it never tries ../config/...
|
|
240
|
+
// and so we can safely clear stale availability-check state between retries.
|
|
241
|
+
await fs.ensureDir('.flare-fcc');
|
|
242
|
+
const registerTeeStateFile = '.flare-fcc/register-tee.state';
|
|
243
|
+
const args = [
|
|
244
|
+
// Query TEE info from the running proxy (host port 6676).
|
|
245
|
+
'-p',
|
|
246
|
+
'http://localhost:6676',
|
|
247
|
+
// External URL to register on-chain (public tunnel URL).
|
|
248
|
+
'-h',
|
|
249
|
+
env.TUNNEL_URL,
|
|
250
|
+
// FTDC NORMAL proxy URL used for availability checks.
|
|
251
|
+
'-ep',
|
|
252
|
+
env.NORMAL_PROXY_URL,
|
|
253
|
+
// Critical: refresh the attestation challenge even on reruns.
|
|
254
|
+
// Flare's own deployment docs call this out as load-bearing.
|
|
255
|
+
'-command',
|
|
256
|
+
'rRap',
|
|
257
|
+
'-state',
|
|
258
|
+
registerTeeStateFile,
|
|
259
|
+
];
|
|
260
|
+
// `fce-sign` supports laptop/dev registration by setting SIMULATED_TEE=true:
|
|
261
|
+
// it skips parsing a real attestation JWT and uses the test platform/code-hash constants,
|
|
262
|
+
// which match the local proxy /info response.
|
|
263
|
+
// FTDC availability checks can be slow on testnets; retry a few times on transient 404s.
|
|
264
|
+
const toolEnv = { ...env, SIMULATED_TEE: 'true', LOCAL_MODE: 'true' };
|
|
265
|
+
let lastErr = undefined;
|
|
266
|
+
const maxAttempts = 5;
|
|
267
|
+
const retryDelayMs = 20_000;
|
|
268
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
269
|
+
try {
|
|
270
|
+
if (await fs.pathExists(registerTeeStateFile)) {
|
|
271
|
+
await fs.remove(registerTeeStateFile);
|
|
272
|
+
}
|
|
273
|
+
await officialTools.runGoTool('register-tee', toolEnv, args, true);
|
|
274
|
+
lastErr = undefined;
|
|
275
|
+
break;
|
|
276
|
+
}
|
|
277
|
+
catch (err) {
|
|
278
|
+
lastErr = err;
|
|
279
|
+
const msg = String(err?.message ?? err ?? '');
|
|
280
|
+
const isTransient404 = msg.includes('action result status not ok, got: 404') || msg.includes('got: 404');
|
|
281
|
+
if (!isTransient404 || attempt === maxAttempts)
|
|
282
|
+
throw err;
|
|
283
|
+
console.log(chalk.yellow(`\nregister-tee availability check not ready yet (404). Retrying (${attempt}/${maxAttempts})...`));
|
|
284
|
+
await new Promise((r) => setTimeout(r, retryDelayMs));
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
console.log(chalk.green('\n✔ TEE machine registered.'));
|
|
288
|
+
},
|
|
289
|
+
}, {
|
|
290
|
+
id: 'e2e_test',
|
|
291
|
+
title: 'Run E2E test (Coston2)',
|
|
292
|
+
run: async () => {
|
|
293
|
+
const env = config.loadEnv();
|
|
294
|
+
if (!env.PRIVATE_KEY || !env.EXTENSION_ID || !env.INSTRUCTION_SENDER) {
|
|
295
|
+
throw new Error('Missing PRIVATE_KEY/EXTENSION_ID/INSTRUCTION_SENDER in .env.');
|
|
296
|
+
}
|
|
297
|
+
console.log(chalk.gray('Running Flare official E2E test tool...'));
|
|
298
|
+
await officialTools.assertE2EPrereqs();
|
|
299
|
+
// fce-sign tools default proxy URL to localhost:6664 (container port).
|
|
300
|
+
// From a laptop we expose the proxy external port on localhost:6676.
|
|
301
|
+
await officialTools.runGoTool('run-test', env, ['-p', 'http://localhost:6676', '-instructionSender', env.INSTRUCTION_SENDER]);
|
|
302
|
+
console.log(chalk.green('\n✔ E2E test completed.'));
|
|
303
|
+
},
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
return steps;
|
|
307
|
+
}
|
|
308
|
+
async function runSteps(steps, state, profile, dryRun) {
|
|
309
|
+
console.log(chalk.magenta.bold(`\nFLARE-FCC ONBOARD (${profile})\n`));
|
|
310
|
+
if (dryRun) {
|
|
311
|
+
console.log(chalk.cyan('Planned steps:'));
|
|
312
|
+
for (const s of steps)
|
|
313
|
+
console.log(`- ${s.id}: ${s.title}`);
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
for (const step of steps) {
|
|
317
|
+
if (state.completedSteps.includes(step.id))
|
|
318
|
+
continue;
|
|
319
|
+
console.log(chalk.cyan(`\n→ ${step.title}`));
|
|
320
|
+
try {
|
|
321
|
+
await step.run({ profile, state });
|
|
322
|
+
state.completedSteps.push(step.id);
|
|
323
|
+
await stateStore.saveState(state);
|
|
324
|
+
}
|
|
325
|
+
catch (err) {
|
|
326
|
+
const message = String(err?.message ?? err ?? '');
|
|
327
|
+
console.error(chalk.red(`\n✖ Step failed: ${step.id}`));
|
|
328
|
+
if (message)
|
|
329
|
+
console.error(chalk.red(message));
|
|
330
|
+
const suggestions = [];
|
|
331
|
+
const lower = message.toLowerCase();
|
|
332
|
+
if (step.id === 'doctor') {
|
|
333
|
+
suggestions.push('Run `node ./dist/index.js doctor` (from the workbench folder) to see exactly what is missing.');
|
|
334
|
+
suggestions.push('Fix the failing checks (Docker daemon is the most common), then rerun `node ./dist/index.js onboard --profile coston2`.');
|
|
335
|
+
}
|
|
336
|
+
if (lower.includes('ports 6675/6676 are already in use') || lower.includes('port is already allocated')) {
|
|
337
|
+
suggestions.push('Another FCC stack is already running on 6675/6676.');
|
|
338
|
+
suggestions.push('Run `node ../dist/index.js stop` from the other project folder, or run `docker compose down` there.');
|
|
339
|
+
}
|
|
340
|
+
if (lower.includes('docker compose exited with code')) {
|
|
341
|
+
suggestions.push('Inspect logs: `docker compose logs --tail 200 ext-proxy` (run inside the project folder).');
|
|
342
|
+
suggestions.push('If needed, stop stack: `node ../dist/index.js stop` (run inside the project folder).');
|
|
343
|
+
}
|
|
344
|
+
if (lower.includes('proxy /info did not become available') || lower.includes('/info')) {
|
|
345
|
+
suggestions.push('Check proxy logs: `docker compose logs --tail 200 ext-proxy`.');
|
|
346
|
+
}
|
|
347
|
+
if (suggestions.length) {
|
|
348
|
+
console.error(chalk.yellow('\nSuggested fixes:'));
|
|
349
|
+
for (const s of suggestions)
|
|
350
|
+
console.error(chalk.yellow(`- ${s}`));
|
|
351
|
+
}
|
|
352
|
+
if (step.id !== 'doctor') {
|
|
353
|
+
console.error(chalk.gray('\nTip: after fixing the issue, run `node ../dist/index.js resume` from the same project folder to continue.\n'));
|
|
354
|
+
}
|
|
355
|
+
throw err;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
console.log(chalk.green('\n✔ Onboard flow completed (Phase 1 skeleton).\n'));
|
|
359
|
+
}
|
|
360
|
+
export async function onboard(opts) {
|
|
361
|
+
const state = stateStore.newRunState(opts.profile);
|
|
362
|
+
await stateStore.saveState(state);
|
|
363
|
+
const steps = stepsForProfile(opts.profile);
|
|
364
|
+
await runSteps(steps, state, opts.profile, opts.dryRun);
|
|
365
|
+
}
|
|
366
|
+
export async function resume(opts) {
|
|
367
|
+
const existing = await stateStore.loadState();
|
|
368
|
+
if (!existing) {
|
|
369
|
+
throw new Error('No onboarding state found. Run `flare-fcc onboard` first.');
|
|
370
|
+
}
|
|
371
|
+
const steps = stepsForProfile(existing.profile);
|
|
372
|
+
await runSteps(steps, existing, existing.profile, opts.dryRun);
|
|
373
|
+
}
|
|
374
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/modules/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare function createAgent(name: string, language: string): Promise<
|
|
1
|
+
export declare function createAgent(name: string, language: string): Promise<string>;
|
package/dist/modules/scaffold.js
CHANGED
|
@@ -2,73 +2,76 @@ import fs from 'fs-extra';
|
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import chalk from 'chalk';
|
|
4
4
|
import * as templates from '../templates/index.js';
|
|
5
|
+
function normalizeProjectName(name) {
|
|
6
|
+
const trimmed = name.trim();
|
|
7
|
+
const dashed = trimmed.replace(/\s+/g, '-');
|
|
8
|
+
const cleaned = dashed.replace(/[^a-zA-Z0-9._-]/g, '');
|
|
9
|
+
return cleaned || 'my-fcc-agent';
|
|
10
|
+
}
|
|
5
11
|
export async function createAgent(name, language) {
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
12
|
+
const safeName = normalizeProjectName(name);
|
|
13
|
+
const projectDir = path.join(process.cwd(), safeName);
|
|
14
|
+
if (await fs.pathExists(projectDir)) {
|
|
15
|
+
throw new Error(`Directory "${safeName}" already exists.`);
|
|
10
16
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
await fs.ensureDir(projectDir);
|
|
14
|
-
await fs.ensureDir(path.join(projectDir, 'extension'));
|
|
15
|
-
await fs.ensureDir(path.join(projectDir, 'proxy'));
|
|
16
|
-
await fs.ensureDir(path.join(projectDir, 'config', 'proxy'));
|
|
17
|
-
await fs.ensureDir(path.join(projectDir, 'contracts'));
|
|
18
|
-
await fs.ensureDir(path.join(projectDir, 'scripts'));
|
|
19
|
-
// Write common files
|
|
20
|
-
await fs.writeFile(path.join(projectDir, 'docker-compose.yml'), templates.DOCKER_COMPOSE);
|
|
21
|
-
// Write Docker stack
|
|
22
|
-
await fs.writeFile(path.join(projectDir, 'extension', 'Dockerfile'), templates.DOCKERFILE);
|
|
23
|
-
await fs.writeFile(path.join(projectDir, 'proxy', 'Dockerfile'), templates.PROXY_DOCKERFILE);
|
|
24
|
-
await fs.writeFile(path.join(projectDir, 'config', 'proxy', 'extension_proxy.toml'), templates.PROXY_CONFIG);
|
|
25
|
-
await fs.writeFile(path.join(projectDir, '.env.example'), [
|
|
26
|
-
'PRIVATE_KEY=0x...',
|
|
27
|
-
'INITIAL_OWNER=0x...',
|
|
28
|
-
'EXTENSION_ID=',
|
|
29
|
-
'INSTRUCTION_SENDER=',
|
|
30
|
-
'TUNNEL_URL=',
|
|
31
|
-
'RPC_URL=https://coston2-api.flare.network/ext/C/rpc',
|
|
32
|
-
].join('\n') + '\n');
|
|
33
|
-
// Write App Kernel
|
|
34
|
-
const appFile = language === 'typescript' ? 'app.ts' : language === 'python' ? 'app.py' : 'main.go';
|
|
35
|
-
const appContent = language === 'typescript' ? templates.TS_APP : language === 'python' ? templates.PY_APP : templates.GO_APP;
|
|
36
|
-
await fs.writeFile(path.join(projectDir, 'extension', appFile), appContent);
|
|
37
|
-
if (language === 'typescript') {
|
|
38
|
-
await fs.writeFile(path.join(projectDir, 'extension', 'package.json'), templates.TS_PACKAGE(name));
|
|
39
|
-
await fs.writeFile(path.join(projectDir, 'extension', 'tsconfig.json'), JSON.stringify({
|
|
40
|
-
compilerOptions: {
|
|
41
|
-
target: "ESNext",
|
|
42
|
-
module: "ESNext",
|
|
43
|
-
moduleResolution: "node",
|
|
44
|
-
outDir: "./dist",
|
|
45
|
-
rootDir: "./",
|
|
46
|
-
strict: true,
|
|
47
|
-
esModuleInterop: true,
|
|
48
|
-
skipLibCheck: true
|
|
49
|
-
}
|
|
50
|
-
}, null, 2));
|
|
51
|
-
}
|
|
52
|
-
// Write Solidity Contract
|
|
53
|
-
await fs.writeFile(path.join(projectDir, 'contracts', 'InstructionSender.sol'), templates.SOL_CONTRACT);
|
|
54
|
-
await fs.writeFile(path.join(projectDir, 'scripts', 'deploy.js'), templates.DEPLOY_SCRIPT);
|
|
55
|
-
console.log(chalk.green(`\n✔ Ghost Agent ${name} birthed successfully!`));
|
|
56
|
-
console.log(chalk.white('\nGenerated:'));
|
|
57
|
-
console.log(chalk.gray(' - extension/ (TEE app code)'));
|
|
58
|
-
console.log(chalk.gray(' - proxy/Dockerfile (Flare TEE proxy)'));
|
|
59
|
-
console.log(chalk.gray(' - config/proxy/ (Proxy config — fill in DB creds)'));
|
|
60
|
-
console.log(chalk.gray(' - contracts/ (InstructionSender.sol)'));
|
|
61
|
-
console.log(chalk.white('\nNext steps:'));
|
|
62
|
-
console.log(chalk.cyan(` cd ${name}`));
|
|
63
|
-
console.log(chalk.yellow(' 1. Run the setup wizard to configure your DB, Private Key, and Initial Owner:'));
|
|
64
|
-
console.log(chalk.cyan(' npx @flarestudio/fcc-workbench@latest setup'));
|
|
65
|
-
console.log(chalk.yellow(' (Or manually rename .env.example to .env and edit extension_proxy.toml)'));
|
|
66
|
-
console.log(chalk.cyan('\n npx @flarestudio/fcc-workbench@latest deploy # deploy contract'));
|
|
67
|
-
console.log(chalk.cyan(' npx @flarestudio/fcc-workbench@latest register-ext # register extension'));
|
|
68
|
-
console.log(chalk.cyan(' npx @flarestudio/fcc-workbench@latest start # start TEE stack'));
|
|
17
|
+
if (safeName !== name) {
|
|
18
|
+
console.log(chalk.yellow(`\nName normalized to "${safeName}" (was "${name}").`));
|
|
69
19
|
}
|
|
70
|
-
|
|
71
|
-
|
|
20
|
+
console.log(chalk.gray(`\n⏳ Seeding Ghost Agent: ${safeName}...`));
|
|
21
|
+
await fs.ensureDir(projectDir);
|
|
22
|
+
await fs.ensureDir(path.join(projectDir, 'extension'));
|
|
23
|
+
await fs.ensureDir(path.join(projectDir, 'proxy'));
|
|
24
|
+
await fs.ensureDir(path.join(projectDir, 'config', 'proxy'));
|
|
25
|
+
await fs.ensureDir(path.join(projectDir, 'contracts'));
|
|
26
|
+
await fs.ensureDir(path.join(projectDir, 'scripts'));
|
|
27
|
+
await fs.writeFile(path.join(projectDir, 'docker-compose.yml'), templates.DOCKER_COMPOSE);
|
|
28
|
+
await fs.writeFile(path.join(projectDir, 'extension', 'Dockerfile'), templates.DOCKERFILE);
|
|
29
|
+
await fs.writeFile(path.join(projectDir, 'proxy', 'Dockerfile'), templates.PROXY_DOCKERFILE);
|
|
30
|
+
await fs.writeFile(path.join(projectDir, 'config', 'proxy', 'extension_proxy.toml'), templates.PROXY_CONFIG);
|
|
31
|
+
await fs.writeFile(path.join(projectDir, '.env.example'), [
|
|
32
|
+
`LANGUAGE=${language}`,
|
|
33
|
+
'PRIVATE_KEY=0x...',
|
|
34
|
+
'INITIAL_OWNER=0x...',
|
|
35
|
+
'EXTENSION_ID=',
|
|
36
|
+
'INSTRUCTION_SENDER=',
|
|
37
|
+
'TUNNEL_URL=',
|
|
38
|
+
'RPC_URL=https://coston2-api.flare.network/ext/C/rpc',
|
|
39
|
+
].join('\n') + '\n');
|
|
40
|
+
await fs.writeFile(path.join(projectDir, '.gitignore'), ['.env', '.flare-fcc-tools/', 'node_modules/', 'dist/'].join('\n') + '\n');
|
|
41
|
+
const appFile = language === 'typescript' ? 'app.ts' : language === 'python' ? 'app.py' : 'main.go';
|
|
42
|
+
const appContent = language === 'typescript' ? templates.TS_APP : language === 'python' ? templates.PY_APP : templates.GO_APP;
|
|
43
|
+
await fs.writeFile(path.join(projectDir, 'extension', appFile), appContent);
|
|
44
|
+
if (language === 'typescript') {
|
|
45
|
+
await fs.writeFile(path.join(projectDir, 'extension', 'package.json'), templates.TS_PACKAGE(safeName));
|
|
46
|
+
await fs.writeFile(path.join(projectDir, 'extension', 'tsconfig.json'), JSON.stringify({
|
|
47
|
+
compilerOptions: {
|
|
48
|
+
target: 'ESNext',
|
|
49
|
+
module: 'ESNext',
|
|
50
|
+
moduleResolution: 'node',
|
|
51
|
+
outDir: './dist',
|
|
52
|
+
rootDir: './',
|
|
53
|
+
strict: true,
|
|
54
|
+
esModuleInterop: true,
|
|
55
|
+
skipLibCheck: true,
|
|
56
|
+
},
|
|
57
|
+
}, null, 2));
|
|
72
58
|
}
|
|
59
|
+
await fs.writeFile(path.join(projectDir, 'contracts', 'InstructionSender.sol'), templates.SOL_CONTRACT);
|
|
60
|
+
await fs.writeFile(path.join(projectDir, 'scripts', 'deploy.js'), templates.DEPLOY_SCRIPT);
|
|
61
|
+
console.log(chalk.green(`\n✔ Ghost Agent ${safeName} birthed successfully!`));
|
|
62
|
+
console.log(chalk.white('\nGenerated:'));
|
|
63
|
+
console.log(chalk.gray(' - extension/ (TEE app code)'));
|
|
64
|
+
console.log(chalk.gray(' - proxy/Dockerfile (Flare TEE proxy)'));
|
|
65
|
+
console.log(chalk.gray(' - config/proxy/ (Proxy config — fill in DB creds)'));
|
|
66
|
+
console.log(chalk.gray(' - contracts/ (InstructionSender.sol)'));
|
|
67
|
+
console.log(chalk.white('\nNext steps:'));
|
|
68
|
+
console.log(chalk.cyan(` cd ${safeName}`));
|
|
69
|
+
console.log(chalk.yellow(' 1. Run the setup wizard to configure your DB, Private Key, and Initial Owner:'));
|
|
70
|
+
console.log(chalk.cyan(' npx @flarestudio/fcc-workbench@latest setup'));
|
|
71
|
+
console.log(chalk.yellow(' (Or manually rename .env.example to .env and edit extension_proxy.toml)'));
|
|
72
|
+
console.log(chalk.cyan('\n npx @flarestudio/fcc-workbench@latest deploy # deploy contract'));
|
|
73
|
+
console.log(chalk.cyan(' npx @flarestudio/fcc-workbench@latest register-ext # register extension'));
|
|
74
|
+
console.log(chalk.cyan(' npx @flarestudio/fcc-workbench@latest start # start TEE stack'));
|
|
75
|
+
return safeName;
|
|
73
76
|
}
|
|
74
77
|
//# sourceMappingURL=scaffold.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/modules/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,SAAS,MAAM,uBAAuB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,QAAgB;IAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/modules/scaffold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface RunState {
|
|
2
|
+
runId: string;
|
|
3
|
+
profile: 'coston2' | 'mainnet';
|
|
4
|
+
createdAt: string;
|
|
5
|
+
updatedAt: string;
|
|
6
|
+
completedSteps: string[];
|
|
7
|
+
outputs: Record<string, unknown>;
|
|
8
|
+
}
|
|
9
|
+
export declare function statePath(cwd?: string): string;
|
|
10
|
+
export declare function loadState(cwd?: string): Promise<RunState | null>;
|
|
11
|
+
export declare function saveState(state: RunState, cwd?: string): Promise<void>;
|
|
12
|
+
export declare function newRunState(profile: RunState['profile']): RunState;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
const STATE_DIR = path.join('.flare-fcc');
|
|
4
|
+
const STATE_FILE = path.join(STATE_DIR, 'state.json');
|
|
5
|
+
export function statePath(cwd = process.cwd()) {
|
|
6
|
+
return path.resolve(cwd, STATE_FILE);
|
|
7
|
+
}
|
|
8
|
+
export async function loadState(cwd = process.cwd()) {
|
|
9
|
+
const p = statePath(cwd);
|
|
10
|
+
if (!(await fs.pathExists(p)))
|
|
11
|
+
return null;
|
|
12
|
+
return (await fs.readJson(p));
|
|
13
|
+
}
|
|
14
|
+
export async function saveState(state, cwd = process.cwd()) {
|
|
15
|
+
const p = statePath(cwd);
|
|
16
|
+
await fs.ensureDir(path.dirname(p));
|
|
17
|
+
state.updatedAt = new Date().toISOString();
|
|
18
|
+
await fs.writeJson(p, state, { spaces: 2 });
|
|
19
|
+
}
|
|
20
|
+
export function newRunState(profile) {
|
|
21
|
+
const runId = `run-${Date.now()}`;
|
|
22
|
+
const now = new Date().toISOString();
|
|
23
|
+
return {
|
|
24
|
+
runId,
|
|
25
|
+
profile,
|
|
26
|
+
createdAt: now,
|
|
27
|
+
updatedAt: now,
|
|
28
|
+
completedSteps: [],
|
|
29
|
+
outputs: {},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/modules/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAWxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AAEtD,MAAM,UAAU,SAAS,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IACjD,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IACzB,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAa,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAe,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAClE,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IACzB,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,KAAK,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAA4B;IACtD,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO;QACL,KAAK;QACL,OAAO;QACP,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;QACd,cAAc,EAAE,EAAE;QAClB,OAAO,EAAE,EAAE;KACZ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function readPackageVersion(): string;
|