Local-first non-linear memory OS for AI operators. One index across Claude Code, Codex, Cursor, Windsurf, Hermes, OpenCode, Aider, pi, and more — with an editable timeline.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio counts 0 tools · 0 res
· 0 prompts
permission surface via code analysis
no tools enumerated yet for this server.
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit dda6d28 · analyzer v17 · 3d ago
danger signals1
- suspicious endpointapi.telegram.orgpbmagnet4-nlm-memory-dda6d28/src/cli/digest.ts:131
const url = `https://api.telegram.org/bot${token}/sendMessage`;
evidence-backed
findings quoted directly from the published source artifact — not inferred
filesystem 66
- fs pbmagnet4-nlm-memory-dda6d28/nlm/index.js :2
import { readFileSync, existsSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/plugin/scripts/prompt-recall-hook.mjs :18
import { appendFileSync, mkdirSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/plugin/scripts/stop-hook.mjs :5
import { appendFileSync, mkdirSync as mkdirSync3 } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/scripts/build-codex-plugin.mjs :21
import { mkdirSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/scripts/eval/classifier-eval.ts :25
import { readFileSync, writeFileSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/scripts/eval/judge.ts :17
import { mkdirSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/scripts/eval/signals-eval.ts :12
import { mkdtempSync, rmSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/scripts/extract-triples.mjs :37
import { createReadStream, existsSync, writeFileSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/scripts/longmemeval/classifier-cache.ts :18
import { mkdirSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/scripts/longmemeval/compare-classifiers.ts :16
import { readFileSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/scripts/longmemeval/embedding-cache.ts :15
import { mkdirSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/scripts/longmemeval/run-harness.ts :34
import { mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/cli/digest.ts :11
import { existsSync, readFileSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/cli/nlm.ts :30
import { mkdirSync, readFileSync, writeFileSync, existsSync, rmSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/adapters/aider.ts :20
import { existsSync, readFileSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/adapters/claude-code.ts :16
import { promises as fs } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/adapters/codex.ts :25
import { promises as fs } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/adapters/cursor.ts :29
import { existsSync, readdirSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/adapters/hermes-agent.ts :21
import { existsSync, readFileSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/adapters/hermes.ts :17
import { promises as fs, existsSync, statSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/adapters/jsonl-generic.ts :25
import { promises as fs, existsSync, statSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/adapters/opencode.ts :23
import { existsSync, readFileSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/adapters/pi.ts :18
import { promises as fs, existsSync, statSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/adapters/windsurf.ts :29
import { existsSync, readdirSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/dataset/build-dataset.ts :11
import { existsSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/embedding/embed-backfill.ts :20
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/embedding/embed-normalize.ts :15
import { existsSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/facts/backfill-facts.ts :19
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/hook/cite-memo.ts :19
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/hook/claude-settings.ts :9
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/hook/hook-log.ts :12
import { appendFileSync, mkdirSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/hook/memo-sweep.ts :18
import { existsSync, readdirSync, rmSync, statSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/hook/memo.ts :14
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/hook/transcript.ts :21
import { existsSync, readFileSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/recall-facts/fact-query-log.ts :14
import { appendFile, mkdir, readFile, stat } from "node:fs/promises"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/recall/citation-log.ts :11
import { appendFile, mkdir, readFile, stat } from "node:fs/promises"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/recall/hook-recall-log.ts :14
import { readFile } from "node:fs/promises"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/recall/miss-log.ts :12
import { appendFile, mkdir, readFile, stat } from "node:fs/promises"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/recall/query-log.ts :12
import { appendFile, mkdir, readFile, stat } from "node:fs/promises"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/recall/recent-log.ts :6
import { readFileSync, existsSync, statSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/scheduler/scan-once.ts :24
import { statSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/scheduler/scheduler.ts :20
import { readFileSync, writeFileSync, mkdirSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/signals/install-scope.ts :8
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/sources/source-registry.ts :17
import { existsSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/storage/db-restore.ts :16
import { existsSync, renameSync, rmSync, statSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/storage/live-status.ts :17
import { statSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/storage/migrate.ts :15
import { readFileSync, readdirSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/storage/pg-storage.ts :14
import { readFileSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/storage/sqlite-session-store.ts :15
import { existsSync, mkdirSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/storage/supersedence-log.ts :13
import { appendFile, mkdir, readFile } from "node:fs/promises"; - fs pbmagnet4-nlm-memory-dda6d28/src/core/update-check/check.ts :23
import { readFile, writeFile, mkdir } from "node:fs/promises"; - fs pbmagnet4-nlm-memory-dda6d28/src/hook/session-end-hook.ts :16
import { appendFileSync, mkdirSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/hook/stop-hook.ts :16
import { appendFileSync, mkdirSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/http/app.ts :21
import { appendFileSync, existsSync, mkdirSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/install/claude-code.ts :11
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/install/codex.ts :32
} from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/install/cursor.ts :10
import { existsSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/install/hermes-agent.ts :15
import { cpSync, existsSync, mkdirSync, rmSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/install/hermes.ts :10
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/install/nlm-dir-perms.ts :14
import { chmodSync, existsSync, readdirSync, statSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/install/ollama.ts :15
import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/install/pi.ts :24
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/install/rules-content.ts :17
import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/install/setup.ts :13
import { existsSync, mkdirSync, writeFileSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/install/windsurf.ts :10
import { existsSync } from "node:fs"; - fs pbmagnet4-nlm-memory-dda6d28/src/llm/env-autoload.ts :9
import { readFileSync, existsSync } from "node:fs";
shell / exec 6
- shell pbmagnet4-nlm-memory-dda6d28/src/cli/launchctl-helpers.ts :9
import { execFileSync } from "node:child_process"; - shell pbmagnet4-nlm-memory-dda6d28/src/cli/nlm.ts :31
import { execFileSync, spawn, spawnSync } from "node:child_process"; - shell pbmagnet4-nlm-memory-dda6d28/src/install/codex.ts :26
import { spawnSync } from "node:child_process"; - shell pbmagnet4-nlm-memory-dda6d28/src/install/hermes-agent.ts :18
import { spawnSync } from "node:child_process"; - shell pbmagnet4-nlm-memory-dda6d28/src/install/ollama.ts :18
import { spawnSync, spawn } from "node:child_process"; - shell pbmagnet4-nlm-memory-dda6d28/src/install/setup.ts :14
import { execFileSync } from "node:child_process";
network 22
- net pbmagnet4-nlm-memory-dda6d28/nlm/index.js :204
const res = await fetch(url, { - net pbmagnet4-nlm-memory-dda6d28/plugin/scripts/prompt-recall-hook.mjs :309
const res = await fetch(url, { - net pbmagnet4-nlm-memory-dda6d28/plugin/scripts/stop-hook.mjs :395
await fetch(url, { - net pbmagnet4-nlm-memory-dda6d28/scripts/eval/classifier-eval.ts :86
const res = await fetch(`${this.baseUrl.replace(/\/+$/, "")}/chat/completions`, { - net pbmagnet4-nlm-memory-dda6d28/scripts/eval/judge.ts :57
const res = await fetch(`${opts.baseUrl.replace(/\/+$/, "")}/chat/completions`, { - net pbmagnet4-nlm-memory-dda6d28/src/cli/digest.ts :97
const res = await fetch(url, { - net pbmagnet4-nlm-memory-dda6d28/src/cli/nlm.ts :981
const res = await fetch(`http://localhost:${p}/api/ui-bootstrap-nonce`, { - net pbmagnet4-nlm-memory-dda6d28/src/hook/recall-over-http.ts :43
const res = await fetch(url, { - net pbmagnet4-nlm-memory-dda6d28/src/hook/session-start-hook.ts :94
const res = await fetch(url, { - net pbmagnet4-nlm-memory-dda6d28/src/hook/stop-hook.ts :211
await fetch(url, { - net pbmagnet4-nlm-memory-dda6d28/src/install/setup.ts :81
const res = await fetch(`${baseUrl}/api/tags`, { signal: controller.signal }); - net pbmagnet4-nlm-memory-dda6d28/src/ui/components/SessionDrawer.tsx :65
fetch(`/api/session/${encodeURIComponent(sessionId)}`) - net pbmagnet4-nlm-memory-dda6d28/src/ui/components/SupersedePalette.tsx :100
const r = await fetch( - net pbmagnet4-nlm-memory-dda6d28/src/ui/components/UpdateBanner.tsx :47
const r = await fetch("/api/update-status"); - net pbmagnet4-nlm-memory-dda6d28/src/ui/lib/actions.ts :17
const res = await fetch("/api/action", { - net pbmagnet4-nlm-memory-dda6d28/src/ui/lib/api.ts :32
const res = await fetch(path); - net pbmagnet4-nlm-memory-dda6d28/src/ui/lib/dataset.ts :117
const res = await fetch("/api/dataset"); - net pbmagnet4-nlm-memory-dda6d28/src/ui/lib/registries.ts :131
const r = await fetch("/api/sources"); - net pbmagnet4-nlm-memory-dda6d28/src/ui/pages/settings/Classifier.tsx :34
fetch("/api/classifier/info").then((r) => r.json() as Promise<ClassifierInfo>), - net pbmagnet4-nlm-memory-dda6d28/src/ui/pages/settings/Data.tsx :57
const r = await fetch("/api/data/stats"); - net pbmagnet4-nlm-memory-dda6d28/src/ui/pages/settings/Providers.tsx :37
await fetch(`/api/providers/${row.id}`, { - net pbmagnet4-nlm-memory-dda6d28/src/ui/pages/settings/Sources.tsx :36
await fetch(`/api/sources/${row.id}`, {
secrets 11
- secrets pbmagnet4-nlm-memory-dda6d28/nlm/index.js :46
const token = process.env["NLM_MCP_TOKEN"]; - secrets pbmagnet4-nlm-memory-dda6d28/plugin/scripts/prompt-recall-hook.mjs :151
const token = process.env["NLM_MCP_TOKEN"]; - secrets pbmagnet4-nlm-memory-dda6d28/plugin/scripts/stop-hook.mjs :273
const token = process.env["NLM_MCP_TOKEN"]; - secrets pbmagnet4-nlm-memory-dda6d28/src/cli/digest.ts :126
const token = process.env["TELEGRAM_BOT_TOKEN"]; - secrets pbmagnet4-nlm-memory-dda6d28/src/cli/nlm.ts :225
const hasMcpToken = Boolean(process.env["NLM_MCP_TOKEN"]); - secrets pbmagnet4-nlm-memory-dda6d28/src/core/providers/provider-registry.ts :188
const deepseekKey = process.env["DEEPSEEK_API_KEY"]; - secrets pbmagnet4-nlm-memory-dda6d28/src/hook/hook-auth.ts :15
const token = process.env["NLM_MCP_TOKEN"]; - secrets pbmagnet4-nlm-memory-dda6d28/src/http/app.ts :302
const token = process.env["NLM_MCP_TOKEN"]; - secrets pbmagnet4-nlm-memory-dda6d28/src/install/ollama.ts :268
const existing = process.env["NLM_MCP_TOKEN"]; - secrets pbmagnet4-nlm-memory-dda6d28/src/install/setup.ts :358
if (token === process.env["NLM_MCP_TOKEN"] && token.length === 64) { - secrets pbmagnet4-nlm-memory-dda6d28/src/llm/deepseek-client.ts :73
const key = opts.apiKey ?? process.env["DEEPSEEK_API_KEY"];
database 28
- db pbmagnet4-nlm-memory-dda6d28/scripts/eval/judge.ts :14
import Database from "better-sqlite3"; - db pbmagnet4-nlm-memory-dda6d28/scripts/extract-triples.mjs :42
import Database from "better-sqlite3"; - db pbmagnet4-nlm-memory-dda6d28/scripts/longmemeval/classifier-cache.ts :15
import Database from "better-sqlite3"; - db pbmagnet4-nlm-memory-dda6d28/scripts/longmemeval/embedding-cache.ts :12
import Database from "better-sqlite3"; - db pbmagnet4-nlm-memory-dda6d28/src/cli/classify-parity.ts :17
import Database from "better-sqlite3"; - db pbmagnet4-nlm-memory-dda6d28/src/core/actions/actions-log.ts :10
import type Database from "better-sqlite3"; - db pbmagnet4-nlm-memory-dda6d28/src/core/actions/overlay.ts :12
import type Database from "better-sqlite3"; - db pbmagnet4-nlm-memory-dda6d28/src/core/adapters/cursor.ts :32
import Database from "better-sqlite3"; - db pbmagnet4-nlm-memory-dda6d28/src/core/adapters/hermes-agent.ts :24
import Database from "better-sqlite3"; - db pbmagnet4-nlm-memory-dda6d28/src/core/adapters/opencode.ts :26
import Database from "better-sqlite3"; - db pbmagnet4-nlm-memory-dda6d28/src/core/adapters/windsurf.ts :32
import Database from "better-sqlite3"; - db pbmagnet4-nlm-memory-dda6d28/src/core/dataset/build-dataset.ts :12
import Database from "better-sqlite3"; - db pbmagnet4-nlm-memory-dda6d28/src/core/embedding/embed-backfill.ts :23
import Database from "better-sqlite3"; - db pbmagnet4-nlm-memory-dda6d28/src/core/embedding/embed-normalize.ts :16
import Database from "better-sqlite3"; - db pbmagnet4-nlm-memory-dda6d28/src/core/integrity/check-invariants.ts :20
import type Database from "better-sqlite3"; - db pbmagnet4-nlm-memory-dda6d28/src/core/providers/provider-registry.ts :16
import type Database from "better-sqlite3"; - db pbmagnet4-nlm-memory-dda6d28/src/core/scheduler/scan-once.ts :25
import type Database from "better-sqlite3"; - db pbmagnet4-nlm-memory-dda6d28/src/core/sources/source-registry.ts :20
import type Database from "better-sqlite3"; - db pbmagnet4-nlm-memory-dda6d28/src/core/storage/db-restore.ts :15
import Database from "better-sqlite3"; - db pbmagnet4-nlm-memory-dda6d28/src/core/storage/migrate.ts :17
import type Database from "better-sqlite3"; - db pbmagnet4-nlm-memory-dda6d28/src/core/storage/pg-fact-store.ts :7
import type { Pool } from "pg"; - db pbmagnet4-nlm-memory-dda6d28/src/core/storage/pg-session-store.ts :9
import type { Pool } from "pg"; - db pbmagnet4-nlm-memory-dda6d28/src/core/storage/pg-signal-store.ts :6
import type { Pool } from "pg"; - db pbmagnet4-nlm-memory-dda6d28/src/core/storage/pg-storage.ts :13
import { Pool } from "pg"; - db pbmagnet4-nlm-memory-dda6d28/src/core/storage/sqlite-fact-store.ts :21
import type Database from "better-sqlite3"; - db pbmagnet4-nlm-memory-dda6d28/src/core/storage/sqlite-session-store.ts :17
import Database from "better-sqlite3"; - db pbmagnet4-nlm-memory-dda6d28/src/core/storage/sqlite-signal-store.ts :7
import type Database from "better-sqlite3"; - db pbmagnet4-nlm-memory-dda6d28/src/core/storage/sqlite-storage.ts :17
import type Database from "better-sqlite3";
declared dependencies 27
- @clack/prompts@^1.4.0
- @hono/node-server@^2.0.3
- @modelcontextprotocol/sdk@^1.29.0
- @toon-format/toon@^2.3.0
- better-sqlite3@^12.10.0
- commander@^15.0.0
- hono@^4.6.0
- pg@^8.21.0
- pgvector@^0.3.0
- sqlite-vec@^0.1.6
- yaml@^2.9.0
- zod@^4.4.3
- @types/better-sqlite3@^7.6.13
- @types/node@^22.10.0
- @types/pg@^8.20.0
- @types/react@^19.2.17
- @types/react-dom@^19.2.3
- @vitejs/plugin-react@^6.0.2
- esbuild@^0.28.0
- react@^19.2.7
- react-dom@^19.2.7
- react-router-dom@^6.30.3
- tsc-alias@^1.8.17
- tsx@^4.19.0
- typescript@^6.0.3
- vite@^8.0.16
- vitest@^4.1.8