Self-hosted AI agent workspace: multi-provider chat (OpenRouter, DeepSeek, Codex, local llama.cpp), MCP with per-call human approval, reusable skills, Model Council, and your own PC as an agent backend.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport http 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 5c5a04a · analyzer v33 · 9h ago
skills & prompt files 1
danger signals1
- suspicious endpoint 169.254.169.254 (cloud metadata) pma1999-agent-studio-5c5a04a/scripts/test-mcp-client-v2.ts :219
() => assertSafeMcpUrl(new URL('https://169.254.169.254/latest/meta-data'), {
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 321
filesystem 56
- fs pma1999-agent-studio-5c5a04a/local-agent/src/config.ts :8
import fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/local-agent/src/fileOpsExecutor.test.ts :11
import fs from 'node:fs/promises'; - fs pma1999-agent-studio-5c5a04a/local-agent/src/fileOpsExecutor.ts :16
import fs from 'node:fs/promises'; - fs (weak) pma1999-agent-studio-5c5a04a/local-agent/src/llamaServerExecutor.test.ts :35
import fs from 'node:fs'; - fs pma1999-agent-studio-5c5a04a/local-agent/src/llamaServerExecutor.ts :31
import * as fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/local-agent/src/mcpExecutor.test.ts :33
import fs from 'node:fs/promises'; - fs (weak) pma1999-agent-studio-5c5a04a/local-agent/src/receiveFileExecutor.test.ts :2
import fsSync from 'node:fs'; - fs pma1999-agent-studio-5c5a04a/local-agent/src/receiveFileExecutor.ts :1
import fs from 'node:fs/promises'; - fs (weak) pma1999-agent-studio-5c5a04a/local-agent/src/sendFileExecutor.test.ts :2
import fsSync from 'node:fs'; - fs pma1999-agent-studio-5c5a04a/local-agent/src/sendFileExecutor.ts :1
import fs from 'node:fs/promises'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/restore-db-from-stdin.mjs :13
import fs from 'fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-abliteration-provider.ts :16
import { readFileSync } from 'node:fs';
show 28 more
- fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-agent-files.ts :2
import fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-agent-relay.ts :2
import fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-agent-uploads.ts :2
import fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-arnict-provider.ts :17
import { readFileSync } from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-artifact-gallery-wiring.ts :2
import fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-artifact-tools.ts :2
import fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-artifact-wiring.ts :2
import fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-artifacts-e2e.ts :2
import fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-artifacts-routes.ts :2
import fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-artifacts-storage.ts :2
import fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-codex-artifact-linkage.ts :7
import fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-compact-route.ts :4
import fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-compact-view.ts :2
import { readFileSync } from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-conversation-sharing.ts :3
import fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-exec-audit.ts :2
import fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-file-ops.ts :2
import fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-llamacpp-chat-gates.ts :32
import { readFileSync } from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-llamacpp-relay.ts :28
import fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-llamacpp-routes.ts :26
import fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-llamacpp-transport.ts :35
import fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-mcp-client-hardening.ts :2
import fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-mcp-client-v2.ts :2
import fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-mcp-config-security.ts :3
import fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-mcp-relay.ts :19
import fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-mcp-runtime-integration.ts :2
import fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-mcp-stdio-hardening.ts :2
import fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-mcp-tenant-isolation.ts :3
import fs from 'node:fs'; - fs (weak) pma1999-agent-studio-5c5a04a/scripts/test-model-catalog.ts :8
import { readdirSync, readFileSync } from 'node:fs';
16 more not shown — this panel samples each group; the count above is the real total.
shell / exec 10
- shell (weak) pma1999-agent-studio-5c5a04a/local-agent/src/commandExecutor.test.ts :5
* (a) a Tier-1 command never reaches `child_process.spawn`. - shell pma1999-agent-studio-5c5a04a/local-agent/src/commandExecutor.ts :9
import { spawn } from 'node:child_process'; - shell pma1999-agent-studio-5c5a04a/local-agent/src/llamaServerExecutor.ts :9
* - the argv array goes straight to `spawn(exePath, args, {shell:false, - shell (weak) pma1999-agent-studio-5c5a04a/local-agent/src/mcpExecutor.test.ts :15
* immediate ok:true and no second spawn (counted via stdout marker - shell pma1999-agent-studio-5c5a04a/local-agent/src/mcpExecutor.ts :19
import { spawn as nodeSpawn, type ChildProcess } from 'node:child_process'; - shell (weak) pma1999-agent-studio-5c5a04a/local-agent/src/shellDetection.test.ts :17
import { spawn } from 'node:child_process'; - shell pma1999-agent-studio-5c5a04a/local-agent/src/shellDetection.ts :13
import { spawnSync } from 'node:child_process'; - shell (weak) pma1999-agent-studio-5c5a04a/scripts/test-conversation-sharing.ts :2
import { spawnSync } from 'node:child_process'; - shell (weak) pma1999-agent-studio-5c5a04a/scripts/test-mcp-relay.ts :18
import { spawn, type ChildProcess } from 'node:child_process'; - shell pma1999-agent-studio-5c5a04a/server/codex/rpc.ts :13
import { spawn, type ChildProcess } from 'child_process';
network 39
- net pma1999-agent-studio-5c5a04a/local-agent/src/index.ts :147
const response = await fetch(pairUrl, { - net pma1999-agent-studio-5c5a04a/local-agent/src/receiveFileExecutor.ts :24
/** Defaults to a real `fetch()`-based implementation; tests inject a fake. */ - net pma1999-agent-studio-5c5a04a/local-agent/src/sendFileExecutor.ts :28
/** Defaults to a real `fetch()`-based implementation; tests inject a fake. */ - net (weak) pma1999-agent-studio-5c5a04a/scripts/test-agent-files.ts :47
const response = await fetch(`${baseUrl}/upload`, { - net (weak) pma1999-agent-studio-5c5a04a/scripts/test-agent-relay.ts :3
import { createServer } from 'node:http'; - net (weak) pma1999-agent-studio-5c5a04a/scripts/test-agent-uploads.ts :93
const upload = (id: string, filename: string, body: Buffer) => fetch( - net (weak) pma1999-agent-studio-5c5a04a/scripts/test-artifact-gallery-wiring.ts :264
assert.ok(!srcNoComments.includes('fetch('), 'no fetch'); - net (weak) pma1999-agent-studio-5c5a04a/scripts/test-artifacts-e2e.ts :159
const res = await fetch(`${base}/api/artifacts/${artifactId}`, { headers: { Authorization: `Bearer ${otherToken}` } }); - net (weak) pma1999-agent-studio-5c5a04a/scripts/test-artifacts-routes.ts :57
const res = await fetch(`${base}/api/conversations/${convId}/artifacts`, { headers: { Authorization: `Bearer ${token}` } }); - net (weak) pma1999-agent-studio-5c5a04a/scripts/test-compact-route.ts :50
const res = await fetch(`${base}${url}`, { - net (weak) pma1999-agent-studio-5c5a04a/scripts/test-compact-view.ts :382
const res = await fetch(`http://127.0.0.1:${port}/api/conversations/${conv}/messages`); - net (weak) pma1999-agent-studio-5c5a04a/scripts/test-llamacpp-routes.ts :199
const response = await fetch(`${base}${url}`, {
show 27 more
- net (weak) pma1999-agent-studio-5c5a04a/scripts/test-llamacpp-transport.ts :36
import http from 'node:http'; - net (weak) pma1999-agent-studio-5c5a04a/scripts/test-mcp-client-hardening.ts :3
import { createServer, type IncomingMessage, type Server as HttpServer } from 'node:http'; - net (weak) pma1999-agent-studio-5c5a04a/scripts/test-mcp-client-v2.ts :3
import { createServer, type IncomingMessage, type Server as HttpServer, type ServerResponse } from 'node:http'; - net (weak) pma1999-agent-studio-5c5a04a/scripts/test-mcp-config-security.ts :101
const response = await fetch(`${origin}${pathname}`, { - net (weak) pma1999-agent-studio-5c5a04a/scripts/test-mcp-tenant-isolation.ts :65
const response = await fetch(`${origin}${pathname}`, { - net (weak) pma1999-agent-studio-5c5a04a/scripts/test-provider-wiring.ts :173
assert.ok(!source.includes(`fetch(${quote}https://${provider.host}`), `${provider.host} fetched from the browser`); - net (weak) pma1999-agent-studio-5c5a04a/scripts/test-web-fetch.mjs :31
const res = await fetch(requestUrl, { - net pma1999-agent-studio-5c5a04a/server/mcp/client.ts :13
import net from 'node:net'; - net pma1999-agent-studio-5c5a04a/server/providers/llamacppTransport.ts :399
const direct = await fetch(healthUrl, { signal: AbortSignal.timeout(PROBE_TIMEOUT_MS) }); - net pma1999-agent-studio-5c5a04a/server/routes/agent.ts :2
import type { Server } from 'node:http'; - net pma1999-agent-studio-5c5a04a/server/routes/agentProbe.ts :2
import type { Server } from 'http'; - net pma1999-agent-studio-5c5a04a/server/routes/chat.ts :1464
apiRes = await fetch(apiUrl, { - net pma1999-agent-studio-5c5a04a/server/routes/credits.ts :17
const response = await fetch('https://openrouter.ai/api/v1/key', { - net pma1999-agent-studio-5c5a04a/server/routes/models.ts :101
const response = await fetch( - net pma1999-agent-studio-5c5a04a/server/services/councilExecutor.ts :270
return fetch(ep.url, init); - net pma1999-agent-studio-5c5a04a/server/shutdown.ts :1
import type { Server } from 'http'; - net pma1999-agent-studio-5c5a04a/server/tools/directFetch.ts :20
res = await fetch(url, { - net pma1999-agent-studio-5c5a04a/server/tools/httpTool.ts :61
const res = await fetch(finalUrl, { - net pma1999-agent-studio-5c5a04a/server/tools/jinaReader.ts :47
/** Target URL to fetch (required). */ - net pma1999-agent-studio-5c5a04a/server/tools/registry.ts :85
url: { type: 'string', description: 'Full URL of the page to fetch (required)' }, - net pma1999-agent-studio-5c5a04a/server/tools/waybackFetch.ts :29
res = await fetch(`${CDX_BASE}?${params.toString()}`, { signal: AbortSignal.timeout(timeoutMs) }); - net pma1999-agent-studio-5c5a04a/server/tools/webSearch.ts :115
const res = await fetch(EXA_API, { - net pma1999-agent-studio-5c5a04a/src/api/client.ts :84
* fetch() that replays the request while the edge proxy keeps answering with a - net pma1999-agent-studio-5c5a04a/src/api/councilClient.ts :147
const response = await fetch(`${API_BASE}/council/runs?conversation_id=${encodeURIComponent(conversationId)}`, { - net pma1999-agent-studio-5c5a04a/src/components/SettingsPanel.tsx :128
const res = await fetch('/api/health'); - net pma1999-agent-studio-5c5a04a/src/utils/llamacppKnobs.ts :21
/** Bounded log fetch (§5 logs envelope). */ - net pma1999-agent-studio-5c5a04a/src/utils/openrouterPkce.ts :86
const res = await fetch(OPENROUTER_KEYS_URL, {
secrets 23
- secrets (weak) pma1999-agent-studio-5c5a04a/scripts/fixtures/mcp-hardening-server.mjs :8
const secret = process.env.HARDENING_SECRET ?? 'fixture-secret'; - secrets (weak) pma1999-agent-studio-5c5a04a/scripts/test-agent-files.ts :11
process.env.JWT_SECRET = 'agent-files-test-jwt-secret'; - secrets (weak) pma1999-agent-studio-5c5a04a/scripts/test-agent-uploads.ts :10
delete process.env.JWT_SECRET; - secrets (weak) pma1999-agent-studio-5c5a04a/scripts/test-artifact-tools.ts :9
process.env.JWT_SECRET = 'artifacts-tools-test-jwt-secret'; - secrets (weak) pma1999-agent-studio-5c5a04a/scripts/test-artifacts-e2e.ts :12
process.env.JWT_SECRET = JWT_SECRET; - secrets (weak) pma1999-agent-studio-5c5a04a/scripts/test-artifacts-routes.ts :11
process.env.JWT_SECRET = JWT_SECRET; - secrets (weak) pma1999-agent-studio-5c5a04a/scripts/test-artifacts-storage.ts :9
process.env.JWT_SECRET = 'artifacts-storage-test-jwt-secret'; - secrets (weak) pma1999-agent-studio-5c5a04a/scripts/test-codex-artifact-linkage.ts :14
process.env.JWT_SECRET = 'codex-artifact-linkage-test-jwt-secret'; - secrets (weak) pma1999-agent-studio-5c5a04a/scripts/test-compact-route.ts :8
process.env.JWT_SECRET = 'test-secret'; - secrets (weak) pma1999-agent-studio-5c5a04a/scripts/test-conversation-sharing.ts :59
process.env.JWT_SECRET = `sharing-test-${process.pid}`; - secrets (weak) pma1999-agent-studio-5c5a04a/scripts/test-llamacpp-routes.ts :33
process.env.JWT_SECRET = 'test-secret'; - secrets (weak) pma1999-agent-studio-5c5a04a/scripts/test-mcp-client-hardening.ts :10
process.env.ENCRYPTION_KEY = process.env.ENCRYPTION_KEY ?? 'mcp-client-hardening-key-material-32-bytes';
show 11 more
- secrets (weak) pma1999-agent-studio-5c5a04a/scripts/test-mcp-client-v2.ts :12
process.env.ENCRYPTION_KEY = process.env.ENCRYPTION_KEY ?? 'mcp-client-test-key-material-32-bytes-minimum'; - secrets (weak) pma1999-agent-studio-5c5a04a/scripts/test-mcp-config-security.ts :11
process.env.ENCRYPTION_KEY = `test-only-${crypto.randomBytes(48).toString('hex')}`; - secrets (weak) pma1999-agent-studio-5c5a04a/scripts/test-mcp-runtime-integration.ts :8
process.env.INITIAL_ADMIN_PASSWORD = 'mcp-runtime-test-only'; - secrets (weak) pma1999-agent-studio-5c5a04a/scripts/test-run-command-e2b.ts :307
process.env.HOST_ONLY_SECRET = 'must-not-enter-sandbox'; - secrets (weak) pma1999-agent-studio-5c5a04a/scripts/test-skill-storage.ts :14
process.env.JWT_SECRET = 'skill-storage-test-jwt-secret'; - secrets (weak) pma1999-agent-studio-5c5a04a/scripts/test-ws-probe.mjs :29
const token = process.argv[3] || process.env.WS_PROBE_TOKEN; - secrets pma1999-agent-studio-5c5a04a/server/crypto.ts :20
const raw = process.env.ENCRYPTION_KEY; - secrets pma1999-agent-studio-5c5a04a/server/db.ts :586
const adminPasswordEnv = process.env.INITIAL_ADMIN_PASSWORD; - secrets pma1999-agent-studio-5c5a04a/server/middleware/auth.ts :5
const JWT_SECRET = process.env.JWT_SECRET; - secrets pma1999-agent-studio-5c5a04a/server/routes/agentProbe.ts :41
const token = process.env.WS_PROBE_TOKEN; - secrets pma1999-agent-studio-5c5a04a/server/routes/auth.ts :9
const JWT_SECRET = process.env.JWT_SECRET;
database 4
- db (weak) pma1999-agent-studio-5c5a04a/scripts/check-local-db.mjs :7
import Database from 'better-sqlite3'; - db (weak) pma1999-agent-studio-5c5a04a/scripts/reassign-to-local.cjs :1
const Database = require('better-sqlite3'); - db pma1999-agent-studio-5c5a04a/server/db.ts :1
import Database from 'better-sqlite3'; - db pma1999-agent-studio-5c5a04a/server/shutdown.ts :3
import type Database from 'better-sqlite3';
declared dependencies 49
- @modelcontextprotocol/client@^2.0.0
- @modelcontextprotocol/sdk@^1.26.0
- @modelcontextprotocol/server@^2.0.0
- @mozilla/readability@^0.6.0
- @openai/codex@^0.146.1
- adm-zip@^0.6.0
- bcrypt@^6.0.0
- better-sqlite3@^11.7.0
- cookie-parser@^1.4.7
- cors@^2.8.5
- dompurify@^3.4.14
- e2b@^2.38.3
show 28 more
- express@^4.22.2
- express-rate-limit@^8.6.2
- framer-motion@^11.15.0
- highlight.js@^11.10.0
- js-yaml@^4.3.1
- jsdom@^29.1.1
- jsonwebtoken@^9.0.3
- lucide-react@^0.468.0
- mermaid@^11.17.2
- nanoid@^5.1.16
- react@^18.3.1
- react-dom@^18.3.1
- react-markdown@^9.0.1
- rehype-highlight@^7.0.1
- remark-gfm@^4.0.0
- undici@^7.29.0
- ws@^8.18.0
- zod@^4.3.6
- zustand@^5.0.2
- @types/adm-zip@^0.5.7
- @types/bcrypt@^6.0.0
- @types/better-sqlite3@^7.6.12
- @types/cookie-parser@^1.4.10
- @types/cors@^2.8.17
- @types/express@^4.17.21
- @types/js-yaml@^4.0.9
- @types/jsdom@^28.0.3
- @types/jsonwebtoken@^9.0.10
9 more not shown — this panel samples each group; the count above is the real total.
cursor-plugin 1
- opaque (low) pma1999-agent-studio-5c5a04a/.cursor/rules/codegraph.mdc
bundled .cursor/ plugin descriptor (pma1999-agent-studio-5c5a04a/.cursor/rules/codegraph.mdc) — presence-detected; review the descriptor
transport_posture 3
- network-listening, binds all interfaces, no auth detected pma1999-agent-studio-5c5a04a/local-agent/src/llamaServerExecutor.test.ts :181
spawnMsg({ requestId: 'v-host', host: '0.0.0.0' as unknown as '127.0.0.1' }) - network-listening, binds all interfaces, no auth detected pma1999-agent-studio-5c5a04a/scripts/test-llamacpp-relay.ts :172
BackendToAgentMessageSchema.safeParse({ ...baseSpawn, host: '0.0.0.0' }).success, - binds all interfaces (0.0.0.0) pma1999-agent-studio-5c5a04a/server/index.ts :149
const server = app.listen(PORT, '0.0.0.0', () => {