Mohamed Boudra 004bb0ea33 refactor(cli): unify daemon start error message handling
What changed:
- Added a shared utility `getErrorMessage(error: unknown)` in `packages/cli/src/utils/errors.ts`.
- Refactored `packages/cli/src/commands/daemon/start.ts` to use `getErrorMessage` and a local `exitWithError` helper instead of repeating inline error-message extraction + exit logic in each catch block.
- Added `packages/cli/tests/19-errors-utils.test.ts` to lock utility behavior for Error and non-Error throw values.

Reasoning:
- `runStart` had repeated branching (`err instanceof Error ? err.message : String(err)`) across multiple catch sites.
- Centralizing this keeps behavior stable while reducing duplication and cognitive overhead, aligned with the refactor skill guidance to simplify structure without changing user-visible behavior.

Verification:
- Ran `npx tsx packages/cli/tests/18-local-daemon-utils.test.ts` (pass).
- Ran `npx tsx packages/cli/tests/19-errors-utils.test.ts` (pass).
- Ran `npm run -w @getpaseo/cli typecheck` (pass).

Notes for next agent:
- Existing `scripts/codex-refactor-loop.sh` was already modified before this change and is intentionally not included.
- `packages/cli/tests/03-daemon.test.ts` currently failed in this environment because Test 3 expected daemon status failure, but command exited successfully (likely environment state dependent). This refactor does not touch that path; worth deflakifying or isolating in a follow-up.
2026-02-14 01:51:36 +07:00
2026-01-26 18:03:51 +07:00
2026-02-13 09:09:39 +00:00
2026-02-05 14:27:26 +07:00
2026-02-08 21:12:40 +07:00
2026-02-05 15:08:41 +07:00

Paseo logo

Paseo

Manage coding agents from your phone and desktop.

Paseo app screenshot


Warning

Early development — Features may break or change without notice. Use at your own risk.

Paseo is a self-hosted daemon for Claude Code, Codex, and OpenCode. Agents run on your machine with your full dev environment. Connect from phone, desktop, or web.

Features

  • Self-hosted: The daemon runs on your laptop, home server, or VPS
  • Multi-provider: Works with Claude Code, Codex, and OpenCode from one interface
  • Multi-host: Connect to multiple daemons and see all your agents in one place
  • Voice input: Dictate prompts when you're away from your keyboard
  • Optional relay: Use the hosted end-to-end encrypted relay, or connect directly
  • Cross-device: iOS, Android, desktop, web, and CLI
  • Git integration: Manage agents in isolated worktrees, review diffs, ship from the app
  • Open source: Free and open source under MIT license

Quick Start

npm install -g @getpaseo/cli && paseo

Then open the app and connect to your daemon.

Local speech (STT/TTS)

Paseo can run dictation + voice mode STT/TTS fully locally via sherpa-onnx.

When the daemon starts with a local speech provider selected, it will download any missing model files automatically (unless PASEO_SHERPA_ONNX_AUTO_DOWNLOAD=0).

npm run speech:download --workspace=@getpaseo/server

Optional configuration:

  • PASEO_SHERPA_ONNX_MODELS_DIR (defaults to ~/.paseo/models/sherpa-onnx)
  • PASEO_SHERPA_ONNX_AUTO_DOWNLOAD (1 by default; set 0 to disable automatic downloads on daemon start)
  • PASEO_SHERPA_STT_PRESET (zipformer, paraformer, or parakeet for NVIDIA Parakeet TDT v3)
  • PASEO_SHERPA_TTS_PRESET (pocket-tts (Kyutai Pocket TTS), kitten, or kokoro)
  • PASEO_DICTATION_STT_PROVIDER, PASEO_VOICE_STT_PROVIDER, PASEO_VOICE_TTS_PROVIDER (sherpa or openai)

To see all supported local model IDs:

npm run speech:models --workspace=@getpaseo/server

Optional: run an end-to-end test that downloads real models and exercises streaming STT + streaming TTS:

PASEO_SPEECH_E2E_DOWNLOAD=1 PASEO_SPEECH_E2E_MODEL_SET=parakeet-pocket \
  npx vitest run --workspace=@getpaseo/server src/server/speech/sherpa/speech-download.e2e.test.ts

Documentation

See paseo.sh/docs for full documentation.

Desktop releases

Desktop app binaries are built and attached to a GitHub Release when you push a version tag (for example v0.1.0 or desktop-v0.1.0).

npm run version:all:patch
npm run release:push

For the full package release flow, use:

npm run release:patch

This triggers the Desktop Release workflow (.github/workflows/desktop-release.yml).

License

MIT

Languages
TypeScript 98.1%
JavaScript 1.3%
Shell 0.1%
Swift 0.1%