Extract client SDK package (#1052)

* Extract client SDK package

* Polish SDK client identity defaults

* Build client before dependent CI jobs

* Restore daemon client server export

* Extract protocol and client SDK packages

* Fix provider override schema validation

* Fix app test daemon client imports

* Simplify workspace build targets

* Fix CLI test server build bootstrap

* Run SDK package tests in CI

* Fix rebase package split drift

* Restore lockfile registry metadata

* Update SDK config test for prompt default

* Move terminal stream router test to client package

* Fix rebase drift for protocol imports

* Fix SDK agent capability fixture

* Restore legacy server client exports

* Fix server export compatibility test

* Advertise custom mode icon client capability

* Remove server daemon-client exports

* Format rebased mode control import

* Fix rebase drift for protocol imports

Files added by upstream PRs (#893, #1147, #1154) referenced the pre-split
shared/ paths that this branch moves into @getpaseo/protocol. Redirect
those imports to the protocol package so typecheck stays green after the
rebase.
This commit is contained in:
Mohamed Boudra
2026-05-28 01:58:18 +08:00
committed by GitHub
parent 0ea41378a4
commit 53c14d9855
403 changed files with 3193 additions and 1417 deletions
+44 -34
View File
@@ -69,18 +69,18 @@ jobs:
- name: Install dependencies - name: Install dependencies
run: npm ci run: npm ci
- name: Build highlight dependency - name: Build server stack
run: npm run build --workspace=@getpaseo/highlight run: npm run build:server
- name: Build relay dependency
run: npm run build --workspace=@getpaseo/relay
- name: Build server dependency
run: npm run build --workspace=@getpaseo/server
- name: Typecheck all packages - name: Typecheck all packages
run: npm run typecheck run: npm run typecheck
- name: Verify public package contents
run: |
npm pack --dry-run --ignore-scripts --workspace=@getpaseo/protocol
npm pack --dry-run --ignore-scripts --workspace=@getpaseo/client
npm pack --dry-run --ignore-scripts --workspace=@getpaseo/server
server-tests: server-tests:
strategy: strategy:
fail-fast: false fail-fast: false
@@ -107,11 +107,8 @@ jobs:
- name: Install agent CLIs for provider tests - name: Install agent CLIs for provider tests
run: npm install -g @anthropic-ai/claude-code opencode-ai run: npm install -g @anthropic-ai/claude-code opencode-ai
- name: Build highlight dependency - name: Build server dependencies
run: npm run build --workspace=@getpaseo/highlight run: npm run build:server-deps
- name: Build relay dependency
run: npm run build --workspace=@getpaseo/relay
- name: Run server tests - name: Run server tests
run: npm run test --workspace=@getpaseo/server run: npm run test --workspace=@getpaseo/server
@@ -137,14 +134,8 @@ jobs:
- name: Install dependencies - name: Install dependencies
run: npm ci run: npm ci
- name: Build highlight dependency - name: Build server stack
run: npm run build --workspace=@getpaseo/highlight run: npm run build:server
- name: Build relay dependency
run: npm run build --workspace=@getpaseo/relay
- name: Build server dependency
run: npm run build --workspace=@getpaseo/server
- name: Run desktop tests - name: Run desktop tests
run: npm run test --workspace=@getpaseo/desktop run: npm run test --workspace=@getpaseo/desktop
@@ -165,12 +156,37 @@ jobs:
- name: Install Playwright browsers - name: Install Playwright browsers
run: npx playwright install --with-deps chromium run: npx playwright install --with-deps chromium
- name: Build highlight dependency - name: Build app dependencies
run: npm run build --workspace=@getpaseo/highlight run: npm run build:app-deps
- name: Run app unit tests - name: Run app unit tests
run: npm run test --workspace=@getpaseo/app run: npm run test --workspace=@getpaseo/app
sdk-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "22"
cache: "npm"
- name: Install dependencies
run: npm ci
- name: Build client dependencies
run: npm run build:client
- name: Run protocol tests
run: npm run test --workspace=@getpaseo/protocol
- name: Run client tests
run: npm run test --workspace=@getpaseo/client
- name: Typecheck client examples
run: npm run typecheck:examples --workspace=@getpaseo/client
playwright: playwright:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
@@ -187,14 +203,11 @@ jobs:
- name: Install Playwright browsers - name: Install Playwright browsers
run: npx playwright install --with-deps chromium run: npx playwright install --with-deps chromium
- name: Build highlight dependency - name: Build app dependencies
run: npm run build --workspace=@getpaseo/highlight run: npm run build:app-deps
- name: Build relay dependency - name: Build server stack
run: npm run build --workspace=@getpaseo/relay run: npm run build:server
- name: Build server dependency
run: npm run build --workspace=@getpaseo/server
- name: Install agent CLIs for provider tests - name: Install agent CLIs for provider tests
run: npm install -g @anthropic-ai/claude-code @openai/codex@0.105.0 opencode-ai run: npm install -g @anthropic-ai/claude-code @openai/codex@0.105.0 opencode-ai
@@ -228,7 +241,7 @@ jobs:
run: npm ci run: npm ci
- name: Build relay - name: Build relay
run: npm run build --workspace=@getpaseo/relay run: npm run build:relay
- name: Run relay tests - name: Run relay tests
run: npm run test --workspace=@getpaseo/relay run: npm run test --workspace=@getpaseo/relay
@@ -254,9 +267,6 @@ jobs:
- name: Install agent CLIs for provider tests - name: Install agent CLIs for provider tests
run: npm install -g @anthropic-ai/claude-code @openai/codex@0.105.0 opencode-ai run: npm install -g @anthropic-ai/claude-code @openai/codex@0.105.0 opencode-ai
- name: Build highlight dependency
run: npm run build --workspace=@getpaseo/highlight
- name: Run CLI tests - name: Run CLI tests
run: npm run test --workspace=@getpaseo/cli run: npm run test --workspace=@getpaseo/cli
env: env:
+2 -2
View File
@@ -28,8 +28,8 @@ jobs:
env: env:
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Build highlight dependency - name: Build app dependencies
run: npm run build --workspace=@getpaseo/highlight run: npm run build:app-deps
- name: Typecheck - name: Typecheck
run: npm run typecheck --workspace=@getpaseo/app run: npm run typecheck --workspace=@getpaseo/app
+2
View File
@@ -10,6 +10,8 @@ on:
- "package.json" - "package.json"
- "package-lock.json" - "package-lock.json"
- "packages/highlight/**" - "packages/highlight/**"
- "packages/protocol/**"
- "packages/client/**"
- "packages/server/**" - "packages/server/**"
- "packages/relay/**" - "packages/relay/**"
- "packages/cli/**" - "packages/cli/**"
+3 -2
View File
@@ -71,8 +71,9 @@ See [docs/development.md](docs/development.md) for full setup, build sync requir
- Never re-run a test suite that another agent already ran and reported green — trust the result. - Never re-run a test suite that another agent already ran and reported green — trust the result.
- For full suite verification, push to CI and check GitHub Actions instead. - For full suite verification, push to CI and check GitHub Actions instead.
- **Always run typecheck and lint after every change.** - **Always run typecheck and lint after every change.**
- **Build workspace packages before diagnosing cross-package type errors.** This repo consumes generated declarations across workspaces. If typecheck fails in a package that depends on another workspace (especially CLI depending on server/daemon types), rebuild the owning package first so `dist` declarations are current: - **Build workspace packages before diagnosing cross-package type errors.** This repo consumes generated declarations across workspaces. If typecheck fails in a package that depends on another workspace, rebuild the owning stack first so `dist` declarations are current:
- `npm run build:daemon` — rebuild highlight, relay, server, and CLI when daemon/server/CLI types may be stale. - `npm run build:client` — rebuild protocol and client declarations.
- `npm run build:server` — rebuild highlight, relay, protocol, client, server, and CLI when server/CLI types may be stale.
- Do not patch inferred callback parameters or add local duplicate types just to silence stale declaration errors. - Do not patch inferred callback parameters or add local duplicate types just to silence stale declaration errors.
- **Run `npm run format` before committing.** This repo uses Biome for formatting. Do not manually fix formatting — let the formatter handle it. - **Run `npm run format` before committing.** This repo uses Biome for formatting. Do not manually fix formatting — let the formatter handle it.
- **Always use npm scripts for linting and formatting.** Do not run tools directly with `npx eslint`, `npx oxfmt`, `npx oxlint`, or package-local binaries. For targeted checks, pass file paths through the npm script: - **Always use npm scripts for linting and formatting.** Do not run tools directly with `npx eslint`, `npx oxfmt`, `npx oxlint`, or package-local binaries. For targeted checks, pass file paths through the npm script:
+2 -2
View File
@@ -134,8 +134,8 @@ npm run dev:app
npm run dev:desktop npm run dev:desktop
npm run dev:website npm run dev:website
# build the daemon # build the server stack
npm run build:daemon npm run build:server
# repo-wide checks # repo-wide checks
npm run typecheck npm run typecheck
+15 -4
View File
@@ -68,9 +68,20 @@ All paths are under `packages/server/src/`.
| `server/schedule/` | Cron-based scheduled agents | | `server/schedule/` | Cron-based scheduled agents |
| `server/loop-service.ts` | Looping agent runs that retry until an exit condition | | `server/loop-service.ts` | Looping agent runs that retry until an exit condition |
| `server/chat/` | Chat rooms for agent-to-agent and human-to-agent messaging | | `server/chat/` | Chat rooms for agent-to-agent and human-to-agent messaging |
| `client/daemon-client.ts` | Client library for connecting to the daemon (used by CLI and app) |
| `shared/messages.ts` | Zod schemas for the entire wire protocol | ### `packages/protocol` — Wire schemas and shared protocol types
| `shared/binary-frames/` | Terminal stream and file transfer binary frame codecs |
The source of truth for WebSocket messages, binary frame codecs, endpoint parsing,
agent timeline types, provider config schemas, and other values shared by daemon
and clients. Server, app, CLI, and `@getpaseo/client` all depend on this package;
it does not depend on the server.
### `packages/client` — Daemon client library and SDK facade
Owns the low-level daemon WebSocket driver plus the higher-level `PaseoClient`
facade. App and CLI may import the low-level driver from
`@getpaseo/client/internal/daemon-client` during migration, while new SDK-shaped
code imports from `@getpaseo/client`.
### `packages/app` — Mobile + web client (Expo) ### `packages/app` — Mobile + web client (Expo)
@@ -126,7 +137,7 @@ TanStack Router + Cloudflare Workers. Serves paseo.sh.
## WebSocket protocol ## WebSocket protocol
All clients speak the same WebSocket protocol over a single connection that mixes JSON text frames and a small binary framing for terminal streams. Schemas live in `packages/server/src/shared/messages.ts`. All clients speak the same WebSocket protocol over a single connection that mixes JSON text frames and a small binary framing for terminal streams. Schemas live in `packages/protocol/src/messages.ts`.
**Handshake:** **Handshake:**
+13 -8
View File
@@ -109,23 +109,28 @@ Every `scripts` entry with `"type": "service"` receives these environment variab
} }
``` ```
## Build sync gotchas ## Built workspace packages
The daemon and CLI consume sibling workspaces from compiled `dist/` output, not `src/`. When you change a workspace that something else imports, rebuild the producer first or the consumer will speak a stale protocol and fail with handshake warnings, timeouts, or stale type errors. Package imports resolve through package exports to compiled `dist/` output, not sibling `src/` files. This is true in local dev and in published packages: the app, daemon, CLI, and SDK consumers should all exercise the same runtime paths.
The fastest way to keep this consistent is to rebuild the whole daemon stack with one command: `npm run dev`, `npm run dev:server`, and `npm run dev:app` build the workspace packages they need once, then keep `@getpaseo/protocol` and `@getpaseo/client` fresh with TypeScript watch builds while the daemon or Expo runs. If you change protocol schemas or client code outside those watch workflows, rebuild the producer before trusting runtime behavior.
Use the named root build targets instead of remembering workspace dependency chains:
```bash ```bash
npm run build:daemon npm run build:client # protocol -> client
npm run build:server-deps # highlight -> relay -> protocol -> client
npm run build:server # server-deps -> server -> cli
npm run build:app-deps # highlight -> protocol -> client -> expo-two-way-audio
``` ```
This rebuilds, in order, `@getpaseo/highlight` → `@getpaseo/relay` → `@getpaseo/server` → `@getpaseo/cli`. Use it whenever you have changed any of those four and need clean cross-package types or runtime behavior. Use `npm run build:server` whenever you have changed any daemon/server-facing package and need clean cross-package types or runtime behavior.
For tighter loops, you can rebuild a single workspace: For tighter loops, you can rebuild a single workspace:
- Changed `packages/relay/src/*`: `npm run build --workspace=@getpaseo/relay` (server imports `@getpaseo/relay` from `dist/*`). - Changed `packages/protocol/src/*` or `packages/client/src/*`: `npm run build:client`.
- Changed `packages/server/src/client/*` (especially `daemon-client.ts`) or shared WS protocol types: `npm run build --workspace=@getpaseo/server` (CLI imports `@getpaseo/server` via package exports resolving to `dist/*`). - Changed `packages/server/src/*`, `packages/cli/src/*`, `packages/relay/src/*`, or `packages/highlight/src/*`: `npm run build:server`.
- Changed `packages/highlight/src/*`: `npm run build --workspace=@getpaseo/highlight` (server depends on it). - Changed app build dependencies: `npm run build:app-deps`.
## CLI reference ## CLI reference
+13 -13
View File
@@ -3,24 +3,24 @@
Authoritative terminology. UI label wins. Don't invent synonyms; use what's here. Authoritative terminology. UI label wins. Don't invent synonyms; use what's here.
- **Project** — Logical grouping of workspaces sharing a git remote (or main repo root). UI: "Project" / "Add project". Code: `ProjectSummary` (`packages/app/src/utils/projects.ts:22`), `projectKey` (`packages/server/src/server/workspace-registry-model.ts:16`). Forbidden: "Repo", "Repository" as UI label. - **Project** — Logical grouping of workspaces sharing a git remote (or main repo root). UI: "Project" / "Add project". Code: `ProjectSummary` (`packages/app/src/utils/projects.ts:22`), `projectKey` (`packages/server/src/server/workspace-registry-model.ts:16`). Forbidden: "Repo", "Repository" as UI label.
- **Workspace** — One concrete `cwd` on one daemon, with git state; belongs to exactly one project. UI: "Workspace". Code: `WorkspaceDescriptorPayload` (`packages/server/src/shared/messages.ts:2178`). Don't confuse with: Branch (one branch can back many workspaces via worktrees). Forbidden: "Folder", "Directory" as UI label. - **Workspace** — One concrete `cwd` on one daemon, with git state; belongs to exactly one project. UI: "Workspace". Code: `WorkspaceDescriptorPayload` (`packages/protocol/src/messages.ts:2178`). Don't confuse with: Branch (one branch can back many workspaces via worktrees). Forbidden: "Folder", "Directory" as UI label.
- **Workspace kind** — `"directory" | "local_checkout" | "worktree"`. Code: `PersistedWorkspaceKind` (`packages/server/src/server/workspace-registry-model.ts:8`). - **Workspace kind** — `"directory" | "local_checkout" | "worktree"`. Code: `PersistedWorkspaceKind` (`packages/server/src/server/workspace-registry-model.ts:8`).
- **Agent** — One AI coding agent run on a daemon (one provider, one model, one cwd, one timeline). UI: "Agent" / "New Agent". Code: `AgentSnapshotPayload` (`packages/server/src/shared/messages.ts:608`). Forbidden: "Task", "Job", "Run". - **Agent** — One AI coding agent run on a daemon (one provider, one model, one cwd, one timeline). UI: "Agent" / "New Agent". Code: `AgentSnapshotPayload` (`packages/protocol/src/messages.ts:608`). Forbidden: "Task", "Job", "Run".
- **Daemon** — Local Paseo server process; identified by `serverId`. UI: "Daemon" (system contexts only). Code: `serverId` in `ServerInfoStatusPayloadSchema` (`packages/server/src/shared/messages.ts:1936`), `DaemonClient` (`packages/server/src/client/daemon-client.ts`). - **Daemon** — Local Paseo server process; identified by `serverId`. UI: "Daemon" (system contexts only). Code: `serverId` in `ServerInfoStatusPayloadSchema` (`packages/protocol/src/messages.ts:1936`), `DaemonClient` (`packages/client/src/daemon-client.ts`).
- **Host** — Client-side connection profile pointing at a daemon; bundles one or more `HostConnection`s. UI: "Host" / "Add host" / "Switch host". Code: `HostProfile` (`packages/app/src/types/host-connection.ts:37`). Forbidden: "Connection" (means `HostConnection`, not host). - **Host** — Client-side connection profile pointing at a daemon; bundles one or more `HostConnection`s. UI: "Host" / "Add host" / "Switch host". Code: `HostProfile` (`packages/app/src/types/host-connection.ts:37`). Forbidden: "Connection" (means `HostConnection`, not host).
- **Project host entry** — One row in a project for a single (project, daemon) pair, aggregating that daemon's workspaces in the project. Internal. Code: `ProjectHostEntry` (`packages/app/src/utils/projects.ts:11`). Don't introduce "Checkout" as a synonym. - **Project host entry** — One row in a project for a single (project, daemon) pair, aggregating that daemon's workspaces in the project. Internal. Code: `ProjectHostEntry` (`packages/app/src/utils/projects.ts:11`). Don't introduce "Checkout" as a synonym.
- **Placement** — One workspace's relationship to its project (projectKey, projectName, git checkout snapshot). Internal. Code: `ProjectPlacementPayload` (`packages/server/src/shared/messages.ts:2113`). - **Placement** — One workspace's relationship to its project (projectKey, projectName, git checkout snapshot). Internal. Code: `ProjectPlacementPayload` (`packages/protocol/src/messages.ts:2113`).
- **Branch** — Plain git branch. UI: "Switch branch". Code: `currentBranch` in `WorkspaceGitRuntimePayloadSchema` (`packages/server/src/shared/messages.ts:2136`); `BranchSwitcher` (`packages/app/src/components/branch-switcher.tsx`). - **Branch** — Plain git branch. UI: "Switch branch". Code: `currentBranch` in `WorkspaceGitRuntimePayloadSchema` (`packages/protocol/src/messages.ts:2136`); `BranchSwitcher` (`packages/app/src/components/branch-switcher.tsx`).
- **Worktree** — Paseo-managed git worktree (`~/.paseo/worktrees/{name}`); also a `workspaceKind` value. UI: CLI + `paseo.json` keys (`worktree.setup`, `worktree.teardown`) only. Code: `ProjectCheckoutLiteGitPaseoPayload` (`packages/server/src/shared/messages.ts:2092`); CLI `paseo worktree` (`packages/cli/src/commands/worktree/index.ts:8`). Forbidden: "Checkout" as a synonym. - **Worktree** — Paseo-managed git worktree (`~/.paseo/worktrees/{name}`); also a `workspaceKind` value. UI: CLI + `paseo.json` keys (`worktree.setup`, `worktree.teardown`) only. Code: `ProjectCheckoutLiteGitPaseoPayload` (`packages/protocol/src/messages.ts:2092`); CLI `paseo worktree` (`packages/cli/src/commands/worktree/index.ts:8`). Forbidden: "Checkout" as a synonym.
- **Repository / Remote** — Internal git inputs (`remoteUrl`, `mainRepoRoot`) used to derive `projectKey`. No UI label. - **Repository / Remote** — Internal git inputs (`remoteUrl`, `mainRepoRoot`) used to derive `projectKey`. No UI label.
- **Session** — Per-client connection to a daemon. Internal. Code: `Session` (`packages/server/src/server/session.ts`). Don't confuse with: provider-side agent session log. - **Session** — Per-client connection to a daemon. Internal. Code: `Session` (`packages/server/src/server/session.ts`). Don't confuse with: provider-side agent session log.
- **Profile** — Internal name for the persisted shape of a host. Code: `HostProfile` (`packages/app/src/types/host-connection.ts:37`). Never user-facing. - **Profile** — Internal name for the persisted shape of a host. Code: `HostProfile` (`packages/app/src/types/host-connection.ts:37`). Never user-facing.
- **Provider** — Agent backend (Claude Code, Codex, Copilot, OpenCode, Pi). UI: "Provider". Code: `ProviderSnapshotEntry` (`packages/server/src/shared/messages.ts:198`). - **Provider** — Agent backend (Claude Code, Codex, Copilot, OpenCode, Pi). UI: "Provider". Code: `ProviderSnapshotEntry` (`packages/protocol/src/messages.ts:198`).
- **Model** — A specific LLM offered by a provider. UI: "Model" / "Select model". Code: `AgentModelDefinition` (`packages/server/src/shared/messages.ts:187`). - **Model** — A specific LLM offered by a provider. UI: "Model" / "Select model". Code: `AgentModelDefinition` (`packages/protocol/src/messages.ts:187`).
- **Terminal** — Workspace-scoped PTY shell streamed over the binary mux channel. UI: "Terminal". Code: `TerminalStreamFrame` (`packages/server/src/shared/terminal-stream-protocol.ts`). - **Terminal** — Workspace-scoped PTY shell streamed over the binary mux channel. UI: "Terminal". Code: `TerminalStreamFrame` (`packages/protocol/src/terminal-stream-protocol.ts`).
- **Schedule** — Cron-style trigger that creates remote agents. UI: CLI only (`paseo schedule`). Code: `ScheduleCreateRequest` (re-exported from `packages/server/src/shared/messages.ts`). Don't confuse with: Loop (iterative re-execution of one agent). - **Schedule** — Cron-style trigger that creates remote agents. UI: CLI only (`paseo schedule`). Code: `ScheduleCreateRequest` (re-exported from `packages/protocol/src/messages.ts`). Don't confuse with: Loop (iterative re-execution of one agent).
- **Mode** — Provider-specific operational mode (plan, default, full-access, …). UI: icon-only. Code: `modeId` in `AgentSessionConfig` (`packages/server/src/shared/messages.ts:257`). - **Mode** — Provider-specific operational mode (plan, default, full-access, …). UI: icon-only. Code: `modeId` in `AgentSessionConfig` (`packages/protocol/src/messages.ts:257`).
- **Attachment** — GitHub PR or Issue bound to an agent prompt. UI: "Attach issue or PR". Code: `AgentAttachment` (`packages/server/src/shared/messages.ts:782`). - **Attachment** — GitHub PR or Issue bound to an agent prompt. UI: "Attach issue or PR". Code: `AgentAttachment` (`packages/protocol/src/messages.ts:782`).
- **Composer** — The whole prompt surface for sending work to an agent. Code: `Composer` (`packages/app/src/composer/index.tsx`). Don't call this "message input" except for the text-entry subcomponent. - **Composer** — The whole prompt surface for sending work to an agent. Code: `Composer` (`packages/app/src/composer/index.tsx`). Don't call this "message input" except for the text-entry subcomponent.
- **Composer input** — The text-entry surface inside the composer. Code: `MessageInput` (`packages/app/src/composer/input/input.tsx`). - **Composer input** — The text-entry surface inside the composer. Code: `MessageInput` (`packages/app/src/composer/input/input.tsx`).
- **Composer toolbar** — The bottom control row inside the composer input. Contains agent controls, attachment button, voice controls, and stop/send controls. Code: `leftContent`, `beforeVoiceContent`, and `rightContent` slots in `MessageInput` (`packages/app/src/composer/input/input.tsx`). Forbidden: "Status bar". - **Composer toolbar** — The bottom control row inside the composer input. Contains agent controls, attachment button, voice controls, and stop/send controls. Code: `leftContent`, `beforeVoiceContent`, and `rightContent` slots in `MessageInput` (`packages/app/src/composer/input/input.tsx`). Forbidden: "Status bar".
@@ -33,4 +33,4 @@ Authoritative terminology. UI label wins. Don't invent synonyms; use what's here
## Inconsistencies (documented, not papered over) ## Inconsistencies (documented, not papered over)
- CLI `--host <host>` description `"Daemon host target"` (`packages/cli/src/utils/command-options.ts:5`) blurs daemon/host; the app keeps them distinct. - CLI `--host <host>` description `"Daemon host target"` (`packages/cli/src/utils/command-options.ts:5`) blurs daemon/host; the app keeps them distinct.
- `WorkspaceDescriptorPayloadSchema.workspaceKind` accepts legacy `"checkout"` on the wire (`packages/server/src/shared/messages.ts:2187`) while `PersistedWorkspaceKind` does not (`packages/server/src/server/workspace-registry-model.ts:8`). - `WorkspaceDescriptorPayloadSchema.workspaceKind` accepts legacy `"checkout"` on the wire (`packages/protocol/src/messages.ts:2187`) while `PersistedWorkspaceKind` does not (`packages/server/src/server/workspace-registry-model.ts:8`).
+1
View File
@@ -4,6 +4,7 @@ pre-commit:
- name: format - name: format
glob: "*.{css,js,json,jsonc,jsx,md,ts,tsx,yaml,yml}" glob: "*.{css,js,json,jsonc,jsx,md,ts,tsx,yaml,yml}"
exclude: exclude:
- "package-lock.json"
- "**/package-lock.json" - "**/package-lock.json"
run: npm run format:check:files -- {staged_files} run: npm run format:check:files -- {staged_files}
- name: lint - name: lint
+3 -3
View File
@@ -73,10 +73,10 @@ buildNpmPackage rec {
# Native deps (terminal emulation; libuv-linked on Linux) # Native deps (terminal emulation; libuv-linked on Linux)
npm rebuild node-pty npm rebuild node-pty
# Daemon workspaces (highlight + relay + server + cli) # Server workspaces (highlight + relay + protocol + client + server + cli)
npm run build:daemon npm run build:server
# App workspace deps not covered by build:daemon # App workspace deps not covered by build:server
npm run build --workspace=@getpaseo/expo-two-way-audio npm run build --workspace=@getpaseo/expo-two-way-audio
# Expo web export for the Electron renderer # Expo web export for the Electron renderer
+2 -2
View File
@@ -79,8 +79,8 @@ buildNpmPackage rec {
# degrade when unavailable. # degrade when unavailable.
npm rebuild node-pty npm rebuild node-pty
# Build all daemon packages in dependency order (defined in package.json) # Build all server packages in dependency order (defined in package.json)
npm run build:daemon npm run build:server
runHook postBuild runHook postBuild
''; '';
+126 -612
View File
File diff suppressed because it is too large Load Diff
+17 -7
View File
@@ -24,6 +24,8 @@
"workspaces": [ "workspaces": [
"packages/expo-two-way-audio", "packages/expo-two-way-audio",
"packages/highlight", "packages/highlight",
"packages/protocol",
"packages/client",
"packages/server", "packages/server",
"packages/app", "packages/app",
"packages/relay", "packages/relay",
@@ -34,16 +36,24 @@
"scripts": { "scripts": {
"dev": "./scripts/dev.sh", "dev": "./scripts/dev.sh",
"dev:win": "powershell ./scripts/dev.ps1", "dev:win": "powershell ./scripts/dev.ps1",
"dev:server": "npm run dev --workspace=@getpaseo/server", "dev:server": "npm run build:server-deps && concurrently --kill-others --names protocol,client,server --prefix-colors yellow,blue,cyan \"npm run watch:protocol\" \"npm run watch:client\" \"npm run dev:server:raw\"",
"dev:server:raw": "npm run dev --workspace=@getpaseo/server",
"dev:app": "npm run start --workspace=@getpaseo/app", "dev:app": "npm run start --workspace=@getpaseo/app",
"dev:website": "npm run dev --workspace=@getpaseo/website", "dev:website": "npm run dev --workspace=@getpaseo/website",
"postinstall": "node scripts/postinstall-patches.mjs", "postinstall": "node scripts/postinstall-patches.mjs",
"prepare": "lefthook install --force", "prepare": "lefthook install --force",
"build": "npm run build --workspaces --if-present", "build": "npm run build --workspaces --if-present",
"build:highlight": "npm run build --workspace=@getpaseo/highlight", "build:highlight": "npm run build --workspace=@getpaseo/highlight",
"build:daemon": "npm run build --workspace=@getpaseo/highlight && npm run build --workspace=@getpaseo/relay && npm run build --workspace=@getpaseo/server && npm run build --workspace=@getpaseo/cli", "build:relay": "npm run build --workspace=@getpaseo/relay",
"build:protocol": "npm run build --workspace=@getpaseo/protocol",
"build:client": "npm run build:protocol && npm run build --workspace=@getpaseo/client",
"build:server-deps": "npm run build:highlight && npm run build:relay && npm run build:client",
"build:server": "npm run build:server-deps && npm run build --workspace=@getpaseo/server && npm run build --workspace=@getpaseo/cli",
"build:app-deps": "npm run build:highlight && npm run build:client && npm run build --workspace=@getpaseo/expo-two-way-audio",
"watch:protocol": "tsc -p packages/protocol/tsconfig.json --watch --preserveWatchOutput",
"watch:client": "tsc -p packages/client/tsconfig.json --watch --preserveWatchOutput",
"typecheck": "npm run typecheck --workspaces --if-present", "typecheck": "npm run typecheck --workspaces --if-present",
"typecheck:daemon": "npm run typecheck --workspace=@getpaseo/relay && npm run typecheck --workspace=@getpaseo/server && npm run typecheck --workspace=@getpaseo/cli", "typecheck:server": "npm run typecheck --workspace=@getpaseo/relay && npm run typecheck --workspace=@getpaseo/protocol && npm run typecheck --workspace=@getpaseo/client && npm run typecheck --workspace=@getpaseo/server && npm run typecheck --workspace=@getpaseo/cli",
"test": "npm run test --workspaces --if-present", "test": "npm run test --workspaces --if-present",
"format": "oxfmt .", "format": "oxfmt .",
"format:files": "oxfmt", "format:files": "oxfmt",
@@ -63,7 +73,7 @@
"web": "npm run web --workspace=@getpaseo/app", "web": "npm run web --workspace=@getpaseo/app",
"dev:desktop": "npm run dev --workspace=@getpaseo/desktop", "dev:desktop": "npm run dev --workspace=@getpaseo/desktop",
"dev:win:desktop": "npm run dev:win --workspace=@getpaseo/desktop", "dev:win:desktop": "npm run dev:win --workspace=@getpaseo/desktop",
"build:desktop": "npm run build:workspace-deps --workspace=@getpaseo/app && cd packages/app && cross-env PASEO_WEB_PLATFORM=electron npx expo export --platform web && cd ../.. && npm run build --workspace=@getpaseo/desktop --", "build:desktop": "npm run build:app-deps && cd packages/app && cross-env PASEO_WEB_PLATFORM=electron npx expo export --platform web && cd ../.. && npm run build --workspace=@getpaseo/desktop --",
"db:query": "npm run db:query --workspace=@getpaseo/server --", "db:query": "npm run db:query --workspace=@getpaseo/server --",
"cli": "npx tsx packages/cli/src/index.js", "cli": "npx tsx packages/cli/src/index.js",
"version": "npm run version:sync-internal && npm run release:prepare && git add -A", "version": "npm run version:sync-internal && npm run release:prepare && git add -A",
@@ -77,9 +87,9 @@
"version:all:beta:major": "node scripts/set-release-version.mjs --mode beta-major", "version:all:beta:major": "node scripts/set-release-version.mjs --mode beta-major",
"version:all:beta:next": "node scripts/set-release-version.mjs --mode beta-next", "version:all:beta:next": "node scripts/set-release-version.mjs --mode beta-next",
"version:all:promote": "node scripts/set-release-version.mjs --mode promote", "version:all:promote": "node scripts/set-release-version.mjs --mode promote",
"release:check": "npm run release:prepare && npm run typecheck --workspace=@getpaseo/highlight && npm run build --workspace=@getpaseo/highlight && npm run typecheck --workspace=@getpaseo/relay && npm run build --workspace=@getpaseo/relay && npm run typecheck --workspace=@getpaseo/server && npm run build --workspace=@getpaseo/server && npm run typecheck --workspace=@getpaseo/cli && npm run build --workspace=@getpaseo/cli && npm pack --dry-run --workspace=@getpaseo/highlight && npm pack --dry-run --workspace=@getpaseo/relay && npm pack --dry-run --workspace=@getpaseo/server && npm pack --dry-run --workspace=@getpaseo/cli", "release:check": "npm run release:prepare && npm run typecheck --workspace=@getpaseo/highlight && npm run typecheck --workspace=@getpaseo/relay && npm run typecheck --workspace=@getpaseo/protocol && npm run build:client && npm run typecheck --workspace=@getpaseo/client && npm run build:server && npm run typecheck --workspace=@getpaseo/server && npm run typecheck --workspace=@getpaseo/cli && npm pack --dry-run --workspace=@getpaseo/highlight && npm pack --dry-run --workspace=@getpaseo/relay && npm pack --dry-run --workspace=@getpaseo/protocol && npm pack --dry-run --workspace=@getpaseo/client && npm pack --dry-run --workspace=@getpaseo/server && npm pack --dry-run --workspace=@getpaseo/cli",
"release:publish:dry-run": "npm publish --dry-run --workspace=@getpaseo/highlight --access public && npm publish --dry-run --workspace=@getpaseo/relay --access public && npm publish --dry-run --workspace=@getpaseo/server --access public && npm publish --dry-run --workspace=@getpaseo/cli --access public", "release:publish:dry-run": "npm publish --dry-run --workspace=@getpaseo/highlight --access public && npm publish --dry-run --workspace=@getpaseo/relay --access public && npm publish --dry-run --workspace=@getpaseo/protocol --access public && npm publish --dry-run --workspace=@getpaseo/client --access public && npm publish --dry-run --workspace=@getpaseo/server --access public && npm publish --dry-run --workspace=@getpaseo/cli --access public",
"release:publish": "npm publish --workspace=@getpaseo/highlight --access public && npm publish --workspace=@getpaseo/relay --access public && npm publish --workspace=@getpaseo/server --access public && npm publish --workspace=@getpaseo/cli --access public", "release:publish": "npm publish --workspace=@getpaseo/highlight --access public && npm publish --workspace=@getpaseo/relay --access public && npm publish --workspace=@getpaseo/protocol --access public && npm publish --workspace=@getpaseo/client --access public && npm publish --workspace=@getpaseo/server --access public && npm publish --workspace=@getpaseo/cli --access public",
"release:push": "node scripts/push-current-release-tag.mjs", "release:push": "node scripts/push-current-release-tag.mjs",
"release:beta:patch": "npm run release:check && npm run version:all:beta:patch && npm run release:push", "release:beta:patch": "npm run release:check && npm run version:all:beta:patch && npm run release:push",
"release:beta:minor": "npm run release:check && npm run version:all:beta:minor && npm run release:push", "release:beta:minor": "npm run release:check && npm run version:all:beta:minor && npm run release:push",
+1 -1
View File
@@ -321,7 +321,7 @@ function ensureRelayBuildArtifact(repoRoot: string): void {
} }
console.log("[e2e] Building @getpaseo/relay for daemon startup"); console.log("[e2e] Building @getpaseo/relay for daemon startup");
execSync("npm run build --workspace=@getpaseo/relay", { execSync("npm run build:relay", {
cwd: repoRoot, cwd: repoRoot,
stdio: "inherit", stdio: "inherit",
}); });
@@ -1,7 +1,6 @@
import { expect, type Page } from "@playwright/test"; import { expect, type Page } from "@playwright/test";
import path from "node:path";
import { pathToFileURL } from "node:url";
import { randomUUID } from "node:crypto"; import { randomUUID } from "node:crypto";
import { loadDaemonClientConstructor } from "./daemon-client-loader";
import { createNodeWebSocketFactory, type NodeWebSocketFactory } from "./node-ws-factory"; import { createNodeWebSocketFactory, type NodeWebSocketFactory } from "./node-ws-factory";
import { buildHostWorkspaceRoute } from "../../src/utils/host-routes"; import { buildHostWorkspaceRoute } from "../../src/utils/host-routes";
@@ -91,21 +90,11 @@ interface DaemonClientConfig {
webSocketFactory?: NodeWebSocketFactory; webSocketFactory?: NodeWebSocketFactory;
} }
async function loadDaemonClientConstructor(): Promise<
new (config: DaemonClientConfig) => DaemonClientInstance
> {
const repoRoot = path.resolve(__dirname, "../../../../");
const moduleUrl = pathToFileURL(
path.join(repoRoot, "packages/server/dist/server/server/exports.js"),
).href;
const mod = (await import(moduleUrl)) as {
DaemonClient: new (config: DaemonClientConfig) => DaemonClientInstance;
};
return mod.DaemonClient;
}
export async function connectDaemonClient(): Promise<DaemonClientInstance> { export async function connectDaemonClient(): Promise<DaemonClientInstance> {
const DaemonClient = await loadDaemonClientConstructor(); const DaemonClient = await loadDaemonClientConstructor<
DaemonClientConfig,
DaemonClientInstance
>();
const webSocketFactory = createNodeWebSocketFactory(); const webSocketFactory = createNodeWebSocketFactory();
const client = new DaemonClient({ const client = new DaemonClient({
url: getDaemonWsUrl(), url: getDaemonWsUrl(),
+5 -16
View File
@@ -1,8 +1,7 @@
import { randomUUID } from "node:crypto"; import { randomUUID } from "node:crypto";
import path from "node:path";
import { pathToFileURL } from "node:url";
import { expect, type Page } from "@playwright/test"; import { expect, type Page } from "@playwright/test";
import { buildCreateAgentPreferences, buildSeededHost } from "./daemon-registry"; import { buildCreateAgentPreferences, buildSeededHost } from "./daemon-registry";
import { loadDaemonClientConstructor } from "./daemon-client-loader";
import { createNodeWebSocketFactory, type NodeWebSocketFactory } from "./node-ws-factory"; import { createNodeWebSocketFactory, type NodeWebSocketFactory } from "./node-ws-factory";
import { waitForWorkspaceTabsVisible } from "./workspace-tabs"; import { waitForWorkspaceTabsVisible } from "./workspace-tabs";
import { import {
@@ -83,21 +82,11 @@ interface ArchiveTabDaemonClientConfig {
webSocketFactory?: NodeWebSocketFactory; webSocketFactory?: NodeWebSocketFactory;
} }
async function loadDaemonClientConstructor(): Promise<
new (config: ArchiveTabDaemonClientConfig) => ArchiveTabDaemonClient
> {
const repoRoot = path.resolve(__dirname, "../../../../");
const moduleUrl = pathToFileURL(
path.join(repoRoot, "packages/server/dist/server/server/exports.js"),
).href;
const mod = (await import(moduleUrl)) as {
DaemonClient: new (config: ArchiveTabDaemonClientConfig) => ArchiveTabDaemonClient;
};
return mod.DaemonClient;
}
export async function connectArchiveTabDaemonClient(): Promise<ArchiveTabDaemonClient> { export async function connectArchiveTabDaemonClient(): Promise<ArchiveTabDaemonClient> {
const DaemonClient = await loadDaemonClientConstructor(); const DaemonClient = await loadDaemonClientConstructor<
ArchiveTabDaemonClientConfig,
ArchiveTabDaemonClient
>();
const webSocketFactory = createNodeWebSocketFactory(); const webSocketFactory = createNodeWebSocketFactory();
const client = new DaemonClient({ const client = new DaemonClient({
url: getDaemonWsUrl(), url: getDaemonWsUrl(),
@@ -0,0 +1,15 @@
import path from "node:path";
import { pathToFileURL } from "node:url";
export async function loadDaemonClientConstructor<ClientConfig, ClientInstance>(): Promise<
new (config: ClientConfig) => ClientInstance
> {
const repoRoot = path.resolve(__dirname, "../../../../");
const moduleUrl = pathToFileURL(
path.join(repoRoot, "packages/client/dist/daemon-client.js"),
).href;
const mod = (await import(moduleUrl)) as {
DaemonClient: new (config: ClientConfig) => ClientInstance;
};
return mod.DaemonClient;
}
+7 -18
View File
@@ -1,14 +1,13 @@
import { randomUUID } from "node:crypto"; import { randomUUID } from "node:crypto";
import path from "node:path";
import { pathToFileURL } from "node:url";
import { expect, type Page } from "@playwright/test"; import { expect, type Page } from "@playwright/test";
import type { DaemonClient as ServerDaemonClient } from "@server/client/daemon-client"; import type { DaemonClient as InternalDaemonClient } from "@getpaseo/client/internal/daemon-client";
import { decodeWorkspaceIdFromPathSegment } from "@/utils/host-routes"; import { decodeWorkspaceIdFromPathSegment } from "@/utils/host-routes";
import { loadDaemonClientConstructor } from "./daemon-client-loader";
import { expectWorkspaceHeader, workspaceLabelFromPath } from "./workspace-ui"; import { expectWorkspaceHeader, workspaceLabelFromPath } from "./workspace-ui";
import { createNodeWebSocketFactory, type NodeWebSocketFactory } from "./node-ws-factory"; import { createNodeWebSocketFactory, type NodeWebSocketFactory } from "./node-ws-factory";
type NewWorkspaceDaemonClient = Pick< type NewWorkspaceDaemonClient = Pick<
ServerDaemonClient, InternalDaemonClient,
| "archivePaseoWorktree" | "archivePaseoWorktree"
| "archiveWorkspace" | "archiveWorkspace"
| "close" | "close"
@@ -48,19 +47,6 @@ function getDaemonWsUrl(): string {
return `ws://127.0.0.1:${getDaemonPort()}/ws`; return `ws://127.0.0.1:${getDaemonPort()}/ws`;
} }
async function loadDaemonClientConstructor(): Promise<
new (config: NewWorkspaceDaemonClientConfig) => NewWorkspaceDaemonClient
> {
const repoRoot = path.resolve(__dirname, "../../../../");
const moduleUrl = pathToFileURL(
path.join(repoRoot, "packages/server/dist/server/server/exports.js"),
).href;
const mod = (await import(moduleUrl)) as {
DaemonClient: new (config: NewWorkspaceDaemonClientConfig) => NewWorkspaceDaemonClient;
};
return mod.DaemonClient;
}
function requireWorkspace(payload: OpenProjectPayload) { function requireWorkspace(payload: OpenProjectPayload) {
if (payload.error) { if (payload.error) {
throw new Error(payload.error); throw new Error(payload.error);
@@ -83,7 +69,10 @@ function parseWorkspaceIdFromPageUrl(page: Page, serverId: string): string | nul
} }
export async function connectNewWorkspaceDaemonClient(): Promise<NewWorkspaceDaemonClient> { export async function connectNewWorkspaceDaemonClient(): Promise<NewWorkspaceDaemonClient> {
const DaemonClient = await loadDaemonClientConstructor(); const DaemonClient = await loadDaemonClientConstructor<
NewWorkspaceDaemonClientConfig,
NewWorkspaceDaemonClient
>();
const webSocketFactory = createNodeWebSocketFactory(); const webSocketFactory = createNodeWebSocketFactory();
const client = new DaemonClient({ const client = new DaemonClient({
url: getDaemonWsUrl(), url: getDaemonWsUrl(),
+5 -15
View File
@@ -1,8 +1,8 @@
import { expect, type Page } from "@playwright/test"; import { expect, type Page } from "@playwright/test";
import path from "node:path"; import path from "node:path";
import { pathToFileURL } from "node:url";
import { randomUUID } from "node:crypto"; import { randomUUID } from "node:crypto";
import { readFileSync } from "node:fs"; import { readFileSync } from "node:fs";
import { loadDaemonClientConstructor } from "./daemon-client-loader";
import { createNodeWebSocketFactory, type NodeWebSocketFactory } from "./node-ws-factory"; import { createNodeWebSocketFactory, type NodeWebSocketFactory } from "./node-ws-factory";
import { buildHostWorkspaceRoute } from "../../src/utils/host-routes"; import { buildHostWorkspaceRoute } from "../../src/utils/host-routes";
@@ -81,21 +81,11 @@ interface TerminalPerfDaemonClientConfig {
webSocketFactory?: NodeWebSocketFactory; webSocketFactory?: NodeWebSocketFactory;
} }
async function loadDaemonClientConstructor(): Promise<
new (config: TerminalPerfDaemonClientConfig) => TerminalPerfDaemonClient
> {
const repoRoot = path.resolve(__dirname, "../../../../");
const moduleUrl = pathToFileURL(
path.join(repoRoot, "packages/server/dist/server/server/exports.js"),
).href;
const mod = (await import(moduleUrl)) as {
DaemonClient: new (config: TerminalPerfDaemonClientConfig) => TerminalPerfDaemonClient;
};
return mod.DaemonClient;
}
export async function connectTerminalClient(): Promise<TerminalPerfDaemonClient> { export async function connectTerminalClient(): Promise<TerminalPerfDaemonClient> {
const DaemonClient = await loadDaemonClientConstructor(); const DaemonClient = await loadDaemonClientConstructor<
TerminalPerfDaemonClientConfig,
TerminalPerfDaemonClient
>();
const webSocketFactory = createNodeWebSocketFactory(); const webSocketFactory = createNodeWebSocketFactory();
const client = new DaemonClient({ const client = new DaemonClient({
url: getDaemonWsUrl(), url: getDaemonWsUrl(),
+8 -24
View File
@@ -1,13 +1,12 @@
import { realpathSync } from "node:fs"; import { realpathSync } from "node:fs";
import path from "node:path";
import { randomUUID } from "node:crypto"; import { randomUUID } from "node:crypto";
import { pathToFileURL } from "node:url";
import { expect, type Page } from "@playwright/test"; import { expect, type Page } from "@playwright/test";
import { parseHostWorkspaceRouteFromPathname } from "../../src/utils/host-routes"; import { parseHostWorkspaceRouteFromPathname } from "../../src/utils/host-routes";
import { gotoAppShell } from "./app"; import { gotoAppShell } from "./app";
import { loadDaemonClientConstructor } from "./daemon-client-loader";
import { createNodeWebSocketFactory, type NodeWebSocketFactory } from "./node-ws-factory"; import { createNodeWebSocketFactory, type NodeWebSocketFactory } from "./node-ws-factory";
import { switchWorkspaceViaSidebar } from "./workspace-ui"; import { switchWorkspaceViaSidebar } from "./workspace-ui";
import type { SessionOutboundMessage } from "@server/shared/messages"; import type { SessionOutboundMessage } from "@getpaseo/protocol/messages";
interface WorkspaceSetupDaemonClient { interface WorkspaceSetupDaemonClient {
connect(): Promise<void>; connect(): Promise<void>;
@@ -70,31 +69,16 @@ function getDaemonWsUrl(): string {
return `ws://127.0.0.1:${daemonPort}/ws`; return `ws://127.0.0.1:${daemonPort}/ws`;
} }
async function loadDaemonClientConstructor(): Promise< export async function connectWorkspaceSetupClient(): Promise<WorkspaceSetupDaemonClient> {
new (config: { const DaemonClient = await loadDaemonClientConstructor<
url: string; {
clientId: string;
clientType: "cli";
webSocketFactory?: NodeWebSocketFactory;
}) => WorkspaceSetupDaemonClient
> {
const repoRoot = path.resolve(process.cwd(), "../..");
const moduleUrl = pathToFileURL(
path.join(repoRoot, "packages/server/dist/server/server/exports.js"),
).href;
const mod = (await import(moduleUrl)) as {
DaemonClient: new (config: {
url: string; url: string;
clientId: string; clientId: string;
clientType: "cli"; clientType: "cli";
webSocketFactory?: NodeWebSocketFactory; webSocketFactory?: NodeWebSocketFactory;
}) => WorkspaceSetupDaemonClient; },
}; WorkspaceSetupDaemonClient
return mod.DaemonClient; >();
}
export async function connectWorkspaceSetupClient(): Promise<WorkspaceSetupDaemonClient> {
const DaemonClient = await loadDaemonClientConstructor();
const webSocketFactory = createNodeWebSocketFactory(); const webSocketFactory = createNodeWebSocketFactory();
const client = new DaemonClient({ const client = new DaemonClient({
url: getDaemonWsUrl(), url: getDaemonWsUrl(),
@@ -15,6 +15,7 @@ OUT_DIR="/tmp/paseo-workspace-create-android-focus-$(date +%s)"
VIDEO_DIR="/tmp/paseo-maestro-videos" VIDEO_DIR="/tmp/paseo-maestro-videos"
DEVICE_VIDEO="/sdcard/paseo-maestro-workspace-create-focused.mp4" DEVICE_VIDEO="/sdcard/paseo-maestro-workspace-create-focused.mp4"
LOCAL_VIDEO="$VIDEO_DIR/paseo-maestro-workspace-create-focused.mp4" LOCAL_VIDEO="$VIDEO_DIR/paseo-maestro-workspace-create-focused.mp4"
CLIENT_EXPORTS="$REPO_ROOT/packages/client/dist/daemon-client.js"
export PASEO_MAESTRO_APP_ID="${PASEO_MAESTRO_APP_ID:-sh.paseo.debug}" export PASEO_MAESTRO_APP_ID="${PASEO_MAESTRO_APP_ID:-sh.paseo.debug}"
export PASEO_MAESTRO_DIRECT_ENDPOINT="${PASEO_MAESTRO_DIRECT_ENDPOINT:-127.0.0.1:6767}" export PASEO_MAESTRO_DIRECT_ENDPOINT="${PASEO_MAESTRO_DIRECT_ENDPOINT:-127.0.0.1:6767}"
@@ -55,6 +56,12 @@ require_command perl
mkdir -p "$OUT_DIR" "$VIDEO_DIR" mkdir -p "$OUT_DIR" "$VIDEO_DIR"
if [ ! -f "$CLIENT_EXPORTS" ]; then
echo "Missing client build artifact: $CLIENT_EXPORTS" >&2
echo "Run: npm run build:client" >&2
exit 1
fi
if [ -z "${PASEO_MAESTRO_PROJECT_PATH:-}" ]; then if [ -z "${PASEO_MAESTRO_PROJECT_PATH:-}" ]; then
PROJECT_PARENT="$(mktemp -d /tmp/paseo-maestro-project-XXXXXX)" PROJECT_PARENT="$(mktemp -d /tmp/paseo-maestro-project-XXXXXX)"
PROJECT_BASENAME="aaa-workspace-create-android-$(basename "$PROJECT_PARENT")" PROJECT_BASENAME="aaa-workspace-create-android-$(basename "$PROJECT_PARENT")"
@@ -96,7 +103,7 @@ if (!repoRoot || !projectPath || !daemonUrl) {
throw new Error("Missing required environment for daemon project setup."); throw new Error("Missing required environment for daemon project setup.");
} }
const moduleUrl = pathToFileURL(`${repoRoot}/packages/server/dist/server/server/exports.js`).href; const moduleUrl = pathToFileURL(`${repoRoot}/packages/client/dist/daemon-client.js`).href;
const { DaemonClient } = await import(moduleUrl); const { DaemonClient } = await import(moduleUrl);
const client = new DaemonClient({ const client = new DaemonClient({
url: daemonUrl, url: daemonUrl,
@@ -24,7 +24,7 @@ REPO_ROOT="$(cd "$(dirname "$0")/../../.." && pwd)"
FLOW_TEMPLATE="$REPO_ROOT/packages/app/maestro/workspace-create-android-crash.yaml" FLOW_TEMPLATE="$REPO_ROOT/packages/app/maestro/workspace-create-android-crash.yaml"
FLOW_TEMPLATE_DIR="$REPO_ROOT/packages/app/maestro" FLOW_TEMPLATE_DIR="$REPO_ROOT/packages/app/maestro"
OUT_DIR="/tmp/paseo-workspace-create-android-$(date +%s)" OUT_DIR="/tmp/paseo-workspace-create-android-$(date +%s)"
SERVER_EXPORTS="$REPO_ROOT/packages/server/dist/server/server/exports.js" CLIENT_EXPORTS="$REPO_ROOT/packages/client/dist/daemon-client.js"
export PASEO_MAESTRO_APP_ID="${PASEO_MAESTRO_APP_ID:-sh.paseo.debug}" export PASEO_MAESTRO_APP_ID="${PASEO_MAESTRO_APP_ID:-sh.paseo.debug}"
export PASEO_MAESTRO_DIRECT_ENDPOINT="${PASEO_MAESTRO_DIRECT_ENDPOINT:-127.0.0.1:6767}" export PASEO_MAESTRO_DIRECT_ENDPOINT="${PASEO_MAESTRO_DIRECT_ENDPOINT:-127.0.0.1:6767}"
@@ -62,9 +62,9 @@ render_flow_tree() {
done done
} }
if [ ! -f "$SERVER_EXPORTS" ]; then if [ ! -f "$CLIENT_EXPORTS" ]; then
echo "Missing server build artifact: $SERVER_EXPORTS" >&2 echo "Missing client build artifact: $CLIENT_EXPORTS" >&2
echo "Run: npm run build --workspace=@getpaseo/server" >&2 echo "Run: npm run build:client" >&2
exit 1 exit 1
fi fi
@@ -117,7 +117,7 @@ if (!repoRoot || !projectPath || !daemonUrl) {
throw new Error("Missing required environment for daemon project setup."); throw new Error("Missing required environment for daemon project setup.");
} }
const moduleUrl = pathToFileURL(`${repoRoot}/packages/server/dist/server/server/exports.js`).href; const moduleUrl = pathToFileURL(`${repoRoot}/packages/client/dist/daemon-client.js`).href;
const { DaemonClient } = await import(moduleUrl); const { DaemonClient } = await import(moduleUrl);
const client = new DaemonClient({ const client = new DaemonClient({
url: daemonUrl, url: daemonUrl,
+1 -6
View File
@@ -6,7 +6,6 @@ const path = require("path");
const projectRoot = __dirname; const projectRoot = __dirname;
const appNodeModulesRoot = path.resolve(projectRoot, "node_modules"); const appNodeModulesRoot = path.resolve(projectRoot, "node_modules");
const appSrcRoot = path.resolve(projectRoot, "src"); const appSrcRoot = path.resolve(projectRoot, "src");
const serverSrcRoot = path.resolve(projectRoot, "../server/src");
const relaySrcRoot = path.resolve(projectRoot, "../relay/src"); const relaySrcRoot = path.resolve(projectRoot, "../relay/src");
const customWebPlatform = (process.env.PASEO_WEB_PLATFORM ?? "") const customWebPlatform = (process.env.PASEO_WEB_PLATFORM ?? "")
.trim() .trim()
@@ -68,11 +67,7 @@ function resolveWithCustomWebOverlay(context, moduleName, platform) {
config.resolver.resolveRequest = (context, moduleName, platform) => { config.resolver.resolveRequest = (context, moduleName, platform) => {
const origin = context.originModulePath; const origin = context.originModulePath;
if ( if (origin && origin.startsWith(relaySrcRoot) && moduleName.endsWith(".js")) {
origin &&
(origin.startsWith(serverSrcRoot) || origin.startsWith(relaySrcRoot)) &&
moduleName.endsWith(".js")
) {
const tsModuleName = moduleName.replace(/\.js$/, ".ts"); const tsModuleName = moduleName.replace(/\.js$/, ".ts");
const candidatePath = path.resolve(path.dirname(origin), tsModuleName); const candidatePath = path.resolve(path.dirname(origin), tsModuleName);
if (fs.existsSync(candidatePath)) { if (fs.existsSync(candidatePath)) {
+15 -11
View File
@@ -4,19 +4,19 @@
"private": true, "private": true,
"main": "index.ts", "main": "index.ts",
"scripts": { "scripts": {
"start": "cross-env APP_VARIANT=development expo start", "start": "npm --prefix ../.. run build:client && concurrently --kill-others --names protocol,client,expo --prefix-colors yellow,blue,magenta \"npm --prefix ../.. run watch:protocol\" \"npm --prefix ../.. run watch:client\" \"npm run start:expo\"",
"build:terminal-webview": "node ./scripts/build-terminal-webview-html.mjs", "start:expo": "cross-env APP_VARIANT=development expo start",
"reset-project": "node ./scripts/reset-project.js", "reset-project": "node ./scripts/reset-project.js",
"build:workspace-deps": "npm run build --workspace=@getpaseo/highlight && npm run build --workspace=@getpaseo/expo-two-way-audio", "eas-build-post-install": "npm --prefix ../.. run build:app-deps && npm run build:terminal-webview",
"eas-build-post-install": "npm run build:workspace-deps && npm run build:terminal-webview",
"android": "npm run android:development", "android": "npm run android:development",
"android:development": "cross-env APP_VARIANT=development expo prebuild --platform android --non-interactive && cross-env APP_VARIANT=development expo run:android --variant=debug", "android:development": "npm --prefix ../.. run build:client && cross-env APP_VARIANT=development expo prebuild --platform android --non-interactive && cross-env APP_VARIANT=development expo run:android --variant=debug",
"android:production": "cross-env APP_VARIANT=production expo prebuild --platform android --non-interactive && cross-env APP_VARIANT=production expo run:android --variant=release", "android:production": "npm --prefix ../.. run build:client && cross-env APP_VARIANT=production expo prebuild --platform android --non-interactive && cross-env APP_VARIANT=production expo run:android --variant=release",
"android:release": "npm run android:production", "android:release": "npm run android:production",
"android:clear": "node -e \"require('node:fs').rmSync('android', { recursive: true, force: true })\"", "android:clear": "node -e \"require('node:fs').rmSync('android', { recursive: true, force: true })\"",
"ios": "expo run:ios", "ios": "npm --prefix ../.. run build:client && expo run:ios",
"ios:release": "expo run:ios --configuration Release", "ios:release": "npm --prefix ../.. run build:client && expo run:ios --configuration Release",
"web": "expo start --web", "web": "npm --prefix ../.. run build:client && concurrently --kill-others --names protocol,client,expo --prefix-colors yellow,blue,magenta \"npm --prefix ../.. run watch:protocol\" \"npm --prefix ../.. run watch:client\" \"npm run web:expo\"",
"web:expo": "expo start --web",
"lint": "expo lint", "lint": "expo lint",
"typecheck": "tsgo --noEmit", "typecheck": "tsgo --noEmit",
"test": "vitest run", "test": "vitest run",
@@ -25,16 +25,19 @@
"test:e2e:real": "playwright test --project=real-provider", "test:e2e:real": "playwright test --project=real-provider",
"test:e2e:ui": "playwright test --ui", "test:e2e:ui": "playwright test --ui",
"build": "npm run build:web", "build": "npm run build:web",
"build:web": "npm run build:workspace-deps && expo export --platform web", "build:web": "npm --prefix ../.. run build:app-deps && expo export --platform web",
"deploy:web": "npm run build:web && wrangler pages deploy dist --project-name paseo-app --branch main" "deploy:web": "npm run build:web && wrangler pages deploy dist --project-name paseo-app --branch main",
"build:terminal-webview": "node ./scripts/build-terminal-webview-html.mjs"
}, },
"dependencies": { "dependencies": {
"@dnd-kit/core": "^6.3.1", "@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0", "@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2", "@dnd-kit/utilities": "^3.2.2",
"@floating-ui/react-native": "^0.10.7", "@floating-ui/react-native": "^0.10.7",
"@getpaseo/client": "*",
"@getpaseo/expo-two-way-audio": "*", "@getpaseo/expo-two-way-audio": "*",
"@getpaseo/highlight": "*", "@getpaseo/highlight": "*",
"@getpaseo/protocol": "*",
"@gorhom/bottom-sheet": "^5.2.14", "@gorhom/bottom-sheet": "^5.2.14",
"@gorhom/portal": "^1.0.14", "@gorhom/portal": "^1.0.14",
"@react-native-async-storage/async-storage": "2.2.0", "@react-native-async-storage/async-storage": "2.2.0",
@@ -105,6 +108,7 @@
}, },
"devDependencies": { "devDependencies": {
"@playwright/test": "^1.56.1", "@playwright/test": "^1.56.1",
"@testing-library/dom": "^10.4.1",
"@testing-library/react": "^16.3.2", "@testing-library/react": "^16.3.2",
"@types/markdown-it": "^14.1.2", "@types/markdown-it": "^14.1.2",
"@types/qrcode": "^1.5.6", "@types/qrcode": "^1.5.6",
+2 -2
View File
@@ -43,13 +43,13 @@ import type { PendingPermission } from "@/types/shared";
import type { import type {
AgentPermissionAction, AgentPermissionAction,
AgentPermissionResponse, AgentPermissionResponse,
} from "@server/server/agent/agent-sdk-types"; } from "@getpaseo/protocol/agent-types";
import type { AgentScreenAgent } from "@/hooks/use-agent-screen-state-machine"; import type { AgentScreenAgent } from "@/hooks/use-agent-screen-state-machine";
import { useSessionStore } from "@/stores/session-store"; import { useSessionStore } from "@/stores/session-store";
import { useFileExplorerActions } from "@/hooks/use-file-explorer-actions"; import { useFileExplorerActions } from "@/hooks/use-file-explorer-actions";
import { useLoadOlderAgentHistory } from "@/hooks/use-load-older-agent-history"; import { useLoadOlderAgentHistory } from "@/hooks/use-load-older-agent-history";
import type { ToastApi } from "@/components/toast-host"; import type { ToastApi } from "@/components/toast-host";
import type { DaemonClient } from "@server/client/daemon-client"; import type { DaemonClient } from "@getpaseo/client/internal/daemon-client";
import { ToolCallDetailsContent } from "@/components/tool-call-details"; import { ToolCallDetailsContent } from "@/components/tool-call-details";
import { QuestionFormCard } from "@/components/question-form-card"; import { QuestionFormCard } from "@/components/question-form-card";
import { ToolCallSheetProvider } from "@/components/tool-call-sheet"; import { ToolCallSheetProvider } from "@/components/tool-call-sheet";
+1 -1
View File
@@ -8,7 +8,7 @@ import type { BarcodeScanningResult, BarcodeSettings } from "expo-camera";
import { useHostMutations } from "@/runtime/host-runtime"; import { useHostMutations } from "@/runtime/host-runtime";
import { decodeOfferFragmentPayload, normalizeHostPort } from "@/utils/daemon-endpoints"; import { decodeOfferFragmentPayload, normalizeHostPort } from "@/utils/daemon-endpoints";
import { connectToDaemon } from "@/utils/test-daemon-connection"; import { connectToDaemon } from "@/utils/test-daemon-connection";
import { ConnectionOfferSchema } from "@server/shared/connection-offer"; import { ConnectionOfferSchema } from "@getpaseo/protocol/connection-offer";
import { buildHostRootRoute, buildSettingsHostRoute } from "@/utils/host-routes"; import { buildHostRootRoute, buildSettingsHostRoute } from "@/utils/host-routes";
import { isWeb } from "@/constants/platform"; import { isWeb } from "@/constants/platform";
import { BackHeader } from "@/components/headers/back-header"; import { BackHeader } from "@/components/headers/back-header";
+1 -1
View File
@@ -1,4 +1,4 @@
import type { AgentAttachment, GitHubSearchItem } from "@server/shared/messages"; import type { AgentAttachment, GitHubSearchItem } from "@getpaseo/protocol/messages";
export type AttachmentStorageType = "web-indexeddb" | "desktop-file" | "native-file"; export type AttachmentStorageType = "web-indexeddb" | "desktop-file" | "native-file";
@@ -3,7 +3,7 @@ import type {
UserComposerAttachment, UserComposerAttachment,
WorkspaceComposerAttachment, WorkspaceComposerAttachment,
} from "@/attachments/types"; } from "@/attachments/types";
import type { AgentAttachment } from "@server/shared/messages"; import type { AgentAttachment } from "@getpaseo/protocol/messages";
export function isWorkspaceAttachment( export function isWorkspaceAttachment(
attachment: ComposerAttachment | undefined, attachment: ComposerAttachment | undefined,
@@ -4,7 +4,7 @@ import { StyleSheet, useUnistyles } from "react-native-unistyles";
import { import {
AGENT_LIFECYCLE_STATUSES, AGENT_LIFECYCLE_STATUSES,
type AgentLifecycleStatus, type AgentLifecycleStatus,
} from "@server/shared/agent-lifecycle"; } from "@getpaseo/protocol/agent-lifecycle";
import { deriveSidebarStateBucket } from "@/utils/sidebar-agent-state"; import { deriveSidebarStateBucket } from "@/utils/sidebar-agent-state";
import { getStatusDotColor } from "@/utils/status-dot-color"; import { getStatusDotColor } from "@/utils/status-dot-color";
@@ -19,7 +19,7 @@ import {
Settings, Settings,
Star, Star,
} from "lucide-react-native"; } from "lucide-react-native";
import type { AgentProvider } from "@server/server/agent/agent-sdk-types"; import type { AgentProvider } from "@getpaseo/protocol/agent-types";
import type { SheetHeader } from "@/components/adaptive-modal-sheet"; import type { SheetHeader } from "@/components/adaptive-modal-sheet";
import { useProviderSettingsStore } from "@/stores/provider-settings-store"; import { useProviderSettingsStore } from "@/stores/provider-settings-store";
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
+1 -1
View File
@@ -1,6 +1,6 @@
import React, { useEffect, useMemo, useRef } from "react"; import React, { useEffect, useMemo, useRef } from "react";
import { useQuery } from "@tanstack/react-query"; import { useQuery } from "@tanstack/react-query";
import type { FileReadResult } from "@server/client/daemon-client"; import type { FileReadResult } from "@getpaseo/client/internal/daemon-client";
import Markdown, { MarkdownIt } from "react-native-markdown-display"; import Markdown, { MarkdownIt } from "react-native-markdown-display";
import { import {
ActivityIndicator, ActivityIndicator,
@@ -5,7 +5,7 @@ import {
isKnownEditorTargetId, isKnownEditorTargetId,
type EditorTargetId, type EditorTargetId,
type KnownEditorTargetId, type KnownEditorTargetId,
} from "@server/shared/messages"; } from "@getpaseo/protocol/messages";
interface EditorAppIconProps { interface EditorAppIconProps {
editorId: EditorTargetId; editorId: EditorTargetId;
@@ -4,8 +4,11 @@
import React, { type ReactNode } from "react"; import React, { type ReactNode } from "react";
import { cleanup, fireEvent, render, screen, waitFor } from "@testing-library/react"; import { cleanup, fireEvent, render, screen, waitFor } from "@testing-library/react";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import type { DaemonClient, FetchRecentProviderSessionEntry } from "@server/client/daemon-client"; import type {
import type { ProviderSnapshotEntry } from "@server/server/agent/agent-sdk-types"; DaemonClient,
FetchRecentProviderSessionEntry,
} from "@getpaseo/client/internal/daemon-client";
import type { ProviderSnapshotEntry } from "@getpaseo/protocol/agent-types";
import { afterEach, describe, expect, it, vi } from "vitest"; import { afterEach, describe, expect, it, vi } from "vitest";
import { ImportSessionSheet } from "@/components/import-session-sheet"; import { ImportSessionSheet } from "@/components/import-session-sheet";
@@ -1,9 +1,12 @@
import React, { useCallback, useEffect, useMemo, useState } from "react"; import React, { useCallback, useEffect, useMemo, useState } from "react";
import { Pressable, type PressableStateCallbackType, ScrollView, Text, View } from "react-native"; import { Pressable, type PressableStateCallbackType, ScrollView, Text, View } from "react-native";
import { useMutation, useQueries, useQueryClient } from "@tanstack/react-query"; import { useMutation, useQueries, useQueryClient } from "@tanstack/react-query";
import type { DaemonClient, FetchRecentProviderSessionEntry } from "@server/client/daemon-client"; import type {
import type { AgentProvider } from "@server/server/agent/agent-sdk-types"; DaemonClient,
import { IMPORTABLE_PROVIDERS } from "@server/shared/importable-providers"; FetchRecentProviderSessionEntry,
} from "@getpaseo/client/internal/daemon-client";
import type { AgentProvider } from "@getpaseo/protocol/agent-types";
import { IMPORTABLE_PROVIDERS } from "@getpaseo/protocol/importable-providers";
import { Inbox, RotateCw } from "lucide-react-native"; import { Inbox, RotateCw } from "lucide-react-native";
import { StyleSheet, useUnistyles } from "react-native-unistyles"; import { StyleSheet, useUnistyles } from "react-native-unistyles";
import { AdaptiveModalSheet, type SheetHeader } from "@/components/adaptive-modal-sheet"; import { AdaptiveModalSheet, type SheetHeader } from "@/components/adaptive-modal-sheet";
+4 -4
View File
@@ -64,8 +64,8 @@ import Svg, { Defs, LinearGradient as SvgLinearGradient, Rect, Stop } from "reac
import { createMarkdownStyles } from "@/styles/markdown-styles"; import { createMarkdownStyles } from "@/styles/markdown-styles";
import { Fonts } from "@/constants/theme"; import { Fonts } from "@/constants/theme";
import type { TodoEntry, UserMessageImageAttachment } from "@/types/stream"; import type { TodoEntry, UserMessageImageAttachment } from "@/types/stream";
import type { AgentAttachment } from "@server/shared/messages"; import type { AgentAttachment } from "@getpaseo/protocol/messages";
import type { ToolCallDetail } from "@server/server/agent/agent-sdk-types"; import type { ToolCallDetail } from "@getpaseo/protocol/agent-types";
import { buildToolCallPresentation } from "@/tool-calls/presentation"; import { buildToolCallPresentation } from "@/tool-calls/presentation";
import { resolveToolCallIcon } from "@/utils/tool-call-icon"; import { resolveToolCallIcon } from "@/utils/tool-call-icon";
import { getMarkdownListMarker, getMarkdownListSpacing } from "@/utils/markdown-list"; import { getMarkdownListMarker, getMarkdownListSpacing } from "@/utils/markdown-list";
@@ -101,9 +101,9 @@ import {
import { getCompactionMarkerLabel } from "./message-compaction-label"; import { getCompactionMarkerLabel } from "./message-compaction-label";
import { useAttachmentPreviewUrl } from "@/attachments/use-attachment-preview-url"; import { useAttachmentPreviewUrl } from "@/attachments/use-attachment-preview-url";
import { persistAttachmentFromBytes, persistAttachmentFromDataUrl } from "@/attachments/service"; import { persistAttachmentFromBytes, persistAttachmentFromDataUrl } from "@/attachments/service";
import type { DaemonClient } from "@server/client/daemon-client"; import type { DaemonClient } from "@getpaseo/client/internal/daemon-client";
import { isWeb, isNative } from "@/constants/platform"; import { isWeb, isNative } from "@/constants/platform";
import type { AgentCapabilityFlags } from "@server/server/agent/agent-sdk-types"; import type { AgentCapabilityFlags } from "@getpaseo/protocol/agent-types";
import { RewindMenu, type RewindMode } from "@/components/rewind/rewind-menu"; import { RewindMenu, type RewindMode } from "@/components/rewind/rewind-menu";
import { useRewindAgentMutation } from "@/components/rewind/use-rewind-agent-mutation"; import { useRewindAgentMutation } from "@/components/rewind/use-rewind-agent-mutation";
export type { InlinePathTarget } from "@/assistant-file-links"; export type { InlinePathTarget } from "@/assistant-file-links";
@@ -7,7 +7,7 @@ import type { HostProfile } from "@/types/host-connection";
import { useHosts, useHostMutations } from "@/runtime/host-runtime"; import { useHosts, useHostMutations } from "@/runtime/host-runtime";
import { decodeOfferFragmentPayload, normalizeHostPort } from "@/utils/daemon-endpoints"; import { decodeOfferFragmentPayload, normalizeHostPort } from "@/utils/daemon-endpoints";
import { connectToDaemon } from "@/utils/test-daemon-connection"; import { connectToDaemon } from "@/utils/test-daemon-connection";
import { ConnectionOfferSchema } from "@server/shared/connection-offer"; import { ConnectionOfferSchema } from "@getpaseo/protocol/connection-offer";
import { AdaptiveModalSheet, AdaptiveTextInput, type SheetHeader } from "./adaptive-modal-sheet"; import { AdaptiveModalSheet, AdaptiveTextInput, type SheetHeader } from "./adaptive-modal-sheet";
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
@@ -25,8 +25,8 @@ import { settingsStyles } from "@/styles/settings";
import { resolveProviderLabel } from "@/utils/provider-definitions"; import { resolveProviderLabel } from "@/utils/provider-definitions";
import { formatTimeAgo } from "@/utils/time"; import { formatTimeAgo } from "@/utils/time";
import { compareMatchScores, scoreTextFields } from "@/utils/score-match"; import { compareMatchScores, scoreTextFields } from "@/utils/score-match";
import type { AgentModelDefinition, AgentProvider } from "@server/server/agent/agent-sdk-types"; import type { AgentModelDefinition, AgentProvider } from "@getpaseo/protocol/agent-types";
import type { ProviderProfileModel } from "@server/server/agent/provider-launch-config"; import type { ProviderProfileModel } from "@getpaseo/protocol/provider-config";
interface ProviderDiagnosticSheetProps { interface ProviderDiagnosticSheetProps {
provider: string; provider: string;
@@ -11,7 +11,7 @@ import { StyleSheet, useUnistyles } from "react-native-unistyles";
import { useIsCompactFormFactor } from "@/constants/layout"; import { useIsCompactFormFactor } from "@/constants/layout";
import { Check, CircleHelp, X } from "lucide-react-native"; import { Check, CircleHelp, X } from "lucide-react-native";
import type { PendingPermission } from "@/types/shared"; import type { PendingPermission } from "@/types/shared";
import type { AgentPermissionResponse } from "@server/server/agent/agent-sdk-types"; import type { AgentPermissionResponse } from "@getpaseo/protocol/agent-types";
import { isWeb } from "@/constants/platform"; import { isWeb } from "@/constants/platform";
interface QuestionOption { interface QuestionOption {
@@ -11,7 +11,7 @@ import {
} from "@/components/ui/dropdown-menu"; } from "@/components/ui/dropdown-menu";
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
import { type RewindMode, useRewindCapabilities } from "./use-rewind-capabilities"; import { type RewindMode, useRewindCapabilities } from "./use-rewind-capabilities";
import type { AgentCapabilityFlags } from "@server/server/agent/agent-sdk-types"; import type { AgentCapabilityFlags } from "@getpaseo/protocol/agent-types";
export type { RewindMode }; export type { RewindMode };
@@ -1,7 +1,7 @@
import { useCallback } from "react"; import { useCallback } from "react";
import { useMutation } from "@tanstack/react-query"; import { useMutation } from "@tanstack/react-query";
import { useToast } from "@/contexts/toast-context"; import { useToast } from "@/contexts/toast-context";
import type { DaemonClient } from "@server/client/daemon-client"; import type { DaemonClient } from "@getpaseo/client/internal/daemon-client";
import type { RewindMode } from "./use-rewind-capabilities"; import type { RewindMode } from "./use-rewind-capabilities";
import { useRewindComposerRestore } from "./composer-restore"; import { useRewindComposerRestore } from "./composer-restore";
import { useSessionStore } from "@/stores/session-store"; import { useSessionStore } from "@/stores/session-store";
@@ -1,5 +1,5 @@
import { useMemo } from "react"; import { useMemo } from "react";
import type { AgentCapabilityFlags } from "@server/server/agent/agent-sdk-types"; import type { AgentCapabilityFlags } from "@getpaseo/protocol/agent-types";
export type RewindMode = "conversation" | "files" | "both"; export type RewindMode = "conversation" | "files" | "both";
@@ -2,8 +2,8 @@
* @vitest-environment jsdom * @vitest-environment jsdom
*/ */
import { act } from "@testing-library/react"; import { act } from "@testing-library/react";
import type { DaemonClient } from "@server/client/daemon-client"; import type { DaemonClient } from "@getpaseo/client/internal/daemon-client";
import type { WorkspaceScriptPayload } from "@server/shared/messages"; import type { WorkspaceScriptPayload } from "@getpaseo/protocol/messages";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { createRoot, type Root } from "react-dom/client"; import { createRoot, type Root } from "react-dom/client";
import React from "react"; import React from "react";
@@ -13,7 +13,7 @@ import {
} from "react-native"; } from "react-native";
import * as Haptics from "expo-haptics"; import * as Haptics from "expo-haptics";
import { useMutation, useQueries, useQueryClient } from "@tanstack/react-query"; import { useMutation, useQueries, useQueryClient } from "@tanstack/react-query";
import { slugify, validateBranchSlug, MAX_SLUG_LENGTH } from "@server/utils/branch-slug"; import { slugify, validateBranchSlug, MAX_SLUG_LENGTH } from "@getpaseo/server/utils/branch-slug";
import { AdaptiveRenameModal } from "@/components/rename-modal"; import { AdaptiveRenameModal } from "@/components/rename-modal";
import { invalidateCheckoutGitQueriesForClient } from "@/git/query-keys"; import { invalidateCheckoutGitQueriesForClient } from "@/git/query-keys";
import { import {
@@ -18,8 +18,8 @@ import {
} from "react-native"; } from "react-native";
import { WebView, type WebViewMessageEvent } from "react-native-webview"; import { WebView, type WebViewMessageEvent } from "react-native-webview";
import type { ITheme } from "@xterm/xterm"; import type { ITheme } from "@xterm/xterm";
import type { TerminalState } from "@server/shared/messages"; import type { TerminalState } from "@getpaseo/protocol/messages";
import type { TerminalInputModeState } from "@server/shared/terminal-input-mode"; import type { TerminalInputModeState } from "@getpaseo/protocol/terminal-input-mode";
import type { TerminalOutputData } from "../terminal/runtime/terminal-emulator-runtime"; import type { TerminalOutputData } from "../terminal/runtime/terminal-emulator-runtime";
import type { import type {
TerminalLocalFileLinkSource, TerminalLocalFileLinkSource,
@@ -17,8 +17,8 @@ import type { DOMProps } from "expo/dom";
import { useDOMImperativeHandle, type DOMImperativeFactory } from "expo/dom"; import { useDOMImperativeHandle, type DOMImperativeFactory } from "expo/dom";
import "@xterm/xterm/css/xterm.css"; import "@xterm/xterm/css/xterm.css";
import type { ITheme } from "@xterm/xterm"; import type { ITheme } from "@xterm/xterm";
import type { TerminalState } from "@server/shared/messages"; import type { TerminalState } from "@getpaseo/protocol/messages";
import type { TerminalInputModeState } from "@server/shared/terminal-input-mode"; import type { TerminalInputModeState } from "@getpaseo/protocol/terminal-input-mode";
import type { PendingTerminalModifiers } from "../utils/terminal-keys"; import type { PendingTerminalModifiers } from "../utils/terminal-keys";
import { import {
TerminalEmulatorRuntime, TerminalEmulatorRuntime,
@@ -8,8 +8,8 @@ import {
} from "react-native"; } from "react-native";
import Animated, { runOnJS, useAnimatedReaction } from "react-native-reanimated"; import Animated, { runOnJS, useAnimatedReaction } from "react-native-reanimated";
import { StyleSheet, useUnistyles } from "react-native-unistyles"; import { StyleSheet, useUnistyles } from "react-native-unistyles";
import { encodeTerminalKeyInput } from "@server/shared/terminal-key-input"; import { encodeTerminalKeyInput } from "@getpaseo/protocol/terminal-key-input";
import type { TerminalInputModeState } from "@server/shared/terminal-input-mode"; import type { TerminalInputModeState } from "@getpaseo/protocol/terminal-input-mode";
import { useHostRuntimeClient, useHostRuntimeIsConnected } from "@/runtime/host-runtime"; import { useHostRuntimeClient, useHostRuntimeIsConnected } from "@/runtime/host-runtime";
import { useKeyboardShiftStyle } from "@/hooks/use-keyboard-shift-style"; import { useKeyboardShiftStyle } from "@/hooks/use-keyboard-shift-style";
import { useAppVisible } from "@/hooks/use-app-visible"; import { useAppVisible } from "@/hooks/use-app-visible";
@@ -9,7 +9,7 @@ import {
import { ScrollView as GHScrollView } from "react-native-gesture-handler"; import { ScrollView as GHScrollView } from "react-native-gesture-handler";
import { StyleSheet } from "react-native-unistyles"; import { StyleSheet } from "react-native-unistyles";
import { Fonts } from "@/constants/theme"; import { Fonts } from "@/constants/theme";
import type { ToolCallDetail } from "@server/server/agent/agent-sdk-types"; import type { ToolCallDetail } from "@getpaseo/protocol/agent-types";
import { buildLineDiff, parseUnifiedDiff, type DiffLine } from "@/utils/tool-call-parsers"; import { buildLineDiff, parseUnifiedDiff, type DiffLine } from "@/utils/tool-call-parsers";
import { hasMeaningfulToolCallDetail } from "@/utils/tool-call-detail-state"; import { hasMeaningfulToolCallDetail } from "@/utils/tool-call-detail-state";
import { useWebScrollbarStyle } from "@/hooks/use-web-scrollbar-style"; import { useWebScrollbarStyle } from "@/hooks/use-web-scrollbar-style";
@@ -9,7 +9,7 @@ import {
BottomSheetBackgroundProps, BottomSheetBackgroundProps,
} from "@gorhom/bottom-sheet"; } from "@gorhom/bottom-sheet";
import { X } from "lucide-react-native"; import { X } from "lucide-react-native";
import type { ToolCallDetail } from "@server/server/agent/agent-sdk-types"; import type { ToolCallDetail } from "@getpaseo/protocol/agent-types";
import { import {
IsolatedBottomSheetModal, IsolatedBottomSheetModal,
useIsolatedBottomSheetVisibility, useIsolatedBottomSheetVisibility,
@@ -16,7 +16,10 @@ import { normalizeAgentSnapshot } from "@/utils/agent-snapshots";
import { encodeImages } from "@/utils/encode-images"; import { encodeImages } from "@/utils/encode-images";
import { toErrorMessage } from "@/utils/error-messages"; import { toErrorMessage } from "@/utils/error-messages";
import { splitComposerAttachmentsForSubmit } from "@/composer/attachments/submit"; import { splitComposerAttachmentsForSubmit } from "@/composer/attachments/submit";
import type { CreateAgentRequestOptions, DaemonClient } from "@server/client/daemon-client"; import type {
CreateAgentRequestOptions,
DaemonClient,
} from "@getpaseo/client/internal/daemon-client";
import { projectIconPlaceholderLabelFromDisplayName } from "@/utils/project-display-name"; import { projectIconPlaceholderLabelFromDisplayName } from "@/utils/project-display-name";
import { requireWorkspaceExecutionAuthority } from "@/utils/workspace-execution"; import { requireWorkspaceExecutionAuthority } from "@/utils/workspace-execution";
import { navigateToAgent } from "@/utils/navigate-to-agent"; import { navigateToAgent } from "@/utils/navigate-to-agent";
@@ -3,7 +3,7 @@
*/ */
import React from "react"; import React from "react";
import { act } from "@testing-library/react"; import { act } from "@testing-library/react";
import type { DaemonClient } from "@server/client/daemon-client"; import type { DaemonClient } from "@getpaseo/client/internal/daemon-client";
import { createRoot, type Root } from "react-dom/client"; import { createRoot, type Root } from "react-dom/client";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { useKeyboardShortcutsStore } from "@/stores/keyboard-shortcuts-store"; import { useKeyboardShortcutsStore } from "@/stores/keyboard-shortcuts-store";
@@ -1,4 +1,4 @@
import type { PaseoConfigRaw } from "@server/shared/messages"; import type { PaseoConfigRaw } from "@getpaseo/protocol/messages";
import { buildProjectSettingsRoute } from "@/utils/host-routes"; import { buildProjectSettingsRoute } from "@/utils/host-routes";
export interface WorktreeSetupWorkspaceInput { export interface WorktreeSetupWorkspaceInput {
+1 -1
View File
@@ -1,5 +1,5 @@
import { describe, expect, it, vi } from "vitest"; import { describe, expect, it, vi } from "vitest";
import type { AgentAttachment, GitHubSearchItem } from "@server/shared/messages"; import type { AgentAttachment, GitHubSearchItem } from "@getpaseo/protocol/messages";
import type { import type {
AttachmentMetadata, AttachmentMetadata,
ComposerAttachment, ComposerAttachment,
+1 -1
View File
@@ -1,4 +1,4 @@
import type { GitHubSearchItem } from "@server/shared/messages"; import type { GitHubSearchItem } from "@getpaseo/protocol/messages";
import type { import type {
AttachmentMetadata, AttachmentMetadata,
ComposerAttachment, ComposerAttachment,
@@ -50,8 +50,8 @@ import type {
AgentMode, AgentMode,
AgentModelDefinition, AgentModelDefinition,
AgentProvider, AgentProvider,
} from "@server/server/agent/agent-sdk-types"; } from "@getpaseo/protocol/agent-types";
import type { AgentProviderDefinition } from "@server/server/agent/provider-manifest"; import type { AgentProviderDefinition } from "@getpaseo/protocol/provider-manifest";
import { import {
getFeatureHighlightColor, getFeatureHighlightColor,
getFeatureTooltip, getFeatureTooltip,
@@ -28,11 +28,8 @@ import { useToast } from "@/contexts/toast-context";
import { useIsCompactFormFactor } from "@/constants/layout"; import { useIsCompactFormFactor } from "@/constants/layout";
import { toErrorMessage } from "@/utils/error-messages"; import { toErrorMessage } from "@/utils/error-messages";
import { formatAgentModeLabel } from "@/composer/agent-controls/utils"; import { formatAgentModeLabel } from "@/composer/agent-controls/utils";
import type { AgentMode, AgentProvider } from "@server/server/agent/agent-sdk-types"; import type { AgentMode, AgentProvider } from "@getpaseo/protocol/agent-types";
import { import { getModeVisuals, type AgentProviderDefinition } from "@getpaseo/protocol/provider-manifest";
getModeVisuals,
type AgentProviderDefinition,
} from "@server/server/agent/provider-manifest";
export type AgentModeControlPlacement = "toolbar" | "footer"; export type AgentModeControlPlacement = "toolbar" | "footer";
@@ -1,4 +1,4 @@
import type { AgentFeature, AgentModelDefinition } from "@server/server/agent/agent-sdk-types"; import type { AgentFeature, AgentModelDefinition } from "@getpaseo/protocol/agent-types";
export type ExplainedAgentControl = "mode" | "model" | "thinking"; export type ExplainedAgentControl = "mode" | "model" | "thinking";
export type FeatureHighlightColor = "blue" | "default" | "green" | "yellow"; export type FeatureHighlightColor = "blue" | "default" | "green" | "yellow";
@@ -4,7 +4,7 @@ import {
isWorkspaceAttachment, isWorkspaceAttachment,
workspaceAttachmentToSubmitAttachment, workspaceAttachmentToSubmitAttachment,
} from "@/attachments/workspace-attachment-utils"; } from "@/attachments/workspace-attachment-utils";
import type { AgentAttachment } from "@server/shared/messages"; import type { AgentAttachment } from "@getpaseo/protocol/messages";
import { buildGitHubAttachmentFromSearchItem } from "@/utils/review-attachments"; import { buildGitHubAttachmentFromSearchItem } from "@/utils/review-attachments";
export function splitComposerAttachmentsForSubmit(attachments: ComposerAttachment[]): { export function splitComposerAttachmentsForSubmit(attachments: ComposerAttachment[]): {
@@ -5,7 +5,7 @@ import { act, renderHook } from "@testing-library/react";
import { beforeEach, describe, expect, it, vi } from "vitest"; import { beforeEach, describe, expect, it, vi } from "vitest";
import { useCreateFlowStore } from "@/stores/create-flow-store"; import { useCreateFlowStore } from "@/stores/create-flow-store";
import type { UserMessageImageAttachment } from "@/types/stream"; import type { UserMessageImageAttachment } from "@/types/stream";
import type { AgentAttachment } from "@server/shared/messages"; import type { AgentAttachment } from "@getpaseo/protocol/messages";
import { useDraftAgentCreateFlow, type DraftCreateAttempt } from "./create-flow"; import { useDraftAgentCreateFlow, type DraftCreateAttempt } from "./create-flow";
describe("useDraftAgentCreateFlow", () => { describe("useDraftAgentCreateFlow", () => {
@@ -9,7 +9,7 @@ import {
type StreamItem, type StreamItem,
type UserMessageImageAttachment, type UserMessageImageAttachment,
} from "@/types/stream"; } from "@/types/stream";
import type { AgentAttachment } from "@server/shared/messages"; import type { AgentAttachment } from "@getpaseo/protocol/messages";
const EMPTY_STREAM_ITEMS: StreamItem[] = []; const EMPTY_STREAM_ITEMS: StreamItem[] = [];
@@ -25,9 +25,9 @@ import { encodeImages } from "@/utils/encode-images";
import type { WorkspaceFileOpenRequest } from "@/workspace/file-open"; import type { WorkspaceFileOpenRequest } from "@/workspace/file-open";
import { shouldAutoFocusWorkspaceDraftComposer } from "@/screens/workspace/workspace-draft-pane-focus"; import { shouldAutoFocusWorkspaceDraftComposer } from "@/screens/workspace/workspace-draft-pane-focus";
import { validateDraftSubmission } from "@/composer/draft/workspace-tab-core"; import { validateDraftSubmission } from "@/composer/draft/workspace-tab-core";
import type { AgentCapabilityFlags } from "@server/server/agent/agent-sdk-types"; import type { AgentCapabilityFlags } from "@getpaseo/protocol/agent-types";
import type { AgentSnapshotPayload } from "@server/shared/messages"; import type { AgentSnapshotPayload } from "@getpaseo/protocol/messages";
import type { DaemonClient } from "@server/client/daemon-client"; import type { DaemonClient } from "@getpaseo/client/internal/daemon-client";
import type { WorkspaceComposerAttachment } from "@/attachments/types"; import type { WorkspaceComposerAttachment } from "@/attachments/types";
import { import {
useWorkspaceAttachments, useWorkspaceAttachments,
@@ -8,7 +8,7 @@ import { useState } from "react";
import { describe, expect, it, vi } from "vitest"; import { describe, expect, it, vi } from "vitest";
import type { UserComposerAttachment } from "@/attachments/types"; import type { UserComposerAttachment } from "@/attachments/types";
import type { GitHubSearchClient } from "@/git/use-github-search-query"; import type { GitHubSearchClient } from "@/git/use-github-search-query";
import type { GitHubSearchItem, GitHubSearchResponse } from "@server/shared/messages"; import type { GitHubSearchItem, GitHubSearchResponse } from "@getpaseo/protocol/messages";
import { useComposerGithubAutoAttach } from "./auto-attach"; import { useComposerGithubAutoAttach } from "./auto-attach";
type GitHubSearchPayload = GitHubSearchResponse["payload"]; type GitHubSearchPayload = GitHubSearchResponse["payload"];
@@ -14,7 +14,7 @@ import {
type GitHubSearchClient, type GitHubSearchClient,
} from "@/git/use-github-search-query"; } from "@/git/use-github-search-query";
import { extractGithubRefs, type GithubRef } from "@/utils/github-refs"; import { extractGithubRefs, type GithubRef } from "@/utils/github-refs";
import type { GitHubSearchItem } from "@server/shared/messages"; import type { GitHubSearchItem } from "@getpaseo/protocol/messages";
import { isAttachmentSelectedForGithubItem, toggleGithubAttachment } from "../actions"; import { isAttachmentSelectedForGithubItem, toggleGithubAttachment } from "../actions";
const AUTO_ATTACH_DEBOUNCE_MS = 300; const AUTO_ATTACH_DEBOUNCE_MS = 300;
+1 -1
View File
@@ -86,7 +86,7 @@ import type { MessageInputKeyboardActionKind } from "@/keyboard/actions";
import { submitAgentInput } from "@/composer/submit"; import { submitAgentInput } from "@/composer/submit";
import { useAppSettings } from "@/hooks/use-settings"; import { useAppSettings } from "@/hooks/use-settings";
import { isWeb, isNative } from "@/constants/platform"; import { isWeb, isNative } from "@/constants/platform";
import type { GitHubSearchItem } from "@server/shared/messages"; import type { GitHubSearchItem } from "@getpaseo/protocol/messages";
import type { import type {
AttachmentMetadata, AttachmentMetadata,
ComposerAttachment, ComposerAttachment,
+1 -1
View File
@@ -26,7 +26,7 @@ import Animated, { useSharedValue, useAnimatedStyle, withTiming } from "react-na
import { useDictation } from "@/hooks/use-dictation"; import { useDictation } from "@/hooks/use-dictation";
import { DictationOverlay } from "@/components/dictation-controls"; import { DictationOverlay } from "@/components/dictation-controls";
import { RealtimeVoiceOverlay } from "@/components/realtime-voice-overlay"; import { RealtimeVoiceOverlay } from "@/components/realtime-voice-overlay";
import type { DaemonClient } from "@server/client/daemon-client"; import type { DaemonClient } from "@getpaseo/client/internal/daemon-client";
import { useSessionStore } from "@/stores/session-store"; import { useSessionStore } from "@/stores/session-store";
import { useVoiceOptional } from "@/contexts/voice-context"; import { useVoiceOptional } from "@/contexts/voice-context";
import { useToast } from "@/contexts/toast-context"; import { useToast } from "@/contexts/toast-context";
+1 -1
View File
@@ -1,4 +1,4 @@
import type { DaemonClient } from "@server/client/daemon-client"; import type { DaemonClient } from "@getpaseo/client/internal/daemon-client";
export function computeCanStartDictation(input: { export function computeCanStartDictation(input: {
client: DaemonClient | null; client: DaemonClient | null;
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest"; import { describe, expect, it } from "vitest";
import type { WorkspaceScriptPayload } from "@server/shared/messages"; import type { WorkspaceScriptPayload } from "@getpaseo/protocol/messages";
import type { WorkspaceDescriptor } from "@/stores/session-store"; import type { WorkspaceDescriptor } from "@/stores/session-store";
import { patchWorkspaceScripts } from "./session-workspace-scripts"; import { patchWorkspaceScripts } from "./session-workspace-scripts";
@@ -15,18 +15,18 @@ import {
} from "@/timeline/session-stream-reducers"; } from "@/timeline/session-stream-reducers";
import { useCreateFlowStore } from "@/stores/create-flow-store"; import { useCreateFlowStore } from "@/stores/create-flow-store";
import { TIMELINE_FETCH_PAGE_SIZE } from "@/timeline/timeline-fetch-policy"; import { TIMELINE_FETCH_PAGE_SIZE } from "@/timeline/timeline-fetch-policy";
import type { AgentAttachment, SessionOutboundMessage } from "@server/shared/messages"; import type { AgentAttachment, SessionOutboundMessage } from "@getpaseo/protocol/messages";
import { parseServerInfoStatusPayload } from "@server/shared/messages"; import { parseServerInfoStatusPayload } from "@getpaseo/protocol/messages";
import { import {
buildAgentAttentionNotificationPayload, buildAgentAttentionNotificationPayload,
type AgentAttentionNotificationPayload, type AgentAttentionNotificationPayload,
type NotificationPermissionRequest, type NotificationPermissionRequest,
} from "@server/shared/agent-attention-notification"; } from "@getpaseo/protocol/agent-attention-notification";
import type { AgentLifecycleStatus } from "@server/shared/agent-lifecycle"; import type { AgentLifecycleStatus } from "@getpaseo/protocol/agent-lifecycle";
import type { DaemonClient } from "@server/client/daemon-client"; import type { DaemonClient } from "@getpaseo/client/internal/daemon-client";
import type { AgentSessionConfig } from "@server/server/agent/agent-sdk-types"; import type { AgentSessionConfig } from "@getpaseo/protocol/agent-types";
import type { GitSetupOptions } from "@server/shared/messages"; import type { GitSetupOptions } from "@getpaseo/protocol/messages";
import type { AgentPermissionResponse } from "@server/server/agent/agent-sdk-types"; import type { AgentPermissionResponse } from "@getpaseo/protocol/agent-types";
import { getHostRuntimeStore, useHostRuntimeIsConnected } from "@/runtime/host-runtime"; import { getHostRuntimeStore, useHostRuntimeIsConnected } from "@/runtime/host-runtime";
import { useVoiceAudioEngineOptional, useVoiceRuntimeOptional } from "@/contexts/voice-context"; import { useVoiceAudioEngineOptional, useVoiceRuntimeOptional } from "@/contexts/voice-context";
import type { AudioPlaybackSource } from "@/voice/audio-engine-types"; import type { AudioPlaybackSource } from "@/voice/audio-engine-types";
@@ -1,4 +1,4 @@
import type { AgentLifecycleStatus } from "@server/shared/agent-lifecycle"; import type { AgentLifecycleStatus } from "@getpaseo/protocol/agent-lifecycle";
import type { Agent } from "@/stores/session-store"; import type { Agent } from "@/stores/session-store";
export function reconcilePreviousAgentStatuses( export function reconcilePreviousAgentStatuses(
@@ -1,5 +1,5 @@
import equal from "fast-deep-equal"; import equal from "fast-deep-equal";
import type { ScriptStatusUpdateMessage } from "@server/shared/messages"; import type { ScriptStatusUpdateMessage } from "@getpaseo/protocol/messages";
import type { WorkspaceDescriptor } from "@/stores/session-store"; import type { WorkspaceDescriptor } from "@/stores/session-store";
import { resolveWorkspaceMapKeyByIdentity } from "@/utils/workspace-execution"; import { resolveWorkspaceMapKeyByIdentity } from "@/utils/workspace-execution";
@@ -1,4 +1,7 @@
import type { DaemonTransport, DaemonTransportFactory } from "@server/client/daemon-client"; import type {
DaemonTransport,
DaemonTransportFactory,
} from "@getpaseo/client/internal/daemon-client";
import { import {
closeLocalTransportSession, closeLocalTransportSession,
listenToLocalTransportEvents, listenToLocalTransportEvents,
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest"; import { describe, expect, it } from "vitest";
import type { DaemonClient } from "@server/client/daemon-client"; import type { DaemonClient } from "@getpaseo/client/internal/daemon-client";
import { DictationStreamSender } from "@/dictation/dictation-stream-sender"; import { DictationStreamSender } from "@/dictation/dictation-stream-sender";
@@ -1,5 +1,5 @@
import { generateMessageId } from "@/types/stream"; import { generateMessageId } from "@/types/stream";
import type { DaemonClient } from "@server/client/daemon-client"; import type { DaemonClient } from "@getpaseo/client/internal/daemon-client";
export interface DictationStreamSenderParams { export interface DictationStreamSenderParams {
client: DaemonClient | null; client: DaemonClient | null;
@@ -1,4 +1,4 @@
import type { FileReadResult } from "@server/client/daemon-client"; import type { FileReadResult } from "@getpaseo/client/internal/daemon-client";
import type { ExplorerFile } from "@/stores/session-store"; import type { ExplorerFile } from "@/stores/session-store";
export function explorerFileFromReadResult(file: FileReadResult): ExplorerFile { export function explorerFileFromReadResult(file: FileReadResult): ExplorerFile {
+1 -1
View File
@@ -1,5 +1,5 @@
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import type { DaemonClient } from "@server/client/daemon-client"; import type { DaemonClient } from "@getpaseo/client/internal/daemon-client";
import { queryClient as appQueryClient } from "@/query/query-client"; import { queryClient as appQueryClient } from "@/query/query-client";
import { useSessionStore } from "@/stores/session-store"; import { useSessionStore } from "@/stores/session-store";
import type { WorkspaceDescriptor } from "@/stores/session-store"; import type { WorkspaceDescriptor } from "@/stores/session-store";
+1 -1
View File
@@ -1,5 +1,5 @@
import type { QueryKey } from "@tanstack/react-query"; import type { QueryKey } from "@tanstack/react-query";
import type { CheckoutPrMergeMethod } from "@server/shared/messages"; import type { CheckoutPrMergeMethod } from "@getpaseo/protocol/messages";
import { create } from "zustand"; import { create } from "zustand";
import { queryClient as appQueryClient } from "@/query/query-client"; import { queryClient as appQueryClient } from "@/query/query-client";
import { import {
+1 -1
View File
@@ -1,4 +1,4 @@
import type { SubscribeCheckoutDiffResponse } from "@server/shared/messages"; import type { SubscribeCheckoutDiffResponse } from "@getpaseo/protocol/messages";
type ParsedDiffFile = SubscribeCheckoutDiffResponse["payload"]["files"][number]; type ParsedDiffFile = SubscribeCheckoutDiffResponse["payload"]["files"][number];
+1 -1
View File
@@ -1,4 +1,4 @@
import { parseGitHubRemoteUrl } from "@server/shared/git-remote"; import { parseGitHubRemoteUrl } from "@getpaseo/protocol/git-remote";
export function parseGitHubRepoFromRemote(remoteUrl: string | null | undefined): string | null { export function parseGitHubRepoFromRemote(remoteUrl: string | null | undefined): string | null {
const trimmed = remoteUrl?.trim(); const trimmed = remoteUrl?.trim();
+1 -1
View File
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest"; import { describe, expect, it } from "vitest";
import { CheckoutPrStatusSchema } from "@server/shared/messages"; import { CheckoutPrStatusSchema } from "@getpaseo/protocol/messages";
import { buildGitActions, type BuildGitActionsInput } from "./policy"; import { buildGitActions, type BuildGitActionsInput } from "./policy";
+1 -1
View File
@@ -5,7 +5,7 @@ import type {
CheckoutPrMergeMethod, CheckoutPrMergeMethod,
CheckoutPrStatusResponse, CheckoutPrStatusResponse,
PullRequestMergeable, PullRequestMergeable,
} from "@server/shared/messages"; } from "@getpaseo/protocol/messages";
export type GitActionId = export type GitActionId =
| "commit" | "commit"
+1 -1
View File
@@ -2,7 +2,7 @@ import { describe, expect, it } from "vitest";
import type { import type {
CheckoutPrStatusResponse, CheckoutPrStatusResponse,
PullRequestTimelineResponse, PullRequestTimelineResponse,
} from "@server/shared/messages"; } from "@getpaseo/protocol/messages";
import { import {
deriveAvatarColor, deriveAvatarColor,
formatAge, formatAge,
+1 -1
View File
@@ -1,7 +1,7 @@
import type { import type {
CheckoutPrStatusResponse, CheckoutPrStatusResponse,
PullRequestTimelineResponse, PullRequestTimelineResponse,
} from "@server/shared/messages"; } from "@getpaseo/protocol/messages";
export type PrState = "open" | "draft" | "merged" | "closed"; export type PrState = "open" | "draft" | "merged" | "closed";
export type CheckStatus = "success" | "failure" | "pending" | "skipped"; export type CheckStatus = "success" | "failure" | "pending" | "skipped";
+1 -1
View File
@@ -5,7 +5,7 @@ import { type CheckoutGitActionStatus, useCheckoutGitActionsStore } from "@/git/
import { type CheckoutStatusPayload, useCheckoutStatusQuery } from "@/git/use-status-query"; import { type CheckoutStatusPayload, useCheckoutStatusQuery } from "@/git/use-status-query";
import { type CheckoutPrStatusPayload, useCheckoutPrStatusQuery } from "@/git/use-pr-status-query"; import { type CheckoutPrStatusPayload, useCheckoutPrStatusQuery } from "@/git/use-pr-status-query";
import { buildGitActions, narrowPullRequestState, type GitActions } from "@/git/policy"; import { buildGitActions, narrowPullRequestState, type GitActions } from "@/git/policy";
import type { CheckoutPrMergeMethod } from "@server/shared/messages"; import type { CheckoutPrMergeMethod } from "@getpaseo/protocol/messages";
import { openExternalUrl } from "@/utils/open-external-url"; import { openExternalUrl } from "@/utils/open-external-url";
import { useToast } from "@/contexts/toast-context"; import { useToast } from "@/contexts/toast-context";
import { useSessionStore } from "@/stores/session-store"; import { useSessionStore } from "@/stores/session-store";
+1 -1
View File
@@ -1,7 +1,7 @@
import { skipToken, useQuery, useQueryClient } from "@tanstack/react-query"; import { skipToken, useQuery, useQueryClient } from "@tanstack/react-query";
import { useEffect, useId, useMemo } from "react"; import { useEffect, useId, useMemo } from "react";
import { useHostRuntimeClient, useHostRuntimeIsConnected } from "@/runtime/host-runtime"; import { useHostRuntimeClient, useHostRuntimeIsConnected } from "@/runtime/host-runtime";
import type { SubscribeCheckoutDiffResponse } from "@server/shared/messages"; import type { SubscribeCheckoutDiffResponse } from "@getpaseo/protocol/messages";
import { orderCheckoutDiffFiles } from "@/git/diff-order"; import { orderCheckoutDiffFiles } from "@/git/diff-order";
import { checkoutDiffQueryKey } from "@/git/query-keys"; import { checkoutDiffQueryKey } from "@/git/query-keys";
@@ -1,5 +1,5 @@
import { useQuery } from "@tanstack/react-query"; import { useQuery } from "@tanstack/react-query";
import type { GitHubSearchRequest, GitHubSearchResponse } from "@server/shared/messages"; import type { GitHubSearchRequest, GitHubSearchResponse } from "@getpaseo/protocol/messages";
export const GITHUB_SEARCH_STALE_TIME = 30_000; export const GITHUB_SEARCH_STALE_TIME = 30_000;
+1 -1
View File
@@ -1,7 +1,7 @@
import { useQuery, useQueryClient } from "@tanstack/react-query"; import { useQuery, useQueryClient } from "@tanstack/react-query";
import { useEffect } from "react"; import { useEffect } from "react";
import { useHostRuntimeClient, useHostRuntimeIsConnected } from "@/runtime/host-runtime"; import { useHostRuntimeClient, useHostRuntimeIsConnected } from "@/runtime/host-runtime";
import type { CheckoutPrStatusResponse } from "@server/shared/messages"; import type { CheckoutPrStatusResponse } from "@getpaseo/protocol/messages";
import { checkoutPrStatusQueryKey } from "@/git/query-keys"; import { checkoutPrStatusQueryKey } from "@/git/query-keys";
interface UseCheckoutPrStatusQueryOptions { interface UseCheckoutPrStatusQueryOptions {
@@ -8,7 +8,7 @@ import {
onlineManager, onlineManager,
} from "@tanstack/react-query"; } from "@tanstack/react-query";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import type { CheckoutStatusResponse } from "@server/shared/messages"; import type { CheckoutStatusResponse } from "@getpaseo/protocol/messages";
import { checkoutStatusQueryKey } from "@/git/query-keys"; import { checkoutStatusQueryKey } from "@/git/query-keys";
import { useCheckoutStatusQuery } from "./use-status-query"; import { useCheckoutStatusQuery } from "./use-status-query";
+1 -1
View File
@@ -1,7 +1,7 @@
import { type QueryClient, useQuery, useQueryClient } from "@tanstack/react-query"; import { type QueryClient, useQuery, useQueryClient } from "@tanstack/react-query";
import { useEffect } from "react"; import { useEffect } from "react";
import { useHostRuntimeClient, useHostRuntimeIsConnected } from "@/runtime/host-runtime"; import { useHostRuntimeClient, useHostRuntimeIsConnected } from "@/runtime/host-runtime";
import type { CheckoutStatusResponse } from "@server/shared/messages"; import type { CheckoutStatusResponse } from "@getpaseo/protocol/messages";
import { checkoutStatusQueryKey } from "@/git/query-keys"; import { checkoutStatusQueryKey } from "@/git/query-keys";
export const CHECKOUT_STATUS_STALE_TIME = 15_000; export const CHECKOUT_STATUS_STALE_TIME = 15_000;
@@ -1,4 +1,4 @@
import type { AgentFeature } from "@server/server/agent/agent-sdk-types"; import type { AgentFeature } from "@getpaseo/protocol/agent-types";
export function pruneFeatureValues( export function pruneFeatureValues(
featureValues: Record<string, unknown>, featureValues: Record<string, unknown>,
@@ -1,4 +1,4 @@
import type { AgentProvider } from "@server/server/agent/agent-sdk-types"; import type { AgentProvider } from "@getpaseo/protocol/agent-types";
export const PROVIDERS_SNAPSHOT_QUERY_ROOT = "providersSnapshot"; export const PROVIDERS_SNAPSHOT_QUERY_ROOT = "providersSnapshot";
@@ -1,5 +1,5 @@
import { useCallback, useState } from "react"; import { useCallback, useState } from "react";
import type { MutableDaemonConfigPatch } from "@server/shared/messages"; import type { MutableDaemonConfigPatch } from "@getpaseo/protocol/messages";
import { ACP_PROVIDER_CATALOG, type AcpProviderCatalogEntry } from "@/data/acp-provider-catalog"; import { ACP_PROVIDER_CATALOG, type AcpProviderCatalogEntry } from "@/data/acp-provider-catalog";
export type AcpProviderCatalogItem = AcpProviderCatalogEntry; export type AcpProviderCatalogItem = AcpProviderCatalogEntry;
@@ -1,6 +1,6 @@
import { useCallback, useEffect, useRef, useState } from "react"; import { useCallback, useEffect, useRef, useState } from "react";
import { AppState } from "react-native"; import { AppState } from "react-native";
import type { DaemonClient } from "@server/client/daemon-client"; import type { DaemonClient } from "@getpaseo/client/internal/daemon-client";
import { import {
shouldClearAgentAttention, shouldClearAgentAttention,
type AgentAttentionClearTrigger, type AgentAttentionClearTrigger,
@@ -1,6 +1,6 @@
import { useQuery } from "@tanstack/react-query"; import { useQuery } from "@tanstack/react-query";
import { useHostRuntimeClient, useHostRuntimeIsConnected } from "@/runtime/host-runtime"; import { useHostRuntimeClient, useHostRuntimeIsConnected } from "@/runtime/host-runtime";
import type { AgentProvider } from "@server/server/agent/agent-sdk-types"; import type { AgentProvider } from "@getpaseo/protocol/agent-types";
const COMMANDS_STALE_TIME = 60_000; // Commands rarely change, cache for 1 minute const COMMANDS_STALE_TIME = 60_000; // Commands rarely change, cache for 1 minute
@@ -1,11 +1,11 @@
import { useCallback, useEffect, useMemo, useReducer, useRef } from "react"; import { useCallback, useEffect, useMemo, useReducer, useRef } from "react";
import type { AgentProviderDefinition } from "@server/server/agent/provider-manifest"; import type { AgentProviderDefinition } from "@getpaseo/protocol/provider-manifest";
import type { import type {
AgentMode, AgentMode,
AgentModelDefinition, AgentModelDefinition,
AgentProvider, AgentProvider,
ProviderSnapshotEntry, ProviderSnapshotEntry,
} from "@server/server/agent/agent-sdk-types"; } from "@getpaseo/protocol/agent-types";
import { useHosts } from "@/runtime/host-runtime"; import { useHosts } from "@/runtime/host-runtime";
import { buildProviderDefinitions } from "@/utils/provider-definitions"; import { buildProviderDefinitions } from "@/utils/provider-definitions";
import { import {
@@ -9,7 +9,7 @@ import type {
DaemonClient, DaemonClient,
FetchAgentHistoryEntry, FetchAgentHistoryEntry,
FetchAgentHistoryOptions, FetchAgentHistoryOptions,
} from "@server/client/daemon-client"; } from "@getpaseo/client/internal/daemon-client";
import { useSessionStore, type Agent } from "@/stores/session-store"; import { useSessionStore, type Agent } from "@/stores/session-store";
import { useAgentHistory } from "./use-agent-history"; import { useAgentHistory } from "./use-agent-history";
+1 -1
View File
@@ -2,7 +2,7 @@ import type {
DaemonClient, DaemonClient,
FetchAgentHistoryOptions, FetchAgentHistoryOptions,
FetchAgentHistoryPageInfo, FetchAgentHistoryPageInfo,
} from "@server/client/daemon-client"; } from "@getpaseo/client/internal/daemon-client";
import { useInfiniteQuery } from "@tanstack/react-query"; import { useInfiniteQuery } from "@tanstack/react-query";
import { useCallback, useMemo } from "react"; import { useCallback, useMemo } from "react";
import type { AggregatedAgent } from "@/hooks/use-aggregated-agents"; import type { AggregatedAgent } from "@/hooks/use-aggregated-agents";
@@ -1,6 +1,6 @@
import { useCallback } from "react"; import { useCallback } from "react";
import { useSessionStore } from "@/stores/session-store"; import { useSessionStore } from "@/stores/session-store";
import type { DaemonClient } from "@server/client/daemon-client"; import type { DaemonClient } from "@getpaseo/client/internal/daemon-client";
import { import {
attachInitTimeout, attachInitTimeout,
createInitDeferred, createInitDeferred,
@@ -1,5 +1,5 @@
import { useRef } from "react"; import { useRef } from "react";
import type { AgentCapabilityFlags } from "@server/server/agent/agent-sdk-types"; import type { AgentCapabilityFlags } from "@getpaseo/protocol/agent-types";
export interface AgentScreenAgent { export interface AgentScreenAgent {
serverId: string; serverId: string;
@@ -2,7 +2,7 @@
* @vitest-environment jsdom * @vitest-environment jsdom
*/ */
import React from "react"; import React from "react";
import type { DaemonClient } from "@server/client/daemon-client"; import type { DaemonClient } from "@getpaseo/client/internal/daemon-client";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { act, renderHook, waitFor } from "@testing-library/react"; import { act, renderHook, waitFor } from "@testing-library/react";
import { beforeEach, describe, expect, it } from "vitest"; import { beforeEach, describe, expect, it } from "vitest";
@@ -1,6 +1,6 @@
import { useState, useCallback, useMemo } from "react"; import { useState, useCallback, useMemo } from "react";
import { useQuery, type QueryClient } from "@tanstack/react-query"; import { useQuery, type QueryClient } from "@tanstack/react-query";
import type { DaemonClient } from "@server/client/daemon-client"; import type { DaemonClient } from "@getpaseo/client/internal/daemon-client";
import type { ComboboxOption } from "@/components/ui/combobox"; import type { ComboboxOption } from "@/components/ui/combobox";
import type { ToastApi } from "@/components/toast-host"; import type { ToastApi } from "@/components/toast-host";
import { invalidateCheckoutGitQueriesForClient } from "@/git/query-keys"; import { invalidateCheckoutGitQueriesForClient } from "@/git/query-keys";
@@ -44,7 +44,7 @@ vi.mock("react-native", () => ({
}, },
})); }));
vi.mock("@server/client/daemon-client", () => ({})); vi.mock("@getpaseo/client/internal/daemon-client", () => ({}));
function createTestClient() { function createTestClient() {
return { return {

Some files were not shown because too many files have changed in this diff Show More