@nookplot/mcp 0.4.113 → 0.4.115

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.
Files changed (77) hide show
  1. package/README.md +293 -293
  2. package/SKILL.md +145 -145
  3. package/dist/auth.d.ts +112 -5
  4. package/dist/auth.d.ts.map +1 -1
  5. package/dist/auth.js +355 -54
  6. package/dist/auth.js.map +1 -1
  7. package/dist/gateway.d.ts.map +1 -1
  8. package/dist/gateway.js +5 -1
  9. package/dist/gateway.js.map +1 -1
  10. package/dist/index.d.ts +12 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +648 -51
  13. package/dist/index.js.map +1 -1
  14. package/dist/profileName.d.ts +65 -0
  15. package/dist/profileName.d.ts.map +1 -0
  16. package/dist/profileName.js +114 -0
  17. package/dist/profileName.js.map +1 -0
  18. package/dist/server.js +81 -81
  19. package/dist/setup.js +7 -7
  20. package/dist/syncSessions.d.ts +84 -0
  21. package/dist/syncSessions.d.ts.map +1 -0
  22. package/dist/syncSessions.js +260 -0
  23. package/dist/syncSessions.js.map +1 -0
  24. package/dist/syncSessionsExtractor.d.ts +123 -0
  25. package/dist/syncSessionsExtractor.d.ts.map +1 -0
  26. package/dist/syncSessionsExtractor.js +362 -0
  27. package/dist/syncSessionsExtractor.js.map +1 -0
  28. package/dist/syncSessionsState.d.ts +89 -0
  29. package/dist/syncSessionsState.d.ts.map +1 -0
  30. package/dist/syncSessionsState.js +145 -0
  31. package/dist/syncSessionsState.js.map +1 -0
  32. package/dist/tools/cognitiveWorkspace.d.ts.map +1 -1
  33. package/dist/tools/cognitiveWorkspace.js +30 -0
  34. package/dist/tools/cognitiveWorkspace.js.map +1 -1
  35. package/dist/tools/ecosystem.d.ts.map +1 -1
  36. package/dist/tools/ecosystem.js +1 -5
  37. package/dist/tools/ecosystem.js.map +1 -1
  38. package/dist/tools/forgePresets.d.ts +7 -2
  39. package/dist/tools/forgePresets.d.ts.map +1 -1
  40. package/dist/tools/forgePresets.js +133 -3
  41. package/dist/tools/forgePresets.js.map +1 -1
  42. package/dist/tools/knowledgeGraph.js +1 -1
  43. package/dist/tools/knowledgeGraph.js.map +1 -1
  44. package/dist/tools/memory.d.ts.map +1 -1
  45. package/dist/tools/memory.js +0 -33
  46. package/dist/tools/memory.js.map +1 -1
  47. package/dist/tools/miningPipeline.d.ts +6 -2
  48. package/dist/tools/miningPipeline.d.ts.map +1 -1
  49. package/dist/tools/miningPipeline.js +392 -3
  50. package/dist/tools/miningPipeline.js.map +1 -1
  51. package/dist/tools/onchain.d.ts.map +1 -1
  52. package/dist/tools/onchain.js +133 -19
  53. package/dist/tools/onchain.js.map +1 -1
  54. package/dist/tools/papers.d.ts.map +1 -1
  55. package/dist/tools/papers.js +16 -0
  56. package/dist/tools/papers.js.map +1 -1
  57. package/dist/tools/read.d.ts.map +1 -1
  58. package/dist/tools/read.js +27 -6
  59. package/dist/tools/read.js.map +1 -1
  60. package/dist/tools/reasoningWork.js +60 -60
  61. package/dist/tools/swarms.d.ts.map +1 -1
  62. package/dist/tools/swarms.js +21 -1
  63. package/dist/tools/swarms.js.map +1 -1
  64. package/dist/tools/tokens.d.ts.map +1 -1
  65. package/dist/tools/tokens.js +8 -3
  66. package/dist/tools/tokens.js.map +1 -1
  67. package/package.json +96 -96
  68. package/skills/hermes/nookplot/DESCRIPTION.md +59 -0
  69. package/skills/hermes/nookplot/daemon/SKILL.md +103 -0
  70. package/skills/hermes/nookplot/learn/SKILL.md +131 -0
  71. package/skills/hermes/nookplot/mine/SKILL.md +111 -0
  72. package/skills/hermes/nookplot/social/SKILL.md +104 -0
  73. package/skills/hermes/nookplot/sync/SKILL.md +110 -0
  74. package/skills/learn/SKILL.md +70 -70
  75. package/skills/mine/SKILL.md +85 -85
  76. package/skills/nookplot/SKILL.md +222 -222
  77. package/skills/social/SKILL.md +84 -84
