@nookplot/mcp 0.4.95 → 0.4.99
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 +293 -293
- package/SKILL.md +145 -145
- package/dist/auth.d.ts +5 -112
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +53 -320
- package/dist/auth.js.map +1 -1
- package/dist/gateway.d.ts.map +1 -1
- package/dist/gateway.js +1 -5
- package/dist/gateway.js.map +1 -1
- package/dist/index.d.ts +1 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +51 -613
- package/dist/index.js.map +1 -1
- package/dist/server.js +81 -81
- package/dist/setup.d.ts +1 -28
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +9 -207
- package/dist/setup.js.map +1 -1
- package/dist/tools/autoresearch.js +9 -9
- package/dist/tools/autoresearch.js.map +1 -1
- package/dist/tools/ecosystem.d.ts.map +1 -1
- package/dist/tools/ecosystem.js +176 -1
- package/dist/tools/ecosystem.js.map +1 -1
- package/dist/tools/forgePresets.d.ts +2 -7
- package/dist/tools/forgePresets.d.ts.map +1 -1
- package/dist/tools/forgePresets.js +3 -130
- package/dist/tools/forgePresets.js.map +1 -1
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/knowledgeGraph.d.ts.map +1 -1
- package/dist/tools/knowledgeGraph.js +2 -8
- package/dist/tools/knowledgeGraph.js.map +1 -1
- package/dist/tools/memory.d.ts.map +1 -1
- package/dist/tools/memory.js +33 -0
- package/dist/tools/memory.js.map +1 -1
- package/dist/tools/miningPipeline.d.ts +2 -6
- package/dist/tools/miningPipeline.d.ts.map +1 -1
- package/dist/tools/miningPipeline.js +3 -392
- package/dist/tools/miningPipeline.js.map +1 -1
- package/dist/tools/onchain.d.ts.map +1 -1
- package/dist/tools/onchain.js +0 -11
- package/dist/tools/onchain.js.map +1 -1
- package/dist/tools/papers.d.ts +13 -0
- package/dist/tools/papers.d.ts.map +1 -0
- package/dist/tools/papers.js +164 -0
- package/dist/tools/papers.js.map +1 -0
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/read.js +6 -27
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/reasoningWork.js +60 -60
- package/dist/tools/swarms.d.ts.map +1 -1
- package/dist/tools/swarms.js +1 -21
- package/dist/tools/swarms.js.map +1 -1
- package/package.json +92 -92
- package/skills/learn/SKILL.md +65 -65
- package/skills/mine/SKILL.md +80 -80
- package/skills/nookplot/SKILL.md +217 -217
- package/skills/social/SKILL.md +79 -79
- package/dist/applyConfig.d.ts +0 -73
- package/dist/applyConfig.d.ts.map +0 -1
- package/dist/applyConfig.js +0 -418
- package/dist/applyConfig.js.map +0 -1
- package/dist/profileName.d.ts +0 -65
- package/dist/profileName.d.ts.map +0 -1
- package/dist/profileName.js +0 -114
- package/dist/profileName.js.map +0 -1
- package/dist/syncSessions.d.ts +0 -84
- package/dist/syncSessions.d.ts.map +0 -1
- package/dist/syncSessions.js +0 -260
- package/dist/syncSessions.js.map +0 -1
- package/dist/syncSessionsExtractor.d.ts +0 -123
- package/dist/syncSessionsExtractor.d.ts.map +0 -1
- package/dist/syncSessionsExtractor.js +0 -362
- package/dist/syncSessionsExtractor.js.map +0 -1
- package/dist/syncSessionsState.d.ts +0 -89
- package/dist/syncSessionsState.d.ts.map +0 -1
- package/dist/syncSessionsState.js +0 -145
- package/dist/syncSessionsState.js.map +0 -1
- package/skills/hermes/nookplot/DESCRIPTION.md +0 -59
- package/skills/hermes/nookplot/daemon/SKILL.md +0 -103
- package/skills/hermes/nookplot/learn/SKILL.md +0 -131
- package/skills/hermes/nookplot/mine/SKILL.md +0 -111
- package/skills/hermes/nookplot/social/SKILL.md +0 -104
- package/skills/hermes/nookplot/sync/SKILL.md +0 -110
package/dist/auth.js
CHANGED
|
@@ -1,195 +1,71 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Credential management for the Nookplot MCP server.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* (chmod 600) — creator's API key, private key, gateway URL. Shared
|
|
6
|
-
* across all forged agents because the API key authenticates the CREATOR
|
|
7
|
-
* (one per user), not the per-forged-agent identity.
|
|
8
|
-
*
|
|
9
|
-
* Multi-agent scoping lives in per-profile files:
|
|
10
|
-
* `~/.nookplot/profiles/<name>/profile.json` → { scopedAgentAddress }
|
|
11
|
-
* The MCP client selects a profile via the `NOOKPLOT_PROFILE` env var.
|
|
12
|
-
* That way:
|
|
13
|
-
* - Hermes users: profile wired by the installer into hermes config.yaml
|
|
14
|
-
* as `env.NOOKPLOT_PROFILE = "<slug>"`
|
|
15
|
-
* - Claude Code / Cursor / Windsurf users: manually add
|
|
16
|
-
* `env.NOOKPLOT_PROFILE = "<slug>"` to their MCP config
|
|
17
|
-
* - CLI users: `NOOKPLOT_PROFILE=<slug> nookplot <cmd>` or
|
|
18
|
-
* `nookplot --profile <slug> <cmd>` (set via CLI layer)
|
|
4
|
+
* Stores credentials in ~/.nookplot/credentials.json (chmod 600).
|
|
19
5
|
*
|
|
20
6
|
* @module auth
|
|
21
7
|
*/
|
|
22
|
-
import { readFileSync, writeFileSync, mkdirSync, existsSync, chmodSync
|
|
8
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync, chmodSync } from "node:fs";
|
|
23
9
|
import { join } from "node:path";
|
|
24
10
|
import { homedir } from "node:os";
|
|
11
|
+
const NOOKPLOT_DIR = join(homedir(), ".nookplot");
|
|
12
|
+
const CREDENTIALS_PATH = join(NOOKPLOT_DIR, "credentials.json");
|
|
13
|
+
/** Per-profile credential dir — used when NOOKPLOT_PROFILE env is set. */
|
|
14
|
+
const AGENTS_DIR = join(NOOKPLOT_DIR, "agents");
|
|
25
15
|
/**
|
|
26
|
-
*
|
|
27
|
-
* `rename()`s it over the real path. `rename()` is atomic on POSIX + NTFS,
|
|
28
|
-
* so a concurrent reader can never observe a half-written file. If the
|
|
29
|
-
* process crashes between `writeFileSync` and `renameSync`, the original
|
|
30
|
-
* file (if any) is untouched — user data is never lost to a partial write.
|
|
16
|
+
* Resolve the credentials file path for the current run.
|
|
31
17
|
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
18
|
+
* Lookup order:
|
|
19
|
+
* 1. Explicit override via NOOKPLOT_CREDENTIALS_PATH env (escape hatch)
|
|
20
|
+
* 2. Profile-scoped path when NOOKPLOT_PROFILE is set + the file exists
|
|
21
|
+
* (~/.nookplot/agents/<profile>/credentials.json)
|
|
22
|
+
* 3. Global ~/.nookplot/credentials.json
|
|
35
23
|
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* applies to `profile.json` (wrapper alias would point nowhere) and
|
|
41
|
-
* `active-profile` (sticky default silently clears). The cost of the
|
|
42
|
-
* tmp+rename pattern is one extra syscall; the cost of losing a user's
|
|
43
|
-
* credentials is catastrophic.
|
|
24
|
+
* The profile-scoped path is what makes a forged child agent (vh1, vh2, …)
|
|
25
|
+
* actually authenticate AS itself with the gateway — so tool calls land
|
|
26
|
+
* under the child's address rather than the parent's. The Forge install
|
|
27
|
+
* flow writes this file when the user provides a child keystore.
|
|
44
28
|
*/
|
|
45
|
-
function
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
renameSync(tmp, path);
|
|
57
|
-
}
|
|
58
|
-
catch (err) {
|
|
59
|
-
// Rename failed — clean up the tmp file so we don't leave garbage.
|
|
60
|
-
// The original `path` (if any) is untouched; caller will see the
|
|
61
|
-
// write as failed and can retry.
|
|
62
|
-
try {
|
|
63
|
-
unlinkSync(tmp);
|
|
64
|
-
}
|
|
65
|
-
catch { /* best effort */ }
|
|
66
|
-
throw err;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
// Resolve paths lazily so tests can mock `homedir()` between imports and
|
|
70
|
-
// assertions. Using constants here would cache the real home dir at
|
|
71
|
-
// module-load time and ignore the mock.
|
|
72
|
-
function nookplotDir() { return join(homedir(), ".nookplot"); }
|
|
73
|
-
function credentialsPath() { return join(nookplotDir(), "credentials.json"); }
|
|
74
|
-
/** Path to a specific profile's metadata file. */
|
|
75
|
-
export function profilePath(profileName) {
|
|
76
|
-
return join(nookplotDir(), "profiles", profileName, "profile.json");
|
|
77
|
-
}
|
|
78
|
-
/** Path to the root profiles dir (where all profiles live). */
|
|
79
|
-
export function profilesDir() {
|
|
80
|
-
return join(nookplotDir(), "profiles");
|
|
81
|
-
}
|
|
82
|
-
/** Path to the sticky-default pointer file (set by `nookplot profile use`). */
|
|
83
|
-
function activeProfilePath() {
|
|
84
|
-
return join(nookplotDir(), "active-profile");
|
|
29
|
+
function resolveCredentialsPath() {
|
|
30
|
+
const explicit = process.env.NOOKPLOT_CREDENTIALS_PATH;
|
|
31
|
+
if (explicit && existsSync(explicit))
|
|
32
|
+
return explicit;
|
|
33
|
+
const profile = process.env.NOOKPLOT_PROFILE;
|
|
34
|
+
if (profile) {
|
|
35
|
+
const scoped = join(AGENTS_DIR, profile, "credentials.json");
|
|
36
|
+
if (existsSync(scoped))
|
|
37
|
+
return scoped;
|
|
38
|
+
}
|
|
39
|
+
return CREDENTIALS_PATH;
|
|
85
40
|
}
|
|
86
41
|
/**
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
* to MCP sessions spawned outside Hermes.
|
|
91
|
-
*
|
|
92
|
-
* Never throws — filesystem errors are silenced, which preserves the
|
|
93
|
-
* fail-open pattern used elsewhere in this module.
|
|
42
|
+
* Load credentials from disk. Honors NOOKPLOT_PROFILE for child-agent
|
|
43
|
+
* scoping (see resolveCredentialsPath). Returns null if the file doesn't
|
|
44
|
+
* exist.
|
|
94
45
|
*/
|
|
95
|
-
function
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
if (!existsSync(path))
|
|
99
|
-
return undefined;
|
|
100
|
-
const content = readFileSync(path, "utf-8").trim();
|
|
101
|
-
return content.length > 0 ? content : undefined;
|
|
102
|
-
}
|
|
103
|
-
catch {
|
|
104
|
-
return undefined;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Load credentials — profile-aware.
|
|
109
|
-
*
|
|
110
|
-
* Resolution order (first match wins):
|
|
111
|
-
* 1. `NOOKPLOT_PROFILE` env var → `~/.nookplot/profiles/<name>/profile.json`
|
|
112
|
-
* merged with default `credentials.json`. The profile only has
|
|
113
|
-
* `scopedAgentAddress`; creds come from the shared file.
|
|
114
|
-
* 2. Default `~/.nookplot/credentials.json` (legacy single-agent path)
|
|
115
|
-
*
|
|
116
|
-
* Returns null if no creds file exists at all. Invalid profile name or
|
|
117
|
-
* missing profile.json falls back to the default creds (not an error —
|
|
118
|
-
* lets users run unscoped commands even when a profile env var was
|
|
119
|
-
* left over from another shell).
|
|
120
|
-
*/
|
|
121
|
-
export function loadCredentials(opts) {
|
|
122
|
-
// Resolution order (first non-empty wins):
|
|
123
|
-
// 1. Explicit `opts.profile` — set by write-profile / apply-config callers
|
|
124
|
-
// 2. `NOOKPLOT_PROFILE` env var — baked into Hermes config.yaml by the
|
|
125
|
-
// installer, or exported by the CLI's preAction hook when --profile
|
|
126
|
-
// was passed
|
|
127
|
-
// 3. Sticky default from `~/.nookplot/active-profile` — written by
|
|
128
|
-
// `nookplot profile use <name>` and honored here so a user who sets
|
|
129
|
-
// their default gets it everywhere, not just in the CLI `profile`
|
|
130
|
-
// subcommand. Without this fallback the sticky default would be a
|
|
131
|
-
// lie for MCP sessions spawned outside Hermes.
|
|
132
|
-
// 4. undefined — creator-direct (no scope merge)
|
|
133
|
-
const profileName = opts?.profile
|
|
134
|
-
?? process.env.NOOKPLOT_PROFILE
|
|
135
|
-
?? readStickyProfile();
|
|
136
|
-
// Always load base creds (API key, private key) from the default path.
|
|
137
|
-
// Per-profile scope is merged on top.
|
|
138
|
-
const baseCreds = loadCredentialsFromFile(credentialsPath());
|
|
139
|
-
if (!baseCreds)
|
|
140
|
-
return null;
|
|
141
|
-
if (!profileName)
|
|
142
|
-
return baseCreds;
|
|
143
|
-
// Try to read the profile's scope file. If it doesn't exist, fall back
|
|
144
|
-
// to base creds without scoping — users who export NOOKPLOT_PROFILE in
|
|
145
|
-
// their shell shouldn't get errors for other commands.
|
|
146
|
-
const profile = loadProfile(profileName);
|
|
147
|
-
if (!profile)
|
|
148
|
-
return baseCreds;
|
|
149
|
-
return {
|
|
150
|
-
...baseCreds,
|
|
151
|
-
scopedAgentAddress: profile.scopedAgentAddress,
|
|
152
|
-
profileName,
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
/** Internal: load + validate a credentials.json at a given path. */
|
|
156
|
-
function loadCredentialsFromFile(path) {
|
|
157
|
-
if (!existsSync(path))
|
|
46
|
+
export function loadCredentials() {
|
|
47
|
+
const path = resolveCredentialsPath();
|
|
48
|
+
if (!existsSync(path)) {
|
|
158
49
|
return null;
|
|
159
|
-
// ── File-mode safety check ──────────────────────────────────
|
|
160
|
-
// credentials.json contains the user's API key + private key — both
|
|
161
|
-
// wallet-equivalent secrets. If the file was created world-readable by
|
|
162
|
-
// accident (manual cp without preserving perms, weird umask, etc.) any
|
|
163
|
-
// other user on the same machine could read these. We don't refuse the
|
|
164
|
-
// load (would brick valid users on Windows where mode bits are fake)
|
|
165
|
-
// but we warn loudly so the user actually fixes it.
|
|
166
|
-
//
|
|
167
|
-
// Skip the check on Windows entirely — its st_mode bits don't follow
|
|
168
|
-
// POSIX semantics and the warning would be noise.
|
|
169
|
-
if (process.platform !== "win32") {
|
|
170
|
-
try {
|
|
171
|
-
const stat = statSync(path);
|
|
172
|
-
// mode & 0o077 = "anything outside owner can read/write/execute"
|
|
173
|
-
if ((stat.mode & 0o077) !== 0) {
|
|
174
|
-
const modeStr = (stat.mode & 0o777).toString(8).padStart(3, "0");
|
|
175
|
-
console.error(`[nookplot-mcp] WARNING: ${path} has unsafe permissions (mode ${modeStr}). ` +
|
|
176
|
-
`Other users on this machine may be able to read your API key + wallet private key. ` +
|
|
177
|
-
`Fix with: chmod 600 "${path}"`);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
catch {
|
|
181
|
-
// If we can't stat, just proceed — readFileSync below will produce
|
|
182
|
-
// a more useful error for permission-denied cases.
|
|
183
|
-
}
|
|
184
50
|
}
|
|
185
51
|
try {
|
|
186
52
|
const raw = readFileSync(path, "utf-8");
|
|
187
53
|
const creds = JSON.parse(raw);
|
|
188
54
|
// Validate required fields
|
|
189
55
|
if (!creds.apiKey || !creds.privateKey || !creds.address || !creds.gatewayUrl) {
|
|
190
|
-
console.error(
|
|
56
|
+
console.error("[nookplot-mcp] Invalid credentials file — missing required fields");
|
|
191
57
|
return null;
|
|
192
58
|
}
|
|
59
|
+
// When loaded via a profile path, surface the profile name so the
|
|
60
|
+
// server can log it ("Connected as <addr> · profile: <name>") and so
|
|
61
|
+
// tools can read ctx.scopedAgentAddress without the env var.
|
|
62
|
+
const profileName = process.env.NOOKPLOT_PROFILE;
|
|
63
|
+
if (profileName && path !== CREDENTIALS_PATH) {
|
|
64
|
+
creds.profileName = profileName;
|
|
65
|
+
// The address from the profile creds IS the scoped address — set
|
|
66
|
+
// it explicitly so downstream tools don't need to guess.
|
|
67
|
+
creds.scopedAgentAddress = creds.address;
|
|
68
|
+
}
|
|
193
69
|
return creds;
|
|
194
70
|
}
|
|
195
71
|
catch (err) {
|
|
@@ -197,164 +73,21 @@ function loadCredentialsFromFile(path) {
|
|
|
197
73
|
return null;
|
|
198
74
|
}
|
|
199
75
|
}
|
|
200
|
-
/**
|
|
201
|
-
* Load a profile's metadata file (`profile.json`). Returns null if the
|
|
202
|
-
* profile doesn't exist or the file is malformed. Profile names must
|
|
203
|
-
* match the Hermes-compatible rule — callers should validate beforehand.
|
|
204
|
-
*/
|
|
205
|
-
export function loadProfile(profileName) {
|
|
206
|
-
const path = profilePath(profileName);
|
|
207
|
-
if (!existsSync(path))
|
|
208
|
-
return null;
|
|
209
|
-
try {
|
|
210
|
-
const raw = readFileSync(path, "utf-8");
|
|
211
|
-
const parsed = JSON.parse(raw);
|
|
212
|
-
if (typeof parsed.scopedAgentAddress !== "string" || parsed.scopedAgentAddress.length === 0) {
|
|
213
|
-
console.error(`[nookplot-mcp] Invalid profile '${profileName}' — missing scopedAgentAddress`);
|
|
214
|
-
return null;
|
|
215
|
-
}
|
|
216
|
-
return parsed;
|
|
217
|
-
}
|
|
218
|
-
catch (err) {
|
|
219
|
-
console.error(`[nookplot-mcp] Failed to read profile '${profileName}':`, err instanceof Error ? err.message : err);
|
|
220
|
-
return null;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* Save (or overwrite) a profile's metadata file. Creates the profile
|
|
225
|
-
* directory if needed with 0o700 permissions (chmod-sensitive systems
|
|
226
|
-
* only — Windows no-ops).
|
|
227
|
-
*
|
|
228
|
-
* Callers:
|
|
229
|
-
* - Installer bash writes this after apply-config
|
|
230
|
-
* - CLI `nookplot profile create` writes this
|
|
231
|
-
* - SDK helpers for programmatic profile setup
|
|
232
|
-
*/
|
|
233
|
-
export function saveProfile(profileName, profile) {
|
|
234
|
-
const dir = join(profilesDir(), profileName);
|
|
235
|
-
if (!existsSync(dir)) {
|
|
236
|
-
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
237
|
-
}
|
|
238
|
-
const path = profilePath(profileName);
|
|
239
|
-
const payload = {
|
|
240
|
-
...profile,
|
|
241
|
-
createdAt: profile.createdAt ?? new Date().toISOString(),
|
|
242
|
-
};
|
|
243
|
-
// Atomic: tmp+rename so a crash can't leave profile.json truncated.
|
|
244
|
-
// A corrupt profile.json would orphan the forged agent's wrapper alias
|
|
245
|
-
// (user types `<slug> chat` and gets creator-direct scope instead of
|
|
246
|
-
// the intended agent). Not data loss per se — but silently wrong.
|
|
247
|
-
writeFileAtomic(path, JSON.stringify(payload, null, 2) + "\n", { mode: 0o600 });
|
|
248
|
-
}
|
|
249
|
-
/**
|
|
250
|
-
* Safer wrapper around `saveProfile` that detects slug collisions before
|
|
251
|
-
* overwriting. Use this instead of calling `saveProfile` directly from
|
|
252
|
-
* any code path that accepts externally-provided profile names (the
|
|
253
|
-
* installer bash, `write-profile` CLI, SDK consumers, etc.).
|
|
254
|
-
*
|
|
255
|
-
* Why: two forged agents whose display names slugify to the same string
|
|
256
|
-
* (e.g. "Research Scout" and "Research-Scout" both → "research-scout")
|
|
257
|
-
* would otherwise silently overwrite each other's profile.json, pointing
|
|
258
|
-
* the wrapper alias `<slug> chat` at whichever was installed most
|
|
259
|
-
* recently. The user has no signal the first install was orphaned.
|
|
260
|
-
*
|
|
261
|
-
* Passing `force: true` makes the write unconditional — reserve this for
|
|
262
|
-
* cases where the caller has explicitly confirmed intent (e.g. the user
|
|
263
|
-
* typed `write-profile --force`).
|
|
264
|
-
*
|
|
265
|
-
* Idempotent re-installs for the SAME forged agent address always succeed
|
|
266
|
-
* (kind: "updated"). CreatedAt is preserved across same-address rewrites
|
|
267
|
-
* so the audit timeline stays intact.
|
|
268
|
-
*/
|
|
269
|
-
export function safeSaveProfile(profileName, profile, opts = {}) {
|
|
270
|
-
const newAddr = profile.scopedAgentAddress.toLowerCase();
|
|
271
|
-
const existing = loadProfile(profileName);
|
|
272
|
-
if (existing) {
|
|
273
|
-
const existingAddr = existing.scopedAgentAddress.toLowerCase();
|
|
274
|
-
if (existingAddr === newAddr) {
|
|
275
|
-
// Same agent — idempotent rewrite. Preserve original createdAt so
|
|
276
|
-
// re-running the installer doesn't reset the profile's audit clock.
|
|
277
|
-
saveProfile(profileName, {
|
|
278
|
-
...profile,
|
|
279
|
-
scopedAgentAddress: newAddr,
|
|
280
|
-
createdAt: profile.createdAt ?? existing.createdAt,
|
|
281
|
-
});
|
|
282
|
-
return { kind: "updated", profileName, previousCreatedAt: existing.createdAt };
|
|
283
|
-
}
|
|
284
|
-
if (!opts.force) {
|
|
285
|
-
return {
|
|
286
|
-
kind: "collision",
|
|
287
|
-
profileName,
|
|
288
|
-
existingAddress: existingAddr,
|
|
289
|
-
attemptedAddress: newAddr,
|
|
290
|
-
};
|
|
291
|
-
}
|
|
292
|
-
// Forced overwrite: user explicitly opted in. Don't preserve the
|
|
293
|
-
// previous createdAt — this is a genuinely new mapping.
|
|
294
|
-
}
|
|
295
|
-
saveProfile(profileName, { ...profile, scopedAgentAddress: newAddr });
|
|
296
|
-
return { kind: "created", profileName };
|
|
297
|
-
}
|
|
298
|
-
/**
|
|
299
|
-
* List every profile that has a valid profile.json. Used by
|
|
300
|
-
* `nookplot profile list` + any UI that shows the user's forged-agent
|
|
301
|
-
* roster. Returns profile names sorted alphabetically for deterministic
|
|
302
|
-
* output.
|
|
303
|
-
*/
|
|
304
|
-
export function listProfiles() {
|
|
305
|
-
if (!existsSync(profilesDir()))
|
|
306
|
-
return [];
|
|
307
|
-
const out = [];
|
|
308
|
-
try {
|
|
309
|
-
const entries = readdirSync(profilesDir());
|
|
310
|
-
for (const name of entries.sort()) {
|
|
311
|
-
const full = join(profilesDir(), name);
|
|
312
|
-
try {
|
|
313
|
-
if (!statSync(full).isDirectory())
|
|
314
|
-
continue;
|
|
315
|
-
}
|
|
316
|
-
catch {
|
|
317
|
-
continue;
|
|
318
|
-
}
|
|
319
|
-
const profile = loadProfile(name);
|
|
320
|
-
if (profile)
|
|
321
|
-
out.push({ name, profile });
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
catch {
|
|
325
|
-
// Permissions or missing dir — return empty, don't crash.
|
|
326
|
-
}
|
|
327
|
-
return out;
|
|
328
|
-
}
|
|
329
76
|
/**
|
|
330
77
|
* Save credentials to ~/.nookplot/credentials.json with restrictive permissions.
|
|
331
78
|
*/
|
|
332
79
|
export function saveCredentials(creds) {
|
|
333
80
|
// Ensure directory exists
|
|
334
|
-
if (!existsSync(
|
|
335
|
-
mkdirSync(
|
|
81
|
+
if (!existsSync(NOOKPLOT_DIR)) {
|
|
82
|
+
mkdirSync(NOOKPLOT_DIR, { recursive: true, mode: 0o700 });
|
|
83
|
+
}
|
|
84
|
+
const content = JSON.stringify(creds, null, 2) + "\n";
|
|
85
|
+
writeFileSync(CREDENTIALS_PATH, content, { encoding: "utf-8", mode: 0o600 });
|
|
86
|
+
// Ensure restrictive permissions
|
|
87
|
+
try {
|
|
88
|
+
chmodSync(CREDENTIALS_PATH, 0o600);
|
|
336
89
|
}
|
|
337
|
-
|
|
338
|
-
// in creds that were loaded through a profile (e.g. accidentally round-
|
|
339
|
-
// tripped via loadCredentials({profile})), we'd otherwise pollute
|
|
340
|
-
// credentials.json with `scopedAgentAddress` + `profileName` — fields
|
|
341
|
-
// that are per-session metadata, not identity. This strip keeps the
|
|
342
|
-
// file's shape stable: apiKey + privateKey + address + gatewayUrl +
|
|
343
|
-
// optional displayName, nothing else.
|
|
344
|
-
const stripped = {
|
|
345
|
-
apiKey: creds.apiKey,
|
|
346
|
-
privateKey: creds.privateKey,
|
|
347
|
-
address: creds.address,
|
|
348
|
-
gatewayUrl: creds.gatewayUrl,
|
|
349
|
-
...(creds.displayName ? { displayName: creds.displayName } : {}),
|
|
350
|
-
};
|
|
351
|
-
const content = JSON.stringify(stripped, null, 2) + "\n";
|
|
352
|
-
// Atomic: tmp+rename so a crash during rotate-key or first-time
|
|
353
|
-
// registration can't leave credentials.json truncated. A truncated
|
|
354
|
-
// credentials file would force the user to re-register from scratch
|
|
355
|
-
// — a catastrophic UX event. With tmp+rename the worst case on crash
|
|
356
|
-
// is "the old file is unchanged" which is always recoverable.
|
|
357
|
-
writeFileAtomic(credentialsPath(), content, { mode: 0o600 });
|
|
90
|
+
catch { /* Windows doesn't support chmod */ }
|
|
358
91
|
}
|
|
359
92
|
/**
|
|
360
93
|
* Get the gateway URL from env, credentials, or default.
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/gateway.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO;IAC1C,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,CAAC,CAAC;CACT;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,IAAI,YAAY,CAGhH;AAWD;;GAEG;AACH,wBAAsB,cAAc,CAAC,CAAC,GAAG,OAAO,EAC9C,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,EACnD,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACA,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO;IAC1C,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,CAAC,CAAC;CACT;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,IAAI,YAAY,CAGhH;AAWD;;GAEG;AACH,wBAAsB,cAAc,CAAC,CAAC,GAAG,OAAO,EAC9C,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,EACnD,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACA,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CA2F5C;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,CAAC,GAAG,OAAO,EACvD,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,EACnD,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACA,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAmB5C"}
|
package/dist/gateway.js
CHANGED
|
@@ -97,13 +97,9 @@ export async function gatewayRequest(gatewayUrl, method, path, options) {
|
|
|
97
97
|
}
|
|
98
98
|
if (!response.ok) {
|
|
99
99
|
const errBody = data;
|
|
100
|
-
const
|
|
100
|
+
const errorMsg = errBody.message
|
|
101
101
|
? (errBody.error ? `${errBody.error}: ${errBody.message}` : errBody.message)
|
|
102
102
|
: (errBody.error ?? `Request failed (${response.status})`);
|
|
103
|
-
// Prepend machine-readable code so agents can branch on it programmatically
|
|
104
|
-
// (e.g. distinguish SAME_CREATOR_VERIFICATION from POSTER_VERIFICATION
|
|
105
|
-
// even when both surface as 403). Format: `[CODE] human message`.
|
|
106
|
-
const errorMsg = errBody.code ? `[${errBody.code}] ${baseMsg}` : baseMsg;
|
|
107
103
|
return { ok: false, status: response.status, error: errorMsg };
|
|
108
104
|
}
|
|
109
105
|
return { ok: true, status: response.status, data: data };
|
package/dist/gateway.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -10,16 +10,5 @@
|
|
|
10
10
|
*
|
|
11
11
|
* @module index
|
|
12
12
|
*/
|
|
13
|
-
|
|
14
|
-
* Compare two semver strings. Returns:
|
|
15
|
-
* -1 if `a < b`, 0 if equal, 1 if `a > b`.
|
|
16
|
-
* Lightweight parser — handles `x.y.z` and `x.y.z-prerelease.n`. We treat
|
|
17
|
-
* a missing pre-release as "higher" than one that has it (so `0.5.0` >
|
|
18
|
-
* `0.5.0-beta.1`). Good enough for the single use-case here — comparing
|
|
19
|
-
* our own `package.json` version against the npm `@latest` dist-tag.
|
|
20
|
-
*
|
|
21
|
-
* Exported for unit tests — production code uses it only inside
|
|
22
|
-
* checkForUpdate().
|
|
23
|
-
*/
|
|
24
|
-
export declare function compareSemver(a: string, b: string): number;
|
|
13
|
+
export {};
|
|
25
14
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG"}
|