mirror of
https://github.com/Ark0N/Codeman.git
synced 2026-09-30 20:49:41 +02:00
Adds `mode: 'deepseek'` alongside claude/shell/opencode/codex/gemini/ antigravity/pi/grok, plus a shortcut that opens the harness's own browser UI as a Codeman web tab. DeepSeek is wired unlike its siblings in three ways, each of which is the reason for a design decision rather than an accident: 1. The agent is a PROFILE, not the binary. `dsh` is a launcher over $DSH_HOME/profiles/<name>, and DeepSeek ships only `web`, `headless` and `base` -- the interactive terminal front door is always a third-party plugin. So availability is two questions: `isDeepSeekAvailable()` (binary) and `isDeepSeekRunnable()` (binary AND a pane-capable profile). The Run button gates on the latter, because reporting only the binary would spawn a pane that dies on arrival. When the binary is present but no profile is, the run menu offers to install one (POST /api/deepseek/install-profile). 2. The permission switch is an env var, not a flag. The harness has no command-line permission option; its sandbox/approval rows read DSH_PERMISSION_MODE (read-only / workspace-write / danger-full-access). Exported via `tmux setenv`, never on the spawn line. Absent = the harness's own workspace-write, which still asks, so the multi-user clamp is the only-if-sent branch and clamps to workspace-write, never read-only. 3. It is the only non-claude mode that passes hooksAvailableForMode(), and it earned that. The terminal front door reports idle/working/blocked to a supervising process over a generic env-gated contract; a generated shim (deepseek-status-shim.ts) makes Codeman that supervisor and forwards each report to /api/hook-event as stop / agent_working / permission_prompt. So a dsh session gets definitive respawn triggers, real wait-endpoint signals and real Approvals Inbox items instead of output-stabilization guesswork. `agent_working` is new (157th SSE constant) and joins APPROVAL_RESOLVING_EVENTS so a dialog answered in the terminal clears its alert at once. The resolver needs the strictest identity probe of the family: `dsh` is not merely a squattable npm name, Debian ships an unrelated `dsh` (dancer's shell), so `dsh --help` must print the harness's own banner before a candidate is handed a spawn line. Model is deliberately not a session field -- it is a composition entry in the profile's config tree. Env allowlist gains DSH_* and DEEPSEEK_* only; provider keys named by a settings-file `apiKeyEnv` stay out, which is pi's 34-provider-key problem in a new shape. Verified live against dsh 0.1.1-rc.2 and @deepseek-harness-tui/dsh-tui: the status endpoint's two-part answer, the no-profile refusal, the profile bootstrap, a real session whose pane runs `dsh --profile dsh-tui` with the permission mode injected via setenv, and the full status bridge -- a send-and-wait returned signal "stop" from a real turn, and blocked/working created and cleared an Approvals Inbox item. Docs: docs/deepseek-integration.md (guide), docs/deepseek-integration-plan.md (decisions + honest gaps). Tests: test/deepseek-mode.test.ts, test/deepseek-cli-resolver.test.ts. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
176 lines
5.1 KiB
JSON
176 lines
5.1 KiB
JSON
{
|
|
"name": "aicodeman",
|
|
"version": "1.22.0",
|
|
"description": "Mission control for AI coding agents - run 20 autonomous agents with real-time monitoring and session persistence",
|
|
"type": "module",
|
|
"main": "dist/index.js",
|
|
"types": "dist/index.d.ts",
|
|
"bin": {
|
|
"aicodeman": "./dist/index.js",
|
|
"codeman": "./dist/index.js"
|
|
},
|
|
"scripts": {
|
|
"postinstall": "node scripts/postinstall.js",
|
|
"build": "node scripts/build.mjs",
|
|
"build:gesture": "node scripts/build-gesture-bundle.mjs",
|
|
"start": "NODE_COMPILE_CACHE=${HOME}/.codeman/compile-cache node dist/index.js",
|
|
"dev": "tsx src/index.ts web",
|
|
"web": "node dist/index.js web",
|
|
"clean": "rm -rf dist",
|
|
"test": "vitest run --config config/vitest.ci.config.ts",
|
|
"test:watch": "vitest --config config/vitest.ci.config.ts",
|
|
"test:coverage": "vitest run --config config/vitest.ci.config.ts --coverage",
|
|
"test:ci": "vitest run --config config/vitest.ci.config.ts",
|
|
"test:browser": "vitest run --config config/vitest.browser.config.ts",
|
|
"test:perf": "vitest run --config config/vitest.perf.config.ts",
|
|
"test:all": "vitest run --config config/vitest.config.ts",
|
|
"pretest:mobile": "node scripts/prepare-test-vendor.mjs",
|
|
"test:mobile": "vitest run --config test/mobile/vitest.config.ts",
|
|
"check:frontend-syntax": "node scripts/check-frontend-syntax.mjs",
|
|
"fix:node-pty": "node scripts/fix-node-pty.mjs",
|
|
"typecheck": "tsc --noEmit",
|
|
"lint": "eslint --config config/eslint.config.js 'src/**/*.ts'",
|
|
"lint:fix": "eslint --config config/eslint.config.js 'src/**/*.ts' --fix",
|
|
"format": "prettier --write 'src/**/*.ts' 'src/web/public/**/*.{js,css,html,json}'",
|
|
"format:check": "prettier --check 'src/**/*.ts' 'src/web/public/**/*.{js,css,html,json}'",
|
|
"check:public-assets": "node scripts/check-public-assets.mjs",
|
|
"capture:subagents": "node scripts/capture-subagent-screenshots.mjs",
|
|
"changeset": "changeset",
|
|
"version-packages": "changeset version && npm install --package-lock-only && node scripts/check-lockfile-sync.mjs",
|
|
"check:lockfile": "node scripts/check-lockfile-sync.mjs",
|
|
"knip": "npx --yes knip@latest --config config/knip.json",
|
|
"release": "changeset publish"
|
|
},
|
|
"prettier": {
|
|
"singleQuote": true,
|
|
"semi": true,
|
|
"tabWidth": 2,
|
|
"printWidth": 120,
|
|
"trailingComma": "es5",
|
|
"endOfLine": "lf"
|
|
},
|
|
"workspaces": [
|
|
".",
|
|
"packages/*"
|
|
],
|
|
"keywords": [
|
|
"claude-code",
|
|
"claude-ai",
|
|
"claude",
|
|
"anthropic",
|
|
"opencode",
|
|
"codex",
|
|
"antigravity",
|
|
"pi",
|
|
"grok",
|
|
"deepseek",
|
|
"gemini-cli",
|
|
"ai-agents",
|
|
"agent",
|
|
"session-manager",
|
|
"self-hosted",
|
|
"developer-tools",
|
|
"tmux",
|
|
"terminal",
|
|
"xterm",
|
|
"docker",
|
|
"mosh",
|
|
"local-echo",
|
|
"web-dashboard",
|
|
"cli",
|
|
"llm",
|
|
"automation"
|
|
],
|
|
"author": "arkon",
|
|
"license": "MIT",
|
|
"dependencies": {
|
|
"@fastify/compress": "^8.3.1",
|
|
"@fastify/cookie": "^11.0.2",
|
|
"@fastify/multipart": "^10.0.0",
|
|
"@fastify/static": "^10.1.3",
|
|
"@fastify/websocket": "^11.2.0",
|
|
"@xterm/addon-fit": "^0.11.0",
|
|
"@xterm/addon-serialize": "^0.14.0",
|
|
"@xterm/addon-unicode11": "^0.9.0",
|
|
"@xterm/addon-webgl": "^0.19.0",
|
|
"@xterm/xterm": "^6.0.0",
|
|
"chalk": "^5.3.0",
|
|
"chokidar": "^3.6.0",
|
|
"commander": "^12.1.0",
|
|
"fastify": "^5.8.5",
|
|
"heic-decode": "^2.1.0",
|
|
"jpeg-js": "^0.4.4",
|
|
"node-pty": "^1.1.0",
|
|
"qrcode": "^1.5.4",
|
|
"uuid": "^14.0.0",
|
|
"web-push": "^3.6.7",
|
|
"ws": "^8.21.0",
|
|
"zod": "^4.3.6"
|
|
},
|
|
"devDependencies": {
|
|
"@changesets/cli": "^2.29.8",
|
|
"@eslint/js": "^9.0.0",
|
|
"@remotion/cli": "4.0.473",
|
|
"@remotion/transitions": "4.0.473",
|
|
"@types/node": "^20.19.33",
|
|
"@types/pngjs": "^6.0.5",
|
|
"@types/qrcode": "^1.5.6",
|
|
"@types/react": "^19.2.14",
|
|
"@types/uuid": "^10.0.0",
|
|
"@types/web-push": "^3.6.4",
|
|
"@types/ws": "^8.18.1",
|
|
"@vitest/coverage-v8": "^4.1.8",
|
|
"agent-browser": "^0.6.0",
|
|
"esbuild": "^0.27.3",
|
|
"eslint": "^9.0.0",
|
|
"pixelmatch": "^6.0.0",
|
|
"playwright": "^1.58.0",
|
|
"pngjs": "^7.0.0",
|
|
"postcss": "^8.5.15",
|
|
"prettier": "^3.4.0",
|
|
"puppeteer": "^24.36.0",
|
|
"remotion": "4.0.473",
|
|
"tsx": "^4.15.0",
|
|
"typescript": "^5.9.3",
|
|
"typescript-eslint": "^8.0.0",
|
|
"vitest": "^4.1.8"
|
|
},
|
|
"optionalDependencies": {
|
|
"@remotion/compositor-linux-x64-gnu": "^4.0.432",
|
|
"@rspack/binding-linux-x64-gnu": "^1.7.7"
|
|
},
|
|
"overrides": {
|
|
"basic-ftp": "^5.3.1",
|
|
"fast-uri": "^3.1.2",
|
|
"flatted": "^3.4.2",
|
|
"anymatch": {
|
|
"picomatch": "^2.3.2"
|
|
},
|
|
"micromatch": {
|
|
"picomatch": "^2.3.2"
|
|
},
|
|
"readdirp": {
|
|
"picomatch": "^2.3.2"
|
|
}
|
|
},
|
|
"engines": {
|
|
"node": ">=22.0.0"
|
|
},
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "git+https://github.com/Ark0N/Codeman.git"
|
|
},
|
|
"bugs": {
|
|
"url": "https://github.com/Ark0N/Codeman/issues"
|
|
},
|
|
"homepage": "https://github.com/Ark0N/Codeman#readme",
|
|
"files": [
|
|
"dist",
|
|
"scripts/postinstall.js",
|
|
"scripts/fix-node-pty.mjs",
|
|
"skills",
|
|
"LICENSE",
|
|
"README.md"
|
|
]
|
|
}
|