mirror of
https://github.com/Ark0N/Codeman.git
synced 2026-09-30 12:39:42 +02:00
- Event-loop blockage: HEIC decode/encode (CPU-synchronous libheif WASM + jpeg-js) now runs in a per-conversion worker_threads Worker (src/web/heic-jpeg-worker.ts, spawned by heic-jpeg-converter.ts) with resourceLimits and a 30s hard timeout that terminates the worker — verified end-to-end under tsx and against compiled dist/ output with a real iPhone HEIC (event-loop max stall 52ms during conversion). - No server-side concurrency cap: conversions now acquire a slot from the existing global runWithConversionLimit() pool (document-conversion-limiter), bounding peak decode memory/CPU across simultaneous uploads. - Decompression bomb: header-declared dimensions are read via heic-decode's allocation-free `.all` path and rejected above 64MP BEFORE decode() can allocate width*height*4 bytes (a <300-byte crafted file can declare 30000x30000 = 3.6GB). Regression-tested with a crafted ISOBMFF fixture against the real heic-decode WASM (test/heic-jpeg-core.test.ts). - Mislabeled HEIC (documented Android/MIUI case): conversion now routes on ftyp magic-byte sniff of the raw buffer regardless of declared ext/Content-Type, so a HEIF uploaded as image/jpeg converts instead of 415ing; the magic-mismatch 415 only fires for genuinely unrecognized bytes. - Brand allowlist narrowed to what heic-decode's isHeic() accepts (heim/heis/hevm/hevs dropped — they could only ever fail conversion). - Converted-output size: the JPEG result is checked against MAX_PASTE_IMAGE_BYTES (jpeg-js can inflate a within-limit HEIC past the cap). - Deps: heic-convert replaced with its underlying heic-decode + jpeg-js (the wrapper could not expose the pre-decode dimension check); lockfile synced, drops pngjs. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
143 lines
4.2 KiB
JSON
143 lines
4.2 KiB
JSON
{
|
|
"name": "aicodeman",
|
|
"version": "1.2.2",
|
|
"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.config.ts",
|
|
"test:watch": "vitest --config config/vitest.config.ts",
|
|
"test:coverage": "vitest run --config config/vitest.config.ts --coverage",
|
|
"test:ci": "vitest run --config config/vitest.ci.config.ts",
|
|
"check:frontend-syntax": "node scripts/check-frontend-syntax.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",
|
|
"release": "changeset publish"
|
|
},
|
|
"workspaces": [
|
|
".",
|
|
"packages/*"
|
|
],
|
|
"keywords": [
|
|
"claude",
|
|
"claude-code",
|
|
"anthropic",
|
|
"ai-agent",
|
|
"automation",
|
|
"session-manager",
|
|
"terminal",
|
|
"cli",
|
|
"llm",
|
|
"autonomous-agent",
|
|
"ralph-loop"
|
|
],
|
|
"author": "arkon",
|
|
"license": "MIT",
|
|
"dependencies": {
|
|
"@fastify/compress": "^8.3.1",
|
|
"@fastify/cookie": "^11.0.2",
|
|
"@fastify/multipart": "^10.0.0",
|
|
"@fastify/static": "^9.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",
|
|
"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",
|
|
"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",
|
|
"LICENSE",
|
|
"README.md"
|
|
]
|
|
}
|