Trustworthy memory and security for AI agents. Memory firewall for any host that writes through it; runtime tool gates on Claude Code, OpenClaw, and Hermes.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · http counts 32 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
audit_query
-
consolidate
-
defence_stats
-
detect_contradictions
-
end_session
-
export_memories
-
forget
-
get_context
-
get_memory
-
get_project
-
get_related
-
graph_entities
-
graph_explain
-
graph_query
-
import_memories
-
iron_dome_activate
-
iron_dome_check
-
iron_dome_emergency_stop
-
iron_dome_resume
-
iron_dome_scan
-
iron_dome_status
-
link_memories
-
memory_stats
-
quarantine_review
-
recall
-
remember
-
scan_memories
-
scan_skill
-
scan_tool_response
-
set_project
-
start_session
-
threat_graph
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 919
filesystem 117
- fs package/dashboard/.next/standalone/dashboard/.next/server/chunks/[turbopack]_runtime.js :658
const { createReadStream } = require('fs'); - fs package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/[turbopack]_runtime.js :658
const { createReadStream } = require('fs'); - fs package/dist/api/routes/admin.js :9
import { existsSync, readFileSync, readdirSync } from 'fs'; - fs package/dist/api/routes/memories.js :3
import { existsSync, readdirSync, readFileSync } from 'fs'; - fs package/dist/api/routes/xray.js :2
import fs from 'fs'; - fs package/dist/api/session-token.js :10
import { readFileSync, writeFileSync, unlinkSync, existsSync, chmodSync } from 'fs'; - fs package/dist/api/version.js :7
import { readFileSync } from 'fs'; - fs package/dist/api/visualization-server.js :10
import { existsSync, unlinkSync } from 'fs'; - fs package/dist/audit/dependency-scanner.js :21
import { readdirSync, readFileSync, existsSync, renameSync, rmSync, writeFileSync } from 'fs'; - fs package/dist/audit/env-scanner.js :10
import { existsSync, readFileSync, readdirSync, statSync } from 'fs'; - fs package/dist/audit/mcp-config-scanner.js :9
import { existsSync, readFileSync } from 'fs'; - fs package/dist/audit/memory-scanner.js :11
import { existsSync, readdirSync, readFileSync, statSync } from 'fs';
show 28 more
- fs package/dist/audit/rules-file-scanner.js :12
import { existsSync, readFileSync, statSync } from 'fs'; - fs package/dist/cli/allowlist-scan.js :28
import { readdirSync, readFileSync, realpathSync, statSync } from 'node:fs'; - fs package/dist/cli/allowlist.js :22
import { readFileSync, realpathSync, statSync } from 'node:fs'; - fs package/dist/cli/approve.js :22
import { existsSync, readSync } from 'node:fs'; - fs package/dist/cli/backup-budget.js :20
import { readdirSync, statSync, unlinkSync } from 'node:fs'; - fs package/dist/cli/cron-denial-audit.js :33
import { closeSync, fstatSync, openSync, readSync } from 'node:fs'; - fs package/dist/cli/doctor.js :5
import fs from 'fs'; - fs package/dist/cli/freeze.js :19
import fs from 'fs'; - fs package/dist/cli/import-jsonl.js :14
import { existsSync } from 'fs'; - fs package/dist/cli/iron-dome.js :12
import fs from 'fs'; - fs package/dist/cli/memory.js :19
import fs from 'fs'; - fs package/dist/cli/migrate-legacy.js :1
import fs from 'fs'; - fs package/dist/cli/openclaw-cron-store.js :24
import { statSync } from 'node:fs'; - fs package/dist/cli/review-copilot.js :1
import { existsSync, readdirSync, rmSync, readFileSync } from 'fs'; - fs package/dist/cli/update.js :14
import fs from 'fs'; - fs package/dist/cli/upsell-state.js :10
import fs from 'fs'; - fs package/dist/cloud/config.js :1
import { readFileSync, writeFileSync, existsSync, chmodSync, statSync, renameSync, rmSync } from 'fs'; - fs package/dist/context/derive-project-key.js :16
import { existsSync, readFileSync, statSync } from 'fs'; - fs package/dist/cortex/store.js :6
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'; - fs package/dist/database/init.js :5
import { existsSync, readFileSync, statSync, writeFileSync, unlinkSync, renameSync, copyFileSync, readdirSync, openSync, closeSync, realpathSync } from 'fs'; - fs package/dist/defence/iron-dome/action-approvals.js :33
import { existsSync, readFileSync, renameSync, writeFileSync } from 'fs'; - fs package/dist/defence/iron-dome/dnp-digest.js :15
import * as fs from 'node:fs'; - fs package/dist/defence/iron-dome/dnp-retry-waiter.js :61
import { closeSync, constants, fstatSync, mkdirSync, openSync, readSync, rmSync, writeFileSync } from 'node:fs'; - fs package/dist/defence/iron-dome/enforcement-binding.js :16
import { existsSync, readFileSync, writeFileSync } from 'node:fs'; - fs package/dist/defence/iron-dome/openclaw-approval-channel.js :42
import { existsSync, mkdirSync, readFileSync } from 'node:fs'; - fs package/dist/defence/iron-dome/openclaw-approval-waiter.js :40
import { mkdirSync, rmSync, writeFileSync } from 'node:fs'; - fs package/dist/defence/iron-dome/retry-control.js :57
import { existsSync, mkdirSync, readFileSync, realpathSync, renameSync, rmSync, rmdirSync, statSync, writeFileSync, } from 'node:fs'; - fs package/dist/defence/iron-dome/reviewed-scripts.js :29
import { realpathSync } from 'node:fs';
77 more not shown — this panel samples each group; the count above is the real total.
shell / exec 32
- shell package/dist/api/routes/xray.js :1
import { execFile, spawn } from 'child_process'; - shell package/dist/api/version.js :6
import { execFileSync, execFile } from 'child_process'; - shell package/dist/audit/dependency-scanner.js :24
import { execSync } from 'child_process'; - shell package/dist/audit/env-scanner.js :13
import { execFileSync } from 'node:child_process'; - shell package/dist/cli/doctor.js :9
import { execFileSync } from 'child_process'; - shell package/dist/cli/update.js :13
import { spawn } from 'child_process'; - shell package/dist/database/init.js :9
import { execSync } from 'child_process'; - shell package/dist/defence/firewall/anomaly-scorer.js :11
const CODE_INDICATORS = /[{}()\[\];=<>|&$`\\]/g; - shell package/dist/defence/iron-dome/cli-invoker.js :33
import { spawn as nodeSpawn } from 'node:child_process'; - shell package/dist/defence/iron-dome/dnp-retry-waiter.js :60
import { execFile } from 'node:child_process'; - shell package/dist/defence/iron-dome/openclaw-approval-channel.js :40
import { spawn } from 'node:child_process'; - shell package/dist/defence/iron-dome/openclaw-approval-waiter.js :39
import { execFile } from 'node:child_process';
show 20 more
- shell package/dist/defence/iron-dome/tool-action-guard.js :258
* A vector is not a statement — it is the arguments OF one. `spawn(command, - shell package/dist/index.js :67
import { spawn } from 'child_process'; - shell package/dist/integrations/claude-code-version.js :1
import { execFileSync } from 'child_process'; - shell package/dist/integrations/openclaw-config-validate.js :45
import { spawnSync } from 'child_process'; - shell package/dist/integrations/openclaw-runtime-inspect.js :9
import { spawnSync } from 'node:child_process'; - shell package/dist/service/dashboard-staleness.js :22
import { execFileSync } from 'node:child_process'; - shell package/dist/service/install.js :13
import { execSync } from 'child_process'; - shell package/dist/setup/deep-clean.js :22
import { execFileSync, execSync } from 'child_process'; - shell package/dist/setup/hook-command-resolution.js :27
import { execFileSync } from 'node:child_process'; - shell package/dist/setup/hooks.js :8
import { spawn } from 'child_process'; - shell package/dist/setup/json-config.js :18
import { execSync } from 'child_process'; - shell package/dist/setup/migrate.js :11
import { execSync } from 'child_process'; - shell package/dist/setup/native-binding.js :30
import { spawn } from 'child_process'; - shell package/dist/setup/openclaw-reconcile.js :4
import { spawnSync } from 'child_process'; - shell package/dist/setup/openclaw.js :11
import { execFileSync, execSync, spawnSync } from 'child_process'; - shell package/hooks/openclaw/cortex-memory/runtime.mjs :1
import { execFile } from "node:child_process"; - shell (weak) package/scripts/lib/capture-distill.mjs :12
import { spawnSync } from 'child_process'; - shell (weak) package/scripts/postinstall.mjs :16
import { spawnSync } from 'child_process'; - shell (weak) package/scripts/pre-tool-hook.mjs :55
import { spawn } from 'child_process'; - shell (weak) package/scripts/run-jest.mjs :3
import { spawn } from 'child_process';
network 34
- net package/dashboard/.next/standalone/dashboard/.next/server/chunks/[root-of-the-server]__07167xi._.js :1
ad(),g=null),el(f.renderSignal,p.route,"fetch()")}switch(w){case"force-no-store":O="fetchCache = force-no-store";break;case"only-no-store":if("force-cache"===x||void 0!==d&&d>0)throw Object.defineProp - net package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/1a28_1jmyq5p._.js :1
.setCacheBustingSearchParam)(o,b);let p=fetch(o,{credentials:"same-origin",headers:b,priority:c||void 0,signal:f}).then(v),q=p.then(({response:a})=>a),r=e?(g=q,k=b,s(g,{callServer:i.callServer,findSou - net package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/1a28_@tanstack_0_dj6c1._.js :1
ted||this.#o({type:"invalidate"})}async fetch(a,c){let d;if("idle"!==this.state.fetchStatus&&this.#l?.status()!=="rejected"){if(void 0!==this.state.data&&c?.cancelRefetch)this.cancel({silent:!0});else - net package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/1a28_next_00uew2j._.js :4
`, etc...) or uncached external data (\`fetch(...)\`, etc...) without explicitly allowing fully dynamic rendering. See more info here: https: - net package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/1a28_next_dist_17tperj._.js :4
`, etc...) or uncached external data (\`fetch(...)\`, etc...) without explicitly allowing fully dynamic rendering. See more info here: https: - net package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/[root-of-the-server]__1_xo78f._.js :19
ead(),q=null),F(p.renderSignal,o.route,"fetch()")}switch(y){case"force-no-store":B="fetchCache = force-no-store";break;case"only-no-store":if("force-cache"===A||void 0!==l&&l>0)throw Object.defineProp - net package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_app_(dashboard)_overview_page_tsx_14bloa6._.js :1
a=setInterval(async()=>{try{let b=await fetch(`https://api.shieldcortex.ai/v1/auth/setup-status/${k}`),c=a - net package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_components_18oljhv._.js :1
abled()&&!a.isStatic()).map(a=>{let b=a.fetch(void 0,d);return d.throwOnError||(b=b.catch(c.noop)),"paused"===a.state.fetchStatus?Promise.resolve():b}))).then(c.noop)}fetchQuery(a){let b=this.defaultQ - net package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_lib_1tvvn_p._.js :1
{return c||d||(d=(async()=>{let a=await fetch(`${b}/api/auth/session-token`);if(!a.ok){let b=await a.json().catch(()=>({}));throw d=null,Error(b.error||"Failed to fetch session token")}let{token:e}=aw - net package/dashboard/.next/standalone/dashboard/.next/static/chunks/0-6uacw2qml2v.js :1
r=!1,a=setInterval(()=>{let t=l.current;fetch(`${y}/api/memories?mode=recent&limit=50` - net package/dashboard/.next/standalone/dashboard/.next/static/chunks/0c29pw6r7unzt.js :1
e=setInterval(async()=>{try{let t=await fetch(`https://api.shieldcortex.ai/v1/auth/setup-status/${o}`),s=await t.json();"complete"===s.status&&s.api_key?(await (0,w.authFetch)("http://localhost:3001/a - net package/dashboard/.next/standalone/dashboard/.next/static/chunks/15h9vpkvncqyc.js :1
.setCacheBustingSearchParam)(p,t);let y=fetch(p,{credentials:"same-origin",headers:t,priority:r||void 0,signal:l}).then(P),g=y.then(({response:e})=>e),_=a?(u=g,s=t,v(u,{callServer:o.callServer,findSou
show 22 more
- net package/dashboard/.next/standalone/dashboard/.next/static/chunks/1_a__wgp0wskr.js :1
{return r||o||(o=(async()=>{let e=await fetch(`${t}/api/auth/session-token`);if(!e.ok){let t=await e.json().catch(()=>({}));throw o=null,Error(t.error||"Failed to fetch session token")}let{token:s}=aw - net package/dashboard/.next/standalone/dashboard/.next/static/chunks/1psxvxobjbrm_.js :1
ted||this.#p({type:"invalidate"})}async fetch(t,i){let s;if("idle"!==this.state.fetchStatus&&this.#h?.status()!=="rejected"){if(void 0!==this.state.data&&i?.cancelRefetch)this.cancel({silent:!0});else - net package/dashboard/.next/standalone/dashboard/.next/static/chunks/2z1fu8vvhw4oc.js :4
`, etc...) or uncached external data (\`fetch(...)\`, etc...) without explicitly allowing fully dynamic rendering. See more info here: https: - net package/dashboard/.next/standalone/dashboard/.next/static/chunks/turbopack-2a9_8r_2i12cr.js :1
,async loadWebAssembly(e,t,r,n,o){let i=fetch(N(r)),{instance:l}=await WebAssembly.instantiateStreaming(i,o);return l.exports},async loadWebAssemblyModule(e,t,r,n){let o=fetch(N(r));return await WebAs - net package/dist/api/bind-policy.js :10
import { isIP } from 'net'; - net package/dist/api/routes/admin.js :592
const response = await fetch(`${config.cloudBaseUrl}/v1/quarantine/ingest`, { - net package/dist/api/visualization-server.js :9
import { createServer } from 'http'; - net package/dist/audit/dependency-scanner.js :63
{ regex: /\bfetch\s*\(/i, label: 'fetch() (HTTP request)' }, - net package/dist/cli/doctor.js :1072
const response = await fetch('http://localhost:3001/api/health', { signal: controller.signal }); - net package/dist/cloud/graph-sync.js :67
const res = await fetch(`${config.cloudBaseUrl}/v1/sync/graph`, { - net package/dist/cloud/iron-dome-sync.js :49
fetch(`${config.cloudBaseUrl}/v1/iron-dome/patterns/sync`, { - net package/dist/cloud/memory-sync.js :97
const res = await fetch(`${config.cloudBaseUrl}/v1/sync/memories`, { - net package/dist/cloud/quarantine-sync.js :49
fetch(url, { - net package/dist/cloud/sync-queue.js :475
const res = await fetch(`${config.cloudBaseUrl}${request.path}`, { - net package/dist/cloud/sync.js :66
track(fetch(`${config.cloudBaseUrl}/v1/devices/heartbeat`, { - net package/dist/cloud/verify.js :48
fetch(`${cloudConfig.cloudBaseUrl}/v1/verify`, { - net package/dist/environment/fetcher.js :40
const res = await fetch(current.toString(), { - net package/dist/events/webhooks.js :47
fetch(webhook.url, { - net package/dist/index.js :69
import http from 'http'; - net package/dist/license/validate.js :35
const res = await fetch(`${baseUrl}/v1/license/validate?sid=${encodeURIComponent(sid)}`, { signal: controller.signal }); - net package/dist/xray/npm-inspector.js :8
import https from 'https'; - net (weak) package/scripts/lib/dashboard-hint.mjs :14
import http from 'node:http';
secrets 4
- secrets package/dist/api/session-token.js :19
const v = (process.env.SHIELDCORTEX_API_TOKEN || '').trim(); - secrets package/dist/context/derive-project-key.js :117
if (process.env.SHIELDCORTEX_PROJECT_KEY) { - secrets package/dist/context/project-context.js :36
const envProject = process.env.SHIELDCORTEX_PROJECT_KEY || process.env.CLAUDE_MEMORY_PROJECT; - secrets (weak) package/scripts/lib/project-key.mjs :122
if (process.env.SHIELDCORTEX_PROJECT_KEY) {
database 14
- db package/dist/cli/doctor.js :289
const Database = require('better-sqlite3'); - db package/dist/cli/migrate-legacy.js :7
import Database from 'better-sqlite3'; - db package/dist/cli/openclaw-cron-store.js :63
const Database = require('better-sqlite3'); - db package/dist/database/better-sqlite3-guard.js :29
/** The original error raised by `require('better-sqlite3')`. */ - db package/dist/integrations/openclaw-gateway-process.js :44
const Database = require('better-sqlite3'); - db package/dist/integrations/openclaw-plugin-index.js :425
const Database = require('better-sqlite3'); - db package/dist/setup/doctor.js :52
const Database = require('better-sqlite3'); - db package/dist/setup/native-binding.js :52
const Database = require('better-sqlite3'); - db (weak) package/scripts/postinstall.mjs :137
const Database = require('better-sqlite3'); - db (weak) package/scripts/pre-compact-hook.mjs :14
import Database from 'better-sqlite3'; - db (weak) package/scripts/prompt-recall-hook.mjs :12
import Database from 'better-sqlite3'; - db (weak) package/scripts/session-end-hook.mjs :24
import Database from 'better-sqlite3';
show 2 more
- db (weak) package/scripts/session-start-hook.mjs :21
import Database from 'better-sqlite3'; - db (weak) package/scripts/stop-hook.mjs :19
import Database from 'better-sqlite3';
tool registrations 32
- remember package/dist/server.js :215
- recall package/dist/server.js :259
- forget package/dist/server.js :291
- get_context package/dist/server.js :324
- start_session package/dist/server.js :344
- end_session package/dist/server.js :358
- consolidate package/dist/server.js :375
- memory_stats package/dist/server.js :412
- get_memory package/dist/server.js :424
- export_memories package/dist/server.js :438
- import_memories package/dist/server.js :454
- get_related package/dist/server.js :486
show 20 more
- link_memories package/dist/server.js :508
- set_project package/dist/server.js :523
- get_project package/dist/server.js :537
- detect_contradictions package/dist/server.js :550
- graph_query package/dist/server.js :598
- threat_graph package/dist/server.js :604
- graph_entities package/dist/server.js :612
- graph_explain package/dist/server.js :618
- audit_query package/dist/server.js :627
- quarantine_review package/dist/server.js :640
- defence_stats package/dist/server.js :679
- scan_tool_response package/dist/server.js :715
- scan_memories package/dist/server.js :798
- scan_skill package/dist/server.js :813
- iron_dome_status package/dist/server.js :851
- iron_dome_scan package/dist/server.js :886
- iron_dome_check package/dist/server.js :909
- iron_dome_activate package/dist/server.js :947
- iron_dome_emergency_stop package/dist/server.js :968
- iron_dome_resume package/dist/server.js :983
install hooks 3
- postinstall package/package.json :62
node scripts/postinstall.mjs - prepack package/package.json :83
node scripts/ensure-bin-executable.mjs - prepublishOnly package/package.json :87
node scripts/sync-plugin-version.mjs --check && npm run build && npm run test:dist
declared dependencies 20
- @modelcontextprotocol/sdk@^1.0.0
- better-sqlite3@^12.0.0
- cors@^2.8.5
- express@^4.21.0
- safe-regex2@^5.0.0
- semver@^7.7.0
- ws@^8.18.0
- zod@^3.23.0
- @types/better-sqlite3@^7.6.11
- @types/cors@^2.8.17
- @types/express@^5.0.0
- @types/jest@^30.0.0
show 8 more
- @types/node@^22.0.0
- @types/semver@^7.7.0
- @types/ws@^8.5.13
- jest@^30.2.0
- ts-jest@^29.4.6
- tsx@^4.19.0
- typescript@^5.6.0
- @huggingface/transformers@^3.7.2
perm:untrusted 7
- untrusted package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/1a28_1jmyq5p._.js :1
.setCacheBustingSearchParam)(o,b);let p=fetch(o,{credentials:"same-origin",headers:b,priority:c||void 0,signal:f}).then(v),q=p.then(({response:a})=>a),r=e?(g=q,k=b,s(g,{callServer:i.callServer,findSou - untrusted package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_app_(dashboard)_overview_page_tsx_14bloa6._.js :1
a=setInterval(async()=>{try{let b=await fetch(`https://api.shieldcortex.ai/v1/auth/setup-status/${k}`),c=await b.json();"complete"===c.status&&c.api_key?(await (0,x.authFetch)("http://localhost:3001/a - untrusted package/dashboard/.next/standalone/dashboard/.next/server/chunks/ssr/dashboard_src_lib_1tvvn_p._.js :1
rn d.set("Authorization",`Bearer ${c}`),fetch(a,{...b,headers:d})}async function g(a,b){if((a.headers.get("content-type")??"").includes("application/json")){let c=await a.json().catch(()=>null);if("st - untrusted package/dashboard/.next/standalone/dashboard/.next/static/chunks/0-6uacw2qml2v.js :1
r=!1,a=setInterval(()=>{let t=l.current;fetch(`${y}/api/memories?mode=recent&limit=50`,{credentials:"include"}).then(e=>e.ok?e.json():null).then(a=>{if(!a||r)return;let n=a.memories??[];for(let r of n - untrusted package/dashboard/.next/standalone/dashboard/.next/static/chunks/0c29pw6r7unzt.js :1
e=setInterval(async()=>{try{let t=await fetch(`https://api.shieldcortex.ai/v1/auth/setup-status/${o}`),s=await t.json();"complete"===s.status&&s.api_key?(await (0,w.authFetch)("http://localhost:3001/a - untrusted package/dashboard/.next/standalone/dashboard/.next/static/chunks/15h9vpkvncqyc.js :1
.setCacheBustingSearchParam)(p,t);let y=fetch(p,{credentials:"same-origin",headers:t,priority:r||void 0,signal:l}).then(P),g=y.then(({response:e})=>e),_=a?(u=g,s=t,v(u,{callServer:o.callServer,findSou - untrusted package/dashboard/.next/standalone/dashboard/.next/static/chunks/1_a__wgp0wskr.js :1
rn o.set("Authorization",`Bearer ${r}`),fetch(e,{...t,headers:o})}async function a(e,t){if((e.headers.get("content-type")??"").includes("application/json")){let r=await e.json().catch(()=>null);if("st