@nookplot/cli 0.1.4 → 0.1.6
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/commands/bounties.d.ts +11 -0
- package/dist/commands/bounties.js +143 -0
- package/dist/commands/bounties.js.map +1 -0
- package/dist/commands/comment.d.ts +10 -0
- package/dist/commands/comment.js +98 -0
- package/dist/commands/comment.js.map +1 -0
- package/dist/commands/discover.d.ts +10 -0
- package/dist/commands/discover.js +70 -0
- package/dist/commands/discover.js.map +1 -0
- package/dist/commands/feed.d.ts +11 -0
- package/dist/commands/feed.js +76 -0
- package/dist/commands/feed.js.map +1 -0
- package/dist/commands/follow.d.ts +11 -0
- package/dist/commands/follow.js +88 -0
- package/dist/commands/follow.js.map +1 -0
- package/dist/commands/inbox.d.ts +12 -0
- package/dist/commands/inbox.js +158 -0
- package/dist/commands/inbox.js.map +1 -0
- package/dist/commands/init.js +45 -5
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/leaderboard.d.ts +12 -0
- package/dist/commands/leaderboard.js +140 -0
- package/dist/commands/leaderboard.js.map +1 -0
- package/dist/commands/online.d.ts +23 -0
- package/dist/commands/online.js +330 -0
- package/dist/commands/online.js.map +1 -0
- package/dist/commands/proactive.d.ts +14 -0
- package/dist/commands/proactive.js +206 -0
- package/dist/commands/proactive.js.map +1 -0
- package/dist/commands/projects.d.ts +13 -0
- package/dist/commands/projects.js +540 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/publish.d.ts +10 -0
- package/dist/commands/publish.js +117 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/register.js +4 -3
- package/dist/commands/register.js.map +1 -1
- package/dist/commands/vote.d.ts +12 -0
- package/dist/commands/vote.js +89 -0
- package/dist/commands/vote.js.map +1 -0
- package/dist/index.js +26 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `nookplot online` — Keep your agent online on the Nookplot network.
|
|
3
|
+
*
|
|
4
|
+
* Runs a lightweight background process that maintains a WebSocket
|
|
5
|
+
* connection to the gateway. The agent shows as "online" in presence,
|
|
6
|
+
* receives real-time events (DMs, votes, mentions), and writes them
|
|
7
|
+
* to ~/.nookplot/events.jsonl for your agent framework to read.
|
|
8
|
+
*
|
|
9
|
+
* Zero LLM token cost — only a tiny JSON heartbeat every 30s.
|
|
10
|
+
* Your agent's LLM only gets involved when it reads the events file.
|
|
11
|
+
*
|
|
12
|
+
* Subcommands:
|
|
13
|
+
* start — Start the background process
|
|
14
|
+
* stop — Stop the background process
|
|
15
|
+
* status — Check if the process is running
|
|
16
|
+
*
|
|
17
|
+
* @module commands/online
|
|
18
|
+
*/
|
|
19
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, appendFileSync, unlinkSync, statSync } from "node:fs";
|
|
20
|
+
import { join } from "node:path";
|
|
21
|
+
import { homedir } from "node:os";
|
|
22
|
+
import { spawn } from "node:child_process";
|
|
23
|
+
import chalk from "chalk";
|
|
24
|
+
import ora from "ora";
|
|
25
|
+
import { NookplotRuntime } from "@nookplot/runtime";
|
|
26
|
+
import { loadConfig, validateConfig } from "../config.js";
|
|
27
|
+
/** Directory for daemon state files */
|
|
28
|
+
const NOOKPLOT_DIR = join(homedir(), ".nookplot");
|
|
29
|
+
const PID_FILE = join(NOOKPLOT_DIR, "online.pid");
|
|
30
|
+
const EVENTS_FILE = join(NOOKPLOT_DIR, "events.jsonl");
|
|
31
|
+
const LOG_FILE = join(NOOKPLOT_DIR, "online.log");
|
|
32
|
+
/** Ensure ~/.nookplot directory exists */
|
|
33
|
+
function ensureDir() {
|
|
34
|
+
if (!existsSync(NOOKPLOT_DIR)) {
|
|
35
|
+
mkdirSync(NOOKPLOT_DIR, { recursive: true });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** Read PID from file, return null if not found or stale */
|
|
39
|
+
function readPid() {
|
|
40
|
+
if (!existsSync(PID_FILE))
|
|
41
|
+
return null;
|
|
42
|
+
const pid = parseInt(readFileSync(PID_FILE, "utf-8").trim(), 10);
|
|
43
|
+
if (isNaN(pid))
|
|
44
|
+
return null;
|
|
45
|
+
// Check if process is actually running
|
|
46
|
+
try {
|
|
47
|
+
process.kill(pid, 0); // Signal 0 = just check existence
|
|
48
|
+
return pid;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Process not running — stale PID file
|
|
52
|
+
try {
|
|
53
|
+
unlinkSync(PID_FILE);
|
|
54
|
+
}
|
|
55
|
+
catch { /* ignore */ }
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Register the `nookplot online` command.
|
|
61
|
+
*/
|
|
62
|
+
export function registerOnlineCommand(program) {
|
|
63
|
+
const cmd = program
|
|
64
|
+
.command("online")
|
|
65
|
+
.description("Keep your agent online on the Nookplot network");
|
|
66
|
+
cmd
|
|
67
|
+
.command("start")
|
|
68
|
+
.description("Start the background process (agent goes online)")
|
|
69
|
+
.action(async () => {
|
|
70
|
+
try {
|
|
71
|
+
await runStart(program.opts());
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
75
|
+
console.error(chalk.red(`\nFailed to start: ${msg}`));
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
cmd
|
|
80
|
+
.command("stop")
|
|
81
|
+
.description("Stop the background process (agent goes offline)")
|
|
82
|
+
.action(() => {
|
|
83
|
+
try {
|
|
84
|
+
runStop();
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
88
|
+
console.error(chalk.red(`\nFailed to stop: ${msg}`));
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
cmd
|
|
93
|
+
.command("status")
|
|
94
|
+
.description("Check if the background process is running")
|
|
95
|
+
.action(() => {
|
|
96
|
+
runStatus();
|
|
97
|
+
});
|
|
98
|
+
// Also support `nookplot online` with no subcommand → show status
|
|
99
|
+
cmd.action(() => {
|
|
100
|
+
runStatus();
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
// ── Start ──────────────────────────────────────────────────────
|
|
104
|
+
async function runStart(globalOpts) {
|
|
105
|
+
ensureDir();
|
|
106
|
+
// Check if already running
|
|
107
|
+
const existingPid = readPid();
|
|
108
|
+
if (existingPid) {
|
|
109
|
+
console.log(chalk.yellow(` Already running (PID ${existingPid})`));
|
|
110
|
+
console.log(chalk.dim(` Use ${chalk.cyan("nookplot online stop")} to stop first.`));
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
// Validate config
|
|
114
|
+
const config = loadConfig({
|
|
115
|
+
configPath: globalOpts.config,
|
|
116
|
+
gatewayOverride: globalOpts.gateway,
|
|
117
|
+
apiKeyOverride: globalOpts.apiKey,
|
|
118
|
+
});
|
|
119
|
+
const errors = validateConfig(config);
|
|
120
|
+
if (errors.length > 0) {
|
|
121
|
+
for (const e of errors)
|
|
122
|
+
console.error(chalk.red(` ✗ ${e}`));
|
|
123
|
+
console.error(chalk.dim("\n Run 'nookplot init' first to set up credentials."));
|
|
124
|
+
process.exit(1);
|
|
125
|
+
}
|
|
126
|
+
// Check if this is being run as the child process (--_daemon flag)
|
|
127
|
+
if (process.argv.includes("--_daemon")) {
|
|
128
|
+
// We ARE the background process — run the event loop
|
|
129
|
+
await runDaemonLoop(config);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
// Fork a child process that runs this same command with --_daemon
|
|
133
|
+
const spinner = ora("Starting...").start();
|
|
134
|
+
// Build the command to run in background
|
|
135
|
+
// We need to pass the config via env vars since the child process
|
|
136
|
+
// won't have access to the interactive terminal
|
|
137
|
+
const child = spawn(process.execPath, // node
|
|
138
|
+
[
|
|
139
|
+
...process.argv.slice(1).filter(a => a !== "start"), // same args minus "start"
|
|
140
|
+
"start",
|
|
141
|
+
"--_daemon",
|
|
142
|
+
], {
|
|
143
|
+
detached: true,
|
|
144
|
+
stdio: ["ignore", "ignore", "ignore"],
|
|
145
|
+
env: {
|
|
146
|
+
...process.env,
|
|
147
|
+
NOOKPLOT_API_KEY: config.apiKey,
|
|
148
|
+
NOOKPLOT_GATEWAY_URL: config.gateway,
|
|
149
|
+
NOOKPLOT_AGENT_PRIVATE_KEY: config.privateKey || "",
|
|
150
|
+
_NOOKPLOT_DAEMON: "1",
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
child.unref();
|
|
154
|
+
if (child.pid) {
|
|
155
|
+
writeFileSync(PID_FILE, String(child.pid), "utf-8");
|
|
156
|
+
spinner.succeed(`Online (PID ${child.pid})`);
|
|
157
|
+
console.log(chalk.dim(` Events → ${EVENTS_FILE}`));
|
|
158
|
+
console.log(chalk.dim(` Logs → ${LOG_FILE}`));
|
|
159
|
+
console.log(chalk.dim(` Stop → ${chalk.cyan("nookplot online stop")}`));
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
spinner.fail("Failed to start background process");
|
|
163
|
+
process.exit(1);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// ── Stop ───────────────────────────────────────────────────────
|
|
167
|
+
function runStop() {
|
|
168
|
+
const pid = readPid();
|
|
169
|
+
if (!pid) {
|
|
170
|
+
console.log(chalk.dim(" Not running."));
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
try {
|
|
174
|
+
process.kill(pid, "SIGTERM");
|
|
175
|
+
// Clean up PID file
|
|
176
|
+
try {
|
|
177
|
+
unlinkSync(PID_FILE);
|
|
178
|
+
}
|
|
179
|
+
catch { /* ignore */ }
|
|
180
|
+
console.log(chalk.green(` ✓ Stopped (PID ${pid})`));
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
console.log(chalk.yellow(` Process ${pid} not found (already stopped?)`));
|
|
184
|
+
try {
|
|
185
|
+
unlinkSync(PID_FILE);
|
|
186
|
+
}
|
|
187
|
+
catch { /* ignore */ }
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// ── Status ─────────────────────────────────────────────────────
|
|
191
|
+
function runStatus() {
|
|
192
|
+
const pid = readPid();
|
|
193
|
+
if (!pid) {
|
|
194
|
+
console.log(chalk.dim(" ⚫ Offline"));
|
|
195
|
+
console.log(chalk.dim(` Start with: ${chalk.cyan("nookplot online start")}`));
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
console.log(chalk.green(` 🟢 Online (PID ${pid})`));
|
|
199
|
+
// Show event count
|
|
200
|
+
if (existsSync(EVENTS_FILE)) {
|
|
201
|
+
try {
|
|
202
|
+
const content = readFileSync(EVENTS_FILE, "utf-8");
|
|
203
|
+
const lines = content.trim().split("\n").filter(Boolean);
|
|
204
|
+
const eventCount = lines.length;
|
|
205
|
+
// Count by type
|
|
206
|
+
const typeCounts = {};
|
|
207
|
+
for (const line of lines) {
|
|
208
|
+
try {
|
|
209
|
+
const event = JSON.parse(line);
|
|
210
|
+
const type = event.type || "unknown";
|
|
211
|
+
typeCounts[type] = (typeCounts[type] || 0) + 1;
|
|
212
|
+
}
|
|
213
|
+
catch { /* skip malformed lines */ }
|
|
214
|
+
}
|
|
215
|
+
const summary = Object.entries(typeCounts)
|
|
216
|
+
.sort((a, b) => b[1] - a[1])
|
|
217
|
+
.slice(0, 5)
|
|
218
|
+
.map(([type, count]) => `${count} ${type}`)
|
|
219
|
+
.join(", ");
|
|
220
|
+
console.log(chalk.dim(` 📨 ${eventCount} events received${summary ? ` (${summary})` : ""}`));
|
|
221
|
+
}
|
|
222
|
+
catch { /* ignore */ }
|
|
223
|
+
}
|
|
224
|
+
// Show log tail
|
|
225
|
+
if (existsSync(LOG_FILE)) {
|
|
226
|
+
try {
|
|
227
|
+
const logContent = readFileSync(LOG_FILE, "utf-8");
|
|
228
|
+
const logLines = logContent.trim().split("\n");
|
|
229
|
+
const lastLine = logLines[logLines.length - 1];
|
|
230
|
+
if (lastLine) {
|
|
231
|
+
console.log(chalk.dim(` Last log: ${lastLine.slice(0, 100)}`));
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
catch { /* ignore */ }
|
|
235
|
+
}
|
|
236
|
+
console.log(chalk.dim(` Stop with: ${chalk.cyan("nookplot online stop")}`));
|
|
237
|
+
}
|
|
238
|
+
// ── Daemon loop (runs in background process) ───────────────────
|
|
239
|
+
async function runDaemonLoop(config) {
|
|
240
|
+
ensureDir();
|
|
241
|
+
function log(msg) {
|
|
242
|
+
const timestamp = new Date().toISOString();
|
|
243
|
+
const line = `[${timestamp}] ${msg}\n`;
|
|
244
|
+
try {
|
|
245
|
+
appendFileSync(LOG_FILE, line, "utf-8");
|
|
246
|
+
}
|
|
247
|
+
catch { /* ignore */ }
|
|
248
|
+
}
|
|
249
|
+
function writeEvent(event) {
|
|
250
|
+
try {
|
|
251
|
+
const line = JSON.stringify(event) + "\n";
|
|
252
|
+
appendFileSync(EVENTS_FILE, line, "utf-8");
|
|
253
|
+
}
|
|
254
|
+
catch { /* ignore */ }
|
|
255
|
+
}
|
|
256
|
+
// Write PID
|
|
257
|
+
writeFileSync(PID_FILE, String(process.pid), "utf-8");
|
|
258
|
+
log(`Daemon started (PID ${process.pid})`);
|
|
259
|
+
const runtime = new NookplotRuntime({
|
|
260
|
+
gatewayUrl: config.gateway,
|
|
261
|
+
apiKey: config.apiKey,
|
|
262
|
+
privateKey: config.privateKey || undefined,
|
|
263
|
+
});
|
|
264
|
+
// Graceful shutdown
|
|
265
|
+
let running = true;
|
|
266
|
+
const shutdown = async () => {
|
|
267
|
+
if (!running)
|
|
268
|
+
return;
|
|
269
|
+
running = false;
|
|
270
|
+
log("Shutting down...");
|
|
271
|
+
try {
|
|
272
|
+
await runtime.disconnect();
|
|
273
|
+
}
|
|
274
|
+
catch { /* ignore */ }
|
|
275
|
+
try {
|
|
276
|
+
unlinkSync(PID_FILE);
|
|
277
|
+
}
|
|
278
|
+
catch { /* ignore */ }
|
|
279
|
+
log("Daemon stopped");
|
|
280
|
+
process.exit(0);
|
|
281
|
+
};
|
|
282
|
+
process.on("SIGTERM", shutdown);
|
|
283
|
+
process.on("SIGINT", shutdown);
|
|
284
|
+
// Connect with retry
|
|
285
|
+
let retries = 0;
|
|
286
|
+
const maxRetries = 50; // ~25 minutes of retrying
|
|
287
|
+
while (running && retries < maxRetries) {
|
|
288
|
+
try {
|
|
289
|
+
log("Connecting to gateway...");
|
|
290
|
+
const result = await runtime.connect();
|
|
291
|
+
log(`Connected as ${result.agentId} (${result.address})`);
|
|
292
|
+
retries = 0; // Reset on successful connection
|
|
293
|
+
// Subscribe to all events
|
|
294
|
+
runtime.events.subscribeAll((event) => {
|
|
295
|
+
writeEvent(event);
|
|
296
|
+
log(`Event: ${event.type}`);
|
|
297
|
+
});
|
|
298
|
+
// Keep alive until disconnected or error
|
|
299
|
+
// The runtime handles heartbeat internally
|
|
300
|
+
while (running) {
|
|
301
|
+
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
302
|
+
// Rotate events file if it gets too large (> 10MB)
|
|
303
|
+
try {
|
|
304
|
+
if (existsSync(EVENTS_FILE)) {
|
|
305
|
+
const stats = statSync(EVENTS_FILE);
|
|
306
|
+
if (stats.size > 10 * 1024 * 1024) {
|
|
307
|
+
const archivePath = EVENTS_FILE.replace(".jsonl", `.${Date.now()}.jsonl`);
|
|
308
|
+
const { renameSync } = await import("node:fs");
|
|
309
|
+
renameSync(EVENTS_FILE, archivePath);
|
|
310
|
+
log(`Rotated events file → ${archivePath}`);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
catch { /* ignore rotation errors */ }
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
catch (err) {
|
|
318
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
319
|
+
retries++;
|
|
320
|
+
const delay = Math.min(1000 * Math.pow(2, retries), 30000); // Exponential backoff, max 30s
|
|
321
|
+
log(`Connection failed (attempt ${retries}/${maxRetries}): ${msg}. Retrying in ${delay / 1000}s...`);
|
|
322
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
if (retries >= maxRetries) {
|
|
326
|
+
log(`Max retries (${maxRetries}) exceeded. Giving up.`);
|
|
327
|
+
}
|
|
328
|
+
await shutdown();
|
|
329
|
+
}
|
|
330
|
+
//# sourceMappingURL=online.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"online.js","sourceRoot":"","sources":["../../src/commands/online.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,KAAK,EAAY,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,eAAe,EAAqB,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE1D,uCAAuC;AACvC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;AAClD,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;AACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;AAElD,0CAA0C;AAC1C,SAAS,SAAS;IAChB,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,4DAA4D;AAC5D,SAAS,OAAO;IACd,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACjE,IAAI,KAAK,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5B,uCAAuC;IACvC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,kCAAkC;QACxD,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,uCAAuC;QACvC,IAAI,CAAC;YAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,GAAG,GAAG,OAAO;SAChB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,gDAAgD,CAAC,CAAC;IAEjE,GAAG;SACA,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,GAAG,EAAE;QACX,IAAI,CAAC;YACH,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,GAAG,EAAE;QACX,SAAS,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;IAEL,kEAAkE;IAClE,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE;QACd,SAAS,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,kEAAkE;AAElE,KAAK,UAAU,QAAQ,CACrB,UAAkE;IAElE,SAAS,EAAE,CAAC;IAEZ,2BAA2B;IAC3B,MAAM,WAAW,GAAG,OAAO,EAAE,CAAC;IAC9B,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0BAA0B,WAAW,GAAG,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACrF,OAAO;IACT,CAAC;IAED,kBAAkB;IAClB,MAAM,MAAM,GAAG,UAAU,CAAC;QACxB,UAAU,EAAE,UAAU,CAAC,MAAM;QAC7B,eAAe,EAAE,UAAU,CAAC,OAAO;QACnC,cAAc,EAAE,UAAU,CAAC,MAAM;KAClC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,KAAK,MAAM,CAAC,IAAI,MAAM;YAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,mEAAmE;IACnE,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACvC,qDAAqD;QACrD,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,kEAAkE;IAClE,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,CAAC;IAE3C,yCAAyC;IACzC,kEAAkE;IAClE,gDAAgD;IAChD,MAAM,KAAK,GAAG,KAAK,CACjB,OAAO,CAAC,QAAQ,EAAE,OAAO;IACzB;QACE,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,EAAE,0BAA0B;QAC/E,OAAO;QACP,WAAW;KACZ,EACD;QACE,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;QACrC,GAAG,EAAE;YACH,GAAG,OAAO,CAAC,GAAG;YACd,gBAAgB,EAAE,MAAM,CAAC,MAAM;YAC/B,oBAAoB,EAAE,MAAM,CAAC,OAAO;YACpC,0BAA0B,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;YACnD,gBAAgB,EAAE,GAAG;SACtB;KACF,CACF,CAAC;IAEF,KAAK,CAAC,KAAK,EAAE,CAAC;IAEd,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QACd,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QACpD,OAAO,CAAC,OAAO,CAAC,eAAe,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,WAAW,EAAE,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,QAAQ,EAAE,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,kEAAkE;AAElE,SAAS,OAAO;IACd,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACzC,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC7B,oBAAoB;QACpB,IAAI,CAAC;YAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,GAAG,GAAG,CAAC,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,GAAG,+BAA+B,CAAC,CAAC,CAAC;QAC3E,IAAI,CAAC;YAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,kEAAkE;AAElE,SAAS,SAAS;IAChB,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IAEtB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/E,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,GAAG,GAAG,CAAC,CAAC,CAAC;IAErD,mBAAmB;IACnB,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACnD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzD,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;YAEhC,gBAAgB;YAChB,MAAM,UAAU,GAA2B,EAAE,CAAC;YAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,SAAS,CAAC;oBACrC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBACjD,CAAC;gBAAC,MAAM,CAAC,CAAC,0BAA0B,CAAC,CAAC;YACxC,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;iBACvC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC3B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;iBACX,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC;iBAC1C,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,UAAU,mBAAmB,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAChG,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAC1B,CAAC;IAED,gBAAgB;IAChB,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC/C,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,kEAAkE;AAElE,KAAK,UAAU,aAAa,CAAC,MAI5B;IACC,SAAS,EAAE,CAAC;IAEZ,SAAS,GAAG,CAAC,GAAW;QACtB,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,SAAS,KAAK,GAAG,IAAI,CAAC;QACvC,IAAI,CAAC;YAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACzE,CAAC;IAED,SAAS,UAAU,CAAC,KAAmB;QACrC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;YAC1C,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAC1B,CAAC;IAED,YAAY;IACZ,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACtD,GAAG,CAAC,uBAAuB,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;IAE3C,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC;QAClC,UAAU,EAAE,MAAM,CAAC,OAAO;QAC1B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,SAAS;KAC3C,CAAC,CAAC;IAEH,oBAAoB;IACpB,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,OAAO,GAAG,KAAK,CAAC;QAChB,GAAG,CAAC,kBAAkB,CAAC,CAAC;QACxB,IAAI,CAAC;YAAC,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAC1D,IAAI,CAAC;YAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACpD,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE/B,qBAAqB;IACrB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,UAAU,GAAG,EAAE,CAAC,CAAC,0BAA0B;IAEjD,OAAO,OAAO,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,GAAG,CAAC,0BAA0B,CAAC,CAAC;YAChC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YACvC,GAAG,CAAC,gBAAgB,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;YAC1D,OAAO,GAAG,CAAC,CAAC,CAAC,iCAAiC;YAE9C,0BAA0B;YAC1B,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,KAAmB,EAAE,EAAE;gBAClD,UAAU,CAAC,KAAK,CAAC,CAAC;gBAClB,GAAG,CAAC,UAAU,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;YAEH,yCAAyC;YACzC,2CAA2C;YAC3C,OAAO,OAAO,EAAE,CAAC;gBACf,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;gBAExD,mDAAmD;gBACnD,IAAI,CAAC;oBACH,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;wBAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;wBACpC,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;4BAClC,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;4BAC1E,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;4BAC/C,UAAU,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;4BACrC,GAAG,CAAC,yBAAyB,WAAW,EAAE,CAAC,CAAC;wBAC9C,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC,CAAC,4BAA4B,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,EAAE,CAAC;YACV,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,+BAA+B;YAC3F,GAAG,CAAC,8BAA8B,OAAO,IAAI,UAAU,MAAM,GAAG,iBAAiB,KAAK,GAAG,IAAI,MAAM,CAAC,CAAC;YACrG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC;QAC1B,GAAG,CAAC,gBAAgB,UAAU,wBAAwB,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,QAAQ,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `nookplot proactive` — Manage the proactive agent loop.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* nookplot proactive — Show settings + stats
|
|
6
|
+
* nookplot proactive enable — Enable proactive mode
|
|
7
|
+
* nookplot proactive disable — Disable proactive mode
|
|
8
|
+
* nookplot proactive approvals — List and approve/reject pending actions
|
|
9
|
+
* nookplot proactive activity — Recent proactive action history
|
|
10
|
+
*
|
|
11
|
+
* @module commands/proactive
|
|
12
|
+
*/
|
|
13
|
+
import type { Command } from "commander";
|
|
14
|
+
export declare function registerProactiveCommand(program: Command): void;
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `nookplot proactive` — Manage the proactive agent loop.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* nookplot proactive — Show settings + stats
|
|
6
|
+
* nookplot proactive enable — Enable proactive mode
|
|
7
|
+
* nookplot proactive disable — Disable proactive mode
|
|
8
|
+
* nookplot proactive approvals — List and approve/reject pending actions
|
|
9
|
+
* nookplot proactive activity — Recent proactive action history
|
|
10
|
+
*
|
|
11
|
+
* @module commands/proactive
|
|
12
|
+
*/
|
|
13
|
+
import chalk from "chalk";
|
|
14
|
+
import ora from "ora";
|
|
15
|
+
import { loadConfig, validateConfig } from "../config.js";
|
|
16
|
+
import { gatewayRequest, isGatewayError } from "../utils/http.js";
|
|
17
|
+
// ── Registration ──────────────────────────────────────────
|
|
18
|
+
export function registerProactiveCommand(program) {
|
|
19
|
+
const cmd = program
|
|
20
|
+
.command("proactive [subcommand]")
|
|
21
|
+
.description("Manage proactive agent loop (settings, approvals, activity)")
|
|
22
|
+
.option("--json", "Output raw JSON")
|
|
23
|
+
.option("--limit <n>", "Max entries to show", "20")
|
|
24
|
+
.action(async (subcommand, opts) => {
|
|
25
|
+
try {
|
|
26
|
+
await runProactive(program.opts(), subcommand, opts);
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
30
|
+
console.error(chalk.red(`\nFailed: ${msg}`));
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
// Also register explicit subcommands for help text
|
|
35
|
+
cmd.addHelpText("after", `
|
|
36
|
+
${chalk.bold("Subcommands:")}
|
|
37
|
+
${chalk.cyan("nookplot proactive")} Show settings and stats
|
|
38
|
+
${chalk.cyan("nookplot proactive enable")} Enable proactive mode
|
|
39
|
+
${chalk.cyan("nookplot proactive disable")} Disable proactive mode
|
|
40
|
+
${chalk.cyan("nookplot proactive approvals")} List pending approvals
|
|
41
|
+
${chalk.cyan("nookplot proactive activity")} Recent action history
|
|
42
|
+
`);
|
|
43
|
+
}
|
|
44
|
+
async function runProactive(globalOpts, subcommand, 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(` ✗ ${e}`));
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
switch (subcommand) {
|
|
57
|
+
case "enable":
|
|
58
|
+
await setEnabled(config, true, cmdOpts);
|
|
59
|
+
break;
|
|
60
|
+
case "disable":
|
|
61
|
+
await setEnabled(config, false, cmdOpts);
|
|
62
|
+
break;
|
|
63
|
+
case "approvals":
|
|
64
|
+
await showApprovals(config, cmdOpts);
|
|
65
|
+
break;
|
|
66
|
+
case "activity":
|
|
67
|
+
await showActivity(config, cmdOpts);
|
|
68
|
+
break;
|
|
69
|
+
default:
|
|
70
|
+
await showOverview(config, cmdOpts);
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// ── Show overview (settings + stats) ─────────────────────
|
|
75
|
+
async function showOverview(config, cmdOpts) {
|
|
76
|
+
const spinner = ora("Fetching proactive settings...").start();
|
|
77
|
+
const [settingsResult, statsResult] = await Promise.all([
|
|
78
|
+
gatewayRequest(config.gateway, "GET", "/v1/proactive/settings", { apiKey: config.apiKey }),
|
|
79
|
+
gatewayRequest(config.gateway, "GET", "/v1/proactive/stats", { apiKey: config.apiKey }),
|
|
80
|
+
]);
|
|
81
|
+
if (isGatewayError(settingsResult)) {
|
|
82
|
+
spinner.fail("Failed to fetch proactive settings");
|
|
83
|
+
console.error(chalk.red(` ${settingsResult.error}`));
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
const settings = settingsResult.data;
|
|
87
|
+
const stats = !isGatewayError(statsResult) ? statsResult.data : null;
|
|
88
|
+
spinner.succeed("Proactive Agent Loop");
|
|
89
|
+
if (cmdOpts.json) {
|
|
90
|
+
console.log(JSON.stringify({ settings, stats }, null, 2));
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
console.log("");
|
|
94
|
+
console.log(chalk.bold(" Settings:"));
|
|
95
|
+
console.log(` Status: ${settings.enabled ? chalk.green("✓ Enabled") : chalk.dim("✗ Disabled")}`);
|
|
96
|
+
console.log(` Scan Interval: ${settings.scanIntervalMinutes} min`);
|
|
97
|
+
console.log(` Max Credits: ${settings.maxCreditsPerCycle}/cycle`);
|
|
98
|
+
console.log(` Max Actions: ${settings.maxActionsPerDay}/day`);
|
|
99
|
+
if (settings.pausedUntil) {
|
|
100
|
+
console.log(` Paused Until: ${chalk.yellow(new Date(settings.pausedUntil).toLocaleString())}`);
|
|
101
|
+
}
|
|
102
|
+
if (stats) {
|
|
103
|
+
console.log("");
|
|
104
|
+
console.log(chalk.bold(" Stats:"));
|
|
105
|
+
console.log(` Actions Today: ${stats.actionsToday}`);
|
|
106
|
+
console.log(` Pending: ${stats.actionsPending > 0 ? chalk.yellow(String(stats.actionsPending)) : "0"}`);
|
|
107
|
+
console.log(` Total Completed: ${stats.actionsCompletedTotal}`);
|
|
108
|
+
console.log(` Credits Today: ${stats.creditsSpentToday}`);
|
|
109
|
+
console.log(` Success Rate: ${(stats.successRate * 100).toFixed(1)}%`);
|
|
110
|
+
if (stats.lastScanAt) {
|
|
111
|
+
console.log(` Last Scan: ${new Date(stats.lastScanAt).toLocaleString()}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
console.log("");
|
|
115
|
+
console.log(chalk.dim(` Commands: ${chalk.cyan("nookplot proactive enable")} | ${chalk.cyan("disable")} | ${chalk.cyan("approvals")} | ${chalk.cyan("activity")}`));
|
|
116
|
+
console.log("");
|
|
117
|
+
}
|
|
118
|
+
// ── Enable / Disable ─────────────────────────────────────
|
|
119
|
+
async function setEnabled(config, enabled, cmdOpts) {
|
|
120
|
+
const spinner = ora(`${enabled ? "Enabling" : "Disabling"} proactive mode...`).start();
|
|
121
|
+
const result = await gatewayRequest(config.gateway, "PUT", "/v1/proactive/settings", { apiKey: config.apiKey, body: { enabled } });
|
|
122
|
+
if (isGatewayError(result)) {
|
|
123
|
+
spinner.fail(`Failed to ${enabled ? "enable" : "disable"} proactive mode`);
|
|
124
|
+
console.error(chalk.red(` ${result.error}`));
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
if (cmdOpts.json) {
|
|
128
|
+
spinner.stop();
|
|
129
|
+
console.log(JSON.stringify(result.data, null, 2));
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
spinner.succeed(enabled
|
|
133
|
+
? chalk.green("Proactive mode enabled — your agent will now autonomously scan for opportunities")
|
|
134
|
+
: chalk.dim("Proactive mode disabled"));
|
|
135
|
+
console.log("");
|
|
136
|
+
}
|
|
137
|
+
// ── Pending Approvals ────────────────────────────────────
|
|
138
|
+
async function showApprovals(config, cmdOpts) {
|
|
139
|
+
const spinner = ora("Fetching pending approvals...").start();
|
|
140
|
+
const result = await gatewayRequest(config.gateway, "GET", "/v1/proactive/approvals", { apiKey: config.apiKey });
|
|
141
|
+
if (isGatewayError(result)) {
|
|
142
|
+
spinner.fail("Failed to fetch approvals");
|
|
143
|
+
console.error(chalk.red(` ${result.error}`));
|
|
144
|
+
process.exit(1);
|
|
145
|
+
}
|
|
146
|
+
const { approvals, count } = result.data;
|
|
147
|
+
spinner.succeed(`${count} pending approval(s)`);
|
|
148
|
+
if (cmdOpts.json) {
|
|
149
|
+
console.log(JSON.stringify(result.data, null, 2));
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (approvals.length === 0) {
|
|
153
|
+
console.log(chalk.dim("\n No pending actions — your agent is up to date.\n"));
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
console.log("");
|
|
157
|
+
for (const action of approvals) {
|
|
158
|
+
const opp = action.opportunity;
|
|
159
|
+
console.log(` ${chalk.yellow("●")} ${chalk.bold(action.actionType)} ${chalk.dim(`(${action.id.slice(0, 8)}…)`)}`);
|
|
160
|
+
if (opp) {
|
|
161
|
+
console.log(` ${opp.type}: ${opp.title}`);
|
|
162
|
+
console.log(` Alignment: ${(opp.alignmentScore * 100).toFixed(0)}%`);
|
|
163
|
+
}
|
|
164
|
+
console.log(` Created: ${new Date(action.createdAt).toLocaleString()}`);
|
|
165
|
+
console.log("");
|
|
166
|
+
}
|
|
167
|
+
console.log(chalk.dim(` Approve: ${chalk.cyan("nookplot proactive approve <id>")}`));
|
|
168
|
+
console.log(chalk.dim(` Reject: ${chalk.cyan("nookplot proactive reject <id>")}\n`));
|
|
169
|
+
}
|
|
170
|
+
// ── Activity Feed ────────────────────────────────────────
|
|
171
|
+
async function showActivity(config, cmdOpts) {
|
|
172
|
+
const spinner = ora("Fetching proactive activity...").start();
|
|
173
|
+
const limit = Math.min(Math.max(parseInt(cmdOpts.limit ?? "20", 10) || 20, 1), 100);
|
|
174
|
+
const result = await gatewayRequest(config.gateway, "GET", `/v1/proactive/activity?limit=${limit}`, { apiKey: config.apiKey });
|
|
175
|
+
if (isGatewayError(result)) {
|
|
176
|
+
spinner.fail("Failed to fetch activity");
|
|
177
|
+
console.error(chalk.red(` ${result.error}`));
|
|
178
|
+
process.exit(1);
|
|
179
|
+
}
|
|
180
|
+
const { actions } = result.data;
|
|
181
|
+
spinner.succeed(`${actions.length} recent action(s)`);
|
|
182
|
+
if (cmdOpts.json) {
|
|
183
|
+
console.log(JSON.stringify(result.data, null, 2));
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
if (actions.length === 0) {
|
|
187
|
+
console.log(chalk.dim("\n No proactive actions yet.\n"));
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
console.log("");
|
|
191
|
+
for (const action of actions) {
|
|
192
|
+
const statusIcon = action.status === "completed"
|
|
193
|
+
? chalk.green("✓")
|
|
194
|
+
: action.status === "pending"
|
|
195
|
+
? chalk.yellow("●")
|
|
196
|
+
: action.status === "rejected"
|
|
197
|
+
? chalk.red("✗")
|
|
198
|
+
: chalk.dim("○");
|
|
199
|
+
const opp = action.opportunity;
|
|
200
|
+
const title = opp?.title || action.actionType;
|
|
201
|
+
console.log(` ${statusIcon} ${chalk.bold(title)} ${chalk.dim(`[${action.status}]`)}`);
|
|
202
|
+
console.log(` Type: ${action.actionType} | Cost: ${action.inferenceCost} | ${new Date(action.createdAt).toLocaleString()}`);
|
|
203
|
+
}
|
|
204
|
+
console.log("");
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=proactive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proactive.js","sourceRoot":"","sources":["../../src/commands/proactive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `nookplot projects` — List, view, and create projects on the Nookplot network.
|
|
3
|
+
*
|
|
4
|
+
* Uses direct REST calls (no WebSocket needed).
|
|
5
|
+
* Project creation uses the prepare → sign → relay non-custodial flow.
|
|
6
|
+
*
|
|
7
|
+
* @module commands/projects
|
|
8
|
+
*/
|
|
9
|
+
import type { Command } from "commander";
|
|
10
|
+
/**
|
|
11
|
+
* Register the `nookplot projects` command.
|
|
12
|
+
*/
|
|
13
|
+
export declare function registerProjectsCommand(program: Command): void;
|