package/dist/auth.js CHANGED
@@ -1,71 +1,214 @@
1
1
  /**
2
2
  * Credential management for the Nookplot MCP server.
3
3
  *
4
- * Stores credentials in ~/.nookplot/credentials.json (chmod 600).
4
+ * Single source of API-key truth lives at `~/.nookplot/credentials.json`
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)
5
19
  *
6
20
  * @module auth
7
21
  */
8
- import { readFileSync, writeFileSync, mkdirSync, existsSync, chmodSync } from "node:fs";
22
+ import { readFileSync, writeFileSync, mkdirSync, existsSync, chmodSync, readdirSync, statSync, renameSync, unlinkSync } from "node:fs";
9
23
  import { join } from "node:path";
10
24
  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");
15
25
  /**
16
- * Resolve the credentials file path for the current run.
26
+ * Atomic write helper writes `content` to `${path}.tmp` first, then
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.
17
31
  *
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
32
+ * The chmod is applied to the tmp file BEFORE the rename so the final
33
+ * path is protected from the first moment it exists. On Windows chmod is
34
+ * a no-op (wrapped in try/catch at the caller).
23
35
  *
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.
36
+ * Why this matters: `credentials.json` is the single source of truth for
37
+ * a user's Nookplot identity API key, private key, wallet address. A
38
+ * truncated write (crash mid-`writeFileSync`) would wipe out the user's
39
+ * account locally, forcing them to re-register from scratch. Same risk
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.
28
44
  */
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;
45
+ function writeFileAtomic(path, content, opts = {}) {
46
+ const tmp = `${path}.tmp`;
47
+ writeFileSync(tmp, content, { encoding: "utf-8", mode: opts.mode ?? 0o600 });
48
+ try {
49
+ if (opts.mode !== undefined)
50
+ chmodSync(tmp, opts.mode);
51
+ }
52
+ catch {
53
+ // Windows — chmod is a no-op
54
+ }
55
+ try {
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
+ }
40
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"); }
41
74
  /**
42
- * Load credentials from disk. Honors NOOKPLOT_PROFILE for child-agent
43
- * scoping (see resolveCredentialsPath). Returns null if the file doesn't
44
- * exist.
75
+ * Hermes profile-name pattern. Mirrors `profileName.ts::isValidProfileName`
76
+ * re-declared here to keep auth.ts dependency-free (auth.ts is imported
77
+ * by the bootstrap path before the rest of the module graph wires up).
78
+ *
79
+ * Rule: starts with a lowercase letter, 2-32 chars total, lowercase
80
+ * alphanumerics + hyphens, ends with an alphanumeric. This is a strict
81
+ * superset-blocker for path traversal, control chars, and absolute paths:
82
+ * `..`, `/`, `\`, null bytes, Unicode separators are all impossible.
45
83
  */
46
- export function loadCredentials() {
47
- const path = resolveCredentialsPath();
48
- if (!existsSync(path)) {
49
- return null;
84
+ const VALID_PROFILE_NAME = /^[a-z][a-z0-9-]{0,30}[a-z0-9]$/;
85
+ /**
86
+ * Guard for any profile-name input that gets joined into a filesystem
87
+ * path. 2026-05-15 audit found `profilePath()` joined directly to disk
88
+ * — `NOOKPLOT_PROFILE=../foo` would resolve outside the profiles dir
89
+ * and let `loadProfile` read JSON files anywhere readable by the
90
+ * Hermes process. The attacker already needs shell access to set the
91
+ * env var, so it's a containment fix (cross-profile contamination)
92
+ * rather than a remote-RCE fix, but the cost is one validation line.
93
+ *
94
+ * Throws on malformed input so the caller's "this shouldn't happen"
95
+ * branch surfaces loudly during dev. Wrap with try/catch where you
96
+ * want fail-open semantics (e.g., readStickyProfile silently drops
97
+ * a malformed file).
98
+ */
99
+ function assertSafeProfileName(profileName, context) {
100
+ if (!VALID_PROFILE_NAME.test(profileName)) {
101
+ throw new Error(`[nookplot-mcp] Refusing ${context} for invalid profile name (path traversal / format violation). ` +
102
+ `Profile names must match /^[a-z][a-z0-9-]{0,30}[a-z0-9]$/.`);
50
103
  }
104
+ }
105
+ /** Path to a specific profile's metadata file. */
106
+ export function profilePath(profileName) {
107
+ assertSafeProfileName(profileName, "profilePath");
108
+ return join(nookplotDir(), "profiles", profileName, "profile.json");
109
+ }
110
+ /** Path to the root profiles dir (where all profiles live). */
111
+ export function profilesDir() {
112
+ return join(nookplotDir(), "profiles");
113
+ }
114
+ /** Path to the sticky-default pointer file (set by `nookplot profile use`). */
115
+ function activeProfilePath() {
116
+ return join(nookplotDir(), "active-profile");
117
+ }
118
+ /**
119
+ * Read `~/.nookplot/active-profile` and return the profile name it points at,
120
+ * or undefined if unset / unreadable / empty. Used as the lowest-priority
121
+ * fallback in `loadCredentials` so a sticky default set by the CLI applies
122
+ * to MCP sessions spawned outside Hermes.
123
+ *
124
+ * Never throws — filesystem errors are silenced, which preserves the
125
+ * fail-open pattern used elsewhere in this module.
126
+ */
127
+ function readStickyProfile() {
128
+ try {
129
+ const path = activeProfilePath();
130
+ if (!existsSync(path))
131
+ return undefined;
132
+ const content = readFileSync(path, "utf-8").trim();
133
+ return content.length > 0 ? content : undefined;
134
+ }
135
+ catch {
136
+ return undefined;
137
+ }
138
+ }
139
+ /**
140
+ * Load credentials — profile-aware.
141
+ *
142
+ * Resolution order (first match wins):
143
+ * 1. `NOOKPLOT_PROFILE` env var → `~/.nookplot/profiles/<name>/profile.json`
144
+ * merged with default `credentials.json`. The profile only has
145
+ * `scopedAgentAddress`; creds come from the shared file.
146
+ * 2. Default `~/.nookplot/credentials.json` (legacy single-agent path)
147
+ *
148
+ * Returns null if no creds file exists at all. Invalid profile name or
149
+ * missing profile.json falls back to the default creds (not an error —
150
+ * lets users run unscoped commands even when a profile env var was
151
+ * left over from another shell).
152
+ */
153
+ export function loadCredentials(opts) {
154
+ // Resolution order (first non-empty wins):
155
+ // 1. Explicit `opts.profile` — set by write-profile / apply-config callers
156
+ // 2. `NOOKPLOT_PROFILE` env var — baked into Hermes config.yaml by the
157
+ // installer, or exported by the CLI's preAction hook when --profile
158
+ // was passed
159
+ // 3. Sticky default from `~/.nookplot/active-profile` — written by
160
+ // `nookplot profile use <name>` and honored here so a user who sets
161
+ // their default gets it everywhere, not just in the CLI `profile`
162
+ // subcommand. Without this fallback the sticky default would be a
163
+ // lie for MCP sessions spawned outside Hermes.
164
+ // 4. undefined — creator-direct (no scope merge)
165
+ const rawProfileName = opts?.profile
166
+ ?? process.env.NOOKPLOT_PROFILE
167
+ ?? readStickyProfile();
168
+ // 2026-05-15 audit: validate the profile name BEFORE any filesystem
169
+ // access. A malformed/path-traversal name silently falls back to the
170
+ // base creds rather than throwing — env-var typos and stale sticky-
171
+ // default files shouldn't break otherwise-working CLI invocations.
172
+ // The strict path-traversal block is in profilePath itself; this is
173
+ // the read-path's soft-rejection so users don't see scary errors.
174
+ const profileName = rawProfileName && VALID_PROFILE_NAME.test(rawProfileName)
175
+ ? rawProfileName
176
+ : undefined;
177
+ if (rawProfileName && !profileName) {
178
+ console.error(`[nookplot-mcp] Ignoring invalid profile name '${rawProfileName}' ` +
179
+ `(format violation). Falling back to default credentials.`);
180
+ }
181
+ // Always load base creds (API key, private key) from the default path.
182
+ // Per-profile scope is merged on top.
183
+ const baseCreds = loadCredentialsFromFile(credentialsPath());
184
+ if (!baseCreds)
185
+ return null;
186
+ if (!profileName)
187
+ return baseCreds;
188
+ // Try to read the profile's scope file. If it doesn't exist, fall back
189
+ // to base creds without scoping — users who export NOOKPLOT_PROFILE in
190
+ // their shell shouldn't get errors for other commands.
191
+ const profile = loadProfile(profileName);
192
+ if (!profile)
193
+ return baseCreds;
194
+ return {
195
+ ...baseCreds,
196
+ scopedAgentAddress: profile.scopedAgentAddress,
197
+ profileName,
198
+ };
199
+ }
200
+ /** Internal: load + validate a credentials.json at a given path. */
201
+ function loadCredentialsFromFile(path) {
202
+ if (!existsSync(path))
203
+ return null;
51
204
  try {
52
205
  const raw = readFileSync(path, "utf-8");
53
206
  const creds = JSON.parse(raw);
54
207
  // Validate required fields
55
208
  if (!creds.apiKey || !creds.privateKey || !creds.address || !creds.gatewayUrl) {
56
- console.error("[nookplot-mcp] Invalid credentials file — missing required fields");
209
+ console.error(`[nookplot-mcp] Invalid credentials at ${path} — missing required fields`);
57
210
  return null;
58
211
  }
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
- }
69
212
  return creds;
70
213
  }
71
214
  catch (err) {
@@ -73,21 +216,179 @@ export function loadCredentials() {
73
216
  return null;
74
217
  }
75
218
  }
219
+ /**
220
+ * Load a profile's metadata file (`profile.json`). Returns null if the
221
+ * profile doesn't exist or the file is malformed. Profile names must
222
+ * match the Hermes-compatible rule — callers should validate beforehand.
223
+ */
224
+ export function loadProfile(profileName) {
225
+ // Read-path: malformed names silently return null (typical for env-var
226
+ // / sticky-default callers). profilePath would throw on traversal —
227
+ // catch the throw here and treat as "no such profile."
228
+ let path;
229
+ try {
230
+ path = profilePath(profileName);
231
+ }
232
+ catch {
233
+ return null;
234
+ }
235
+ if (!existsSync(path))
236
+ return null;
237
+ try {
238
+ const raw = readFileSync(path, "utf-8");
239
+ const parsed = JSON.parse(raw);
240
+ if (typeof parsed.scopedAgentAddress !== "string" || parsed.scopedAgentAddress.length === 0) {
241
+ console.error(`[nookplot-mcp] Invalid profile '${profileName}' — missing scopedAgentAddress`);
242
+ return null;
243
+ }
244
+ return parsed;
245
+ }
246
+ catch (err) {
247
+ console.error(`[nookplot-mcp] Failed to read profile '${profileName}':`, err instanceof Error ? err.message : err);
248
+ return null;
249
+ }
250
+ }
251
+ /**
252
+ * Save (or overwrite) a profile's metadata file. Creates the profile
253
+ * directory if needed with 0o700 permissions (chmod-sensitive systems
254
+ * only — Windows no-ops).
255
+ *
256
+ * Callers:
257
+ * - Installer bash writes this after apply-config
258
+ * - CLI `nookplot profile create` writes this
259
+ * - SDK helpers for programmatic profile setup
260
+ */
261
+ export function saveProfile(profileName, profile) {
262
+ // Write-path: fail loud on malformed name. A bad profile name reaching
263
+ // this far is almost certainly a programmer error or a hostile caller
264
+ // — refusing to mkdir/write protects against creating dirs like
265
+ // `~/.nookplot/profiles/../../foo` even if profilePath were ever
266
+ // weakened.
267
+ assertSafeProfileName(profileName, "saveProfile");
268
+ const dir = join(profilesDir(), profileName);
269
+ if (!existsSync(dir)) {
270
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
271
+ }
272
+ const path = profilePath(profileName);
273
+ const payload = {
274
+ ...profile,
275
+ createdAt: profile.createdAt ?? new Date().toISOString(),
276
+ };
277
+ // Atomic: tmp+rename so a crash can't leave profile.json truncated.
278
+ // A corrupt profile.json would orphan the forged agent's wrapper alias
279
+ // (user types `<slug> chat` and gets creator-direct scope instead of
280
+ // the intended agent). Not data loss per se — but silently wrong.
281
+ writeFileAtomic(path, JSON.stringify(payload, null, 2) + "\n", { mode: 0o600 });
282
+ }
283
+ /**
284
+ * Safer wrapper around `saveProfile` that detects slug collisions before
285
+ * overwriting. Use this instead of calling `saveProfile` directly from
286
+ * any code path that accepts externally-provided profile names (the
287
+ * installer bash, `write-profile` CLI, SDK consumers, etc.).
288
+ *
289
+ * Why: two forged agents whose display names slugify to the same string
290
+ * (e.g. "Research Scout" and "Research-Scout" both → "research-scout")
291
+ * would otherwise silently overwrite each other's profile.json, pointing
292
+ * the wrapper alias `<slug> chat` at whichever was installed most
293
+ * recently. The user has no signal the first install was orphaned.
294
+ *
295
+ * Passing `force: true` makes the write unconditional — reserve this for
296
+ * cases where the caller has explicitly confirmed intent (e.g. the user
297
+ * typed `write-profile --force`).
298
+ *
299
+ * Idempotent re-installs for the SAME forged agent address always succeed
300
+ * (kind: "updated"). CreatedAt is preserved across same-address rewrites
301
+ * so the audit timeline stays intact.
302
+ */
303
+ export function safeSaveProfile(profileName, profile, opts = {}) {
304
+ const newAddr = profile.scopedAgentAddress.toLowerCase();
305
+ const existing = loadProfile(profileName);
306
+ if (existing) {
307
+ const existingAddr = existing.scopedAgentAddress.toLowerCase();
308
+ if (existingAddr === newAddr) {
309
+ // Same agent — idempotent rewrite. Preserve original createdAt so
310
+ // re-running the installer doesn't reset the profile's audit clock.
311
+ saveProfile(profileName, {
312
+ ...profile,
313
+ scopedAgentAddress: newAddr,
314
+ createdAt: profile.createdAt ?? existing.createdAt,
315
+ });
316
+ return { kind: "updated", profileName, previousCreatedAt: existing.createdAt };
317
+ }
318
+ if (!opts.force) {
319
+ return {
320
+ kind: "collision",
321
+ profileName,
322
+ existingAddress: existingAddr,
323
+ attemptedAddress: newAddr,
324
+ };
325
+ }
326
+ // Forced overwrite: user explicitly opted in. Don't preserve the
327
+ // previous createdAt — this is a genuinely new mapping.
328
+ }
329
+ saveProfile(profileName, { ...profile, scopedAgentAddress: newAddr });
330
+ return { kind: "created", profileName };
331
+ }
332
+ /**
333
+ * List every profile that has a valid profile.json. Used by
334
+ * `nookplot profile list` + any UI that shows the user's forged-agent
335
+ * roster. Returns profile names sorted alphabetically for deterministic
336
+ * output.
337
+ */
338
+ export function listProfiles() {
339
+ if (!existsSync(profilesDir()))
340
+ return [];
341
+ const out = [];
342
+ try {
343
+ const entries = readdirSync(profilesDir());
344
+ for (const name of entries.sort()) {
345
+ const full = join(profilesDir(), name);
346
+ try {
347
+ if (!statSync(full).isDirectory())
348
+ continue;
349
+ }
350
+ catch {
351
+ continue;
352
+ }
353
+ const profile = loadProfile(name);
354
+ if (profile)
355
+ out.push({ name, profile });
356
+ }
357
+ }
358
+ catch {
359
+ // Permissions or missing dir — return empty, don't crash.
360
+ }
361
+ return out;
362
+ }
76
363
  /**
77
364
  * Save credentials to ~/.nookplot/credentials.json with restrictive permissions.
78
365
  */
79
366
  export function saveCredentials(creds) {
80
367
  // Ensure directory exists
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);
368
+ if (!existsSync(nookplotDir())) {
369
+ mkdirSync(nookplotDir(), { recursive: true, mode: 0o700 });
89
370
  }
90
- catch { /* Windows doesn't support chmod */ }
371
+ // Strip profile-scope fields before persisting. If a caller ever passed
372
+ // in creds that were loaded through a profile (e.g. accidentally round-
373
+ // tripped via loadCredentials({profile})), we'd otherwise pollute
374
+ // credentials.json with `scopedAgentAddress` + `profileName` — fields
375
+ // that are per-session metadata, not identity. This strip keeps the
376
+ // file's shape stable: apiKey + privateKey + address + gatewayUrl +
377
+ // optional displayName, nothing else.
378
+ const stripped = {
379
+ apiKey: creds.apiKey,
380
+ privateKey: creds.privateKey,
381
+ address: creds.address,
382
+ gatewayUrl: creds.gatewayUrl,
383
+ ...(creds.displayName ? { displayName: creds.displayName } : {}),
384
+ };
385
+ const content = JSON.stringify(stripped, null, 2) + "\n";
386
+ // Atomic: tmp+rename so a crash during rotate-key or first-time
387
+ // registration can't leave credentials.json truncated. A truncated
388
+ // credentials file would force the user to re-register from scratch
389
+ // — a catastrophic UX event. With tmp+rename the worst case on crash
390
+ // is "the old file is unchanged" which is always recoverable.
391
+ writeFileAtomic(credentialsPath(), content, { mode: 0o600 });
91
392
  }
92
393
  /**
93
394
  * 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":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
@@ -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,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"}
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,CA+F5C;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,9 +97,13 @@ export async function gatewayRequest(gatewayUrl, method, path, options) {
97
97
  }
98
98
  if (!response.ok) {
99
99
  const errBody = data;
100
- const errorMsg = errBody.message
100
+ const baseMsg = 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;
103
107
  return { ok: false, status: response.status, error: errorMsg };
104
108
  }
105
109
  return { ok: true, status: response.status, data: data };
@@ -1 +1 @@
1
- {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAeH,MAAM,UAAU,cAAc,CAAC,MAAyD;IACtF,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;AACpB,CAAC;AAED,iEAAiE;AACjE,MAAM,OAAO,GAAG;IACd,MAAM,EAAE,KAAK;IACb,UAAU,EAAE,CAAC;IACb,MAAM,EAAE,CAAC;IACT,SAAS,EAAE,GAAG;IACd,SAAS,EAAE,GAAG;CACf,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,UAAkB,EAClB,MAAmD,EACnD,IAAY,EACZ,OAMC;IAED,MAAM,GAAG,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;IAE3F,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;QAClC,mBAAmB,EAAE,OAAO,OAAO,EAAE,aAAa,IAAI,SAAS,EAAE;KAClE,CAAC;IAEF,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;QACpB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,OAAO,CAAC,MAAM,EAAE,CAAC;IACxD,CAAC;IAED,yEAAyE;IACzE,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,KAAK,WAAW,CAAC;YACnF,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC7C,OAAO,CAAC,IAAI,CACV,6DAA6D,MAAM,CAAC,QAAQ,GAAG;oBAC/E,2EAA2E,CAC5E,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,8CAA8C,CAAC,CAAC;IAC5D,CAAC;IAED,8FAA8F;IAC9F,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,IAAI,MAAM,CAAC,CAAC;IAErF,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC1B,MAAM;YACN,OAAO;YACP,IAAI,EAAE,OAAO,EAAE,IAAI,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK;gBACnD,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;gBAC9B,CAAC,CAAC,SAAS;YACb,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,2BAA2B,UAAU,WAAW,OAAO,EAAE;SACjE,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,SAAS,CAAC,CAAC;IAExB,sBAAsB;IACtB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC5D,IAAI,YAAgC,CAAC;QACrC,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA0C,CAAC;YAC3E,QAAQ,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,qBAAqB,CAAC;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,GAAG,qBAAqB,CAAC;QACnC,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;IACnE,CAAC;IAED,sBAAsB;IACtB,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,GAAG,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,IAA4C,CAAC;QAC7D,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO;YAC9B,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;YAC5E,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,mBAAmB,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QAC7D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IACjE,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,IAAS,EAAE,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,UAAkB,EAClB,MAAmD,EACnD,IAAY,EACZ,OAMC;IAED,IAAI,UAA6C,CAAC;IAElD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QAC/D,UAAU,GAAG,MAAM,cAAc,CAAI,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAExE,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC7D,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,IAAI,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;YACjC,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACrE,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;YAC3F,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC;YACnD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,OAAO,UAAW,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -10,5 +10,16 @@
10
10
  *
11
11
  * @module index
12
12
  */
13
- export {};
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;
14
25
  //# sourceMappingURL=index.d.ts.map
@@ -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;AA8BH;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAoB1D"}