mirror of
https://github.com/getpaseo/paseo.git
synced 2026-07-29 12:01:31 +00:00
* feat(server): replace Pi ACP integration with direct SDK provider Replace the ACP-based Pi provider (which spawned a `pi-acp` subprocess and talked JSON-RPC over stdio) with a direct in-process integration using `@mariozechner/pi-coding-agent` as a library. The new `PiDirectAgentClient` and `PiDirectAgentSession` use the Pi SDK directly — creating sessions via `createAgentSession()`, managing models via `ModelRegistry`, and mapping Pi's `AgentSessionEvent` stream to Paseo's `AgentStreamEvent` types including: - Thread/turn lifecycle events - Assistant text and thinking/reasoning deltas - Tool execution (bash, read, write, edit, find, grep, ls) with arg caching across start/update/end events - Compaction events - Session persistence and resume via `SessionManager` Thinking levels flow through the existing `thinkingOptionId` / `setThinkingOption()` infrastructure, not through features. Includes 9 real e2e tests against a live Pi agent covering tool calls (bash/read/write/edit), reasoning chunks, session persistence/resume, model listing, and thinking option management. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: update lockfile signatures and Nix hash * refactor(server): improve Pi direct provider code quality Address coding standards violations in pi-direct-agent.ts: - Replace all `as Record<string, unknown>` / `as any` / `as unknown as` casts with properly typed boundaries using Pi SDK's exported tool input types (BashToolInput, ReadToolInput, EditToolInput, etc.) - Introduce named interfaces at all boundaries: PiPromptPayload, ToolCallOutputSummary, PiModelReference, PiPersistenceMetadata - Parse tool args once at boundary into typed discriminated union, then trust types internally — no more typeof probing in mappers - Break all dense ternary chains into named steps / helper functions - Import SDK types directly (RegisteredCommand, ResourceLoader, Skill) instead of casting through anonymous inline shapes - Isolate the system prompt SDK escape hatch into a minimal boundary helper with a named interface Behavior is preserved — all 9 real e2e tests still pass. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: regenerate package-lock.json with resolved/integrity fields The previous lockfile regeneration ran under an offline/cached npm context and stripped resolved URLs and integrity hashes from existing entries, which would break npm ci and Nix builds. * fix: update Nix npmDepsHash for regenerated lockfile * chore(server): bump @mariozechner/pi-coding-agent to ^0.67.68 * fix: update lockfile signatures and Nix hash * fix(app): surface agent setter RPC errors as toasts setAgentMode/Model/ThinkingOption/Feature errors from the daemon were only logged to console, so failures like missing API keys silently vanished. Add toast.error fallbacks at all call sites and hoist ToastProvider above SessionProvider so session context can use it. --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
115 lines
4.9 KiB
JSON
115 lines
4.9 KiB
JSON
{
|
|
"name": "@getpaseo/server",
|
|
"version": "0.1.60-rc.1",
|
|
"description": "Paseo backend server",
|
|
"type": "module",
|
|
"publishConfig": {
|
|
"access": "public"
|
|
},
|
|
"types": "./dist/server/server/exports.d.ts",
|
|
"files": [
|
|
"dist/server",
|
|
"dist/src",
|
|
"dist/scripts",
|
|
"src/server/speech/providers/local/sherpa/assets",
|
|
"README.md",
|
|
".env.example"
|
|
],
|
|
"exports": {
|
|
".": {
|
|
"types": "./dist/server/server/exports.d.ts",
|
|
"source": "./src/server/exports.ts",
|
|
"default": "./dist/server/server/exports.js"
|
|
},
|
|
"./utils/tool-call-parsers": {
|
|
"types": "./dist/server/utils/tool-call-parsers.d.ts",
|
|
"source": "./src/utils/tool-call-parsers.ts",
|
|
"default": "./dist/server/utils/tool-call-parsers.js"
|
|
}
|
|
},
|
|
"scripts": {
|
|
"dev": "cross-env NODE_ENV=development tsx scripts/dev-runner.ts",
|
|
"dev:tsx": "cross-env NODE_ENV=development tsx watch --ignore '**/*.timestamp-*' src/server/index.ts",
|
|
"build": "node -e \"require('node:fs').rmSync('dist',{ recursive: true, force: true })\" && npm run build:lib && npm run build:scripts",
|
|
"build:lib": "tsc -p tsconfig.server.json --incremental false && node -e \"const fs=require('node:fs'); fs.mkdirSync('dist/server/server/speech/providers/local/sherpa/assets',{recursive:true}); fs.copyFileSync('src/server/speech/providers/local/sherpa/assets/silero_vad.onnx','dist/server/server/speech/providers/local/sherpa/assets/silero_vad.onnx'); fs.cpSync('src/terminal/shell-integration','dist/server/terminal/shell-integration',{recursive:true}); fs.cpSync('src/terminal/shell-integration','dist/src/terminal/shell-integration',{recursive:true});\"",
|
|
"build:scripts": "tsc -p tsconfig.scripts.json --incremental false && node -e \"const fs=require('node:fs'); fs.mkdirSync('dist/scripts',{recursive:true}); fs.copyFileSync('scripts/mcp-stdio-socket-bridge-cli.mjs','dist/scripts/mcp-stdio-socket-bridge-cli.mjs');\"",
|
|
"prepack": "npm run build",
|
|
"start": "cross-env NODE_ENV=production node dist/server/server/index.js",
|
|
"typecheck": "tsc -p tsconfig.server.typecheck.json --noEmit",
|
|
"generate:config-schema": "tsx scripts/generate-config-schema.ts",
|
|
"speech:models": "tsx scripts/list-speech-models.ts",
|
|
"speech:download": "tsx scripts/download-speech-models.ts",
|
|
"speech:tts:matrix": "tsx scripts/generate-sherpa-tts-matrix.ts",
|
|
"speech:transcribe:local": "tsx scripts/transcribe-local-wav.ts",
|
|
"test": "npm run test:unit && npm run test:integration",
|
|
"test:unit": "vitest run --exclude \"**/*.e2e.test.ts\"",
|
|
"test:integration": "vitest run --maxWorkers=1 --minWorkers=1 src/server/daemon-e2e/models.e2e.test.ts src/server/daemon-e2e/live-preferences.e2e.test.ts src/server/agent/model-catalog.e2e.test.ts",
|
|
"test:integration:all": "npm run test:e2e",
|
|
"test:integration:real": "vitest run real.e2e.test.ts",
|
|
"test:integration:local": "vitest run local.e2e.test.ts",
|
|
"test:watch": "vitest",
|
|
"test:ui": "vitest --ui",
|
|
"test:e2e": "vitest run e2e.test.ts --maxWorkers=1 --minWorkers=1 --exclude \"**/*.real.e2e.test.ts\" --exclude \"**/*.local.e2e.test.ts\"",
|
|
"test:e2e:all": "vitest run e2e.test.ts --maxWorkers=1 --minWorkers=1",
|
|
"test:e2e:real": "npm run test:integration:real",
|
|
"test:e2e:local": "npm run test:integration:local",
|
|
"test:e2e:ui": "vitest --ui e2e.test.ts"
|
|
},
|
|
"dependencies": {
|
|
"@agentclientprotocol/sdk": "^0.17.1",
|
|
"@ai-sdk/openai": "2.0.52",
|
|
"@anthropic-ai/claude-agent-sdk": "^0.2.11",
|
|
"@deepgram/sdk": "^3.4.0",
|
|
"@getpaseo/highlight": "0.1.60-rc.1",
|
|
"@getpaseo/relay": "0.1.60-rc.1",
|
|
"@isaacs/ttlcache": "^2.1.4",
|
|
"@modelcontextprotocol/sdk": "^1.20.1",
|
|
"@mariozechner/pi-coding-agent": "^0.67.68",
|
|
"@opencode-ai/sdk": "1.2.6",
|
|
"@sctg/sentencepiece-js": "^1.1.0",
|
|
"@xterm/headless": "^6.0.0",
|
|
"ai": "5.0.78",
|
|
"ajv": "^8.17.1",
|
|
"dotenv": "^17.2.3",
|
|
"express": "^4.18.2",
|
|
"express-basic-auth": "^1.2.1",
|
|
"fast-deep-equal": "^3.1.3",
|
|
"fast-uri": "^3.1.0",
|
|
"mnemonic-id": "^3.2.7",
|
|
"node-pty": "1.2.0-beta.11",
|
|
"onnxruntime-node": "^1.23.0",
|
|
"openai": "^4.20.0",
|
|
"p-limit": "^7.3.0",
|
|
"pino": "^10.2.0",
|
|
"pino-pretty": "^13.1.3",
|
|
"qrcode": "^1.5.4",
|
|
"rotating-file-stream": "^3.2.9",
|
|
"sherpa-onnx": "1.12.28",
|
|
"sherpa-onnx-node": "1.12.28",
|
|
"strip-ansi": "^7.1.2",
|
|
"tiny-invariant": "^1.3.3",
|
|
"uuid": "^9.0.1",
|
|
"which": "^5.0.0",
|
|
"ws": "^8.14.2",
|
|
"zod": "^3.23.8",
|
|
"zod-to-json-schema": "^3.25.1"
|
|
},
|
|
"devDependencies": {
|
|
"@playwright/test": "^1.56.1",
|
|
"@types/express": "^4.17.20",
|
|
"@types/node": "^20.9.0",
|
|
"@types/qrcode": "^1.5.6",
|
|
"@types/uuid": "^9.0.7",
|
|
"@types/ws": "^8.5.8",
|
|
"@vitest/ui": "^3.2.4",
|
|
"cross-env": "^10.1.0",
|
|
"playwright": "^1.56.1",
|
|
"tsx": "^4.6.0",
|
|
"typescript": "^5.2.2",
|
|
"vitest": "^3.2.4"
|
|
},
|
|
"overrides": {
|
|
"lightningcss": "1.30.1"
|
|
}
|
|
}
|