{ "name": "open-walnut", "version": "0.6.30", "description": "Personal AI powered by Claude — task management, Claude Code sessions, memory system, and web UI", "license": "MIT", "homepage": "https://github.com/EvanZhang008/open-walnut", "repository": { "type": "git", "url": "git+https://github.com/EvanZhang008/open-walnut.git" }, "keywords": [ "ai", "task-manager", "claude", "claude-code", "personal-assistant", "productivity", "self-hosted", "local-first", "ai-agent", "web-ui", "knowledge-management", "typescript", "cli", "personal-ai", "automation" ], "type": "module", "imports": { "#ws": { "bun": "./src/lib/ws-npm.ts", "default": "ws" } }, "workspaces": [ "packages/plugin-api", "packages/plugin-cli" ], "bin": { "open-walnut": "bin/open-walnut.js", "walnut": "bin/open-walnut.js" }, "main": "./dist/cli.js", "engines": { "bun": ">=1.4.4" }, "packageManager": "bun@1.4.4", "allowScripts": { "esbuild": true, "onnxruntime-node": true, "protobufjs": true, "screencapturekit-audio-capture": true, "sharp": true }, "trustedDependencies": [ "esbuild", "onnxruntime-node", "protobufjs", "screencapturekit-audio-capture", "sharp" ], "files": [ "bin", "dist", "!dist/daemon-binaries/daemon-linux-*", "!dist/daemon-binaries/daemon-darwin-*", "!dist/daemon-binaries/walnut-net-*", "dist/daemon-binaries/dtach-*", "!dist/**/*.map", "!dist/**/*.gz", "patches", "scripts/postinstall.mjs", "infra/bin", "infra/lib", "infra/cdk.json", "infra/package.json", "infra/bun.lock", "infra/tsconfig.json", "infra/README.md", "!infra/**/*.js", "!infra/**/*.d.ts", "README.md", "LICENSE" ], "scripts": { "postinstall": "node scripts/postinstall.mjs", "prepublishOnly": "WALNUT_REQUIRE_BUN=1 bun run build && cd web && bun x vite build && cd .. && bun scripts/check-publish.mjs", "start": "bun run web:build && bun dist/cli.js web --port 3456", "build:plugins": "bun run --filter @open-walnut/plugin-api build && bun run --filter @open-walnut/plugin-cli build", "build": "bun run build:plugins && bash scripts/build-daemon.sh && tsup && rm -rf dist/data && cp -r src/data dist/ && for d in src/integrations/*/manifest.json; do t=\"dist/integrations/$(basename $(dirname $d))\"; mkdir -p \"$t\"; cp \"$d\" \"$t/\"; i=\"$(dirname $d)/icon.svg\"; rm -f \"$t/icon.svg\"; if [ -f \"$i\" ]; then cp \"$i\" \"$t/\"; fi; for sub in skills agent-skills; do s=\"$(dirname $d)/$sub\"; rm -rf \"$t/$sub\"; if [ -d \"$s\" ]; then cp -r \"$s\" \"$t/\"; fi; done; done && bun scripts/ship-builtin-plugins.mjs && bun scripts/ship-store-plugins.mjs", "docs:check": "bun scripts/generate-ops-docs.mjs --check --repo-only && bun scripts/check-plugin-doc-snippets.mjs", "test:plugin-packages": "bun run build:plugins && WALNUT_REQUIRE_NPM=1 bun --bun vitest run --config vitest.focus.config.ts tests/core/plugin-package-metadata.test.ts tests/core/plugin-cli-dev.test.ts tests/core/plugin-cli-scaffold.test.ts tests/core/plugin-publish-check.test.ts && bun scripts/check-plugin-packages.mjs", "test:npm-channel": "WALNUT_REQUIRE_NPM=1 bun --bun vitest run --config vitest.focus.config.ts tests/scripts/release-rehearsal.test.ts tests/scripts/release-archives.test.ts tests/providers/daemon-service-artifact.test.ts tests/scripts/file-distribution.e2e.test.ts tests/scripts/field-rehearsal.test.ts tests/scripts/npm-launcher-fetch.test.ts", "test:source-twin-node": "WALNUT_REQUIRE_NODE=1 bun --bun vitest run --config vitest.focus.config.ts -t 'source twin \\(node\\)' tests/providers/daemon-service-update-force-twins-e2e.test.ts tests/providers/transcript-archive-twins-e2e.test.ts tests/providers/daemon-big-stream-resume-twins-e2e.test.ts tests/providers/daemon-client-role-twins-e2e.test.ts tests/providers/daemon-gateway-resend-twins-e2e.test.ts tests/providers/daemon-isolated-twins-e2e.test.ts tests/providers/daemon-restart-ride-twins-e2e.test.ts tests/providers/daemon-restart-ride-cli-twins.test.ts tests/providers/daemon-cwd-heal-twins-e2e.test.ts tests/providers/daemon-bounded-reads-twins-e2e.test.ts tests/providers/daemon-host-vitals-twins-e2e.test.ts tests/providers/daemon-bridge-slow-link-twins-e2e.test.ts tests/providers/daemon-bridge-wss-twins-e2e.test.ts tests/providers/daemon-changes-memo-twins-e2e.test.ts tests/providers/daemon-git-compare-twins-e2e.test.ts tests/providers/daemon-cli-owner-twins-e2e.test.ts tests/providers/daemon-argv-files-twins-e2e.test.ts tests/providers/daemon-session-walnut-twins-e2e.test.ts tests/providers/daemon-runtime-keep-twins-e2e.test.ts tests/providers/daemon-service-handover-busy-twins-e2e.test.ts tests/providers/daemon-external-scan-twins-e2e.test.ts tests/providers/daemon-fallback-dir-twins-e2e.test.ts tests/providers/daemon-fold-checkpoint-twins-e2e.test.ts tests/providers/daemon-fs-find-config-dir-twins.test.ts tests/providers/daemon-isolated-exit-reap-twins.test.ts tests/providers/daemon-link-liveness-twins-e2e.test.ts tests/providers/daemon-send-dedupe-twins-e2e.test.ts tests/providers/daemon-user-line-images-twins-e2e.test.ts tests/providers/daemon-send-boot-wait-twins-e2e.test.ts tests/providers/daemon-spawn-gate-e2e.test.ts tests/providers/daemon-spawn-journal-twins-e2e.test.ts tests/providers/daemon-stale-pid-twins-e2e.test.ts tests/providers/daemon-startup-failure-twins-e2e.test.ts tests/providers/daemon-stream-compact-twins-e2e.test.ts tests/providers/daemon-transfer-twins-e2e.test.ts tests/providers/daemon-workspace-twins-e2e.test.ts tests/providers/feature-relay-twins-e2e.test.ts tests/providers/oneshot-twins-e2e.test.ts tests/providers/task-dir-reboot-twins-e2e.test.ts tests/providers/host-exec-twins-e2e.test.ts tests/providers/net-twins-e2e.test.ts tests/providers/host-reach-twins-e2e.test.ts tests/providers/secrets-twins-e2e.test.ts tests/providers/pw-silence-twins-e2e.test.ts tests/providers/daemon-walnut-scope-hooks-twins-e2e.test.ts tests/providers/turn-settings-twins-e2e.test.ts tests/providers/daemon-served-walnuts-twins-e2e.test.ts tests/providers/daemon-caller-proof-twins-e2e.test.ts tests/setup/exec-guard.test.ts && WALNUT_REQUIRE_NODE=1 bun --bun vitest run --config vitest.e2e.config.ts -t 'source twin \\(node\\)' tests/e2e/daemon-bridge-uplink.test.ts tests/e2e/feature-relay-journey-e2e.test.ts", "test:source-twin-node-suites": "WALNUT_REQUIRE_NODE=1 bun --bun vitest run --config vitest.focus.config.ts --maxWorkers=1 --retry=2 tests/e2e/acp-daemon-e2e.test.ts tests/e2e/acp-host-daemon-e2e.test.ts tests/e2e/asks-relay-e2e.test.ts tests/e2e/clock-routine-cluster-e2e.test.ts tests/e2e/cloud-file-content-relay-e2e.test.ts tests/e2e/cloud-host-hop-e2e.test.ts tests/e2e/cloud-send-daemon-death-redelivery-e2e.test.ts tests/e2e/control-host-policy-e2e.test.ts tests/e2e/daemon-bridge-e2e.test.ts tests/e2e/daemon-bridge-file-read-e2e.test.ts tests/e2e/daemon-bridge-image-save-e2e.test.ts tests/e2e/daemon-bridge-session-launch-e2e.test.ts tests/e2e/daemon-bridge-session-message-e2e.test.ts tests/e2e/daemon-fs-mkdir-e2e.test.ts tests/e2e/daemon-lifecycle-e2e.test.ts tests/e2e/daemon-parent-watchdog-e2e.test.ts tests/e2e/host-server-alone-e2e.test.ts tests/e2e/host-server-e2e.test.ts tests/e2e/host-server-file-e2e.test.ts tests/e2e/leader-takeover-live-e2e.test.ts tests/e2e/offline-trigger-create-server-e2e.test.ts tests/e2e/offline-triggers-server-e2e.test.ts tests/e2e/remote-session-autorespawn-e2e.test.ts tests/e2e/remote-session-e2e.test.ts tests/e2e/replica-api-v1-away.test.ts tests/e2e/replica-ask-e2e.test.ts tests/e2e/replica-cluster-e2e.test.ts tests/e2e/replica-console-static-e2e.test.ts tests/e2e/replica-old-mac-e2e.test.ts tests/e2e/replica-scale-e2e.test.ts tests/e2e/same-host-send-e2e.test.ts tests/e2e/session-cron-metadata-wire.test.ts tests/e2e/session-cron-supervision.test.ts tests/e2e/session-manager-e2e.test.ts tests/e2e/trigger-host-resume-server-e2e.test.ts tests/integration/agent-gateway.test.ts tests/integration/bridge-stream-twins.test.ts tests/integration/clock-routine-twins.test.ts tests/integration/host-replica-twins.test.ts tests/integration/host-server-twins.test.ts tests/integration/plugin-jobs-twins.test.ts tests/integration/host-slice-probe-twins.test.ts tests/integration/journal-v2-twins.test.ts tests/integration/leader-takeover-twins.test.ts tests/integration/letter-journal-twins.test.ts tests/integration/note-journal-twins.test.ts tests/integration/offline-host-gateway.test.ts tests/integration/offline-triggers-twins.test.ts tests/integration/replica-ask-twins.test.ts tests/integration/replica-front-twins.test.ts tests/integration/replica-local-routes-twins.test.ts tests/integration/replica-logs-twins.test.ts tests/integration/trigger-check-repair-daemon.test.ts tests/integration/trigger-host-delivery-daemon.test.ts tests/integration/trigger-host-resume-daemon.test.ts tests/lib/entry-runtime.test.ts tests/providers/daemon-control-cancel.test.ts tests/providers/daemon-crash-guards-e2e.test.ts tests/providers/daemon-orphan-stop-real-e2e.test.ts tests/providers/daemon-relay-reroute.test.ts tests/providers/daemon-relay-target-liveness.test.ts tests/providers/daemon-snapshot-wiring.test.ts tests/providers/daemon-source-fallback-loaders-e2e.test.ts tests/providers/daemon-streams-migration.test.ts tests/providers/daemon-trigger-state-reboot.test.ts tests/providers/daemon-triggers-two-walnuts.test.ts tests/providers/daemon-bridge-per-walnut-twins-e2e.test.ts tests/providers/daemon-turn-retry-e2e.test.ts tests/providers/follower-owner-scope-twins.test.ts tests/providers/oneshot-via-daemon-e2e.test.ts tests/unit/peers/wn-env-fallback.test.ts tests/unit/peers/tools-call-trailing-args.test.ts tests/unit/peers/tool-call-json-errors.test.ts tests/unit/peers/tool-call-force-color.test.ts tests/unit/peers/wn-shell-dollar.test.ts tests/unit/peers/host-exec-run-id.test.ts tests/providers/daemon-net-update-twins-e2e.test.ts tests/unit/peers/op-call-id-clients.test.ts tests/providers/daemon-trigger-state-snapshot.test.ts", "dev": "tsup --watch", "release": "bun scripts/release.mjs", "test": "bun scripts/test-layers.mjs run local", "test:ci": "bun scripts/test-parallel.mjs", "test:quick": "bun run docs:check && bun --bun vitest run --config vitest.quick.config.ts", "search:eval": "bun scripts/search-eval.mjs", "search:robustness": "bun scripts/search-robustness-eval.mjs", "test:slow": "bun --bun vitest run --config vitest.slow.config.ts", "test:focus": "bun --bun vitest run --config vitest.focus.config.ts", "test:local": "bun scripts/test-layers.mjs run local", "test:land": "bun scripts/test-layers.mjs run land", "test:frontend:ci": "bun scripts/test-frontend.mjs", "test:changed": "bun scripts/test-changed.mjs", "test:baseline": "bun scripts/test-baseline.mjs check", "test:baseline:record": "bun scripts/test-baseline.mjs record", "test:browser:baseline": "bun scripts/browser-baseline.mjs check --run", "test:browser:baseline:record": "bun scripts/browser-baseline.mjs record --run", "test:pre-commit": "bun run docs:check && bun scripts/test-changed.mjs --tiers", "test:unit": "bun --bun vitest run --config vitest.unit.config.ts", "test:integration": "bun --bun vitest run --config vitest.integration.config.ts", "test:infra": "bun install --frozen-lockfile --cwd infra && bun --bun vitest run --root infra", "test:e2e": "bun --bun vitest run --config vitest.e2e.config.ts", "test:live": "WALNUT_LIVE_TEST=1 bun --bun vitest run --config vitest.live.config.ts", "test:live:daemon": "bash scripts/run-live-daemon-tests.sh", "test:live:cloud": "bash scripts/run-live-cloud-tests.sh", "test:live:providers": "bun --bun vitest run --config vitest.live.config.ts tests/live/provider-matrix/matrix.live.test.ts", "test:live:aws-setup": "bash scripts/run-live-aws-cloud-setup.sh", "test:fleet": "bash scripts/run-fleet-tests.sh", "test:full": "bun run test && bun run test:e2e && bun run test:live:daemon && bun run test:live:cloud", "test:all": "bun run lint && bun run lint:paths && bun run test:ci && bun x playwright test", "lint:paths": "bash scripts/lint-production-paths.sh", "lint:plugins": "bun run build:plugins && tsc --noEmit -p packages/browser-extension/tsconfig.json && tsc --noEmit -p packages/plugin-api/tsconfig.json && tsc --noEmit -p packages/plugin-cli/tsconfig.json && tsc -p tests/typechecks/tsconfig.plugin-api.json && tsc --noEmit -p examples/plugins/walnut-demo/tsconfig.json && tsc --noEmit -p examples/plugins/walnut-time/tsconfig.json", "test:coverage": "bun --bun vitest run --coverage", "test:watch": "bun --bun vitest", "build:daemon": "bash scripts/build-daemon.sh", "build:binary": "bun scripts/build-binary.mjs", "lint": "tsc --noEmit && bun run lint:plugins", "web": "bun dist/cli.js web", "web:dev": "concurrently \"tsup --watch\" \"cd web && bun x vite\"", "web:build": "bash scripts/build-daemon.sh && tsup && rm -rf dist/data && cp -r src/data dist/ && for d in src/integrations/*/manifest.json; do t=\"dist/integrations/$(basename $(dirname $d))\"; mkdir -p \"$t\"; cp \"$d\" \"$t/\"; i=\"$(dirname $d)/icon.svg\"; rm -f \"$t/icon.svg\"; if [ -f \"$i\" ]; then cp \"$i\" \"$t/\"; fi; for sub in skills agent-skills; do s=\"$(dirname $d)/$sub\"; rm -rf \"$t/$sub\"; if [ -d \"$s\" ]; then cp -r \"$s\" \"$t/\"; fi; done; done && bun scripts/ship-builtin-plugins.mjs && bun scripts/ship-store-plugins.mjs && cd web && ./node_modules/.bin/vite build && cd .. && bun scripts/build-extension.mjs", "extension:build": "bun scripts/build-extension.mjs", "dev:ephemeral": "bash scripts/dev-ephemeral.sh", "dev:demo": "bun run web:build && (lsof -ti:3457 -sTCP:LISTEN | xargs kill -15 2>/dev/null || true); (cat /tmp/open-walnut-demo/daemon.pid 2>/dev/null | xargs kill -15 2>/dev/null || true); sleep 1; echo \"Demo server: http://localhost:3457 (data: $HOME/.open-walnut-demo, daemon: /tmp/open-walnut-demo; isolated from prod)\"; OPEN_WALNUT_HOME=\"$HOME/.open-walnut-demo\" WALNUT_DAEMON_DIR=/tmp/open-walnut-demo bun dist/cli.js web --port 3457", "dev:prod": "bash scripts/dev-prod.sh", "prepare": "husky" }, "dependencies": { "@agentclientprotocol/codex-acp": "1.4.0", "@agentclientprotocol/sdk": "1.2.1", "@anthropic-ai/bedrock-sdk": "^0.26.3", "@anthropic-ai/claude-agent-sdk": "0.2.50", "@anthropic-ai/tokenizer": "^0.0.4", "@aws-sdk/client-s3": "^3.1110.0", "@aws-sdk/client-sts": "^3.996.0", "@aws-sdk/lib-storage": "^3.1110.0", "@azure/msal-node": "^5.0.3", "@google/generative-ai": "^0.24.1", "@modelcontextprotocol/sdk": "^1.29.0", "@mozilla/readability": "^0.6.0", "@slack/web-api": "^7.14.0", "@tiptap/extension-image": "^3.20.1", "chalk": "^5.4.1", "commander": "^14.0.0", "compression": "^1.8.1", "cors": "^2.8.6", "croner": "^10.0.1", "diff": "^9.0.0", "express": "^5.2.1", "entities": "7.0.1", "htmlparser2": "10.1.0", "image-size": "^2.0.2", "imapflow": "^1.7.8", "js-yaml": "^4.1.0", "linkedom": "^0.18.12", "mailparser": "^3.9.20", "marked": "^15.0.12", "marked-terminal": "^7.3.0", "nodemailer": "^9.1.1", "openai": "^6.29.0", "parse5": "8.0.0", "tldts": "7.4.19", "ws": "^8.19.0", "zod": "^4.3.6" }, "optionalDependencies": { "@huggingface/transformers": "^4.2.0", "screencapturekit-audio-capture": "^1.3.6", "sharp": "^0.34.5" }, "devDependencies": { "@playwright/test": "^1.58.2", "@types/compression": "^1.8.1", "@types/cors": "^2.8.19", "@types/express": "^5.0.6", "@types/image-size": "^0.7.0", "@types/js-yaml": "^4.0.9", "@types/marked-terminal": "^6.1.1", "@types/node": "^22.15.0", "@types/sharp": "^0.31.1", "@types/supertest": "^6.0.3", "@types/ws": "^8.18.1", "@vitest/coverage-v8": "^3.1.0", "acorn": "^8.16.0", "concurrently": "^9.2.1", "esbuild": "^0.27.3", "husky": "^9.1.7", "pi-acp": "0.0.33", "supertest": "^7.2.2", "tsup": "^8.5.0", "tsx": "^4.23.1", "typescript": "^5.8.0", "vitest": "^3.1.0", "yaml": "^2.8.3" }, "patchedDependencies": { "@anthropic-ai/claude-agent-sdk@0.2.50": "patches/@anthropic-ai%2Fclaude-agent-sdk@0.2.50.patch", "@agentclientprotocol/codex-acp@1.4.0": "patches/@agentclientprotocol%2Fcodex-acp@1.4.0.patch" } }