Open-source alternative to Claude Cowork — a local-first AI agent desktop app · multi-model · self-evolving skills · privacy-first
Drift inferred · capture-to-capture
- HIGH code analysis flagged dynamic code execution ×3 in PM-Shawn/Abu-Cowork
- HIGH code analysis flagged dynamic code execution ×2 in PM-Shawn/Abu-Cowork
- HIGH code analysis flagged dynamic code execution ×2 in PM-Shawn/Abu-Cowork
- HIGH code analysis flagged dynamic code execution ×2 in PM-Shawn/Abu-Cowork
- HIGH code analysis flagged dynamic code execution ×2 in PM-Shawn/Abu-Cowork
- HIGH code analysis flagged dynamic code execution ×2 in PM-Shawn/Abu-Cowork
transport stdio · 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 f4b861f · analyzer v28 · 2d ago
skills & prompt files 29
- agent-rules PM-Shawn-Abu-Cowork-f4b861f/CLAUDE.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/Abu-Browser/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/alert-sop/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/algorithmic-art/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/brand-guidelines/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/canvas-design/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/claude-api/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/create-agent/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/doc-coauthoring/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/docx/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/frontend-design/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/html-widget/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/infographic/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/init/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/internal-comms/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/mcp-builder/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/mermaid-diagram/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/pdf/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/pptx/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/reflect/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/schedule/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/skill-creator/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/slack-gif-creator/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/svg-diagram/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/theme-factory/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/trigger/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/web-artifacts-builder/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/webapp-testing/SKILL.md
- skill PM-Shawn-Abu-Cowork-f4b861f/builtin-skills/xlsx/SKILL.md
danger signals5
- dynamic code execution eval() PM-Shawn-Abu-Cowork-f4b861f/abu-chrome-extension/src/background/index.ts :489
return eval(jsCode); - dynamic code execution eval() PM-Shawn-Abu-Cowork-f4b861f/src-tauri/browser-extension/background.js :370
return eval(jsCode); - dynamic code execution new Function() PM-Shawn-Abu-Cowork-f4b861f/src/components/chat/widgetReceiverDom.test.ts :57
const buildApi = new Function(`${WIDGET_RECEIVER_DOM_JS} - suspicious endpoint 169.254.169.254 (cloud metadata) PM-Shawn-Abu-Cowork-f4b861f/src/core/tools/definitions/webTools.test.ts :28
const result = await httpFetchTool.execute({ url: 'http://169.254.169.254/latest/meta-data/' }); - suspicious endpoint 100.100.100.200 (cloud metadata) PM-Shawn-Abu-Cowork-f4b861f/src/core/tools/definitions/webTools.test.ts :38
const result = await httpFetchTool.execute({ url: 'http://100.100.100.200/latest/meta-data/' });
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 937
filesystem 5
- fs PM-Shawn-Abu-Cowork-f4b861f/abu-browser-bridge/src/version.ts :1
import { readFileSync } from 'fs'; - fs PM-Shawn-Abu-Cowork-f4b861f/abu-chrome-extension/build.js :2
import { cpSync, mkdirSync, readFileSync, writeFileSync } from 'fs'; - fs PM-Shawn-Abu-Cowork-f4b861f/src/eval/report.ts :7
import { writeFileSync, readFileSync, existsSync, mkdirSync, readdirSync } from 'fs'; - fs PM-Shawn-Abu-Cowork-f4b861f/src/eval/run.ts :16
import { readFileSync } from 'node:fs'; - fs PM-Shawn-Abu-Cowork-f4b861f/src/eval/runOpenAI.ts :23
import { readFileSync } from 'node:fs';
shell / exec 6
- shell PM-Shawn-Abu-Cowork-f4b861f/abu-browser-bridge/src/index.ts :67
const { execSync } = await import('child_process'); - shell PM-Shawn-Abu-Cowork-f4b861f/src/core/mcp/client.ts :47
// Node.js child_process. Implements the MCP Transport interface. - shell PM-Shawn-Abu-Cowork-f4b861f/src/core/safety/contentGuard.ts :169
{ id: 'exec_string', severity: 'high', category: 'obfuscation', regex: /\bexec\s*\(\s*["\']/i, description: 'exec() with string argument' }, - shell PM-Shawn-Abu-Cowork-f4b861f/src/core/tools/definitions/fileTools.ts :348
// `` $` ``, `$'` in new_content as special patterns (even with a string - shell PM-Shawn-Abu-Cowork-f4b861f/src/core/trigger/triggerEngine.ts :31
return new RegExp(`^${regex}$`, 'i').test(str); - shell PM-Shawn-Abu-Cowork-f4b861f/src/core/trigger/triggerPermission.ts :22
return new RegExp(`^${regex}$`, 'i').test(command);
network 24
- net PM-Shawn-Abu-Cowork-f4b861f/abu-browser-bridge/src/index.ts :39
const res = await fetch(`http://127.0.0.1:${DISCOVERY_PORT}/status`, { - net PM-Shawn-Abu-Cowork-f4b861f/abu-browser-bridge/src/wsServer.ts :14
import { createServer, type Server as HTTPServer } from 'http'; - net PM-Shawn-Abu-Cowork-f4b861f/abu-chrome-extension/src/background/index.ts :119
const res = await fetch(DISCOVERY_URL, { signal: controller.signal }); - net PM-Shawn-Abu-Cowork-f4b861f/src-tauri/browser-extension/background.js :66
const res = await fetch(DISCOVERY_URL, { signal: controller.signal }); - net PM-Shawn-Abu-Cowork-f4b861f/src/components/enterprise/EnterpriseLoginPage.tsx :63
const res = await fetch(`${base}/api/client/v1/session`, { - net PM-Shawn-Abu-Cowork-f4b861f/src/core/enterprise/api.ts :127
const res = await fetch(endpoint, { ...fetchInit, headers: buildHeaders(b) }) - net PM-Shawn-Abu-Cowork-f4b861f/src/core/enterprise/auth.ts :47
const initRes = await fetch(`${base}/api/client/bind/init`, { - net PM-Shawn-Abu-Cowork-f4b861f/src/core/enterprise/bootstrap.ts :65
const res = await fetch(`${base}/api/client/v1/bootstrap`) - net PM-Shawn-Abu-Cowork-f4b861f/src/core/enterprise/token-refresh.ts :54
const res = await fetch(url, { - net PM-Shawn-Abu-Cowork-f4b861f/src/core/enterprise/useEnterpriseModels.ts :27
fetch(`${r.baseUrl}/v1/models`, { - net PM-Shawn-Abu-Cowork-f4b861f/src/core/im/adapters/base.ts :23
const response = await fetch(webhookUrl, { - net PM-Shawn-Abu-Cowork-f4b861f/src/core/llm/openai-compatible.ts :428
// the fetch (the merged signal is GC'd with chat() — no listener leak). - net PM-Shawn-Abu-Cowork-f4b861f/src/core/observability/langfuse.ts :29
async fetch(url: string, options: TauriFetchOptions): Promise<Response> { - net PM-Shawn-Abu-Cowork-f4b861f/src/core/safety/contentGuard.ts :108
{ id: 'env_exfil_fetch', severity: 'critical', category: 'exfiltration', regex: /fetch\s*\([^\n]*\$\{?\w*(KEY|TOKEN|SECRET|PASSWORD|API)/i, description: 'fetch() call interpolating secret environment - net PM-Shawn-Abu-Cowork-f4b861f/src/core/skill/npmInstaller.ts :177
resp = await fetch(url, { - net PM-Shawn-Abu-Cowork-f4b861f/src/core/tools/definitions/mediaTools.ts :80
// Call image generation API via Tauri fetch (bypasses CORS) - net PM-Shawn-Abu-Cowork-f4b861f/src/core/updates/checker.ts :35
const res = await fetch(LATEST_JSON_URL, { cache: 'no-cache' }); - net PM-Shawn-Abu-Cowork-f4b861f/src/eval/runOpenAI.ts :139
const res = await fetch(url, { - net PM-Shawn-Abu-Cowork-f4b861f/src/utils/consoleAnnouncement.ts :50
res = await fetch(`${baseUrl}/api/announcements?version=${APP_VERSION}`, { - net PM-Shawn-Abu-Cowork-f4b861f/src/utils/consoleDiagnostic.ts :29
res = await fetch(`${baseUrl}/api/diagnostics/upload`, { - net PM-Shawn-Abu-Cowork-f4b861f/src/utils/consoleError.ts :17
fetch(`${baseUrl}/api/error`, { - net PM-Shawn-Abu-Cowork-f4b861f/src/utils/consoleFeedback.ts :14
fetch(`${baseUrl}/api/feedback`, { - net PM-Shawn-Abu-Cowork-f4b861f/src/utils/consolePing.ts :17
fetch(`${baseUrl}/api/ping`, { - net PM-Shawn-Abu-Cowork-f4b861f/src/utils/previewUrl.ts :11
* 1. Lazy-fetch (port, token) from Tauri on first call; cache for app lifetime.
secrets 2
- secrets PM-Shawn-Abu-Cowork-f4b861f/src/eval/run.ts :86
?? process.env.ANTHROPIC_API_KEY - secrets PM-Shawn-Abu-Cowork-f4b861f/src/eval/runMiniMaxAB.ts :28
const API_KEY = process.env.MINIMAX_API_KEY;
install hooks 1
- prepare PM-Shawn-Abu-Cowork-f4b861f/package.json :40
husky
declared dependencies 117
- @modelcontextprotocol/sdk@^1.29.0
- @anthropic-ai/sdk@^0.95.2
- @cfworker/json-schema@^4.1.1
- @codemirror/theme-one-dark@^6.1.3
- @mozilla/readability@^0.6.0
- @tauri-apps/api@^2.11.1
- @tauri-apps/plugin-clipboard-manager@^2.3.2
- @tauri-apps/plugin-deep-link@^2.4.9
- @tauri-apps/plugin-dialog@^2.7.1
- @tauri-apps/plugin-fs@^2.5.1
- @tauri-apps/plugin-global-shortcut@^2.3.2
- @tauri-apps/plugin-http@^2.5.9
- @tauri-apps/plugin-notification@^2.3.3
- @tauri-apps/plugin-opener@^2.5.4
- @tauri-apps/plugin-os@^2.3.2
- @tauri-apps/plugin-process@^2.3.1
- @tauri-apps/plugin-shell@^2.3.5
- @tauri-apps/plugin-updater@^2.10.1
- @types/diff@^7.0.2
- @uiw/codemirror-extensions-langs@^4.25.11
- @uiw/react-codemirror@^4.25.11
- @xterm/addon-fit@^0.11.0
- @xterm/xterm@^6.0.0
- aes-js@^3.1.2
- class-variance-authority@^0.7.1
- clsx@^2.1.1
- diff@^9.0.0
- docx-preview@^0.3.7
- fflate@^0.8.3
- immer@^11.1.15
- langfuse@^3.38.20
- linkedom@^0.18.13
- lucide-react@^0.575.0
- mermaid@^11.15.0
- pptx-preview@^1.0.7
- pptxgenjs@^4.0.1
- qrcode@^1.5.4
- radix-ui@^1.4.3
- react@^19.2.7
- react-dom@^19.2.7
- react-markdown@^10.1.0
- react-pdf@^10.4.1
- react-syntax-highlighter@^16.1.1
- react-virtuoso@^4.18.11
- remark-breaks@^4.0.0
- remark-gfm@^4.0.1
- tailwind-merge@^3.5.0
- xlsx@^0.18.5
- yaml@^2.8.2
- zod@^4.3.6
- zustand@^5.0.14
- @eslint/js@^10.0.1
- @playwright/test@^1.61.1
- @tailwindcss/vite@^4.3.3
- @tauri-apps/cli@^2.11.4
- @testing-library/jest-dom@^6.9.1
- @testing-library/react@^16.3.2
- @testing-library/user-event@^14.6.1
- @types/aes-js@^3.1.4
- @types/node@^25.7.0
- @types/qrcode@^1.5.6
- @types/react@^19.2.17
- @types/react-dom@^19.2.3
- @types/react-syntax-highlighter@^15.5.13
- @vitejs/plugin-react@^6.0.3
- @vitest/coverage-v8@^4.1.10
- eslint@^10.3.0
- eslint-plugin-react-hooks@^7.1.1
- eslint-plugin-react-refresh@^0.5.3
- globals@^17.6.0
- happy-dom@^20.9.0
- husky@^9.1.7
- lint-staged@^17.0.8
- shadcn@^4.7.0
- tailwindcss@^4.2.1
- tsx@^4.21.0
- tw-animate-css@^1.4.0
- typescript@~6.0.3
- typescript-eslint@^8.59.3
- vite@^8.0.16
- vitest@^4.1.6
- tauri-build@2
- tauri@2
- tauri-plugin-dialog@2
- tauri-plugin-fs@2
- tauri-plugin-shell@2
- tauri-plugin-notification@2
- tauri-plugin-opener@2
- tauri-plugin-os@2
- tauri-plugin-http@2
- tauri-plugin-clipboard-manager@2
- tauri-plugin-global-shortcut@2
- tauri-plugin-updater@2
- tauri-plugin-process@2
- tauri-plugin-deep-link@2
- serde@1
- serde_json@1
- tokio@1
- tokio-tungstenite@0.26
- futures-util@0.3
- prost@0.13
- reqwest@0.13
- xcap@0.9
- enigo@0.3
- base64@0.22
- image@0.25
- tempfile@3
- trash@5
- rusqlite@0.31
- axum@0.7
- tower@0.5
- mime_guess@2
- uuid@1
- urlencoding@2
- subtle@2.5
- tokio-util@0.7
- portable-pty@0.9