github TypeScript analyzed 5c5a04a

pma1999/agent-studio

github

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.

maintainer
pma1999
licence
MIT
first seen
2026-08-28
last seen
2026-09-17
releases · 30d
0
short id

Drift inferred · capture-to-capture

No drift recorded — single capability capture; advisories appear once its surface changes.

capabilities 0 tools
transport http counts 0 tools · 0 res · 0 prompts permission surface via code analysis

No tools enumerated yet for this server.

skills & danger signals github-tarball
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

code evidence vHEAD · github-tarball
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', () => {