* chore(ai): upgrade ACP packages and unwrap Skill+CLI command in tool-call panel
Package bumps:
- @zed-industries/claude-agent-acp 0.22.2 → @agentclientprotocol/claude-agent-acp 0.37.0
(old npm package is deprecated; scope rename)
- @zed-industries/codex-acp 0.10.0 → 0.15.0
- @mcpc-tech/acp-ai-provider 0.2.8 → 0.3.3
- electron-builder asarUnpack glob + bridge require.resolve switched to the new scope
After the upgrade Codex tool-call cards started showing the local
worktree path for every step — "Run /Users/.../netcatty-tool-cli session
--session …" — instead of the remote command. Three things lined up:
1. The new acp-ai-provider maps ACP's `title` to `toolName`, and Codex's
title is the full shell invocation it's about to run.
2. Codex local_shell ships args as ["/bin/zsh","-lc","<full>"], so the
old `typeof args.command === 'string'` branch in ToolCall never fired
and we fell through to printing `name` (i.e. the title).
3. The bridge serializes tool args under `args`, but the ACP adapter
only read `event.input`, so even when args were available the
renderer received {}.
Fixes:
- acpAgentAdapter: read tool input from both `event.input` and
`event.args` so bridge-serialized chunks and direct AI SDK chunks
both work.
- ai-elements/tool-call: new extractDisplayCommand() unwraps the shell
array, then the netcatty-tool-cli wrapper (exec/job-start … -- <cmd>),
and renders the real remote command. session/env/job-poll/etc. fall
back to short labels ("netcatty: inspect session", …) instead of
exposing the binary path.
- shellUtils.cjs: defensive JSON-parse the ACP wrapper input in case
the AI SDK ever stops auto-parsing it.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix(build): exclude bundled Claude CLI binaries from the installer
@anthropic-ai/claude-agent-sdk@0.3.x bundles the native Claude Code CLI
(~211MB per arch) as optional sibling packages. Including them would
silently regress Netcatty's "bring your own Claude" design — the project
has always required users to install Claude Code locally, and the entire
path-discovery flow exists precisely to honor that contract:
- useAgentDiscovery.ts scans the user's PATH for `claude` and writes
the absolute path into the agent config's CLAUDE_CODE_EXECUTABLE env.
- aiBridge.cjs runs normalizeClaudeCodeExecutableEnvForAcp on every ACP
spawn, forwarding the env var to the child process.
- The @agentclientprotocol/claude-agent-acp wrapper's claudeCliPath()
(acp-agent.js) prefers process.env.CLAUDE_CODE_EXECUTABLE over the
bundled binary and only falls back to sibling-package resolution when
the env var is empty.
So the right place to enforce the design is electron-builder: exclude
node_modules/@anthropic-ai/claude-agent-sdk-* from `files`. Dev mode is
unaffected (optional deps still install for `npm run dev`); only the
packaged installer drops the binaries, saving ~150MB. Users without
Claude Code installed get the same SDK error they got pre-upgrade.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
120 lines
5.8 KiB
JSON
120 lines
5.8 KiB
JSON
{
|
|
"name": "netcatty",
|
|
"description": "Netcatty is a modern SSH manager and terminal app with host grouping, SFTP, keychain, port forwarding, and a rich UI.",
|
|
"homepage": "https://github.com/binaricat/Netcatty",
|
|
"private": true,
|
|
"version": "0.0.0",
|
|
"type": "module",
|
|
"author": "binaricat <support@netcatty.com>",
|
|
"license": "GPL-3.0-or-later",
|
|
"main": "electron/main.cjs",
|
|
"bin": {
|
|
"netcatty-tool-cli": "./electron/cli/netcatty-tool-cli.cjs"
|
|
},
|
|
"scripts": {
|
|
"dev": "npm run fetch:mosh:dev && npm run lint && concurrently -k \"vite\" \"npm:dev:electron\"",
|
|
"dev:electron": "wait-on http-get://localhost:5173 && cross-env VITE_DEV_SERVER_URL=http://localhost:5173 node electron/launch.cjs",
|
|
"prebuild": "node scripts/copy-monaco.cjs",
|
|
"fetch:mosh": "node scripts/fetch-mosh-binaries.cjs",
|
|
"fetch:mosh:dev": "node scripts/fetch-mosh-binaries.cjs --host --resolve-release",
|
|
"build": "vite build",
|
|
"preview": "vite preview",
|
|
"start": "node electron/launch.cjs",
|
|
"pack": "npm run build && cross-env NODE_OPTIONS=--disable-warning=DEP0190 electron-builder --config electron-builder.config.cjs --publish=never",
|
|
"pack:dir": "npm run build && cross-env NODE_OPTIONS=--disable-warning=DEP0190 electron-builder --config electron-builder.config.cjs --dir --publish=never",
|
|
"pack:win": "npm run build && cross-env npm_config_arch=x64 NODE_OPTIONS=--disable-warning=DEP0190 electron-builder --config electron-builder.config.cjs --win --x64 --publish=never && cross-env npm_config_arch=arm64 NODE_OPTIONS=--disable-warning=DEP0190 electron-builder --config electron-builder.config.cjs --win --arm64 --publish=never",
|
|
"pack:win-x64": "npm run build && cross-env npm_config_arch=x64 NODE_OPTIONS=--disable-warning=DEP0190 electron-builder --config electron-builder.config.cjs --win --x64 --publish=never",
|
|
"pack:mac": "npm run build && cross-env NODE_OPTIONS=--disable-warning=DEP0190 electron-builder --config electron-builder.config.cjs --mac --publish=never",
|
|
"pack:linux": "npm run build && cross-env NODE_OPTIONS=--disable-warning=DEP0190 electron-builder --config electron-builder.config.cjs --linux --publish=never",
|
|
"pack:linux-x64": "npm run build && cross-env npm_config_arch=x64 NODE_OPTIONS=--disable-warning=DEP0190 electron-builder --config electron-builder.config.cjs --linux --x64 --publish=never",
|
|
"pack:linux-arm64": "npm run build && cross-env npm_config_arch=arm64 NODE_OPTIONS=--disable-warning=DEP0190 electron-builder --config electron-builder.config.cjs --linux --arm64 --publish=never",
|
|
"postinstall": "electron-builder install-app-deps && patch-package && node scripts/patch-xterm-webgl-atlas.cjs",
|
|
"rebuild": "electron-builder install-app-deps",
|
|
"tool:cli": "node electron/cli/netcatty-tool-cli.cjs",
|
|
"lint": "eslint .",
|
|
"lint:fix": "eslint . --fix",
|
|
"test": "node --test --import tsx electron/bridges/*.test.cjs electron/bridges/*/*.test.cjs scripts/*.test.cjs application/*.test.ts application/state/*.test.ts application/state/*/*.test.ts components/*.test.tsx components/editor/*.test.tsx components/ai/*.test.ts components/terminal/*.test.ts components/terminal/runtime/*.test.ts domain/*.test.ts infrastructure/ai/*.test.ts infrastructure/config/*.test.ts lib/*.test.ts"
|
|
},
|
|
"dependencies": {
|
|
"@agentclientprotocol/claude-agent-acp": "0.37.0",
|
|
"@ai-sdk/anthropic": "^3.0.58",
|
|
"@ai-sdk/google": "^3.0.43",
|
|
"@ai-sdk/openai": "^3.0.41",
|
|
"@aws-sdk/client-s3": "^3.956.0",
|
|
"@fontsource/jetbrains-mono": "^5.2.8",
|
|
"@fontsource/space-grotesk": "^5.2.10",
|
|
"@google/genai": "1.33.0",
|
|
"@mcpc-tech/acp-ai-provider": "0.3.3",
|
|
"@monaco-editor/react": "^4.7.0",
|
|
"@radix-ui/react-collapsible": "1.1.12",
|
|
"@radix-ui/react-context-menu": "2.2.16",
|
|
"@radix-ui/react-dialog": "1.1.15",
|
|
"@radix-ui/react-hover-card": "^1.1.15",
|
|
"@radix-ui/react-popover": "1.1.15",
|
|
"@radix-ui/react-scroll-area": "1.2.10",
|
|
"@radix-ui/react-select": "2.2.6",
|
|
"@radix-ui/react-slot": "1.2.4",
|
|
"@radix-ui/react-tabs": "1.1.13",
|
|
"@radix-ui/react-tooltip": "^1.2.8",
|
|
"@streamdown/cjk": "^1.0.2",
|
|
"@streamdown/code": "^1.1.0",
|
|
"@withfig/autocomplete": "^2.692.3",
|
|
"@xterm/addon-fit": "^0.11.0",
|
|
"@xterm/addon-search": "^0.16.0",
|
|
"@xterm/addon-serialize": "^0.14.0",
|
|
"@xterm/addon-unicode-graphemes": "^0.4.0",
|
|
"@xterm/addon-web-links": "^0.12.0",
|
|
"@xterm/addon-webgl": "^0.19.0",
|
|
"@xterm/xterm": "^6.0.0",
|
|
"@zed-industries/codex-acp": "0.15.0",
|
|
"ai": "^6.0.116",
|
|
"clsx": "2.1.1",
|
|
"electron-updater": "^6.8.3",
|
|
"iconv-lite": "^0.6.3",
|
|
"lucide-react": "0.560.0",
|
|
"monaco-editor": "^0.55.1",
|
|
"node-pty": "1.1.0",
|
|
"react": "^19.2.1",
|
|
"react-dom": "^19.2.1",
|
|
"serialport": "^13.0.0",
|
|
"ssh2-sftp-client": "^12.0.1",
|
|
"streamdown": "^2.4.0",
|
|
"tailwind-merge": "3.4.0",
|
|
"use-stick-to-bottom": "^1.1.3",
|
|
"uuid": "^13.0.0",
|
|
"webdav": "^5.8.0",
|
|
"zmodem.js": "^0.1.10",
|
|
"zod": "^4.3.6"
|
|
},
|
|
"devDependencies": {
|
|
"@eslint/js": "^9.39.1",
|
|
"@tailwindcss/postcss": "^4.1.17",
|
|
"@tailwindcss/vite": "^4.1.17",
|
|
"@types/node": "^25.0.0",
|
|
"@typescript-eslint/eslint-plugin": "^8.49.0",
|
|
"@typescript-eslint/parser": "^8.49.0",
|
|
"@vitejs/plugin-react": "^5.1.2",
|
|
"@withfig/autocomplete-types": "^1.31.0",
|
|
"concurrently": "^9.2.1",
|
|
"cross-env": "^10.1.0",
|
|
"electron": "^40.8.5",
|
|
"electron-builder": "^26.0.12",
|
|
"eslint": "^9.39.1",
|
|
"eslint-plugin-react-hooks": "^7.0.1",
|
|
"eslint-plugin-unused-imports": "^4.3.0",
|
|
"patch-package": "^8.0.0",
|
|
"tailwindcss": "^4.1.17",
|
|
"tsx": "^4.21.0",
|
|
"typescript": "~5.9.3",
|
|
"vite": "^7.3.2",
|
|
"wait-on": "^9.0.3"
|
|
},
|
|
"optionalDependencies": {
|
|
"@vscode/windows-process-tree": "^0.7.0"
|
|
},
|
|
"overrides": {
|
|
"cpu-features": "npm:empty-npm-package@1.0.0",
|
|
"axios": "1.13.5"
|
|
}
|
|
}
|