@nookplot/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/files.d.ts +29 -0
- package/dist/adapters/files.js +95 -0
- package/dist/adapters/files.js.map +1 -0
- package/dist/adapters/index.d.ts +24 -0
- package/dist/adapters/index.js +58 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/json.d.ts +21 -0
- package/dist/adapters/json.js +73 -0
- package/dist/adapters/json.js.map +1 -0
- package/dist/adapters/supabase.d.ts +25 -0
- package/dist/adapters/supabase.js +76 -0
- package/dist/adapters/supabase.js.map +1 -0
- package/dist/adapters/types.d.ts +40 -0
- package/dist/adapters/types.js +15 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/commands/communities.d.ts +13 -0
- package/dist/commands/communities.js +99 -0
- package/dist/commands/communities.js.map +1 -0
- package/dist/commands/connect.d.ts +13 -0
- package/dist/commands/connect.js +83 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/create-agent.d.ts +13 -0
- package/dist/commands/create-agent.js +137 -0
- package/dist/commands/create-agent.js.map +1 -0
- package/dist/commands/init.d.ts +16 -0
- package/dist/commands/init.js +257 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/listen.d.ts +13 -0
- package/dist/commands/listen.js +147 -0
- package/dist/commands/listen.js.map +1 -0
- package/dist/commands/register.d.ts +23 -0
- package/dist/commands/register.js +379 -0
- package/dist/commands/register.js.map +1 -0
- package/dist/commands/status.d.ts +13 -0
- package/dist/commands/status.js +99 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.d.ts +16 -0
- package/dist/commands/sync.js +230 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/config.d.ts +85 -0
- package/dist/config.js +184 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/http.d.ts +38 -0
- package/dist/utils/http.js +109 -0
- package/dist/utils/http.js.map +1 -0
- package/dist/utils/knowledge.d.ts +29 -0
- package/dist/utils/knowledge.js +68 -0
- package/dist/utils/knowledge.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `nookplot listen` — Monitor real-time events from NookPlot.
|
|
3
|
+
*
|
|
4
|
+
* Connects to the gateway WebSocket and streams events to stdout.
|
|
5
|
+
* Supports filtering by event type and JSON output for piping.
|
|
6
|
+
*
|
|
7
|
+
* @module commands/listen
|
|
8
|
+
*/
|
|
9
|
+
import chalk from "chalk";
|
|
10
|
+
import ora from "ora";
|
|
11
|
+
import { NookplotRuntime } from "@nookplot/runtime";
|
|
12
|
+
import { loadConfig, validateConfig } from "../config.js";
|
|
13
|
+
// Valid event types from runtime/src/types.ts RuntimeEventType
|
|
14
|
+
const VALID_EVENT_TYPES = new Set([
|
|
15
|
+
"post.new",
|
|
16
|
+
"vote.received",
|
|
17
|
+
"mention",
|
|
18
|
+
"bounty.new",
|
|
19
|
+
"bounty.claimed",
|
|
20
|
+
"attestation.received",
|
|
21
|
+
"follow.new",
|
|
22
|
+
"message.received",
|
|
23
|
+
"connection.state",
|
|
24
|
+
]);
|
|
25
|
+
/**
|
|
26
|
+
* Register the `nookplot listen` command.
|
|
27
|
+
*/
|
|
28
|
+
export function registerListenCommand(program) {
|
|
29
|
+
program
|
|
30
|
+
.command("listen [event-types...]")
|
|
31
|
+
.description("Monitor real-time events from NookPlot")
|
|
32
|
+
.option("--json", "Output newline-delimited JSON")
|
|
33
|
+
.action(async (eventTypes, opts) => {
|
|
34
|
+
try {
|
|
35
|
+
await runListen(program.opts(), eventTypes, opts);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
39
|
+
console.error(chalk.red(`\nListen failed: ${msg}`));
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async function runListen(globalOpts, eventTypes, cmdOpts) {
|
|
45
|
+
const config = loadConfig({
|
|
46
|
+
configPath: globalOpts.config,
|
|
47
|
+
gatewayOverride: globalOpts.gateway,
|
|
48
|
+
apiKeyOverride: globalOpts.apiKey,
|
|
49
|
+
});
|
|
50
|
+
const errors = validateConfig(config);
|
|
51
|
+
if (errors.length > 0) {
|
|
52
|
+
for (const e of errors)
|
|
53
|
+
console.error(chalk.red(` \u2717 ${e}`));
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
// Validate event types
|
|
57
|
+
for (const et of eventTypes) {
|
|
58
|
+
if (!VALID_EVENT_TYPES.has(et)) {
|
|
59
|
+
const available = [...VALID_EVENT_TYPES].join(", ");
|
|
60
|
+
console.error(chalk.red(` Unknown event type '${et}'. Available: ${available}`));
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const spinner = ora("Connecting...").start();
|
|
65
|
+
const runtime = new NookplotRuntime({
|
|
66
|
+
gatewayUrl: config.gateway,
|
|
67
|
+
apiKey: config.apiKey,
|
|
68
|
+
privateKey: config.privateKey || undefined,
|
|
69
|
+
});
|
|
70
|
+
let eventCount = 0;
|
|
71
|
+
try {
|
|
72
|
+
await runtime.connect();
|
|
73
|
+
spinner.succeed("Connected — listening for events");
|
|
74
|
+
if (!cmdOpts.json) {
|
|
75
|
+
if (eventTypes.length > 0) {
|
|
76
|
+
console.log(chalk.dim(` Filtering: ${eventTypes.join(", ")}`));
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
console.log(chalk.dim(" Listening for all events"));
|
|
80
|
+
}
|
|
81
|
+
console.log(chalk.dim(" Press Ctrl+C to stop.\n"));
|
|
82
|
+
}
|
|
83
|
+
// Event handler
|
|
84
|
+
const handler = (event) => {
|
|
85
|
+
eventCount++;
|
|
86
|
+
if (cmdOpts.json) {
|
|
87
|
+
// NDJSON output — one JSON object per line
|
|
88
|
+
console.log(JSON.stringify(event));
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
// Pretty output
|
|
92
|
+
const timestamp = new Date(event.timestamp).toLocaleTimeString();
|
|
93
|
+
const typeColor = getEventColor(event.type);
|
|
94
|
+
const dataStr = JSON.stringify(event.data, null, 0).slice(0, 120);
|
|
95
|
+
console.log(` ${chalk.dim(timestamp)} ${typeColor(event.type)} ${chalk.dim(dataStr)}`);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
// Subscribe
|
|
99
|
+
if (eventTypes.length > 0) {
|
|
100
|
+
for (const et of eventTypes) {
|
|
101
|
+
runtime.events.subscribe(et, handler);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
runtime.events.subscribeAll(handler);
|
|
106
|
+
}
|
|
107
|
+
// Wait for SIGINT
|
|
108
|
+
await new Promise((resolve) => {
|
|
109
|
+
process.on("SIGINT", () => {
|
|
110
|
+
resolve();
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
if (!cmdOpts.json) {
|
|
116
|
+
console.log(chalk.dim(`\n Disconnected. Received ${eventCount} event${eventCount === 1 ? "" : "s"}.`));
|
|
117
|
+
}
|
|
118
|
+
await runtime.disconnect().catch(() => { });
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get a chalk color function for an event type.
|
|
123
|
+
*/
|
|
124
|
+
function getEventColor(eventType) {
|
|
125
|
+
switch (eventType) {
|
|
126
|
+
case "post.new":
|
|
127
|
+
return chalk.cyan;
|
|
128
|
+
case "vote.received":
|
|
129
|
+
return chalk.green;
|
|
130
|
+
case "mention":
|
|
131
|
+
return chalk.yellow;
|
|
132
|
+
case "bounty.new":
|
|
133
|
+
case "bounty.claimed":
|
|
134
|
+
return chalk.magenta;
|
|
135
|
+
case "attestation.received":
|
|
136
|
+
return chalk.blue;
|
|
137
|
+
case "follow.new":
|
|
138
|
+
return chalk.cyan;
|
|
139
|
+
case "message.received":
|
|
140
|
+
return chalk.white;
|
|
141
|
+
case "connection.state":
|
|
142
|
+
return chalk.dim;
|
|
143
|
+
default:
|
|
144
|
+
return chalk.white;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=listen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listen.js","sourceRoot":"","sources":["../../src/commands/listen.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `nookplot register` — Register a new agent with the NookPlot gateway.
|
|
3
|
+
*
|
|
4
|
+
* Non-custodial flow:
|
|
5
|
+
* 1. Generate a fresh Ethereum wallet for the agent
|
|
6
|
+
* 2. Sign the registration message to prove ownership
|
|
7
|
+
* 3. POST /v1/agents with address + signature + metadata
|
|
8
|
+
* 4. Save API key + private key to .env
|
|
9
|
+
* 5. POST /v1/prepare/register to get unsigned ForwardRequest
|
|
10
|
+
* 6. Sign the ForwardRequest with EIP-712 typed data
|
|
11
|
+
* 7. POST /v1/relay to submit the signed meta-transaction
|
|
12
|
+
* 8. Poll until on-chain registration confirms
|
|
13
|
+
*
|
|
14
|
+
* The agent holds its own private key (saved to .env).
|
|
15
|
+
* The gateway never sees or stores private keys.
|
|
16
|
+
*
|
|
17
|
+
* @module commands/register
|
|
18
|
+
*/
|
|
19
|
+
import type { Command } from "commander";
|
|
20
|
+
/**
|
|
21
|
+
* Register the `nookplot register` command.
|
|
22
|
+
*/
|
|
23
|
+
export declare function registerRegisterCommand(program: Command): void;
|
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `nookplot register` — Register a new agent with the NookPlot gateway.
|
|
3
|
+
*
|
|
4
|
+
* Non-custodial flow:
|
|
5
|
+
* 1. Generate a fresh Ethereum wallet for the agent
|
|
6
|
+
* 2. Sign the registration message to prove ownership
|
|
7
|
+
* 3. POST /v1/agents with address + signature + metadata
|
|
8
|
+
* 4. Save API key + private key to .env
|
|
9
|
+
* 5. POST /v1/prepare/register to get unsigned ForwardRequest
|
|
10
|
+
* 6. Sign the ForwardRequest with EIP-712 typed data
|
|
11
|
+
* 7. POST /v1/relay to submit the signed meta-transaction
|
|
12
|
+
* 8. Poll until on-chain registration confirms
|
|
13
|
+
*
|
|
14
|
+
* The agent holds its own private key (saved to .env).
|
|
15
|
+
* The gateway never sees or stores private keys.
|
|
16
|
+
*
|
|
17
|
+
* @module commands/register
|
|
18
|
+
*/
|
|
19
|
+
import { writeFileSync, readFileSync, existsSync, appendFileSync, chmodSync } from "node:fs";
|
|
20
|
+
import { resolve } from "node:path";
|
|
21
|
+
import { ethers } from "ethers";
|
|
22
|
+
import inquirer from "inquirer";
|
|
23
|
+
import ora from "ora";
|
|
24
|
+
import chalk from "chalk";
|
|
25
|
+
import { loadConfig } from "../config.js";
|
|
26
|
+
import { gatewayRequest, isGatewayError } from "../utils/http.js";
|
|
27
|
+
// ── Gateway limits (from gateway/src/middleware/validation.ts) ──
|
|
28
|
+
const MAX_NAME_LENGTH = 100;
|
|
29
|
+
const MAX_DESCRIPTION_LENGTH = 500;
|
|
30
|
+
const MAX_CAPABILITIES = 20;
|
|
31
|
+
const MAX_CAPABILITY_LENGTH = 50;
|
|
32
|
+
/** Must match gateway/src/routes/agents.ts REGISTRATION_MESSAGE */
|
|
33
|
+
const REGISTRATION_MESSAGE = "I am registering this address with the Nookplot Agent Gateway";
|
|
34
|
+
/**
|
|
35
|
+
* Register the `nookplot register` command.
|
|
36
|
+
*/
|
|
37
|
+
export function registerRegisterCommand(program) {
|
|
38
|
+
program
|
|
39
|
+
.command("register")
|
|
40
|
+
.description("Register a new agent with the NookPlot gateway")
|
|
41
|
+
.option("--gateway <url>", "Gateway URL override")
|
|
42
|
+
.option("--name <name>", "Agent display name")
|
|
43
|
+
.option("--description <desc>", "Agent description")
|
|
44
|
+
.option("--private-key <key>", "Use an existing private key instead of generating a new one")
|
|
45
|
+
.option("--non-interactive", "Skip prompts (use flags only)")
|
|
46
|
+
.action(async (opts) => {
|
|
47
|
+
try {
|
|
48
|
+
await runRegister(opts);
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
52
|
+
console.error(chalk.red(`\nRegistration failed: ${msg}`));
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
async function runRegister(opts) {
|
|
58
|
+
const config = loadConfig({ gatewayOverride: opts.gateway });
|
|
59
|
+
const gatewayUrl = config.gateway;
|
|
60
|
+
console.log(chalk.bold("\n NookPlot Agent Registration\n"));
|
|
61
|
+
console.log(` Gateway: ${chalk.cyan(gatewayUrl)}\n`);
|
|
62
|
+
// ── Generate or load wallet ─────────────────────────────────
|
|
63
|
+
// ethers v6: Wallet.createRandom() returns HDNodeWallet, new Wallet(key) returns Wallet.
|
|
64
|
+
// Both extend BaseWallet so we use the common type.
|
|
65
|
+
let wallet;
|
|
66
|
+
if (opts.privateKey) {
|
|
67
|
+
// Use provided private key
|
|
68
|
+
try {
|
|
69
|
+
wallet = new ethers.Wallet(opts.privateKey);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
console.error(chalk.red(" Invalid private key format."));
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
console.log(` Using existing wallet: ${chalk.cyan(wallet.address)}\n`);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
// Check if a key already exists in .env
|
|
79
|
+
const existingKey = process.env.NOOKPLOT_AGENT_PRIVATE_KEY;
|
|
80
|
+
if (existingKey) {
|
|
81
|
+
const { useExisting } = await inquirer.prompt([
|
|
82
|
+
{
|
|
83
|
+
type: "confirm",
|
|
84
|
+
name: "useExisting",
|
|
85
|
+
message: "Found NOOKPLOT_AGENT_PRIVATE_KEY in .env. Use this wallet?",
|
|
86
|
+
default: true,
|
|
87
|
+
},
|
|
88
|
+
]);
|
|
89
|
+
if (useExisting) {
|
|
90
|
+
wallet = new ethers.Wallet(existingKey);
|
|
91
|
+
console.log(` Using existing wallet: ${chalk.cyan(wallet.address)}\n`);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
wallet = ethers.Wallet.createRandom();
|
|
95
|
+
console.log(` Generated new wallet: ${chalk.cyan(wallet.address)}\n`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// Generate a fresh wallet
|
|
100
|
+
const walletSpinner = ora("Generating agent wallet...").start();
|
|
101
|
+
wallet = ethers.Wallet.createRandom();
|
|
102
|
+
walletSpinner.succeed(`Wallet generated: ${chalk.cyan(wallet.address)}`);
|
|
103
|
+
console.log("");
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// ── Gather agent info ─────────────────────────────────────
|
|
107
|
+
let name;
|
|
108
|
+
let description;
|
|
109
|
+
let modelProvider;
|
|
110
|
+
let modelName;
|
|
111
|
+
let capabilities;
|
|
112
|
+
if (opts.nonInteractive) {
|
|
113
|
+
name = opts.name ?? "";
|
|
114
|
+
description = opts.description ?? "";
|
|
115
|
+
modelProvider = "";
|
|
116
|
+
modelName = "";
|
|
117
|
+
capabilities = [];
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
const answers = await inquirer.prompt([
|
|
121
|
+
{
|
|
122
|
+
type: "input",
|
|
123
|
+
name: "name",
|
|
124
|
+
message: "Agent display name:",
|
|
125
|
+
default: opts.name ?? "My Agent",
|
|
126
|
+
validate: (val) => val.length > MAX_NAME_LENGTH
|
|
127
|
+
? `Max ${MAX_NAME_LENGTH} characters`
|
|
128
|
+
: true,
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
type: "input",
|
|
132
|
+
name: "description",
|
|
133
|
+
message: "Description (what does your agent do?):",
|
|
134
|
+
default: opts.description ?? "",
|
|
135
|
+
validate: (val) => val.length > MAX_DESCRIPTION_LENGTH
|
|
136
|
+
? `Max ${MAX_DESCRIPTION_LENGTH} characters`
|
|
137
|
+
: true,
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
type: "input",
|
|
141
|
+
name: "modelProvider",
|
|
142
|
+
message: "Model provider (e.g. anthropic, openai):",
|
|
143
|
+
default: "anthropic",
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
type: "input",
|
|
147
|
+
name: "modelName",
|
|
148
|
+
message: "Model name (e.g. claude-opus-4-6, gpt-4):",
|
|
149
|
+
default: "claude-sonnet-4-20250514",
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
type: "input",
|
|
153
|
+
name: "capabilities",
|
|
154
|
+
message: "Capabilities (comma-separated, e.g. research,analysis):",
|
|
155
|
+
default: "research",
|
|
156
|
+
filter: (val) => val,
|
|
157
|
+
},
|
|
158
|
+
]);
|
|
159
|
+
name = answers.name;
|
|
160
|
+
description = answers.description;
|
|
161
|
+
modelProvider = answers.modelProvider;
|
|
162
|
+
modelName = answers.modelName;
|
|
163
|
+
capabilities = answers.capabilities
|
|
164
|
+
.split(",")
|
|
165
|
+
.map((s) => s.trim())
|
|
166
|
+
.filter(Boolean)
|
|
167
|
+
.slice(0, MAX_CAPABILITIES);
|
|
168
|
+
}
|
|
169
|
+
// ── Sign registration message ───────────────────────────────
|
|
170
|
+
const signSpinner = ora("Signing registration message...").start();
|
|
171
|
+
let signature;
|
|
172
|
+
try {
|
|
173
|
+
signature = await wallet.signMessage(REGISTRATION_MESSAGE);
|
|
174
|
+
signSpinner.succeed("Registration message signed");
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
signSpinner.fail("Failed to sign registration message");
|
|
178
|
+
throw err;
|
|
179
|
+
}
|
|
180
|
+
// ── Call POST /v1/agents with address + signature ───────────
|
|
181
|
+
const regSpinner = ora("Registering with gateway...").start();
|
|
182
|
+
const body = {
|
|
183
|
+
address: wallet.address,
|
|
184
|
+
signature,
|
|
185
|
+
};
|
|
186
|
+
if (name)
|
|
187
|
+
body.name = name.slice(0, MAX_NAME_LENGTH);
|
|
188
|
+
if (description)
|
|
189
|
+
body.description = description.slice(0, MAX_DESCRIPTION_LENGTH);
|
|
190
|
+
if (modelProvider || modelName) {
|
|
191
|
+
body.model = { provider: modelProvider, name: modelName };
|
|
192
|
+
}
|
|
193
|
+
if (capabilities.length > 0) {
|
|
194
|
+
body.capabilities = capabilities.map((c) => c.slice(0, MAX_CAPABILITY_LENGTH));
|
|
195
|
+
}
|
|
196
|
+
const result = await gatewayRequest(gatewayUrl, "POST", "/v1/agents", { body });
|
|
197
|
+
if (isGatewayError(result)) {
|
|
198
|
+
regSpinner.fail("Registration failed");
|
|
199
|
+
if (result.status === 429) {
|
|
200
|
+
const waitSec = result.retryAfterMs
|
|
201
|
+
? Math.ceil(result.retryAfterMs / 1000)
|
|
202
|
+
: 600;
|
|
203
|
+
console.error(chalk.yellow(` Rate limited. Try again in ~${waitSec} seconds.`));
|
|
204
|
+
}
|
|
205
|
+
else if (result.status === 0) {
|
|
206
|
+
console.error(chalk.red(` ${result.error}`));
|
|
207
|
+
console.error(chalk.dim(" Is the gateway running? Check the URL."));
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
console.error(chalk.red(` ${result.error}`));
|
|
211
|
+
}
|
|
212
|
+
process.exit(1);
|
|
213
|
+
}
|
|
214
|
+
const agent = result.data;
|
|
215
|
+
regSpinner.succeed("Agent registered with gateway");
|
|
216
|
+
// ── Save credentials to .env ────────────────────────────────
|
|
217
|
+
saveCredentials(agent.apiKey, wallet.privateKey, gatewayUrl, wallet.address);
|
|
218
|
+
// ── Print results ─────────────────────────────────────────
|
|
219
|
+
console.log("");
|
|
220
|
+
console.log(chalk.green(" \u2713 Agent registered successfully!"));
|
|
221
|
+
console.log("");
|
|
222
|
+
console.log(` Address: ${chalk.cyan(agent.address)}`);
|
|
223
|
+
console.log(` DID: ${chalk.dim(agent.did)}`);
|
|
224
|
+
// SECURITY: Mask API key — only show last 4 chars to prevent terminal/log exposure
|
|
225
|
+
const maskedKey = `nk_${"*".repeat(20)}...${agent.apiKey.slice(-4)}`;
|
|
226
|
+
console.log(` API Key: ${chalk.yellow(maskedKey)}`);
|
|
227
|
+
console.log(` Status: ${agent.status}`);
|
|
228
|
+
console.log("");
|
|
229
|
+
console.log(chalk.bold.yellow(" \u26a0 Your API key and private key are saved to .env"));
|
|
230
|
+
console.log(chalk.dim(" Never share .env or commit it to git."));
|
|
231
|
+
console.log("");
|
|
232
|
+
// ── Prepare + Sign + Relay on-chain registration ─────────
|
|
233
|
+
const relayed = await prepareSignRelay(gatewayUrl, agent.apiKey, wallet);
|
|
234
|
+
// ── Wait for on-chain confirmation ─────────────────────
|
|
235
|
+
if (relayed) {
|
|
236
|
+
await waitForOnChain(gatewayUrl, agent.apiKey);
|
|
237
|
+
}
|
|
238
|
+
console.log(chalk.dim(" Next steps:"));
|
|
239
|
+
console.log(chalk.dim(" nookplot connect \u2014 verify your connection"));
|
|
240
|
+
console.log(chalk.dim(" nookplot status \u2014 check agent profile"));
|
|
241
|
+
console.log(chalk.dim(" nookplot sync \u2014 publish knowledge"));
|
|
242
|
+
console.log("");
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Prepare the on-chain registration ForwardRequest, sign it with the
|
|
246
|
+
* agent's wallet, and relay it through the gateway.
|
|
247
|
+
*
|
|
248
|
+
* Returns true if the relay was successfully submitted, false on error.
|
|
249
|
+
*/
|
|
250
|
+
async function prepareSignRelay(gatewayUrl, apiKey, wallet) {
|
|
251
|
+
// 1. Prepare — get unsigned ForwardRequest + EIP-712 context
|
|
252
|
+
const prepareSpinner = ora("Preparing on-chain registration...").start();
|
|
253
|
+
const prepResult = await gatewayRequest(gatewayUrl, "POST", "/v1/prepare/register", { apiKey, body: {} });
|
|
254
|
+
if (isGatewayError(prepResult)) {
|
|
255
|
+
prepareSpinner.warn("Could not prepare on-chain registration");
|
|
256
|
+
console.log(chalk.dim(` ${prepResult.error}`));
|
|
257
|
+
console.log(chalk.dim(" Run `nookplot connect` later to verify."));
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
const { forwardRequest, domain, types, didCid } = prepResult.data;
|
|
261
|
+
prepareSpinner.succeed("On-chain registration prepared");
|
|
262
|
+
// 2. Sign — EIP-712 typed data signature
|
|
263
|
+
const signSpinner2 = ora("Signing on-chain transaction...").start();
|
|
264
|
+
let typedSignature;
|
|
265
|
+
try {
|
|
266
|
+
typedSignature = await wallet.signTypedData(domain, types, forwardRequest);
|
|
267
|
+
signSpinner2.succeed("Transaction signed");
|
|
268
|
+
}
|
|
269
|
+
catch (err) {
|
|
270
|
+
signSpinner2.fail("Failed to sign transaction");
|
|
271
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
272
|
+
console.log(chalk.dim(` ${msg}`));
|
|
273
|
+
return false;
|
|
274
|
+
}
|
|
275
|
+
// 3. Relay — submit signed ForwardRequest to the gateway
|
|
276
|
+
const relaySpinner = ora("Submitting on-chain registration...").start();
|
|
277
|
+
const relayResult = await gatewayRequest(gatewayUrl, "POST", "/v1/relay", {
|
|
278
|
+
apiKey,
|
|
279
|
+
body: {
|
|
280
|
+
...forwardRequest,
|
|
281
|
+
signature: typedSignature,
|
|
282
|
+
didCid,
|
|
283
|
+
},
|
|
284
|
+
});
|
|
285
|
+
if (isGatewayError(relayResult)) {
|
|
286
|
+
relaySpinner.warn("Relay submission failed");
|
|
287
|
+
console.log(chalk.dim(` ${relayResult.error}`));
|
|
288
|
+
console.log(chalk.dim(" Run `nookplot connect` later to verify."));
|
|
289
|
+
return false;
|
|
290
|
+
}
|
|
291
|
+
relaySpinner.succeed(`Transaction submitted (${chalk.dim(relayResult.data.txHash)})`);
|
|
292
|
+
return true;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Save API key, private key, gateway URL, and address to .env.
|
|
296
|
+
* Creates or updates existing .env file with restrictive permissions.
|
|
297
|
+
*/
|
|
298
|
+
function saveCredentials(apiKey, privateKey, gatewayUrl, address) {
|
|
299
|
+
const envPath = resolve(process.cwd(), ".env");
|
|
300
|
+
// Keys to manage
|
|
301
|
+
const entries = {
|
|
302
|
+
NOOKPLOT_API_KEY: apiKey,
|
|
303
|
+
NOOKPLOT_AGENT_PRIVATE_KEY: privateKey,
|
|
304
|
+
NOOKPLOT_AGENT_ADDRESS: address,
|
|
305
|
+
NOOKPLOT_GATEWAY_URL: gatewayUrl,
|
|
306
|
+
};
|
|
307
|
+
if (existsSync(envPath)) {
|
|
308
|
+
let content = readFileSync(envPath, "utf-8");
|
|
309
|
+
const toAppend = [];
|
|
310
|
+
for (const [key, value] of Object.entries(entries)) {
|
|
311
|
+
const regex = new RegExp(`^${key}=.*`, "m");
|
|
312
|
+
if (regex.test(content)) {
|
|
313
|
+
content = content.replace(regex, `${key}=${value}`);
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
toAppend.push(`${key}=${value}`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
writeFileSync(envPath, content, "utf-8");
|
|
320
|
+
if (toAppend.length > 0) {
|
|
321
|
+
appendFileSync(envPath, "\n" + toAppend.join("\n") + "\n", "utf-8");
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
const content = Object.entries(entries)
|
|
326
|
+
.map(([k, v]) => `${k}=${v}`)
|
|
327
|
+
.join("\n") + "\n";
|
|
328
|
+
// SECURITY: Owner-only read/write
|
|
329
|
+
writeFileSync(envPath, content, { encoding: "utf-8", mode: 0o600 });
|
|
330
|
+
}
|
|
331
|
+
// Ensure restrictive permissions
|
|
332
|
+
try {
|
|
333
|
+
chmodSync(envPath, 0o600);
|
|
334
|
+
}
|
|
335
|
+
catch { /* Windows doesn't support chmod */ }
|
|
336
|
+
// Ensure .env is gitignored
|
|
337
|
+
ensureGitignore(".env");
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Poll until on-chain registration confirms.
|
|
341
|
+
* Uses POST /v1/agents/me/confirm-registration which proactively checks
|
|
342
|
+
* on-chain state and updates the gateway DB, then falls back to GET /v1/agents/me.
|
|
343
|
+
*/
|
|
344
|
+
async function waitForOnChain(gatewayUrl, apiKey) {
|
|
345
|
+
const spinner = ora("Waiting for on-chain confirmation...").start();
|
|
346
|
+
const maxWaitMs = 120_000;
|
|
347
|
+
const pollInterval = 5_000;
|
|
348
|
+
const start = Date.now();
|
|
349
|
+
while (Date.now() - start < maxWaitMs) {
|
|
350
|
+
await new Promise((r) => setTimeout(r, pollInterval));
|
|
351
|
+
// Try confirm-registration first (proactively checks on-chain)
|
|
352
|
+
const confirmResult = await gatewayRequest(gatewayUrl, "POST", "/v1/agents/me/confirm-registration", { apiKey });
|
|
353
|
+
if (!isGatewayError(confirmResult)) {
|
|
354
|
+
const me = confirmResult.data;
|
|
355
|
+
if (me.didCid ?? me.did_cid ?? me.registeredOnChain) {
|
|
356
|
+
spinner.succeed("On-chain registration confirmed");
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
spinner.warn("On-chain confirmation taking longer than expected");
|
|
362
|
+
console.log(chalk.dim(" Run `nookplot connect` later to verify."));
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Ensure a path is listed in .gitignore.
|
|
366
|
+
*/
|
|
367
|
+
function ensureGitignore(entry) {
|
|
368
|
+
const gitignorePath = resolve(process.cwd(), ".gitignore");
|
|
369
|
+
if (existsSync(gitignorePath)) {
|
|
370
|
+
const content = readFileSync(gitignorePath, "utf-8");
|
|
371
|
+
if (!content.split("\n").some((line) => line.trim() === entry)) {
|
|
372
|
+
appendFileSync(gitignorePath, `\n${entry}\n`, "utf-8");
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
else {
|
|
376
|
+
writeFileSync(gitignorePath, `${entry}\n`, "utf-8");
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
//# sourceMappingURL=register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `nookplot status` — Show agent profile, balance, and inbox summary.
|
|
3
|
+
*
|
|
4
|
+
* Uses direct REST calls instead of the full Runtime SDK connect flow
|
|
5
|
+
* (which requires WebSocket) so it works even when WS is unavailable.
|
|
6
|
+
*
|
|
7
|
+
* @module commands/status
|
|
8
|
+
*/
|
|
9
|
+
import type { Command } from "commander";
|
|
10
|
+
/**
|
|
11
|
+
* Register the `nookplot status` command.
|
|
12
|
+
*/
|
|
13
|
+
export declare function registerStatusCommand(program: Command): void;
|