From 53c14d9855dd9590746b81ad26931fd489a0e06d Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Thu, 28 May 2026 01:58:18 +0800 Subject: [PATCH] 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. --- .github/workflows/ci.yml | 78 +- .github/workflows/deploy-app.yml | 4 +- .github/workflows/nix.yml | 2 + CLAUDE.md | 5 +- README.md | 4 +- docs/architecture.md | 19 +- docs/development.md | 21 +- docs/glossary.md | 26 +- lefthook.yml | 1 + nix/desktop-package.nix | 6 +- nix/package.nix | 4 +- package-lock.json | 738 +++------------- package.json | 24 +- packages/app/e2e/global-setup.ts | 2 +- .../app/e2e/helpers/agent-bottom-anchor.ts | 21 +- packages/app/e2e/helpers/archive-tab.ts | 21 +- .../app/e2e/helpers/daemon-client-loader.ts | 15 + packages/app/e2e/helpers/new-workspace.ts | 25 +- packages/app/e2e/helpers/terminal-perf.ts | 20 +- packages/app/e2e/helpers/workspace-setup.ts | 32 +- .../record-workspace-create-android-focus.sh | 9 +- .../test-workspace-create-android-crash.sh | 10 +- packages/app/metro.config.cjs | 7 +- packages/app/package.json | 26 +- packages/app/src/agent-stream/view.tsx | 4 +- packages/app/src/app/pair-scan.tsx | 2 +- packages/app/src/attachments/types.ts | 2 +- .../attachments/workspace-attachment-utils.ts | 2 +- .../app/src/components/agent-status-dot.tsx | 2 +- .../components/combined-model-selector.tsx | 2 +- packages/app/src/components/file-pane.tsx | 2 +- .../src/components/icons/editor-app-icons.tsx | 2 +- .../components/import-session-sheet.test.tsx | 7 +- .../src/components/import-session-sheet.tsx | 9 +- packages/app/src/components/message.tsx | 8 +- .../app/src/components/pair-link-modal.tsx | 2 +- .../components/provider-diagnostic-sheet.tsx | 4 +- .../app/src/components/question-form-card.tsx | 2 +- .../app/src/components/rewind/rewind-menu.tsx | 2 +- .../rewind/use-rewind-agent-mutation.ts | 2 +- .../rewind/use-rewind-capabilities.ts | 2 +- .../sidebar-workspace-list.test.tsx | 4 +- .../src/components/sidebar-workspace-list.tsx | 2 +- .../components/terminal-emulator.native.tsx | 4 +- .../app/src/components/terminal-emulator.tsx | 4 +- packages/app/src/components/terminal-pane.tsx | 4 +- .../app/src/components/tool-call-details.tsx | 2 +- .../app/src/components/tool-call-sheet.tsx | 2 +- .../src/components/workspace-setup-dialog.tsx | 5 +- ...space-shortcut-targets-subscriber.test.tsx | 2 +- .../worktree-setup-callout-policy.ts | 2 +- packages/app/src/composer/actions.test.ts | 2 +- packages/app/src/composer/actions.ts | 2 +- .../app/src/composer/agent-controls/index.tsx | 4 +- .../composer/agent-controls/mode-control.tsx | 7 +- .../app/src/composer/agent-controls/utils.ts | 2 +- .../app/src/composer/attachments/submit.ts | 2 +- .../src/composer/draft/create-flow.test.ts | 2 +- .../app/src/composer/draft/create-flow.ts | 2 +- .../app/src/composer/draft/workspace-tab.tsx | 6 +- .../src/composer/github/auto-attach.test.tsx | 2 +- .../app/src/composer/github/auto-attach.ts | 2 +- packages/app/src/composer/index.tsx | 2 +- packages/app/src/composer/input/input.tsx | 2 +- packages/app/src/composer/input/state.ts | 2 +- .../session-context.service-status.test.ts | 2 +- packages/app/src/contexts/session-context.tsx | 16 +- .../src/contexts/session-status-tracking.ts | 2 +- .../src/contexts/session-workspace-scripts.ts | 2 +- .../daemon/desktop-daemon-transport.ts | 5 +- .../dictation/dictation-stream-sender.test.ts | 2 +- .../src/dictation/dictation-stream-sender.ts | 2 +- packages/app/src/file-explorer/read-result.ts | 2 +- packages/app/src/git/actions-store.test.ts | 2 +- packages/app/src/git/actions-store.ts | 2 +- packages/app/src/git/diff-order.ts | 2 +- packages/app/src/git/github-url.ts | 2 +- packages/app/src/git/policy.test.ts | 2 +- packages/app/src/git/policy.ts | 2 +- packages/app/src/git/pr-pane-data.test.ts | 2 +- packages/app/src/git/pr-pane-data.ts | 2 +- packages/app/src/git/use-actions.ts | 2 +- packages/app/src/git/use-diff-query.ts | 2 +- .../app/src/git/use-github-search-query.ts | 2 +- packages/app/src/git/use-pr-status-query.ts | 2 +- packages/app/src/git/use-status-query.test.ts | 2 +- packages/app/src/git/use-status-query.ts | 2 +- packages/app/src/hooks/feature-preferences.ts | 2 +- .../app/src/hooks/providers-snapshot-query.ts | 2 +- .../app/src/hooks/use-acp-provider-catalog.ts | 2 +- .../src/hooks/use-agent-attention-clear.ts | 2 +- .../app/src/hooks/use-agent-commands-query.ts | 2 +- .../app/src/hooks/use-agent-form-state.ts | 4 +- .../app/src/hooks/use-agent-history.test.tsx | 2 +- packages/app/src/hooks/use-agent-history.ts | 2 +- .../app/src/hooks/use-agent-initialization.ts | 2 +- .../hooks/use-agent-screen-state-machine.ts | 2 +- .../app/src/hooks/use-archive-agent.test.ts | 2 +- packages/app/src/hooks/use-branch-switcher.ts | 2 +- .../src/hooks/use-client-activity.test.tsx | 2 +- packages/app/src/hooks/use-client-activity.ts | 2 +- packages/app/src/hooks/use-daemon-config.ts | 2 +- .../app/src/hooks/use-dictation.shared.ts | 2 +- .../app/src/hooks/use-draft-agent-features.ts | 2 +- .../app/src/hooks/use-form-preferences.ts | 2 +- packages/app/src/hooks/use-open-project.ts | 2 +- .../app/src/hooks/use-pr-pane-data.test.ts | 2 +- packages/app/src/hooks/use-pr-pane-data.ts | 2 +- .../app/src/hooks/use-preferred-editor.ts | 2 +- .../app/src/hooks/use-project-icon-query.ts | 2 +- packages/app/src/hooks/use-projects.test.ts | 2 +- packages/app/src/hooks/use-projects.ts | 2 +- .../src/hooks/use-providers-snapshot.test.ts | 4 +- .../app/src/hooks/use-providers-snapshot.ts | 4 +- .../src/hooks/use-push-token-registration.ts | 2 +- .../hooks/use-sidebar-workspaces-list.test.ts | 2 +- .../src/hooks/use-sidebar-workspaces-list.ts | 2 +- packages/app/src/panels/agent-panel.tsx | 2 +- packages/app/src/panels/terminal-panel.tsx | 2 +- .../provider-selection.test.ts | 7 +- .../provider-selection/provider-selection.ts | 4 +- .../resolve-agent-form.test.ts | 4 +- .../provider-selection/resolve-agent-form.ts | 4 +- packages/app/src/review/store.ts | 2 +- packages/app/src/runtime/host-runtime.test.ts | 4 +- packages/app/src/runtime/host-runtime.ts | 4 +- .../app/src/screens/new-workspace-empty.ts | 2 +- .../screens/new-workspace-picker-item.test.ts | 2 +- .../src/screens/new-workspace-picker-item.ts | 4 +- .../new-workspace-picker-state.test.ts | 2 +- .../app/src/screens/new-workspace-screen.tsx | 6 +- .../src/screens/project-settings-screen.tsx | 4 +- .../settings/providers-section.test.tsx | 4 +- .../screens/workspace/terminals/state.test.ts | 2 +- .../src/screens/workspace/terminals/state.ts | 2 +- .../terminals/use-workspace-terminals.ts | 2 +- .../workspace/use-workspace-tab-rename.tsx | 4 +- .../screens/workspace/workspace-bulk-close.ts | 2 +- .../workspace/workspace-draft-agent-config.ts | 2 +- .../workspace-open-in-editor-button.tsx | 2 +- .../workspace-scripts-button.test.tsx | 2 +- packages/app/src/stores/create-flow-store.ts | 2 +- packages/app/src/stores/draft-store.ts | 2 +- .../src/stores/session-store-hooks.test.ts | 2 +- packages/app/src/stores/session-store.test.ts | 4 +- packages/app/src/stores/session-store.ts | 8 +- .../workspace-draft-submission-store.ts | 2 +- .../app/src/stores/workspace-setup-store.ts | 2 +- .../workspace-subagents-integration.test.ts | 2 +- .../app/src/stores/workspace-tabs-store.ts | 2 +- packages/app/src/subagents/select.test.ts | 2 +- .../subagents/use-archive-subagent.test.ts | 2 +- .../terminal-emulator-runtime.browser.test.ts | 2 +- .../runtime/terminal-emulator-runtime.ts | 4 +- .../runtime/terminal-restore-options.ts | 2 +- .../src/terminal/runtime/terminal-snapshot.ts | 2 +- .../runtime/terminal-stream-controller.ts | 2 +- .../runtime/workspace-terminal-session.ts | 2 +- .../terminal-emulator-webview-entry.ts | 4 +- .../timeline/session-stream-reducers.test.ts | 2 +- .../src/timeline/session-stream-reducers.ts | 4 +- .../app/src/tool-calls/presentation.test.ts | 2 +- packages/app/src/tool-calls/presentation.ts | 2 +- packages/app/src/types/host-connection.ts | 7 +- packages/app/src/types/shared.ts | 2 +- packages/app/src/types/stream-event.test.ts | 2 +- packages/app/src/types/stream.harness.test.ts | 4 +- packages/app/src/types/stream.test.ts | 6 +- packages/app/src/types/stream.ts | 4 +- .../src/utils/agent-directory-sync.test.ts | 6 +- .../app/src/utils/agent-directory-sync.ts | 2 +- .../app/src/utils/agent-snapshots.test.ts | 4 +- packages/app/src/utils/agent-snapshots.ts | 6 +- packages/app/src/utils/daemon-endpoints.ts | 4 +- .../src/utils/extract-tool-call-file-path.ts | 2 +- packages/app/src/utils/github-refs.ts | 2 +- .../app/src/utils/navigate-to-agent.test.ts | 2 +- .../app/src/utils/project-config-form.test.ts | 4 +- packages/app/src/utils/project-config-form.ts | 2 +- packages/app/src/utils/project-placement.ts | 2 +- packages/app/src/utils/projects.test.ts | 2 +- .../app/src/utils/provider-definitions.ts | 4 +- packages/app/src/utils/review-attachments.ts | 2 +- .../utils/server-info-capabilities.test.ts | 2 +- .../app/src/utils/server-info-capabilities.ts | 2 +- packages/app/src/utils/sidebar-agent-state.ts | 2 +- packages/app/src/utils/terminal-list.ts | 2 +- .../src/utils/test-daemon-connection.test.ts | 2 +- .../app/src/utils/test-daemon-connection.ts | 4 +- .../src/utils/tool-call-detail-state.test.ts | 2 +- .../app/src/utils/tool-call-detail-state.ts | 2 +- packages/app/src/utils/tool-call-display.ts | 2 +- packages/app/src/utils/tool-call-icon.ts | 4 +- .../workspace-archive-navigation.test.ts | 2 +- .../src/utils/workspace-script-links.test.ts | 2 +- .../app/src/utils/workspace-script-links.ts | 4 +- packages/app/src/voice/voice-runtime.ts | 2 +- .../src/workspace/workspace-archive.test.ts | 2 +- packages/app/tsconfig.json | 3 +- packages/app/vitest.config.ts | 1 - packages/cli/package.json | 2 + packages/cli/src/commands/agent/archive.ts | 2 +- packages/cli/src/commands/agent/attach.ts | 9 +- packages/cli/src/commands/agent/delete.ts | 2 +- packages/cli/src/commands/agent/import.ts | 2 +- packages/cli/src/commands/agent/inspect.ts | 3 +- packages/cli/src/commands/agent/logs.ts | 4 +- packages/cli/src/commands/agent/ls.ts | 2 +- packages/cli/src/commands/agent/mode.ts | 2 +- packages/cli/src/commands/agent/reload.ts | 2 +- packages/cli/src/commands/agent/run.ts | 7 +- packages/cli/src/commands/agent/stop.ts | 2 +- packages/cli/src/commands/permit/allow.ts | 2 +- packages/cli/src/commands/permit/deny.ts | 2 +- packages/cli/src/commands/permit/ls.ts | 3 +- packages/cli/src/commands/provider/ls.ts | 3 +- packages/cli/src/commands/worktree/archive.ts | 2 +- .../cli/src/commands/worktree/create-input.ts | 2 +- packages/cli/src/commands/worktree/create.ts | 2 +- packages/cli/src/commands/worktree/ls.ts | 2 +- packages/cli/src/utils/client.ts | 12 +- packages/cli/src/utils/timeline.ts | 3 +- .../25-daemon-restart-supervisor.test.ts | 12 +- packages/cli/tests/e2e/relay-host.test.ts | 10 +- packages/cli/tests/run-all.ts | 10 +- packages/client/README.md | 12 + packages/client/examples/README.md | 18 + .../client/examples/agents-and-providers.ts | 56 ++ .../client/examples/events-and-timeline.ts | 62 ++ packages/client/examples/provider-settings.ts | 62 ++ packages/client/examples/workspaces.ts | 30 + packages/client/package.json | 44 + .../daemon-client-relay-e2ee-transport.ts | 0 .../src}/daemon-client-runtime-metrics.ts | 2 +- .../src}/daemon-client-transport-types.ts | 0 .../src}/daemon-client-transport-utils.ts | 0 .../src}/daemon-client-transport.test.ts | 0 .../src}/daemon-client-transport.ts | 0 .../src}/daemon-client-websocket-transport.ts | 0 .../src}/daemon-client.test.ts | 7 +- .../client => client/src}/daemon-client.ts | 16 +- packages/client/src/index.test.ts | 795 ++++++++++++++++++ packages/client/src/index.ts | 539 ++++++++++++ .../src}/terminal-stream-router.test.ts | 2 +- .../src}/terminal-stream-router.ts | 4 +- packages/client/tsconfig.examples.json | 7 + packages/client/tsconfig.json | 25 + packages/desktop/package.json | 2 +- packages/protocol/README.md | 12 + packages/protocol/package.json | 33 + .../src}/agent-attention-notification.test.ts | 0 .../src}/agent-attention-notification.ts | 0 .../src}/agent-feature-schemas.test.ts | 0 .../shared => protocol/src}/agent-labels.ts | 0 .../src}/agent-lifecycle.ts | 0 .../src}/agent-state-bucket.test.ts | 0 .../src}/agent-state-bucket.ts | 0 .../src}/agent-title-limits.ts | 0 packages/protocol/src/agent-types.ts | 466 ++++++++++ .../src}/binary-frames/file-transfer.test.ts | 0 .../src}/binary-frames/file-transfer.ts | 0 .../src}/binary-frames/index.ts | 0 .../src}/binary-frames/terminal.test.ts | 0 .../src}/binary-frames/terminal.ts | 0 .../src/chat/rpc-schemas.ts} | 2 +- .../src/chat/types.ts} | 0 .../src}/client-capabilities.ts | 0 .../src}/connection-offer.test.ts | 0 .../src}/connection-offer.ts | 0 .../src}/daemon-endpoints.test.ts | 0 .../src}/daemon-endpoints.ts | 0 .../shared => protocol/src}/error-utils.ts | 0 .../src/shared => protocol/src}/git-remote.ts | 0 .../src}/host-connection-schema.ts | 0 .../src}/importable-providers.ts | 0 .../shared => protocol/src}/literal-union.ts | 0 .../src}/loop/rpc-schemas.ts | 2 +- .../src}/messages.attachments.test.ts | 0 .../src}/messages.checkout-pr-schema.test.ts | 0 ...ges.create-agent-client-message-id.test.ts | 2 +- ....create-agent-worktree-autoarchive.test.ts | 0 .../src}/messages.list-commands.test.ts | 0 .../src}/messages.providers-snapshot.test.ts | 0 .../messages.pull-request-timeline.test.ts | 0 .../src}/messages.rename-entities.test.ts | 0 .../src}/messages.stream-parsing.test.ts | 0 .../src}/messages.terminal-restore.test.ts | 0 .../shared => protocol/src}/messages.test.ts | 0 .../src}/messages.tool-call-schema.test.ts | 0 .../src/shared => protocol/src}/messages.ts | 19 +- .../src}/messages.workspaces.test.ts | 0 .../src}/paseo-config-schema.test.ts | 2 +- .../src}/paseo-config-schema.ts | 0 .../src/shared => protocol/src}/path-utils.ts | 0 packages/protocol/src/provider-config.ts | 148 ++++ .../src}/provider-manifest.ts | 2 +- .../src}/schedule/rpc-schemas.ts | 0 .../server => protocol/src}/schedule/types.ts | 2 +- .../src}/terminal-input-mode.test.ts | 0 .../src}/terminal-input-mode.ts | 0 .../src}/terminal-key-input.test.ts | 0 .../src}/terminal-key-input.ts | 0 .../src}/terminal-snapshot.ts | 0 .../src}/terminal-stream-protocol.test.ts | 0 .../src}/terminal-stream-protocol.ts | 0 .../src}/tool-call-display.test.ts | 0 .../src}/tool-call-display.ts | 4 +- .../src}/tool-name-normalization.ts | 0 packages/protocol/tsconfig.json | 25 + packages/server/CLAUDE.md | 6 +- packages/server/package.json | 2 + .../src/server/agent-attention-policy.ts | 2 +- .../src/server/agent/activity-curator.ts | 4 +- .../src/server/agent/agent-manager.test.ts | 2 +- .../server/src/server/agent/agent-manager.ts | 6 +- .../server/agent/agent-metadata-generator.ts | 2 +- .../agent-metadata-generator.unit.test.ts | 2 +- .../src/server/agent/agent-response-loop.ts | 2 +- .../src/server/agent/agent-sdk-types.ts | 2 +- .../src/server/agent/create-agent-title.ts | 2 +- .../src/server/agent/create-agent/create.ts | 4 +- .../src/server/agent/import-sessions.test.ts | 2 +- .../src/server/agent/import-sessions.ts | 2 +- .../src/server/agent/mcp-parity.e2e.test.ts | 2 +- .../src/server/agent/mcp-server.test.ts | 9 +- .../server/src/server/agent/mcp-server.ts | 5 +- .../server/src/server/agent/mcp-shared.ts | 2 +- .../src/server/agent/prompt-attachments.ts | 2 +- .../server/agent/provider-launch-config.ts | 110 +-- .../src/server/agent/provider-registry.ts | 4 +- .../providers/claude/sidechain-tracker.ts | 2 +- .../providers/claude/tool-call-mapper.ts | 2 +- .../codex/tool-call-detail-parser.ts | 2 +- .../agent/providers/codex/tool-call-mapper.ts | 2 +- .../agent/providers/mock-load-test-agent.ts | 2 +- .../server/agent/providers/opencode-agent.ts | 2 +- .../agent/tool-name-normalization.test.ts | 2 +- .../server/src/server/chat/chat-service.ts | 2 +- .../server/checkout/status-projection.test.ts | 2 +- .../src/server/checkout/status-projection.ts | 2 +- .../src/server/client-activity.e2e.test.ts | 2 +- packages/server/src/server/config.ts | 2 +- .../server/src/server/connection-offer.ts | 2 +- .../server/src/server/daemon-config-store.ts | 11 +- .../daemon-e2e/checkout-pr-merge.e2e.test.ts | 2 +- .../daemon-restart-resume.e2e.test.ts | 2 +- .../opencode-rewind.real.e2e.test.ts | 2 +- .../daemon-e2e/relay-transport.e2e.test.ts | 6 +- .../server/daemon-e2e/terminal.e2e.test.ts | 6 +- .../daemon-e2e/two-cycle-resume.e2e.test.ts | 2 +- packages/server/src/server/editor-targets.ts | 2 +- packages/server/src/server/exports.test.ts | 19 + packages/server/src/server/exports.ts | 21 +- packages/server/src/server/loop-service.ts | 2 +- packages/server/src/server/messages.ts | 6 +- .../src/server/paseo-worktree-service.ts | 2 +- .../server/src/server/persisted-config.ts | 53 +- packages/server/src/server/relay-transport.ts | 4 +- packages/server/src/server/schedule/cron.ts | 2 +- .../src/server/schedule/service.test.ts | 2 +- .../server/src/server/schedule/service.ts | 4 +- packages/server/src/server/schedule/store.ts | 2 +- .../server/script-status-projection.test.ts | 4 +- .../src/server/script-status-projection.ts | 4 +- packages/server/src/server/session.test.ts | 7 +- packages/server/src/server/session.ts | 8 +- ...on.workspace-resolution-invariants.test.ts | 2 +- .../src/server/session.workspaces.test.ts | 2 +- .../src/server/test-utils/daemon-client.ts | 2 +- .../server/test-utils/fake-agent-client.ts | 2 +- .../server/test-utils/message-collector.ts | 4 +- .../src/server/test-utils/session-stubs.ts | 2 +- .../src/server/voice-local-agent.e2e.test.ts | 2 +- .../src/server/voice-permission-policy.ts | 2 +- .../src/server/voice-roundtrip.e2e.test.ts | 2 +- .../websocket-server.relay-reconnect.test.ts | 4 +- .../server/src/server/websocket-server.ts | 4 +- .../{shared => server}/wire-compat.test.ts | 10 +- .../server/src/server/workspace-directory.ts | 2 +- .../src/server/workspace-git-service.ts | 2 +- .../src/server/workspace-registry-model.ts | 5 +- .../server/worktree-branch-name-generator.ts | 2 +- packages/server/src/server/worktree-core.ts | 2 +- .../src/services/github-service.test.ts | 2 +- .../server/src/services/github-service.ts | 2 +- .../server/src/terminal/terminal-capture.ts | 2 +- .../src/terminal/terminal-restore.test.ts | 7 +- .../server/src/terminal/terminal-restore.ts | 6 +- .../terminal-session-controller.test.ts | 4 +- .../terminal/terminal-session-controller.ts | 2 +- .../src/terminal/terminal-worker-protocol.ts | 2 +- packages/server/src/terminal/terminal.ts | 4 +- .../terminal/worker-terminal-manager.test.ts | 2 +- .../src/terminal/worker-terminal-manager.ts | 4 +- .../server/src/utils/build-metadata-prompt.ts | 2 +- packages/server/src/utils/github-remote.ts | 4 +- .../server/src/utils/paseo-config-file.ts | 4 +- .../server/src/utils/tool-call-parsers.ts | 2 +- .../server/src/utils/worktree.posix.test.ts | 2 +- packages/server/src/utils/worktree.ts | 4 +- paseo.json | 2 +- scripts/dev.ps1 | 6 - scripts/trace-daemon.mjs | 2 +- 403 files changed, 3193 insertions(+), 1417 deletions(-) create mode 100644 packages/app/e2e/helpers/daemon-client-loader.ts create mode 100644 packages/client/README.md create mode 100644 packages/client/examples/README.md create mode 100644 packages/client/examples/agents-and-providers.ts create mode 100644 packages/client/examples/events-and-timeline.ts create mode 100644 packages/client/examples/provider-settings.ts create mode 100644 packages/client/examples/workspaces.ts create mode 100644 packages/client/package.json rename packages/{server/src/client => client/src}/daemon-client-relay-e2ee-transport.ts (100%) rename packages/{server/src/client => client/src}/daemon-client-runtime-metrics.ts (99%) rename packages/{server/src/client => client/src}/daemon-client-transport-types.ts (100%) rename packages/{server/src/client => client/src}/daemon-client-transport-utils.ts (100%) rename packages/{server/src/client => client/src}/daemon-client-transport.test.ts (100%) rename packages/{server/src/client => client/src}/daemon-client-transport.ts (100%) rename packages/{server/src/client => client/src}/daemon-client-websocket-transport.ts (100%) rename packages/{server/src/client => client/src}/daemon-client.test.ts (99%) rename packages/{server/src/client => client/src}/daemon-client.ts (99%) create mode 100644 packages/client/src/index.test.ts create mode 100644 packages/client/src/index.ts rename packages/{server/src/client => client/src}/terminal-stream-router.test.ts (90%) rename packages/{server/src/client => client/src}/terminal-stream-router.ts (96%) create mode 100644 packages/client/tsconfig.examples.json create mode 100644 packages/client/tsconfig.json create mode 100644 packages/protocol/README.md create mode 100644 packages/protocol/package.json rename packages/{server/src/shared => protocol/src}/agent-attention-notification.test.ts (100%) rename packages/{server/src/shared => protocol/src}/agent-attention-notification.ts (100%) rename packages/{server/src/shared => protocol/src}/agent-feature-schemas.test.ts (100%) rename packages/{server/src/shared => protocol/src}/agent-labels.ts (100%) rename packages/{server/src/shared => protocol/src}/agent-lifecycle.ts (100%) rename packages/{server/src/shared => protocol/src}/agent-state-bucket.test.ts (100%) rename packages/{server/src/shared => protocol/src}/agent-state-bucket.ts (100%) rename packages/{server/src/server/agent => protocol/src}/agent-title-limits.ts (100%) create mode 100644 packages/protocol/src/agent-types.ts rename packages/{server/src/shared => protocol/src}/binary-frames/file-transfer.test.ts (100%) rename packages/{server/src/shared => protocol/src}/binary-frames/file-transfer.ts (100%) rename packages/{server/src/shared => protocol/src}/binary-frames/index.ts (100%) rename packages/{server/src/shared => protocol/src}/binary-frames/terminal.test.ts (100%) rename packages/{server/src/shared => protocol/src}/binary-frames/terminal.ts (100%) rename packages/{server/src/server/chat/chat-rpc-schemas.ts => protocol/src/chat/rpc-schemas.ts} (97%) rename packages/{server/src/server/chat/chat-types.ts => protocol/src/chat/types.ts} (100%) rename packages/{server/src/shared => protocol/src}/client-capabilities.ts (100%) rename packages/{server/src/shared => protocol/src}/connection-offer.test.ts (100%) rename packages/{server/src/shared => protocol/src}/connection-offer.ts (100%) rename packages/{server/src/shared => protocol/src}/daemon-endpoints.test.ts (100%) rename packages/{server/src/shared => protocol/src}/daemon-endpoints.ts (100%) rename packages/{server/src/shared => protocol/src}/error-utils.ts (100%) rename packages/{server/src/shared => protocol/src}/git-remote.ts (100%) rename packages/{server/src/shared => protocol/src}/host-connection-schema.ts (100%) rename packages/{server/src/shared => protocol/src}/importable-providers.ts (100%) rename packages/{server/src/shared => protocol/src}/literal-union.ts (100%) rename packages/{server/src/server => protocol/src}/loop/rpc-schemas.ts (98%) rename packages/{server/src/shared => protocol/src}/messages.attachments.test.ts (100%) rename packages/{server/src/shared => protocol/src}/messages.checkout-pr-schema.test.ts (100%) rename packages/{server/src/shared => protocol/src}/messages.create-agent-client-message-id.test.ts (95%) rename packages/{server/src/shared => protocol/src}/messages.create-agent-worktree-autoarchive.test.ts (100%) rename packages/{server/src/shared => protocol/src}/messages.list-commands.test.ts (100%) rename packages/{server/src/shared => protocol/src}/messages.providers-snapshot.test.ts (100%) rename packages/{server/src/shared => protocol/src}/messages.pull-request-timeline.test.ts (100%) rename packages/{server/src/shared => protocol/src}/messages.rename-entities.test.ts (100%) rename packages/{server/src/shared => protocol/src}/messages.stream-parsing.test.ts (100%) rename packages/{server/src/shared => protocol/src}/messages.terminal-restore.test.ts (100%) rename packages/{server/src/shared => protocol/src}/messages.test.ts (100%) rename packages/{server/src/shared => protocol/src}/messages.tool-call-schema.test.ts (100%) rename packages/{server/src/shared => protocol/src}/messages.ts (99%) rename packages/{server/src/shared => protocol/src}/messages.workspaces.test.ts (100%) rename packages/{server/src/utils => protocol/src}/paseo-config-schema.test.ts (97%) rename packages/{server/src/utils => protocol/src}/paseo-config-schema.ts (100%) rename packages/{server/src/shared => protocol/src}/path-utils.ts (100%) create mode 100644 packages/protocol/src/provider-config.ts rename packages/{server/src/server/agent => protocol/src}/provider-manifest.ts (99%) rename packages/{server/src/server => protocol/src}/schedule/rpc-schemas.ts (100%) rename packages/{server/src/server => protocol/src}/schedule/types.ts (97%) rename packages/{server/src/shared => protocol/src}/terminal-input-mode.test.ts (100%) rename packages/{server/src/shared => protocol/src}/terminal-input-mode.ts (100%) rename packages/{server/src/shared => protocol/src}/terminal-key-input.test.ts (100%) rename packages/{server/src/shared => protocol/src}/terminal-key-input.ts (100%) rename packages/{server/src/shared => protocol/src}/terminal-snapshot.ts (100%) rename packages/{server/src/shared => protocol/src}/terminal-stream-protocol.test.ts (100%) rename packages/{server/src/shared => protocol/src}/terminal-stream-protocol.ts (100%) rename packages/{server/src/shared => protocol/src}/tool-call-display.test.ts (100%) rename packages/{server/src/shared => protocol/src}/tool-call-display.ts (96%) rename packages/{server/src/server/agent => protocol/src}/tool-name-normalization.ts (100%) create mode 100644 packages/protocol/tsconfig.json create mode 100644 packages/server/src/server/exports.test.ts rename packages/server/src/{shared => server}/wire-compat.test.ts (98%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 48eaaec56..f354e2269 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -69,18 +69,18 @@ jobs: - name: Install dependencies run: npm ci - - name: Build highlight dependency - run: npm run build --workspace=@getpaseo/highlight - - - name: Build relay dependency - run: npm run build --workspace=@getpaseo/relay - - - name: Build server dependency - run: npm run build --workspace=@getpaseo/server + - name: Build server stack + run: npm run build:server - name: Typecheck all packages 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: strategy: fail-fast: false @@ -107,11 +107,8 @@ jobs: - name: Install agent CLIs for provider tests run: npm install -g @anthropic-ai/claude-code opencode-ai - - name: Build highlight dependency - run: npm run build --workspace=@getpaseo/highlight - - - name: Build relay dependency - run: npm run build --workspace=@getpaseo/relay + - name: Build server dependencies + run: npm run build:server-deps - name: Run server tests run: npm run test --workspace=@getpaseo/server @@ -137,14 +134,8 @@ jobs: - name: Install dependencies run: npm ci - - name: Build highlight dependency - run: npm run build --workspace=@getpaseo/highlight - - - name: Build relay dependency - run: npm run build --workspace=@getpaseo/relay - - - name: Build server dependency - run: npm run build --workspace=@getpaseo/server + - name: Build server stack + run: npm run build:server - name: Run desktop tests run: npm run test --workspace=@getpaseo/desktop @@ -165,12 +156,37 @@ jobs: - name: Install Playwright browsers run: npx playwright install --with-deps chromium - - name: Build highlight dependency - run: npm run build --workspace=@getpaseo/highlight + - name: Build app dependencies + run: npm run build:app-deps - name: Run app unit tests 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: runs-on: ubuntu-latest steps: @@ -187,14 +203,11 @@ jobs: - name: Install Playwright browsers run: npx playwright install --with-deps chromium - - name: Build highlight dependency - run: npm run build --workspace=@getpaseo/highlight + - name: Build app dependencies + run: npm run build:app-deps - - name: Build relay dependency - run: npm run build --workspace=@getpaseo/relay - - - name: Build server dependency - run: npm run build --workspace=@getpaseo/server + - name: Build server stack + run: npm run build:server - name: Install agent CLIs for provider tests run: npm install -g @anthropic-ai/claude-code @openai/codex@0.105.0 opencode-ai @@ -228,7 +241,7 @@ jobs: run: npm ci - name: Build relay - run: npm run build --workspace=@getpaseo/relay + run: npm run build:relay - name: Run relay tests run: npm run test --workspace=@getpaseo/relay @@ -254,9 +267,6 @@ jobs: - name: Install agent CLIs for provider tests 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 run: npm run test --workspace=@getpaseo/cli env: diff --git a/.github/workflows/deploy-app.yml b/.github/workflows/deploy-app.yml index d566f66ad..6997de9ee 100644 --- a/.github/workflows/deploy-app.yml +++ b/.github/workflows/deploy-app.yml @@ -28,8 +28,8 @@ jobs: env: NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Build highlight dependency - run: npm run build --workspace=@getpaseo/highlight + - name: Build app dependencies + run: npm run build:app-deps - name: Typecheck run: npm run typecheck --workspace=@getpaseo/app diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml index 5d0c479b1..36348c301 100644 --- a/.github/workflows/nix.yml +++ b/.github/workflows/nix.yml @@ -10,6 +10,8 @@ on: - "package.json" - "package-lock.json" - "packages/highlight/**" + - "packages/protocol/**" + - "packages/client/**" - "packages/server/**" - "packages/relay/**" - "packages/cli/**" diff --git a/CLAUDE.md b/CLAUDE.md index e5a679074..58c10a571 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -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. - For full suite verification, push to CI and check GitHub Actions instead. - **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: - - `npm run build:daemon` — rebuild highlight, relay, server, and CLI when daemon/server/CLI types may be stale. +- **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: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. - **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: diff --git a/README.md b/README.md index 6f43840c0..bdc377b3c 100644 --- a/README.md +++ b/README.md @@ -134,8 +134,8 @@ npm run dev:app npm run dev:desktop npm run dev:website -# build the daemon -npm run build:daemon +# build the server stack +npm run build:server # repo-wide checks npm run typecheck diff --git a/docs/architecture.md b/docs/architecture.md index e525c1193..83fe2ed41 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -68,9 +68,20 @@ All paths are under `packages/server/src/`. | `server/schedule/` | Cron-based scheduled agents | | `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 | -| `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 | -| `shared/binary-frames/` | Terminal stream and file transfer binary frame codecs | + +### `packages/protocol` — Wire schemas and shared protocol types + +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) @@ -126,7 +137,7 @@ TanStack Router + Cloudflare Workers. Serves paseo.sh. ## 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:** diff --git a/docs/development.md b/docs/development.md index cf4cb2f42..6ae0fea6a 100644 --- a/docs/development.md +++ b/docs/development.md @@ -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 -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: -- Changed `packages/relay/src/*`: `npm run build --workspace=@getpaseo/relay` (server imports `@getpaseo/relay` from `dist/*`). -- 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/highlight/src/*`: `npm run build --workspace=@getpaseo/highlight` (server depends on it). +- Changed `packages/protocol/src/*` or `packages/client/src/*`: `npm run build:client`. +- Changed `packages/server/src/*`, `packages/cli/src/*`, `packages/relay/src/*`, or `packages/highlight/src/*`: `npm run build:server`. +- Changed app build dependencies: `npm run build:app-deps`. ## CLI reference diff --git a/docs/glossary.md b/docs/glossary.md index 76c3ff09a..68912d971 100644 --- a/docs/glossary.md +++ b/docs/glossary.md @@ -3,24 +3,24 @@ 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. -- **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`). -- **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". -- **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`). +- **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/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). - **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`). -- **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`). -- **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. +- **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/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/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. - **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. -- **Provider** — Agent backend (Claude Code, Codex, Copilot, OpenCode, Pi). UI: "Provider". Code: `ProviderSnapshotEntry` (`packages/server/src/shared/messages.ts:198`). -- **Model** — A specific LLM offered by a provider. UI: "Model" / "Select model". Code: `AgentModelDefinition` (`packages/server/src/shared/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`). -- **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). -- **Mode** — Provider-specific operational mode (plan, default, full-access, …). UI: icon-only. Code: `modeId` in `AgentSessionConfig` (`packages/server/src/shared/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`). +- **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/protocol/src/messages.ts:187`). +- **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/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/protocol/src/messages.ts:257`). +- **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 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". @@ -33,4 +33,4 @@ Authoritative terminology. UI label wins. Don't invent synonyms; use what's here ## Inconsistencies (documented, not papered over) - CLI `--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`). diff --git a/lefthook.yml b/lefthook.yml index 97f22481d..9e4a718fd 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -4,6 +4,7 @@ pre-commit: - name: format glob: "*.{css,js,json,jsonc,jsx,md,ts,tsx,yaml,yml}" exclude: + - "package-lock.json" - "**/package-lock.json" run: npm run format:check:files -- {staged_files} - name: lint diff --git a/nix/desktop-package.nix b/nix/desktop-package.nix index aeca26040..9703c497a 100644 --- a/nix/desktop-package.nix +++ b/nix/desktop-package.nix @@ -73,10 +73,10 @@ buildNpmPackage rec { # Native deps (terminal emulation; libuv-linked on Linux) npm rebuild node-pty - # Daemon workspaces (highlight + relay + server + cli) - npm run build:daemon + # Server workspaces (highlight + relay + protocol + client + server + cli) + 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 # Expo web export for the Electron renderer diff --git a/nix/package.nix b/nix/package.nix index aa00a3b9e..b904333f5 100644 --- a/nix/package.nix +++ b/nix/package.nix @@ -79,8 +79,8 @@ buildNpmPackage rec { # degrade when unavailable. npm rebuild node-pty - # Build all daemon packages in dependency order (defined in package.json) - npm run build:daemon + # Build all server packages in dependency order (defined in package.json) + npm run build:server runHook postBuild ''; diff --git a/package-lock.json b/package-lock.json index b08039262..805f83e18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,8 @@ "workspaces": [ "packages/expo-two-way-audio", "packages/highlight", + "packages/protocol", + "packages/client", "packages/server", "packages/app", "packages/relay", @@ -6426,6 +6428,10 @@ "resolved": "packages/cli", "link": true }, + "node_modules/@getpaseo/client": { + "resolved": "packages/client", + "link": true + }, "node_modules/@getpaseo/desktop": { "resolved": "packages/desktop", "link": true @@ -6438,6 +6444,10 @@ "resolved": "packages/highlight", "link": true }, + "node_modules/@getpaseo/protocol": { + "resolved": "packages/protocol", + "link": true + }, "node_modules/@getpaseo/relay": { "resolved": "packages/relay", "link": true @@ -10287,12 +10297,12 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "android" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-android-arm64": { "version": "4.59.0", @@ -10301,12 +10311,12 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "android" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.59.0", @@ -10315,12 +10325,12 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-darwin-x64": { "version": "4.59.0", @@ -10329,12 +10339,12 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-freebsd-arm64": { "version": "4.59.0", @@ -10343,12 +10353,12 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "freebsd" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-freebsd-x64": { "version": "4.59.0", @@ -10357,12 +10367,12 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "freebsd" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { "version": "4.59.0", @@ -10371,12 +10381,12 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { "version": "4.59.0", @@ -10385,12 +10395,12 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { "version": "4.59.0", @@ -10399,12 +10409,12 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { "version": "4.59.0", @@ -10413,12 +10423,12 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { "version": "4.59.0", @@ -10427,12 +10437,12 @@ "cpu": [ "loong64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { "version": "4.59.0", @@ -10441,12 +10451,12 @@ "cpu": [ "loong64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { "version": "4.59.0", @@ -10455,12 +10465,12 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { "version": "4.59.0", @@ -10469,12 +10479,12 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { "version": "4.59.0", @@ -10483,12 +10493,12 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { "version": "4.59.0", @@ -10497,12 +10507,12 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { "version": "4.59.0", @@ -10511,12 +10521,12 @@ "cpu": [ "s390x" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.59.0", @@ -10525,12 +10535,12 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-x64-musl": { "version": "4.59.0", @@ -10539,12 +10549,12 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-openbsd-x64": { "version": "4.59.0", @@ -10553,12 +10563,12 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "openbsd" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-openharmony-arm64": { "version": "4.59.0", @@ -10567,12 +10577,12 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "openharmony" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { "version": "4.59.0", @@ -10581,12 +10591,12 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "win32" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { "version": "4.59.0", @@ -10595,12 +10605,12 @@ "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "win32" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { "version": "4.59.0", @@ -10609,12 +10619,12 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "win32" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { "version": "4.59.0", @@ -10623,12 +10633,12 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "win32" - ], - "peer": true + ] }, "node_modules/@rtsao/scc": { "version": "1.1.0", @@ -11901,7 +11911,6 @@ "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -11922,7 +11931,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -11936,7 +11944,6 @@ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -11951,8 +11958,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@testing-library/react": { "version": "16.3.2", @@ -12073,8 +12079,7 @@ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -12492,6 +12497,7 @@ "version": "19.2.14", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, "license": "MIT", "dependencies": { "csstype": "^3.2.2" @@ -12501,7 +12507,7 @@ "version": "19.2.3", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", - "devOptional": true, + "dev": true, "license": "MIT", "peerDependencies": { "@types/react": "^19.2.0" @@ -14320,7 +14326,6 @@ "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "dequal": "^2.0.3" } @@ -16590,6 +16595,7 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, "license": "MIT" }, "node_modules/data-urls": { @@ -17191,8 +17197,7 @@ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/dom-serializer": { "version": "2.0.0", @@ -18211,7 +18216,6 @@ "dev": true, "license": "BSD-3-Clause", "optional": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -22538,7 +22542,7 @@ "version": "4.13.6", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -22811,7 +22815,7 @@ "version": "16.8.1", "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.8.1.tgz", "integrity": "sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" @@ -26195,7 +26199,6 @@ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "lz-string": "bin/bin.js" } @@ -31109,6 +31112,7 @@ "version": "0.17.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -31781,7 +31785,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "devOptional": true, + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" @@ -31943,6 +31947,7 @@ "version": "4.59.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, "license": "MIT", "dependencies": { "@types/estree": "1.0.8" @@ -34417,7 +34422,7 @@ "version": "4.21.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "esbuild": "~0.27.0", @@ -35244,6 +35249,7 @@ "version": "7.3.3", "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.3.tgz", "integrity": "sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==", + "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.27.0", @@ -35338,6 +35344,7 @@ "version": "8.5.8", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, "funding": [ { "type": "opencollective", @@ -36254,6 +36261,7 @@ "version": "4.3.6", "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -36341,8 +36349,10 @@ "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", "@floating-ui/react-native": "^0.10.7", + "@getpaseo/client": "*", "@getpaseo/expo-two-way-audio": "*", "@getpaseo/highlight": "*", + "@getpaseo/protocol": "*", "@gorhom/bottom-sheet": "^5.2.14", "@gorhom/portal": "^1.0.14", "@react-native-async-storage/async-storage": "2.2.0", @@ -36413,6 +36423,7 @@ }, "devDependencies": { "@playwright/test": "^1.56.1", + "@testing-library/dom": "^10.4.1", "@testing-library/react": "^16.3.2", "@types/markdown-it": "^14.1.2", "@types/qrcode": "^1.5.6", @@ -36560,6 +36571,8 @@ "version": "0.1.83", "dependencies": { "@clack/prompts": "^1.0.0", + "@getpaseo/client": "0.1.83", + "@getpaseo/protocol": "0.1.83", "@getpaseo/server": "0.1.83", "chalk": "^5.3.0", "commander": "^12.0.0", @@ -36580,115 +36593,6 @@ "zx": "^8.8.5" } }, - "packages/cli/node_modules/@vitest/browser": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.1.6.tgz", - "integrity": "sha512-ynsspTubXGSpa58JFJ24xIQt4z4A25epSbugEyaTmmrV1//Wec9EgE/LtoaC6yxUrXi5P7erGHRrkdZIHaVQuA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@blazediff/core": "1.9.1", - "@vitest/mocker": "4.1.6", - "@vitest/utils": "4.1.6", - "magic-string": "^0.30.21", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.1.0", - "ws": "^8.19.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.1.6" - } - }, - "packages/cli/node_modules/@vitest/browser-playwright": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.1.6.tgz", - "integrity": "sha512-4csoeyl/qwHyxU2zNL0++WaoDr8YJDXOQPwWPNJoTZ+QzcdO3INYKgF5Zfz730Io7zbkuv914aZmfQ+QE+1Hvw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vitest/browser": "4.1.6", - "@vitest/mocker": "4.1.6", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "playwright": "*", - "vitest": "4.1.6" - }, - "peerDependenciesMeta": { - "playwright": { - "optional": false - } - } - }, - "packages/cli/node_modules/@vitest/browser-playwright/node_modules/@vitest/mocker": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.6.tgz", - "integrity": "sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vitest/spy": "4.1.6", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "packages/cli/node_modules/@vitest/browser/node_modules/@vitest/mocker": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.6.tgz", - "integrity": "sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vitest/spy": "4.1.6", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "packages/cli/node_modules/@vitest/expect": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.6.tgz", @@ -36913,6 +36817,29 @@ } } }, + "packages/client": { + "name": "@getpaseo/client", + "version": "0.1.83", + "dependencies": { + "@getpaseo/protocol": "0.1.83", + "@getpaseo/relay": "0.1.83", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/node": "^20.9.0", + "typescript": "^5.2.2", + "vitest": "^4.1.6" + } + }, + "packages/client/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "packages/desktop": { "name": "@getpaseo/desktop", "version": "0.1.83", @@ -36946,115 +36873,6 @@ "undici-types": "~7.13.0" } }, - "packages/desktop/node_modules/@vitest/browser": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.1.6.tgz", - "integrity": "sha512-ynsspTubXGSpa58JFJ24xIQt4z4A25epSbugEyaTmmrV1//Wec9EgE/LtoaC6yxUrXi5P7erGHRrkdZIHaVQuA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@blazediff/core": "1.9.1", - "@vitest/mocker": "4.1.6", - "@vitest/utils": "4.1.6", - "magic-string": "^0.30.21", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.1.0", - "ws": "^8.19.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.1.6" - } - }, - "packages/desktop/node_modules/@vitest/browser-playwright": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.1.6.tgz", - "integrity": "sha512-4csoeyl/qwHyxU2zNL0++WaoDr8YJDXOQPwWPNJoTZ+QzcdO3INYKgF5Zfz730Io7zbkuv914aZmfQ+QE+1Hvw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vitest/browser": "4.1.6", - "@vitest/mocker": "4.1.6", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "playwright": "*", - "vitest": "4.1.6" - }, - "peerDependenciesMeta": { - "playwright": { - "optional": false - } - } - }, - "packages/desktop/node_modules/@vitest/browser-playwright/node_modules/@vitest/mocker": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.6.tgz", - "integrity": "sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vitest/spy": "4.1.6", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "packages/desktop/node_modules/@vitest/browser/node_modules/@vitest/mocker": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.6.tgz", - "integrity": "sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vitest/spy": "4.1.6", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "packages/desktop/node_modules/@vitest/expect": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.6.tgz", @@ -37336,115 +37154,6 @@ "vitest": "^4.1.6" } }, - "packages/highlight/node_modules/@vitest/browser": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.1.6.tgz", - "integrity": "sha512-ynsspTubXGSpa58JFJ24xIQt4z4A25epSbugEyaTmmrV1//Wec9EgE/LtoaC6yxUrXi5P7erGHRrkdZIHaVQuA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@blazediff/core": "1.9.1", - "@vitest/mocker": "4.1.6", - "@vitest/utils": "4.1.6", - "magic-string": "^0.30.21", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.1.0", - "ws": "^8.19.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.1.6" - } - }, - "packages/highlight/node_modules/@vitest/browser-playwright": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.1.6.tgz", - "integrity": "sha512-4csoeyl/qwHyxU2zNL0++WaoDr8YJDXOQPwWPNJoTZ+QzcdO3INYKgF5Zfz730Io7zbkuv914aZmfQ+QE+1Hvw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vitest/browser": "4.1.6", - "@vitest/mocker": "4.1.6", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "playwright": "*", - "vitest": "4.1.6" - }, - "peerDependenciesMeta": { - "playwright": { - "optional": false - } - } - }, - "packages/highlight/node_modules/@vitest/browser-playwright/node_modules/@vitest/mocker": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.6.tgz", - "integrity": "sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vitest/spy": "4.1.6", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "packages/highlight/node_modules/@vitest/browser/node_modules/@vitest/mocker": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.6.tgz", - "integrity": "sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vitest/spy": "4.1.6", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "packages/highlight/node_modules/@vitest/expect": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.6.tgz", @@ -37648,6 +37357,27 @@ } } }, + "packages/protocol": { + "name": "@getpaseo/protocol", + "version": "0.1.82", + "dependencies": { + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/node": "^20.9.0", + "typescript": "^5.2.2", + "vitest": "^4.1.6" + } + }, + "packages/protocol/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "packages/relay": { "name": "@getpaseo/relay", "version": "0.1.83", @@ -37663,115 +37393,6 @@ "vitest": "^4.1.6" } }, - "packages/relay/node_modules/@vitest/browser": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.1.6.tgz", - "integrity": "sha512-ynsspTubXGSpa58JFJ24xIQt4z4A25epSbugEyaTmmrV1//Wec9EgE/LtoaC6yxUrXi5P7erGHRrkdZIHaVQuA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@blazediff/core": "1.9.1", - "@vitest/mocker": "4.1.6", - "@vitest/utils": "4.1.6", - "magic-string": "^0.30.21", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.1.0", - "ws": "^8.19.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.1.6" - } - }, - "packages/relay/node_modules/@vitest/browser-playwright": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.1.6.tgz", - "integrity": "sha512-4csoeyl/qwHyxU2zNL0++WaoDr8YJDXOQPwWPNJoTZ+QzcdO3INYKgF5Zfz730Io7zbkuv914aZmfQ+QE+1Hvw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vitest/browser": "4.1.6", - "@vitest/mocker": "4.1.6", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "playwright": "*", - "vitest": "4.1.6" - }, - "peerDependenciesMeta": { - "playwright": { - "optional": false - } - } - }, - "packages/relay/node_modules/@vitest/browser-playwright/node_modules/@vitest/mocker": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.6.tgz", - "integrity": "sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vitest/spy": "4.1.6", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "packages/relay/node_modules/@vitest/browser/node_modules/@vitest/mocker": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.6.tgz", - "integrity": "sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vitest/spy": "4.1.6", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "packages/relay/node_modules/@vitest/expect": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.6.tgz", @@ -37981,7 +37602,9 @@ "dependencies": { "@agentclientprotocol/sdk": "^0.17.1", "@anthropic-ai/claude-agent-sdk": "^0.2.133", + "@getpaseo/client": "0.1.83", "@getpaseo/highlight": "0.1.83", + "@getpaseo/protocol": "0.1.83", "@getpaseo/relay": "0.1.83", "@isaacs/ttlcache": "^2.1.4", "@modelcontextprotocol/sdk": "^1.20.1", @@ -38175,115 +37798,6 @@ "cross-spawn": "7.0.6" } }, - "packages/server/node_modules/@vitest/browser": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.1.6.tgz", - "integrity": "sha512-ynsspTubXGSpa58JFJ24xIQt4z4A25epSbugEyaTmmrV1//Wec9EgE/LtoaC6yxUrXi5P7erGHRrkdZIHaVQuA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@blazediff/core": "1.9.1", - "@vitest/mocker": "4.1.6", - "@vitest/utils": "4.1.6", - "magic-string": "^0.30.21", - "pngjs": "^7.0.0", - "sirv": "^3.0.2", - "tinyrainbow": "^3.1.0", - "ws": "^8.19.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "4.1.6" - } - }, - "packages/server/node_modules/@vitest/browser-playwright": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.1.6.tgz", - "integrity": "sha512-4csoeyl/qwHyxU2zNL0++WaoDr8YJDXOQPwWPNJoTZ+QzcdO3INYKgF5Zfz730Io7zbkuv914aZmfQ+QE+1Hvw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vitest/browser": "4.1.6", - "@vitest/mocker": "4.1.6", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "playwright": "*", - "vitest": "4.1.6" - }, - "peerDependenciesMeta": { - "playwright": { - "optional": false - } - } - }, - "packages/server/node_modules/@vitest/browser-playwright/node_modules/@vitest/mocker": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.6.tgz", - "integrity": "sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vitest/spy": "4.1.6", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "packages/server/node_modules/@vitest/browser/node_modules/@vitest/mocker": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.6.tgz", - "integrity": "sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vitest/spy": "4.1.6", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "packages/server/node_modules/@vitest/expect": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.6.tgz", diff --git a/package.json b/package.json index 32d64fc3b..5f44fa7d7 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,8 @@ "workspaces": [ "packages/expo-two-way-audio", "packages/highlight", + "packages/protocol", + "packages/client", "packages/server", "packages/app", "packages/relay", @@ -34,16 +36,24 @@ "scripts": { "dev": "./scripts/dev.sh", "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:website": "npm run dev --workspace=@getpaseo/website", "postinstall": "node scripts/postinstall-patches.mjs", "prepare": "lefthook install --force", "build": "npm run build --workspaces --if-present", "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: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", "format": "oxfmt .", "format:files": "oxfmt", @@ -63,7 +73,7 @@ "web": "npm run web --workspace=@getpaseo/app", "dev:desktop": "npm run dev --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 --", "cli": "npx tsx packages/cli/src/index.js", "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:next": "node scripts/set-release-version.mjs --mode beta-next", "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: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": "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: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/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/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: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", diff --git a/packages/app/e2e/global-setup.ts b/packages/app/e2e/global-setup.ts index 5ab1a7449..16193dcb4 100644 --- a/packages/app/e2e/global-setup.ts +++ b/packages/app/e2e/global-setup.ts @@ -321,7 +321,7 @@ function ensureRelayBuildArtifact(repoRoot: string): void { } console.log("[e2e] Building @getpaseo/relay for daemon startup"); - execSync("npm run build --workspace=@getpaseo/relay", { + execSync("npm run build:relay", { cwd: repoRoot, stdio: "inherit", }); diff --git a/packages/app/e2e/helpers/agent-bottom-anchor.ts b/packages/app/e2e/helpers/agent-bottom-anchor.ts index 6a7f99e20..61362ec1c 100644 --- a/packages/app/e2e/helpers/agent-bottom-anchor.ts +++ b/packages/app/e2e/helpers/agent-bottom-anchor.ts @@ -1,7 +1,6 @@ import { expect, type Page } from "@playwright/test"; -import path from "node:path"; -import { pathToFileURL } from "node:url"; import { randomUUID } from "node:crypto"; +import { loadDaemonClientConstructor } from "./daemon-client-loader"; import { createNodeWebSocketFactory, type NodeWebSocketFactory } from "./node-ws-factory"; import { buildHostWorkspaceRoute } from "../../src/utils/host-routes"; @@ -91,21 +90,11 @@ interface DaemonClientConfig { 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 { - const DaemonClient = await loadDaemonClientConstructor(); + const DaemonClient = await loadDaemonClientConstructor< + DaemonClientConfig, + DaemonClientInstance + >(); const webSocketFactory = createNodeWebSocketFactory(); const client = new DaemonClient({ url: getDaemonWsUrl(), diff --git a/packages/app/e2e/helpers/archive-tab.ts b/packages/app/e2e/helpers/archive-tab.ts index 3c901b2d1..bda873d9e 100644 --- a/packages/app/e2e/helpers/archive-tab.ts +++ b/packages/app/e2e/helpers/archive-tab.ts @@ -1,8 +1,7 @@ import { randomUUID } from "node:crypto"; -import path from "node:path"; -import { pathToFileURL } from "node:url"; import { expect, type Page } from "@playwright/test"; import { buildCreateAgentPreferences, buildSeededHost } from "./daemon-registry"; +import { loadDaemonClientConstructor } from "./daemon-client-loader"; import { createNodeWebSocketFactory, type NodeWebSocketFactory } from "./node-ws-factory"; import { waitForWorkspaceTabsVisible } from "./workspace-tabs"; import { @@ -83,21 +82,11 @@ interface ArchiveTabDaemonClientConfig { 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 { - const DaemonClient = await loadDaemonClientConstructor(); + const DaemonClient = await loadDaemonClientConstructor< + ArchiveTabDaemonClientConfig, + ArchiveTabDaemonClient + >(); const webSocketFactory = createNodeWebSocketFactory(); const client = new DaemonClient({ url: getDaemonWsUrl(), diff --git a/packages/app/e2e/helpers/daemon-client-loader.ts b/packages/app/e2e/helpers/daemon-client-loader.ts new file mode 100644 index 000000000..c2bc0ccbd --- /dev/null +++ b/packages/app/e2e/helpers/daemon-client-loader.ts @@ -0,0 +1,15 @@ +import path from "node:path"; +import { pathToFileURL } from "node:url"; + +export async function loadDaemonClientConstructor(): 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; +} diff --git a/packages/app/e2e/helpers/new-workspace.ts b/packages/app/e2e/helpers/new-workspace.ts index 4bee74449..22146428f 100644 --- a/packages/app/e2e/helpers/new-workspace.ts +++ b/packages/app/e2e/helpers/new-workspace.ts @@ -1,14 +1,13 @@ import { randomUUID } from "node:crypto"; -import path from "node:path"; -import { pathToFileURL } from "node:url"; 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 { loadDaemonClientConstructor } from "./daemon-client-loader"; import { expectWorkspaceHeader, workspaceLabelFromPath } from "./workspace-ui"; import { createNodeWebSocketFactory, type NodeWebSocketFactory } from "./node-ws-factory"; type NewWorkspaceDaemonClient = Pick< - ServerDaemonClient, + InternalDaemonClient, | "archivePaseoWorktree" | "archiveWorkspace" | "close" @@ -48,19 +47,6 @@ function getDaemonWsUrl(): string { 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) { if (payload.error) { throw new Error(payload.error); @@ -83,7 +69,10 @@ function parseWorkspaceIdFromPageUrl(page: Page, serverId: string): string | nul } export async function connectNewWorkspaceDaemonClient(): Promise { - const DaemonClient = await loadDaemonClientConstructor(); + const DaemonClient = await loadDaemonClientConstructor< + NewWorkspaceDaemonClientConfig, + NewWorkspaceDaemonClient + >(); const webSocketFactory = createNodeWebSocketFactory(); const client = new DaemonClient({ url: getDaemonWsUrl(), diff --git a/packages/app/e2e/helpers/terminal-perf.ts b/packages/app/e2e/helpers/terminal-perf.ts index 9e191fcc5..31ad6f797 100644 --- a/packages/app/e2e/helpers/terminal-perf.ts +++ b/packages/app/e2e/helpers/terminal-perf.ts @@ -1,8 +1,8 @@ import { expect, type Page } from "@playwright/test"; import path from "node:path"; -import { pathToFileURL } from "node:url"; import { randomUUID } from "node:crypto"; import { readFileSync } from "node:fs"; +import { loadDaemonClientConstructor } from "./daemon-client-loader"; import { createNodeWebSocketFactory, type NodeWebSocketFactory } from "./node-ws-factory"; import { buildHostWorkspaceRoute } from "../../src/utils/host-routes"; @@ -81,21 +81,11 @@ interface TerminalPerfDaemonClientConfig { 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 { - const DaemonClient = await loadDaemonClientConstructor(); + const DaemonClient = await loadDaemonClientConstructor< + TerminalPerfDaemonClientConfig, + TerminalPerfDaemonClient + >(); const webSocketFactory = createNodeWebSocketFactory(); const client = new DaemonClient({ url: getDaemonWsUrl(), diff --git a/packages/app/e2e/helpers/workspace-setup.ts b/packages/app/e2e/helpers/workspace-setup.ts index 3ab7bc6a3..103a1d40e 100644 --- a/packages/app/e2e/helpers/workspace-setup.ts +++ b/packages/app/e2e/helpers/workspace-setup.ts @@ -1,13 +1,12 @@ import { realpathSync } from "node:fs"; -import path from "node:path"; import { randomUUID } from "node:crypto"; -import { pathToFileURL } from "node:url"; import { expect, type Page } from "@playwright/test"; import { parseHostWorkspaceRouteFromPathname } from "../../src/utils/host-routes"; import { gotoAppShell } from "./app"; +import { loadDaemonClientConstructor } from "./daemon-client-loader"; import { createNodeWebSocketFactory, type NodeWebSocketFactory } from "./node-ws-factory"; import { switchWorkspaceViaSidebar } from "./workspace-ui"; -import type { SessionOutboundMessage } from "@server/shared/messages"; +import type { SessionOutboundMessage } from "@getpaseo/protocol/messages"; interface WorkspaceSetupDaemonClient { connect(): Promise; @@ -70,31 +69,16 @@ function getDaemonWsUrl(): string { return `ws://127.0.0.1:${daemonPort}/ws`; } -async function loadDaemonClientConstructor(): Promise< - new (config: { - 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: { +export async function connectWorkspaceSetupClient(): Promise { + const DaemonClient = await loadDaemonClientConstructor< + { url: string; clientId: string; clientType: "cli"; webSocketFactory?: NodeWebSocketFactory; - }) => WorkspaceSetupDaemonClient; - }; - return mod.DaemonClient; -} - -export async function connectWorkspaceSetupClient(): Promise { - const DaemonClient = await loadDaemonClientConstructor(); + }, + WorkspaceSetupDaemonClient + >(); const webSocketFactory = createNodeWebSocketFactory(); const client = new DaemonClient({ url: getDaemonWsUrl(), diff --git a/packages/app/maestro/record-workspace-create-android-focus.sh b/packages/app/maestro/record-workspace-create-android-focus.sh index 748981738..c55ffd3bd 100755 --- a/packages/app/maestro/record-workspace-create-android-focus.sh +++ b/packages/app/maestro/record-workspace-create-android-focus.sh @@ -15,6 +15,7 @@ OUT_DIR="/tmp/paseo-workspace-create-android-focus-$(date +%s)" VIDEO_DIR="/tmp/paseo-maestro-videos" DEVICE_VIDEO="/sdcard/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_DIRECT_ENDPOINT="${PASEO_MAESTRO_DIRECT_ENDPOINT:-127.0.0.1:6767}" @@ -55,6 +56,12 @@ require_command perl 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 PROJECT_PARENT="$(mktemp -d /tmp/paseo-maestro-project-XXXXXX)" 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."); } -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 client = new DaemonClient({ url: daemonUrl, diff --git a/packages/app/maestro/test-workspace-create-android-crash.sh b/packages/app/maestro/test-workspace-create-android-crash.sh index e9cccc543..73f275a11 100755 --- a/packages/app/maestro/test-workspace-create-android-crash.sh +++ b/packages/app/maestro/test-workspace-create-android-crash.sh @@ -24,7 +24,7 @@ REPO_ROOT="$(cd "$(dirname "$0")/../../.." && pwd)" FLOW_TEMPLATE="$REPO_ROOT/packages/app/maestro/workspace-create-android-crash.yaml" FLOW_TEMPLATE_DIR="$REPO_ROOT/packages/app/maestro" 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_DIRECT_ENDPOINT="${PASEO_MAESTRO_DIRECT_ENDPOINT:-127.0.0.1:6767}" @@ -62,9 +62,9 @@ render_flow_tree() { done } -if [ ! -f "$SERVER_EXPORTS" ]; then - echo "Missing server build artifact: $SERVER_EXPORTS" >&2 - echo "Run: npm run build --workspace=@getpaseo/server" >&2 +if [ ! -f "$CLIENT_EXPORTS" ]; then + echo "Missing client build artifact: $CLIENT_EXPORTS" >&2 + echo "Run: npm run build:client" >&2 exit 1 fi @@ -117,7 +117,7 @@ if (!repoRoot || !projectPath || !daemonUrl) { 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 client = new DaemonClient({ url: daemonUrl, diff --git a/packages/app/metro.config.cjs b/packages/app/metro.config.cjs index 1852ad545..591792bf9 100644 --- a/packages/app/metro.config.cjs +++ b/packages/app/metro.config.cjs @@ -6,7 +6,6 @@ const path = require("path"); const projectRoot = __dirname; const appNodeModulesRoot = path.resolve(projectRoot, "node_modules"); const appSrcRoot = path.resolve(projectRoot, "src"); -const serverSrcRoot = path.resolve(projectRoot, "../server/src"); const relaySrcRoot = path.resolve(projectRoot, "../relay/src"); const customWebPlatform = (process.env.PASEO_WEB_PLATFORM ?? "") .trim() @@ -68,11 +67,7 @@ function resolveWithCustomWebOverlay(context, moduleName, platform) { config.resolver.resolveRequest = (context, moduleName, platform) => { const origin = context.originModulePath; - if ( - origin && - (origin.startsWith(serverSrcRoot) || origin.startsWith(relaySrcRoot)) && - moduleName.endsWith(".js") - ) { + if (origin && origin.startsWith(relaySrcRoot) && moduleName.endsWith(".js")) { const tsModuleName = moduleName.replace(/\.js$/, ".ts"); const candidatePath = path.resolve(path.dirname(origin), tsModuleName); if (fs.existsSync(candidatePath)) { diff --git a/packages/app/package.json b/packages/app/package.json index 818ad060d..f942ecf58 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -4,19 +4,19 @@ "private": true, "main": "index.ts", "scripts": { - "start": "cross-env APP_VARIANT=development expo start", - "build:terminal-webview": "node ./scripts/build-terminal-webview-html.mjs", + "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\"", + "start:expo": "cross-env APP_VARIANT=development expo start", "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 run build:workspace-deps && npm run build:terminal-webview", + "eas-build-post-install": "npm --prefix ../.. run build:app-deps && npm run build:terminal-webview", "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:production": "cross-env APP_VARIANT=production expo prebuild --platform android --non-interactive && cross-env APP_VARIANT=production expo run:android --variant=release", + "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": "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:clear": "node -e \"require('node:fs').rmSync('android', { recursive: true, force: true })\"", - "ios": "expo run:ios", - "ios:release": "expo run:ios --configuration Release", - "web": "expo start --web", + "ios": "npm --prefix ../.. run build:client && expo run:ios", + "ios:release": "npm --prefix ../.. run build:client && expo run:ios --configuration Release", + "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", "typecheck": "tsgo --noEmit", "test": "vitest run", @@ -25,16 +25,19 @@ "test:e2e:real": "playwright test --project=real-provider", "test:e2e:ui": "playwright test --ui", "build": "npm run build:web", - "build:web": "npm run build:workspace-deps && expo export --platform web", - "deploy:web": "npm run build:web && wrangler pages deploy dist --project-name paseo-app --branch main" + "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", + "build:terminal-webview": "node ./scripts/build-terminal-webview-html.mjs" }, "dependencies": { "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", "@floating-ui/react-native": "^0.10.7", + "@getpaseo/client": "*", "@getpaseo/expo-two-way-audio": "*", "@getpaseo/highlight": "*", + "@getpaseo/protocol": "*", "@gorhom/bottom-sheet": "^5.2.14", "@gorhom/portal": "^1.0.14", "@react-native-async-storage/async-storage": "2.2.0", @@ -105,6 +108,7 @@ }, "devDependencies": { "@playwright/test": "^1.56.1", + "@testing-library/dom": "^10.4.1", "@testing-library/react": "^16.3.2", "@types/markdown-it": "^14.1.2", "@types/qrcode": "^1.5.6", diff --git a/packages/app/src/agent-stream/view.tsx b/packages/app/src/agent-stream/view.tsx index 57f17970d..303cbcb04 100644 --- a/packages/app/src/agent-stream/view.tsx +++ b/packages/app/src/agent-stream/view.tsx @@ -43,13 +43,13 @@ import type { PendingPermission } from "@/types/shared"; import type { AgentPermissionAction, AgentPermissionResponse, -} from "@server/server/agent/agent-sdk-types"; +} from "@getpaseo/protocol/agent-types"; import type { AgentScreenAgent } from "@/hooks/use-agent-screen-state-machine"; import { useSessionStore } from "@/stores/session-store"; import { useFileExplorerActions } from "@/hooks/use-file-explorer-actions"; import { useLoadOlderAgentHistory } from "@/hooks/use-load-older-agent-history"; 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 { QuestionFormCard } from "@/components/question-form-card"; import { ToolCallSheetProvider } from "@/components/tool-call-sheet"; diff --git a/packages/app/src/app/pair-scan.tsx b/packages/app/src/app/pair-scan.tsx index 7ff8db78f..b3a96f3aa 100644 --- a/packages/app/src/app/pair-scan.tsx +++ b/packages/app/src/app/pair-scan.tsx @@ -8,7 +8,7 @@ import type { BarcodeScanningResult, BarcodeSettings } from "expo-camera"; import { useHostMutations } from "@/runtime/host-runtime"; import { decodeOfferFragmentPayload, normalizeHostPort } from "@/utils/daemon-endpoints"; 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 { isWeb } from "@/constants/platform"; import { BackHeader } from "@/components/headers/back-header"; diff --git a/packages/app/src/attachments/types.ts b/packages/app/src/attachments/types.ts index 66dda83d5..3d373bd0f 100644 --- a/packages/app/src/attachments/types.ts +++ b/packages/app/src/attachments/types.ts @@ -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"; diff --git a/packages/app/src/attachments/workspace-attachment-utils.ts b/packages/app/src/attachments/workspace-attachment-utils.ts index cdb6f0915..1d7df81fe 100644 --- a/packages/app/src/attachments/workspace-attachment-utils.ts +++ b/packages/app/src/attachments/workspace-attachment-utils.ts @@ -3,7 +3,7 @@ import type { UserComposerAttachment, WorkspaceComposerAttachment, } from "@/attachments/types"; -import type { AgentAttachment } from "@server/shared/messages"; +import type { AgentAttachment } from "@getpaseo/protocol/messages"; export function isWorkspaceAttachment( attachment: ComposerAttachment | undefined, diff --git a/packages/app/src/components/agent-status-dot.tsx b/packages/app/src/components/agent-status-dot.tsx index bdf7e360a..c7c1ec5bb 100644 --- a/packages/app/src/components/agent-status-dot.tsx +++ b/packages/app/src/components/agent-status-dot.tsx @@ -4,7 +4,7 @@ import { StyleSheet, useUnistyles } from "react-native-unistyles"; import { AGENT_LIFECYCLE_STATUSES, type AgentLifecycleStatus, -} from "@server/shared/agent-lifecycle"; +} from "@getpaseo/protocol/agent-lifecycle"; import { deriveSidebarStateBucket } from "@/utils/sidebar-agent-state"; import { getStatusDotColor } from "@/utils/status-dot-color"; diff --git a/packages/app/src/components/combined-model-selector.tsx b/packages/app/src/components/combined-model-selector.tsx index 2f7b3c2f5..9c87318b8 100644 --- a/packages/app/src/components/combined-model-selector.tsx +++ b/packages/app/src/components/combined-model-selector.tsx @@ -19,7 +19,7 @@ import { Settings, Star, } 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 { useProviderSettingsStore } from "@/stores/provider-settings-store"; import { Button } from "@/components/ui/button"; diff --git a/packages/app/src/components/file-pane.tsx b/packages/app/src/components/file-pane.tsx index a4e71a3d5..02cb36c6a 100644 --- a/packages/app/src/components/file-pane.tsx +++ b/packages/app/src/components/file-pane.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useMemo, useRef } from "react"; 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 { ActivityIndicator, diff --git a/packages/app/src/components/icons/editor-app-icons.tsx b/packages/app/src/components/icons/editor-app-icons.tsx index 0f086f0ce..2abdba0ed 100644 --- a/packages/app/src/components/icons/editor-app-icons.tsx +++ b/packages/app/src/components/icons/editor-app-icons.tsx @@ -5,7 +5,7 @@ import { isKnownEditorTargetId, type EditorTargetId, type KnownEditorTargetId, -} from "@server/shared/messages"; +} from "@getpaseo/protocol/messages"; interface EditorAppIconProps { editorId: EditorTargetId; diff --git a/packages/app/src/components/import-session-sheet.test.tsx b/packages/app/src/components/import-session-sheet.test.tsx index 33cfa0b79..3dd17243d 100644 --- a/packages/app/src/components/import-session-sheet.test.tsx +++ b/packages/app/src/components/import-session-sheet.test.tsx @@ -4,8 +4,11 @@ import React, { type ReactNode } from "react"; import { cleanup, fireEvent, render, screen, waitFor } from "@testing-library/react"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import type { DaemonClient, FetchRecentProviderSessionEntry } from "@server/client/daemon-client"; -import type { ProviderSnapshotEntry } from "@server/server/agent/agent-sdk-types"; +import type { + 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 { ImportSessionSheet } from "@/components/import-session-sheet"; diff --git a/packages/app/src/components/import-session-sheet.tsx b/packages/app/src/components/import-session-sheet.tsx index 09b0bf21e..b737a10f1 100644 --- a/packages/app/src/components/import-session-sheet.tsx +++ b/packages/app/src/components/import-session-sheet.tsx @@ -1,9 +1,12 @@ import React, { useCallback, useEffect, useMemo, useState } from "react"; import { Pressable, type PressableStateCallbackType, ScrollView, Text, View } from "react-native"; import { useMutation, useQueries, useQueryClient } from "@tanstack/react-query"; -import type { DaemonClient, FetchRecentProviderSessionEntry } from "@server/client/daemon-client"; -import type { AgentProvider } from "@server/server/agent/agent-sdk-types"; -import { IMPORTABLE_PROVIDERS } from "@server/shared/importable-providers"; +import type { + DaemonClient, + 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 { StyleSheet, useUnistyles } from "react-native-unistyles"; import { AdaptiveModalSheet, type SheetHeader } from "@/components/adaptive-modal-sheet"; diff --git a/packages/app/src/components/message.tsx b/packages/app/src/components/message.tsx index 4dbee1b49..4a59a6f2f 100644 --- a/packages/app/src/components/message.tsx +++ b/packages/app/src/components/message.tsx @@ -64,8 +64,8 @@ import Svg, { Defs, LinearGradient as SvgLinearGradient, Rect, Stop } from "reac import { createMarkdownStyles } from "@/styles/markdown-styles"; import { Fonts } from "@/constants/theme"; import type { TodoEntry, UserMessageImageAttachment } from "@/types/stream"; -import type { AgentAttachment } from "@server/shared/messages"; -import type { ToolCallDetail } from "@server/server/agent/agent-sdk-types"; +import type { AgentAttachment } from "@getpaseo/protocol/messages"; +import type { ToolCallDetail } from "@getpaseo/protocol/agent-types"; import { buildToolCallPresentation } from "@/tool-calls/presentation"; import { resolveToolCallIcon } from "@/utils/tool-call-icon"; import { getMarkdownListMarker, getMarkdownListSpacing } from "@/utils/markdown-list"; @@ -101,9 +101,9 @@ import { import { getCompactionMarkerLabel } from "./message-compaction-label"; import { useAttachmentPreviewUrl } from "@/attachments/use-attachment-preview-url"; 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 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 { useRewindAgentMutation } from "@/components/rewind/use-rewind-agent-mutation"; export type { InlinePathTarget } from "@/assistant-file-links"; diff --git a/packages/app/src/components/pair-link-modal.tsx b/packages/app/src/components/pair-link-modal.tsx index 4328c0180..bb9048a45 100644 --- a/packages/app/src/components/pair-link-modal.tsx +++ b/packages/app/src/components/pair-link-modal.tsx @@ -7,7 +7,7 @@ import type { HostProfile } from "@/types/host-connection"; import { useHosts, useHostMutations } from "@/runtime/host-runtime"; import { decodeOfferFragmentPayload, normalizeHostPort } from "@/utils/daemon-endpoints"; 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 { Button } from "@/components/ui/button"; diff --git a/packages/app/src/components/provider-diagnostic-sheet.tsx b/packages/app/src/components/provider-diagnostic-sheet.tsx index e8094ea25..53a4afa89 100644 --- a/packages/app/src/components/provider-diagnostic-sheet.tsx +++ b/packages/app/src/components/provider-diagnostic-sheet.tsx @@ -25,8 +25,8 @@ import { settingsStyles } from "@/styles/settings"; import { resolveProviderLabel } from "@/utils/provider-definitions"; import { formatTimeAgo } from "@/utils/time"; import { compareMatchScores, scoreTextFields } from "@/utils/score-match"; -import type { AgentModelDefinition, AgentProvider } from "@server/server/agent/agent-sdk-types"; -import type { ProviderProfileModel } from "@server/server/agent/provider-launch-config"; +import type { AgentModelDefinition, AgentProvider } from "@getpaseo/protocol/agent-types"; +import type { ProviderProfileModel } from "@getpaseo/protocol/provider-config"; interface ProviderDiagnosticSheetProps { provider: string; diff --git a/packages/app/src/components/question-form-card.tsx b/packages/app/src/components/question-form-card.tsx index c64238858..150221c0a 100644 --- a/packages/app/src/components/question-form-card.tsx +++ b/packages/app/src/components/question-form-card.tsx @@ -11,7 +11,7 @@ import { StyleSheet, useUnistyles } from "react-native-unistyles"; import { useIsCompactFormFactor } from "@/constants/layout"; import { Check, CircleHelp, X } from "lucide-react-native"; 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"; interface QuestionOption { diff --git a/packages/app/src/components/rewind/rewind-menu.tsx b/packages/app/src/components/rewind/rewind-menu.tsx index c603b4d22..08ddb04e3 100644 --- a/packages/app/src/components/rewind/rewind-menu.tsx +++ b/packages/app/src/components/rewind/rewind-menu.tsx @@ -11,7 +11,7 @@ import { } from "@/components/ui/dropdown-menu"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; 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 }; diff --git a/packages/app/src/components/rewind/use-rewind-agent-mutation.ts b/packages/app/src/components/rewind/use-rewind-agent-mutation.ts index 06c645e06..f09112b22 100644 --- a/packages/app/src/components/rewind/use-rewind-agent-mutation.ts +++ b/packages/app/src/components/rewind/use-rewind-agent-mutation.ts @@ -1,7 +1,7 @@ import { useCallback } from "react"; import { useMutation } from "@tanstack/react-query"; 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 { useRewindComposerRestore } from "./composer-restore"; import { useSessionStore } from "@/stores/session-store"; diff --git a/packages/app/src/components/rewind/use-rewind-capabilities.ts b/packages/app/src/components/rewind/use-rewind-capabilities.ts index f00525030..0d66fd825 100644 --- a/packages/app/src/components/rewind/use-rewind-capabilities.ts +++ b/packages/app/src/components/rewind/use-rewind-capabilities.ts @@ -1,5 +1,5 @@ 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"; diff --git a/packages/app/src/components/sidebar-workspace-list.test.tsx b/packages/app/src/components/sidebar-workspace-list.test.tsx index 5408c4f0f..cf38bc493 100644 --- a/packages/app/src/components/sidebar-workspace-list.test.tsx +++ b/packages/app/src/components/sidebar-workspace-list.test.tsx @@ -2,8 +2,8 @@ * @vitest-environment jsdom */ import { act } from "@testing-library/react"; -import type { DaemonClient } from "@server/client/daemon-client"; -import type { WorkspaceScriptPayload } from "@server/shared/messages"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; +import type { WorkspaceScriptPayload } from "@getpaseo/protocol/messages"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { createRoot, type Root } from "react-dom/client"; import React from "react"; diff --git a/packages/app/src/components/sidebar-workspace-list.tsx b/packages/app/src/components/sidebar-workspace-list.tsx index 974c734c7..7f9d504d5 100644 --- a/packages/app/src/components/sidebar-workspace-list.tsx +++ b/packages/app/src/components/sidebar-workspace-list.tsx @@ -13,7 +13,7 @@ import { } from "react-native"; import * as Haptics from "expo-haptics"; 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 { invalidateCheckoutGitQueriesForClient } from "@/git/query-keys"; import { diff --git a/packages/app/src/components/terminal-emulator.native.tsx b/packages/app/src/components/terminal-emulator.native.tsx index 1de6dda36..b090d4ad2 100644 --- a/packages/app/src/components/terminal-emulator.native.tsx +++ b/packages/app/src/components/terminal-emulator.native.tsx @@ -18,8 +18,8 @@ import { } from "react-native"; import { WebView, type WebViewMessageEvent } from "react-native-webview"; import type { ITheme } from "@xterm/xterm"; -import type { TerminalState } from "@server/shared/messages"; -import type { TerminalInputModeState } from "@server/shared/terminal-input-mode"; +import type { TerminalState } from "@getpaseo/protocol/messages"; +import type { TerminalInputModeState } from "@getpaseo/protocol/terminal-input-mode"; import type { TerminalOutputData } from "../terminal/runtime/terminal-emulator-runtime"; import type { TerminalLocalFileLinkSource, diff --git a/packages/app/src/components/terminal-emulator.tsx b/packages/app/src/components/terminal-emulator.tsx index 4b0566b2b..22e9d33e2 100644 --- a/packages/app/src/components/terminal-emulator.tsx +++ b/packages/app/src/components/terminal-emulator.tsx @@ -17,8 +17,8 @@ import type { DOMProps } from "expo/dom"; import { useDOMImperativeHandle, type DOMImperativeFactory } from "expo/dom"; import "@xterm/xterm/css/xterm.css"; import type { ITheme } from "@xterm/xterm"; -import type { TerminalState } from "@server/shared/messages"; -import type { TerminalInputModeState } from "@server/shared/terminal-input-mode"; +import type { TerminalState } from "@getpaseo/protocol/messages"; +import type { TerminalInputModeState } from "@getpaseo/protocol/terminal-input-mode"; import type { PendingTerminalModifiers } from "../utils/terminal-keys"; import { TerminalEmulatorRuntime, diff --git a/packages/app/src/components/terminal-pane.tsx b/packages/app/src/components/terminal-pane.tsx index 73c8bb117..7522c33fe 100644 --- a/packages/app/src/components/terminal-pane.tsx +++ b/packages/app/src/components/terminal-pane.tsx @@ -8,8 +8,8 @@ import { } from "react-native"; import Animated, { runOnJS, useAnimatedReaction } from "react-native-reanimated"; import { StyleSheet, useUnistyles } from "react-native-unistyles"; -import { encodeTerminalKeyInput } from "@server/shared/terminal-key-input"; -import type { TerminalInputModeState } from "@server/shared/terminal-input-mode"; +import { encodeTerminalKeyInput } from "@getpaseo/protocol/terminal-key-input"; +import type { TerminalInputModeState } from "@getpaseo/protocol/terminal-input-mode"; import { useHostRuntimeClient, useHostRuntimeIsConnected } from "@/runtime/host-runtime"; import { useKeyboardShiftStyle } from "@/hooks/use-keyboard-shift-style"; import { useAppVisible } from "@/hooks/use-app-visible"; diff --git a/packages/app/src/components/tool-call-details.tsx b/packages/app/src/components/tool-call-details.tsx index bad25a0c1..40e35bddc 100644 --- a/packages/app/src/components/tool-call-details.tsx +++ b/packages/app/src/components/tool-call-details.tsx @@ -9,7 +9,7 @@ import { import { ScrollView as GHScrollView } from "react-native-gesture-handler"; import { StyleSheet } from "react-native-unistyles"; 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 { hasMeaningfulToolCallDetail } from "@/utils/tool-call-detail-state"; import { useWebScrollbarStyle } from "@/hooks/use-web-scrollbar-style"; diff --git a/packages/app/src/components/tool-call-sheet.tsx b/packages/app/src/components/tool-call-sheet.tsx index 1030bc6a0..2d9f98a5c 100644 --- a/packages/app/src/components/tool-call-sheet.tsx +++ b/packages/app/src/components/tool-call-sheet.tsx @@ -9,7 +9,7 @@ import { BottomSheetBackgroundProps, } from "@gorhom/bottom-sheet"; 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 { IsolatedBottomSheetModal, useIsolatedBottomSheetVisibility, diff --git a/packages/app/src/components/workspace-setup-dialog.tsx b/packages/app/src/components/workspace-setup-dialog.tsx index 7f23ed3ec..5792fade9 100644 --- a/packages/app/src/components/workspace-setup-dialog.tsx +++ b/packages/app/src/components/workspace-setup-dialog.tsx @@ -16,7 +16,10 @@ import { normalizeAgentSnapshot } from "@/utils/agent-snapshots"; import { encodeImages } from "@/utils/encode-images"; import { toErrorMessage } from "@/utils/error-messages"; 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 { requireWorkspaceExecutionAuthority } from "@/utils/workspace-execution"; import { navigateToAgent } from "@/utils/navigate-to-agent"; diff --git a/packages/app/src/components/workspace-shortcut-targets-subscriber.test.tsx b/packages/app/src/components/workspace-shortcut-targets-subscriber.test.tsx index 8809abf3e..86e2ac3e8 100644 --- a/packages/app/src/components/workspace-shortcut-targets-subscriber.test.tsx +++ b/packages/app/src/components/workspace-shortcut-targets-subscriber.test.tsx @@ -3,7 +3,7 @@ */ import React from "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 { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { useKeyboardShortcutsStore } from "@/stores/keyboard-shortcuts-store"; diff --git a/packages/app/src/components/worktree-setup-callout-policy.ts b/packages/app/src/components/worktree-setup-callout-policy.ts index 29b8d2a9b..ab67e4192 100644 --- a/packages/app/src/components/worktree-setup-callout-policy.ts +++ b/packages/app/src/components/worktree-setup-callout-policy.ts @@ -1,4 +1,4 @@ -import type { PaseoConfigRaw } from "@server/shared/messages"; +import type { PaseoConfigRaw } from "@getpaseo/protocol/messages"; import { buildProjectSettingsRoute } from "@/utils/host-routes"; export interface WorktreeSetupWorkspaceInput { diff --git a/packages/app/src/composer/actions.test.ts b/packages/app/src/composer/actions.test.ts index 84e677950..ab6266b09 100644 --- a/packages/app/src/composer/actions.test.ts +++ b/packages/app/src/composer/actions.test.ts @@ -1,5 +1,5 @@ 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 { AttachmentMetadata, ComposerAttachment, diff --git a/packages/app/src/composer/actions.ts b/packages/app/src/composer/actions.ts index 62924128c..82d61c63d 100644 --- a/packages/app/src/composer/actions.ts +++ b/packages/app/src/composer/actions.ts @@ -1,4 +1,4 @@ -import type { GitHubSearchItem } from "@server/shared/messages"; +import type { GitHubSearchItem } from "@getpaseo/protocol/messages"; import type { AttachmentMetadata, ComposerAttachment, diff --git a/packages/app/src/composer/agent-controls/index.tsx b/packages/app/src/composer/agent-controls/index.tsx index 8747544b2..dd2733aff 100644 --- a/packages/app/src/composer/agent-controls/index.tsx +++ b/packages/app/src/composer/agent-controls/index.tsx @@ -50,8 +50,8 @@ import type { AgentMode, AgentModelDefinition, AgentProvider, -} from "@server/server/agent/agent-sdk-types"; -import type { AgentProviderDefinition } from "@server/server/agent/provider-manifest"; +} from "@getpaseo/protocol/agent-types"; +import type { AgentProviderDefinition } from "@getpaseo/protocol/provider-manifest"; import { getFeatureHighlightColor, getFeatureTooltip, diff --git a/packages/app/src/composer/agent-controls/mode-control.tsx b/packages/app/src/composer/agent-controls/mode-control.tsx index 6cd246d31..8d92992ef 100644 --- a/packages/app/src/composer/agent-controls/mode-control.tsx +++ b/packages/app/src/composer/agent-controls/mode-control.tsx @@ -28,11 +28,8 @@ import { useToast } from "@/contexts/toast-context"; import { useIsCompactFormFactor } from "@/constants/layout"; import { toErrorMessage } from "@/utils/error-messages"; import { formatAgentModeLabel } from "@/composer/agent-controls/utils"; -import type { AgentMode, AgentProvider } from "@server/server/agent/agent-sdk-types"; -import { - getModeVisuals, - type AgentProviderDefinition, -} from "@server/server/agent/provider-manifest"; +import type { AgentMode, AgentProvider } from "@getpaseo/protocol/agent-types"; +import { getModeVisuals, type AgentProviderDefinition } from "@getpaseo/protocol/provider-manifest"; export type AgentModeControlPlacement = "toolbar" | "footer"; diff --git a/packages/app/src/composer/agent-controls/utils.ts b/packages/app/src/composer/agent-controls/utils.ts index 2d0df9d59..3e4dce724 100644 --- a/packages/app/src/composer/agent-controls/utils.ts +++ b/packages/app/src/composer/agent-controls/utils.ts @@ -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 FeatureHighlightColor = "blue" | "default" | "green" | "yellow"; diff --git a/packages/app/src/composer/attachments/submit.ts b/packages/app/src/composer/attachments/submit.ts index 2ae391589..4e443815b 100644 --- a/packages/app/src/composer/attachments/submit.ts +++ b/packages/app/src/composer/attachments/submit.ts @@ -4,7 +4,7 @@ import { isWorkspaceAttachment, workspaceAttachmentToSubmitAttachment, } 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"; export function splitComposerAttachmentsForSubmit(attachments: ComposerAttachment[]): { diff --git a/packages/app/src/composer/draft/create-flow.test.ts b/packages/app/src/composer/draft/create-flow.test.ts index b8e662b5f..70ae16b66 100644 --- a/packages/app/src/composer/draft/create-flow.test.ts +++ b/packages/app/src/composer/draft/create-flow.test.ts @@ -5,7 +5,7 @@ import { act, renderHook } from "@testing-library/react"; import { beforeEach, describe, expect, it, vi } from "vitest"; import { useCreateFlowStore } from "@/stores/create-flow-store"; 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"; describe("useDraftAgentCreateFlow", () => { diff --git a/packages/app/src/composer/draft/create-flow.ts b/packages/app/src/composer/draft/create-flow.ts index 9049912db..f86002b49 100644 --- a/packages/app/src/composer/draft/create-flow.ts +++ b/packages/app/src/composer/draft/create-flow.ts @@ -9,7 +9,7 @@ import { type StreamItem, type UserMessageImageAttachment, } from "@/types/stream"; -import type { AgentAttachment } from "@server/shared/messages"; +import type { AgentAttachment } from "@getpaseo/protocol/messages"; const EMPTY_STREAM_ITEMS: StreamItem[] = []; diff --git a/packages/app/src/composer/draft/workspace-tab.tsx b/packages/app/src/composer/draft/workspace-tab.tsx index 974e802c6..f610249a1 100644 --- a/packages/app/src/composer/draft/workspace-tab.tsx +++ b/packages/app/src/composer/draft/workspace-tab.tsx @@ -25,9 +25,9 @@ import { encodeImages } from "@/utils/encode-images"; import type { WorkspaceFileOpenRequest } from "@/workspace/file-open"; import { shouldAutoFocusWorkspaceDraftComposer } from "@/screens/workspace/workspace-draft-pane-focus"; import { validateDraftSubmission } from "@/composer/draft/workspace-tab-core"; -import type { AgentCapabilityFlags } from "@server/server/agent/agent-sdk-types"; -import type { AgentSnapshotPayload } from "@server/shared/messages"; -import type { DaemonClient } from "@server/client/daemon-client"; +import type { AgentCapabilityFlags } from "@getpaseo/protocol/agent-types"; +import type { AgentSnapshotPayload } from "@getpaseo/protocol/messages"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import type { WorkspaceComposerAttachment } from "@/attachments/types"; import { useWorkspaceAttachments, diff --git a/packages/app/src/composer/github/auto-attach.test.tsx b/packages/app/src/composer/github/auto-attach.test.tsx index f904d23d8..8d283ff05 100644 --- a/packages/app/src/composer/github/auto-attach.test.tsx +++ b/packages/app/src/composer/github/auto-attach.test.tsx @@ -8,7 +8,7 @@ import { useState } from "react"; import { describe, expect, it, vi } from "vitest"; import type { UserComposerAttachment } from "@/attachments/types"; 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"; type GitHubSearchPayload = GitHubSearchResponse["payload"]; diff --git a/packages/app/src/composer/github/auto-attach.ts b/packages/app/src/composer/github/auto-attach.ts index 8ca9be4c4..c92f7eac3 100644 --- a/packages/app/src/composer/github/auto-attach.ts +++ b/packages/app/src/composer/github/auto-attach.ts @@ -14,7 +14,7 @@ import { type GitHubSearchClient, } from "@/git/use-github-search-query"; 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"; const AUTO_ATTACH_DEBOUNCE_MS = 300; diff --git a/packages/app/src/composer/index.tsx b/packages/app/src/composer/index.tsx index 476a05b35..3f935e885 100644 --- a/packages/app/src/composer/index.tsx +++ b/packages/app/src/composer/index.tsx @@ -86,7 +86,7 @@ import type { MessageInputKeyboardActionKind } from "@/keyboard/actions"; import { submitAgentInput } from "@/composer/submit"; import { useAppSettings } from "@/hooks/use-settings"; import { isWeb, isNative } from "@/constants/platform"; -import type { GitHubSearchItem } from "@server/shared/messages"; +import type { GitHubSearchItem } from "@getpaseo/protocol/messages"; import type { AttachmentMetadata, ComposerAttachment, diff --git a/packages/app/src/composer/input/input.tsx b/packages/app/src/composer/input/input.tsx index e6285aecf..a565d6085 100644 --- a/packages/app/src/composer/input/input.tsx +++ b/packages/app/src/composer/input/input.tsx @@ -26,7 +26,7 @@ import Animated, { useSharedValue, useAnimatedStyle, withTiming } from "react-na import { useDictation } from "@/hooks/use-dictation"; import { DictationOverlay } from "@/components/dictation-controls"; 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 { useVoiceOptional } from "@/contexts/voice-context"; import { useToast } from "@/contexts/toast-context"; diff --git a/packages/app/src/composer/input/state.ts b/packages/app/src/composer/input/state.ts index dc106e2df..c15d01b84 100644 --- a/packages/app/src/composer/input/state.ts +++ b/packages/app/src/composer/input/state.ts @@ -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: { client: DaemonClient | null; diff --git a/packages/app/src/contexts/session-context.service-status.test.ts b/packages/app/src/contexts/session-context.service-status.test.ts index aad407202..4365d2c25 100644 --- a/packages/app/src/contexts/session-context.service-status.test.ts +++ b/packages/app/src/contexts/session-context.service-status.test.ts @@ -1,5 +1,5 @@ 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 { patchWorkspaceScripts } from "./session-workspace-scripts"; diff --git a/packages/app/src/contexts/session-context.tsx b/packages/app/src/contexts/session-context.tsx index e82d5ca71..86f286240 100644 --- a/packages/app/src/contexts/session-context.tsx +++ b/packages/app/src/contexts/session-context.tsx @@ -15,18 +15,18 @@ import { } from "@/timeline/session-stream-reducers"; import { useCreateFlowStore } from "@/stores/create-flow-store"; import { TIMELINE_FETCH_PAGE_SIZE } from "@/timeline/timeline-fetch-policy"; -import type { AgentAttachment, SessionOutboundMessage } from "@server/shared/messages"; -import { parseServerInfoStatusPayload } from "@server/shared/messages"; +import type { AgentAttachment, SessionOutboundMessage } from "@getpaseo/protocol/messages"; +import { parseServerInfoStatusPayload } from "@getpaseo/protocol/messages"; import { buildAgentAttentionNotificationPayload, type AgentAttentionNotificationPayload, type NotificationPermissionRequest, -} from "@server/shared/agent-attention-notification"; -import type { AgentLifecycleStatus } from "@server/shared/agent-lifecycle"; -import type { DaemonClient } from "@server/client/daemon-client"; -import type { AgentSessionConfig } from "@server/server/agent/agent-sdk-types"; -import type { GitSetupOptions } from "@server/shared/messages"; -import type { AgentPermissionResponse } from "@server/server/agent/agent-sdk-types"; +} from "@getpaseo/protocol/agent-attention-notification"; +import type { AgentLifecycleStatus } from "@getpaseo/protocol/agent-lifecycle"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; +import type { AgentSessionConfig } from "@getpaseo/protocol/agent-types"; +import type { GitSetupOptions } from "@getpaseo/protocol/messages"; +import type { AgentPermissionResponse } from "@getpaseo/protocol/agent-types"; import { getHostRuntimeStore, useHostRuntimeIsConnected } from "@/runtime/host-runtime"; import { useVoiceAudioEngineOptional, useVoiceRuntimeOptional } from "@/contexts/voice-context"; import type { AudioPlaybackSource } from "@/voice/audio-engine-types"; diff --git a/packages/app/src/contexts/session-status-tracking.ts b/packages/app/src/contexts/session-status-tracking.ts index 58657ae09..3e56167d4 100644 --- a/packages/app/src/contexts/session-status-tracking.ts +++ b/packages/app/src/contexts/session-status-tracking.ts @@ -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"; export function reconcilePreviousAgentStatuses( diff --git a/packages/app/src/contexts/session-workspace-scripts.ts b/packages/app/src/contexts/session-workspace-scripts.ts index 457b5f375..d43f6697c 100644 --- a/packages/app/src/contexts/session-workspace-scripts.ts +++ b/packages/app/src/contexts/session-workspace-scripts.ts @@ -1,5 +1,5 @@ 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 { resolveWorkspaceMapKeyByIdentity } from "@/utils/workspace-execution"; diff --git a/packages/app/src/desktop/daemon/desktop-daemon-transport.ts b/packages/app/src/desktop/daemon/desktop-daemon-transport.ts index 18b3f46f8..b17ee6cc2 100644 --- a/packages/app/src/desktop/daemon/desktop-daemon-transport.ts +++ b/packages/app/src/desktop/daemon/desktop-daemon-transport.ts @@ -1,4 +1,7 @@ -import type { DaemonTransport, DaemonTransportFactory } from "@server/client/daemon-client"; +import type { + DaemonTransport, + DaemonTransportFactory, +} from "@getpaseo/client/internal/daemon-client"; import { closeLocalTransportSession, listenToLocalTransportEvents, diff --git a/packages/app/src/dictation/dictation-stream-sender.test.ts b/packages/app/src/dictation/dictation-stream-sender.test.ts index ee5707a8d..152329420 100644 --- a/packages/app/src/dictation/dictation-stream-sender.test.ts +++ b/packages/app/src/dictation/dictation-stream-sender.test.ts @@ -1,5 +1,5 @@ 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"; diff --git a/packages/app/src/dictation/dictation-stream-sender.ts b/packages/app/src/dictation/dictation-stream-sender.ts index b22d9b3d4..272482c74 100644 --- a/packages/app/src/dictation/dictation-stream-sender.ts +++ b/packages/app/src/dictation/dictation-stream-sender.ts @@ -1,5 +1,5 @@ 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 { client: DaemonClient | null; diff --git a/packages/app/src/file-explorer/read-result.ts b/packages/app/src/file-explorer/read-result.ts index bce6c7b30..693e0a4e1 100644 --- a/packages/app/src/file-explorer/read-result.ts +++ b/packages/app/src/file-explorer/read-result.ts @@ -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"; export function explorerFileFromReadResult(file: FileReadResult): ExplorerFile { diff --git a/packages/app/src/git/actions-store.test.ts b/packages/app/src/git/actions-store.test.ts index ea136b286..a5e1d12ed 100644 --- a/packages/app/src/git/actions-store.test.ts +++ b/packages/app/src/git/actions-store.test.ts @@ -1,5 +1,5 @@ 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 { useSessionStore } from "@/stores/session-store"; import type { WorkspaceDescriptor } from "@/stores/session-store"; diff --git a/packages/app/src/git/actions-store.ts b/packages/app/src/git/actions-store.ts index 72483901c..09f80ff3c 100644 --- a/packages/app/src/git/actions-store.ts +++ b/packages/app/src/git/actions-store.ts @@ -1,5 +1,5 @@ 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 { queryClient as appQueryClient } from "@/query/query-client"; import { diff --git a/packages/app/src/git/diff-order.ts b/packages/app/src/git/diff-order.ts index 6cb20cf67..127121ed3 100644 --- a/packages/app/src/git/diff-order.ts +++ b/packages/app/src/git/diff-order.ts @@ -1,4 +1,4 @@ -import type { SubscribeCheckoutDiffResponse } from "@server/shared/messages"; +import type { SubscribeCheckoutDiffResponse } from "@getpaseo/protocol/messages"; type ParsedDiffFile = SubscribeCheckoutDiffResponse["payload"]["files"][number]; diff --git a/packages/app/src/git/github-url.ts b/packages/app/src/git/github-url.ts index 922cba3bc..fc1702a5a 100644 --- a/packages/app/src/git/github-url.ts +++ b/packages/app/src/git/github-url.ts @@ -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 { const trimmed = remoteUrl?.trim(); diff --git a/packages/app/src/git/policy.test.ts b/packages/app/src/git/policy.test.ts index 08da19407..c11d2221f 100644 --- a/packages/app/src/git/policy.test.ts +++ b/packages/app/src/git/policy.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { CheckoutPrStatusSchema } from "@server/shared/messages"; +import { CheckoutPrStatusSchema } from "@getpaseo/protocol/messages"; import { buildGitActions, type BuildGitActionsInput } from "./policy"; diff --git a/packages/app/src/git/policy.ts b/packages/app/src/git/policy.ts index 5410bbacb..5388dd8c4 100644 --- a/packages/app/src/git/policy.ts +++ b/packages/app/src/git/policy.ts @@ -5,7 +5,7 @@ import type { CheckoutPrMergeMethod, CheckoutPrStatusResponse, PullRequestMergeable, -} from "@server/shared/messages"; +} from "@getpaseo/protocol/messages"; export type GitActionId = | "commit" diff --git a/packages/app/src/git/pr-pane-data.test.ts b/packages/app/src/git/pr-pane-data.test.ts index 9160b3adf..b0d75bd77 100644 --- a/packages/app/src/git/pr-pane-data.test.ts +++ b/packages/app/src/git/pr-pane-data.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from "vitest"; import type { CheckoutPrStatusResponse, PullRequestTimelineResponse, -} from "@server/shared/messages"; +} from "@getpaseo/protocol/messages"; import { deriveAvatarColor, formatAge, diff --git a/packages/app/src/git/pr-pane-data.ts b/packages/app/src/git/pr-pane-data.ts index 7f1b6a003..a53445e86 100644 --- a/packages/app/src/git/pr-pane-data.ts +++ b/packages/app/src/git/pr-pane-data.ts @@ -1,7 +1,7 @@ import type { CheckoutPrStatusResponse, PullRequestTimelineResponse, -} from "@server/shared/messages"; +} from "@getpaseo/protocol/messages"; export type PrState = "open" | "draft" | "merged" | "closed"; export type CheckStatus = "success" | "failure" | "pending" | "skipped"; diff --git a/packages/app/src/git/use-actions.ts b/packages/app/src/git/use-actions.ts index 6a4ba6a2a..ac9b6c4ff 100644 --- a/packages/app/src/git/use-actions.ts +++ b/packages/app/src/git/use-actions.ts @@ -5,7 +5,7 @@ import { type CheckoutGitActionStatus, useCheckoutGitActionsStore } from "@/git/ import { type CheckoutStatusPayload, useCheckoutStatusQuery } from "@/git/use-status-query"; import { type CheckoutPrStatusPayload, useCheckoutPrStatusQuery } from "@/git/use-pr-status-query"; 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 { useToast } from "@/contexts/toast-context"; import { useSessionStore } from "@/stores/session-store"; diff --git a/packages/app/src/git/use-diff-query.ts b/packages/app/src/git/use-diff-query.ts index 6672f4d5b..393e725d9 100644 --- a/packages/app/src/git/use-diff-query.ts +++ b/packages/app/src/git/use-diff-query.ts @@ -1,7 +1,7 @@ import { skipToken, useQuery, useQueryClient } from "@tanstack/react-query"; import { useEffect, useId, useMemo } from "react"; 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 { checkoutDiffQueryKey } from "@/git/query-keys"; diff --git a/packages/app/src/git/use-github-search-query.ts b/packages/app/src/git/use-github-search-query.ts index d3db8d31c..b1af449ef 100644 --- a/packages/app/src/git/use-github-search-query.ts +++ b/packages/app/src/git/use-github-search-query.ts @@ -1,5 +1,5 @@ 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; diff --git a/packages/app/src/git/use-pr-status-query.ts b/packages/app/src/git/use-pr-status-query.ts index 64c5de284..1a32f6b3a 100644 --- a/packages/app/src/git/use-pr-status-query.ts +++ b/packages/app/src/git/use-pr-status-query.ts @@ -1,7 +1,7 @@ import { useQuery, useQueryClient } from "@tanstack/react-query"; import { useEffect } from "react"; 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"; interface UseCheckoutPrStatusQueryOptions { diff --git a/packages/app/src/git/use-status-query.test.ts b/packages/app/src/git/use-status-query.test.ts index 6a3deb234..a2f90fa1d 100644 --- a/packages/app/src/git/use-status-query.test.ts +++ b/packages/app/src/git/use-status-query.test.ts @@ -8,7 +8,7 @@ import { onlineManager, } from "@tanstack/react-query"; 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 { useCheckoutStatusQuery } from "./use-status-query"; diff --git a/packages/app/src/git/use-status-query.ts b/packages/app/src/git/use-status-query.ts index 684c0a327..7f463cc07 100644 --- a/packages/app/src/git/use-status-query.ts +++ b/packages/app/src/git/use-status-query.ts @@ -1,7 +1,7 @@ import { type QueryClient, useQuery, useQueryClient } from "@tanstack/react-query"; import { useEffect } from "react"; 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"; export const CHECKOUT_STATUS_STALE_TIME = 15_000; diff --git a/packages/app/src/hooks/feature-preferences.ts b/packages/app/src/hooks/feature-preferences.ts index 8fc3f1aaf..4fbd95658 100644 --- a/packages/app/src/hooks/feature-preferences.ts +++ b/packages/app/src/hooks/feature-preferences.ts @@ -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( featureValues: Record, diff --git a/packages/app/src/hooks/providers-snapshot-query.ts b/packages/app/src/hooks/providers-snapshot-query.ts index 2874bf042..cb58a823e 100644 --- a/packages/app/src/hooks/providers-snapshot-query.ts +++ b/packages/app/src/hooks/providers-snapshot-query.ts @@ -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"; diff --git a/packages/app/src/hooks/use-acp-provider-catalog.ts b/packages/app/src/hooks/use-acp-provider-catalog.ts index 03ed02ea5..6e184ff7d 100644 --- a/packages/app/src/hooks/use-acp-provider-catalog.ts +++ b/packages/app/src/hooks/use-acp-provider-catalog.ts @@ -1,5 +1,5 @@ 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"; export type AcpProviderCatalogItem = AcpProviderCatalogEntry; diff --git a/packages/app/src/hooks/use-agent-attention-clear.ts b/packages/app/src/hooks/use-agent-attention-clear.ts index 3c268c8cd..e1501e0dc 100644 --- a/packages/app/src/hooks/use-agent-attention-clear.ts +++ b/packages/app/src/hooks/use-agent-attention-clear.ts @@ -1,6 +1,6 @@ import { useCallback, useEffect, useRef, useState } from "react"; import { AppState } from "react-native"; -import type { DaemonClient } from "@server/client/daemon-client"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import { shouldClearAgentAttention, type AgentAttentionClearTrigger, diff --git a/packages/app/src/hooks/use-agent-commands-query.ts b/packages/app/src/hooks/use-agent-commands-query.ts index 2018ecc6a..c7b511707 100644 --- a/packages/app/src/hooks/use-agent-commands-query.ts +++ b/packages/app/src/hooks/use-agent-commands-query.ts @@ -1,6 +1,6 @@ import { useQuery } from "@tanstack/react-query"; 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 diff --git a/packages/app/src/hooks/use-agent-form-state.ts b/packages/app/src/hooks/use-agent-form-state.ts index f04a0cbbc..552a289f0 100644 --- a/packages/app/src/hooks/use-agent-form-state.ts +++ b/packages/app/src/hooks/use-agent-form-state.ts @@ -1,11 +1,11 @@ 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 { AgentMode, AgentModelDefinition, AgentProvider, ProviderSnapshotEntry, -} from "@server/server/agent/agent-sdk-types"; +} from "@getpaseo/protocol/agent-types"; import { useHosts } from "@/runtime/host-runtime"; import { buildProviderDefinitions } from "@/utils/provider-definitions"; import { diff --git a/packages/app/src/hooks/use-agent-history.test.tsx b/packages/app/src/hooks/use-agent-history.test.tsx index dc1fbefda..d43082216 100644 --- a/packages/app/src/hooks/use-agent-history.test.tsx +++ b/packages/app/src/hooks/use-agent-history.test.tsx @@ -9,7 +9,7 @@ import type { DaemonClient, FetchAgentHistoryEntry, FetchAgentHistoryOptions, -} from "@server/client/daemon-client"; +} from "@getpaseo/client/internal/daemon-client"; import { useSessionStore, type Agent } from "@/stores/session-store"; import { useAgentHistory } from "./use-agent-history"; diff --git a/packages/app/src/hooks/use-agent-history.ts b/packages/app/src/hooks/use-agent-history.ts index 2744b8417..0ddf54709 100644 --- a/packages/app/src/hooks/use-agent-history.ts +++ b/packages/app/src/hooks/use-agent-history.ts @@ -2,7 +2,7 @@ import type { DaemonClient, FetchAgentHistoryOptions, FetchAgentHistoryPageInfo, -} from "@server/client/daemon-client"; +} from "@getpaseo/client/internal/daemon-client"; import { useInfiniteQuery } from "@tanstack/react-query"; import { useCallback, useMemo } from "react"; import type { AggregatedAgent } from "@/hooks/use-aggregated-agents"; diff --git a/packages/app/src/hooks/use-agent-initialization.ts b/packages/app/src/hooks/use-agent-initialization.ts index c77043867..6d89a074c 100644 --- a/packages/app/src/hooks/use-agent-initialization.ts +++ b/packages/app/src/hooks/use-agent-initialization.ts @@ -1,6 +1,6 @@ import { useCallback } from "react"; import { useSessionStore } from "@/stores/session-store"; -import type { DaemonClient } from "@server/client/daemon-client"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import { attachInitTimeout, createInitDeferred, diff --git a/packages/app/src/hooks/use-agent-screen-state-machine.ts b/packages/app/src/hooks/use-agent-screen-state-machine.ts index be254a6a3..6e9766c84 100644 --- a/packages/app/src/hooks/use-agent-screen-state-machine.ts +++ b/packages/app/src/hooks/use-agent-screen-state-machine.ts @@ -1,5 +1,5 @@ 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 { serverId: string; diff --git a/packages/app/src/hooks/use-archive-agent.test.ts b/packages/app/src/hooks/use-archive-agent.test.ts index eeb622efb..bd05954f0 100644 --- a/packages/app/src/hooks/use-archive-agent.test.ts +++ b/packages/app/src/hooks/use-archive-agent.test.ts @@ -2,7 +2,7 @@ * @vitest-environment jsdom */ 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 { act, renderHook, waitFor } from "@testing-library/react"; import { beforeEach, describe, expect, it } from "vitest"; diff --git a/packages/app/src/hooks/use-branch-switcher.ts b/packages/app/src/hooks/use-branch-switcher.ts index 2c11c51db..192426527 100644 --- a/packages/app/src/hooks/use-branch-switcher.ts +++ b/packages/app/src/hooks/use-branch-switcher.ts @@ -1,6 +1,6 @@ import { useState, useCallback, useMemo } from "react"; 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 { ToastApi } from "@/components/toast-host"; import { invalidateCheckoutGitQueriesForClient } from "@/git/query-keys"; diff --git a/packages/app/src/hooks/use-client-activity.test.tsx b/packages/app/src/hooks/use-client-activity.test.tsx index b541424cc..98d17400a 100644 --- a/packages/app/src/hooks/use-client-activity.test.tsx +++ b/packages/app/src/hooks/use-client-activity.test.tsx @@ -44,7 +44,7 @@ vi.mock("react-native", () => ({ }, })); -vi.mock("@server/client/daemon-client", () => ({})); +vi.mock("@getpaseo/client/internal/daemon-client", () => ({})); function createTestClient() { return { diff --git a/packages/app/src/hooks/use-client-activity.ts b/packages/app/src/hooks/use-client-activity.ts index b659a6164..257b59d31 100644 --- a/packages/app/src/hooks/use-client-activity.ts +++ b/packages/app/src/hooks/use-client-activity.ts @@ -1,6 +1,6 @@ import { useEffect, useRef, useCallback } from "react"; import { AppState } from "react-native"; -import type { DaemonClient } from "@server/client/daemon-client"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import { getIsElectron, isWeb, isNative } from "@/constants/platform"; import { getDesktopSystemIdleTimeMs } from "@/desktop/electron/idle"; import { useStableEvent } from "@/hooks/use-stable-event"; diff --git a/packages/app/src/hooks/use-daemon-config.ts b/packages/app/src/hooks/use-daemon-config.ts index bb27cbd95..5e94fd5ec 100644 --- a/packages/app/src/hooks/use-daemon-config.ts +++ b/packages/app/src/hooks/use-daemon-config.ts @@ -1,6 +1,6 @@ import { useCallback, useEffect, useMemo } from "react"; import { useQuery, useQueryClient } from "@tanstack/react-query"; -import type { MutableDaemonConfig, MutableDaemonConfigPatch } from "@server/shared/messages"; +import type { MutableDaemonConfig, MutableDaemonConfigPatch } from "@getpaseo/protocol/messages"; import { useHostRuntimeClient, useHostRuntimeIsConnected } from "@/runtime/host-runtime"; export function daemonConfigQueryKey(serverId: string | null) { diff --git a/packages/app/src/hooks/use-dictation.shared.ts b/packages/app/src/hooks/use-dictation.shared.ts index af2a99582..b7a7293d5 100644 --- a/packages/app/src/hooks/use-dictation.shared.ts +++ b/packages/app/src/hooks/use-dictation.shared.ts @@ -1,7 +1,7 @@ export type DictationStatus = "idle" | "recording" | "uploading" | "failed"; export interface UseDictationOptions { - client: import("@server/client/daemon-client").DaemonClient | null; + client: import("@getpaseo/client/internal/daemon-client").DaemonClient | null; onTranscript: (text: string, meta: { requestId: string }) => void; onPartialTranscript?: (text: string, meta: { requestId: string }) => void; onError?: (error: Error) => void; diff --git a/packages/app/src/hooks/use-draft-agent-features.ts b/packages/app/src/hooks/use-draft-agent-features.ts index a76935829..68281acbc 100644 --- a/packages/app/src/hooks/use-draft-agent-features.ts +++ b/packages/app/src/hooks/use-draft-agent-features.ts @@ -1,6 +1,6 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { useQuery } from "@tanstack/react-query"; -import type { AgentProvider, AgentSessionConfig } from "@server/server/agent/agent-sdk-types"; +import type { AgentProvider, AgentSessionConfig } from "@getpaseo/protocol/agent-types"; import { useHostRuntimeClient, useHostRuntimeIsConnected } from "@/runtime/host-runtime"; import { mergeProviderPreferences, useFormPreferences } from "./use-form-preferences"; import { diff --git a/packages/app/src/hooks/use-form-preferences.ts b/packages/app/src/hooks/use-form-preferences.ts index 0bc898510..55875fa0a 100644 --- a/packages/app/src/hooks/use-form-preferences.ts +++ b/packages/app/src/hooks/use-form-preferences.ts @@ -2,7 +2,7 @@ import { useCallback } from "react"; import AsyncStorage from "@react-native-async-storage/async-storage"; import { useQuery, useQueryClient } from "@tanstack/react-query"; import { z } from "zod"; -import type { AgentProvider } from "@server/server/agent/agent-sdk-types"; +import type { AgentProvider } from "@getpaseo/protocol/agent-types"; const FORM_PREFERENCES_STORAGE_KEY = "@paseo:create-agent-preferences"; const FORM_PREFERENCES_QUERY_KEY = ["form-preferences"]; diff --git a/packages/app/src/hooks/use-open-project.ts b/packages/app/src/hooks/use-open-project.ts index ee7f77a50..2fc7bb949 100644 --- a/packages/app/src/hooks/use-open-project.ts +++ b/packages/app/src/hooks/use-open-project.ts @@ -1,5 +1,5 @@ import { useCallback } from "react"; -import type { DaemonClient } from "@server/client/daemon-client"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import { useHostRuntimeClient, useHostRuntimeIsConnected } from "@/runtime/host-runtime"; import { normalizeWorkspaceDescriptor, diff --git a/packages/app/src/hooks/use-pr-pane-data.test.ts b/packages/app/src/hooks/use-pr-pane-data.test.ts index d020ea888..a19d5b9e5 100644 --- a/packages/app/src/hooks/use-pr-pane-data.test.ts +++ b/packages/app/src/hooks/use-pr-pane-data.test.ts @@ -11,7 +11,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import type { CheckoutPrStatusResponse, PullRequestTimelineResponse, -} from "@server/shared/messages"; +} from "@getpaseo/protocol/messages"; import { checkoutPrStatusQueryKey, prPaneTimelineQueryKey } from "@/git/query-keys"; import { usePrPaneData, type UsePrPaneDataResult } from "./use-pr-pane-data"; import { useWorkspacePrHint } from "@/git/use-pr-status-query"; diff --git a/packages/app/src/hooks/use-pr-pane-data.ts b/packages/app/src/hooks/use-pr-pane-data.ts index 0175543dd..698e362ed 100644 --- a/packages/app/src/hooks/use-pr-pane-data.ts +++ b/packages/app/src/hooks/use-pr-pane-data.ts @@ -3,7 +3,7 @@ import { useHostRuntimeClient, useHostRuntimeIsConnected } from "@/runtime/host- import type { CheckoutPrStatusResponse, PullRequestTimelineResponse, -} from "@server/shared/messages"; +} from "@getpaseo/protocol/messages"; import { mapPrPaneData, type PrPaneData } from "@/git/pr-pane-data"; import { useCheckoutPrStatusQuery } from "@/git/use-pr-status-query"; import { prPaneTimelineQueryKey } from "@/git/query-keys"; diff --git a/packages/app/src/hooks/use-preferred-editor.ts b/packages/app/src/hooks/use-preferred-editor.ts index 3d4bb0291..9b80f97f6 100644 --- a/packages/app/src/hooks/use-preferred-editor.ts +++ b/packages/app/src/hooks/use-preferred-editor.ts @@ -1,7 +1,7 @@ import { useCallback } from "react"; import AsyncStorage from "@react-native-async-storage/async-storage"; import { useQuery, useQueryClient } from "@tanstack/react-query"; -import { EditorTargetIdSchema, type EditorTargetId } from "@server/shared/messages"; +import { EditorTargetIdSchema, type EditorTargetId } from "@getpaseo/protocol/messages"; const PREFERRED_EDITOR_STORAGE_KEY = "@paseo:preferred-editor"; const PREFERRED_EDITOR_QUERY_KEY = ["preferred-editor"]; diff --git a/packages/app/src/hooks/use-project-icon-query.ts b/packages/app/src/hooks/use-project-icon-query.ts index 6a5b5bbb9..f0353da59 100644 --- a/packages/app/src/hooks/use-project-icon-query.ts +++ b/packages/app/src/hooks/use-project-icon-query.ts @@ -1,6 +1,6 @@ import { useQuery } from "@tanstack/react-query"; import { useHostRuntimeClient, useHostRuntimeIsConnected } from "@/runtime/host-runtime"; -import type { ProjectIcon } from "@server/shared/messages"; +import type { ProjectIcon } from "@getpaseo/protocol/messages"; export function projectIconQueryKey(serverId: string, cwd: string) { return ["projectIcon", serverId, cwd] as const; diff --git a/packages/app/src/hooks/use-projects.test.ts b/packages/app/src/hooks/use-projects.test.ts index 9b10bc789..0921df725 100644 --- a/packages/app/src/hooks/use-projects.test.ts +++ b/packages/app/src/hooks/use-projects.test.ts @@ -5,7 +5,7 @@ import React from "react"; import { renderHook, waitFor } from "@testing-library/react"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { afterEach, describe, expect, it, vi } from "vitest"; -import type { WorkspaceDescriptorPayload } from "@server/shared/messages"; +import type { WorkspaceDescriptorPayload } from "@getpaseo/protocol/messages"; import { useProjects } from "./use-projects"; interface MockDaemonClient { diff --git a/packages/app/src/hooks/use-projects.ts b/packages/app/src/hooks/use-projects.ts index 8b23dbf74..a22d0b61a 100644 --- a/packages/app/src/hooks/use-projects.ts +++ b/packages/app/src/hooks/use-projects.ts @@ -1,6 +1,6 @@ import { useMemo } from "react"; import { useQuery } from "@tanstack/react-query"; -import type { DaemonClient } from "@server/client/daemon-client"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import { getHostRuntimeStore, useHosts } from "@/runtime/host-runtime"; import { normalizeWorkspaceDescriptor, type WorkspaceDescriptor } from "@/stores/session-store"; import { buildProjects, type ProjectHost, type ProjectSummary } from "@/utils/projects"; diff --git a/packages/app/src/hooks/use-providers-snapshot.test.ts b/packages/app/src/hooks/use-providers-snapshot.test.ts index 5bae5f4a9..68bbcbaf2 100644 --- a/packages/app/src/hooks/use-providers-snapshot.test.ts +++ b/packages/app/src/hooks/use-providers-snapshot.test.ts @@ -6,8 +6,8 @@ import { act, renderHook, waitFor } from "@testing-library/react"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { afterEach, describe, expect, it, vi } from "vitest"; -import type { DaemonClient } from "@server/client/daemon-client"; -import type { ProviderSnapshotEntry } from "@server/server/agent/agent-sdk-types"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; +import type { ProviderSnapshotEntry } from "@getpaseo/protocol/agent-types"; import { useSessionStore } from "@/stores/session-store"; import { providersSnapshotQueryKey, useProvidersSnapshot } from "./use-providers-snapshot"; diff --git a/packages/app/src/hooks/use-providers-snapshot.ts b/packages/app/src/hooks/use-providers-snapshot.ts index 67eef830d..7973f704b 100644 --- a/packages/app/src/hooks/use-providers-snapshot.ts +++ b/packages/app/src/hooks/use-providers-snapshot.ts @@ -1,7 +1,7 @@ import { useCallback, useEffect, useMemo } from "react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import type { AgentProvider, ProviderSnapshotEntry } from "@server/server/agent/agent-sdk-types"; -import type { DaemonClient } from "@server/client/daemon-client"; +import type { AgentProvider, ProviderSnapshotEntry } from "@getpaseo/protocol/agent-types"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import { useHostRuntimeClient, useHostRuntimeIsConnected } from "@/runtime/host-runtime"; import { useSessionStore } from "@/stores/session-store"; import { queryClient as singletonQueryClient } from "@/query/query-client"; diff --git a/packages/app/src/hooks/use-push-token-registration.ts b/packages/app/src/hooks/use-push-token-registration.ts index a100bc48c..4dd1209f9 100644 --- a/packages/app/src/hooks/use-push-token-registration.ts +++ b/packages/app/src/hooks/use-push-token-registration.ts @@ -3,7 +3,7 @@ import { Platform } from "react-native"; import AsyncStorage from "@react-native-async-storage/async-storage"; import * as Notifications from "expo-notifications"; import Constants from "expo-constants"; -import type { DaemonClient } from "@server/client/daemon-client"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import { isWeb } from "@/constants/platform"; const STORAGE_PREFIX = "@paseo:expo-push-token:"; diff --git a/packages/app/src/hooks/use-sidebar-workspaces-list.test.ts b/packages/app/src/hooks/use-sidebar-workspaces-list.test.ts index f0c36de48..3cda6be87 100644 --- a/packages/app/src/hooks/use-sidebar-workspaces-list.test.ts +++ b/packages/app/src/hooks/use-sidebar-workspaces-list.test.ts @@ -2,7 +2,7 @@ * @vitest-environment jsdom */ 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 React from "react"; import { afterEach, describe, expect, it, vi } from "vitest"; diff --git a/packages/app/src/hooks/use-sidebar-workspaces-list.ts b/packages/app/src/hooks/use-sidebar-workspaces-list.ts index a8a3d5730..31ddb96e8 100644 --- a/packages/app/src/hooks/use-sidebar-workspaces-list.ts +++ b/packages/app/src/hooks/use-sidebar-workspaces-list.ts @@ -1,5 +1,5 @@ import { useCallback, useEffect, useMemo, useSyncExternalStore } from "react"; -import type { WorkspaceDescriptorPayload } from "@server/shared/messages"; +import type { WorkspaceDescriptorPayload } from "@getpaseo/protocol/messages"; import { normalizeWorkspaceDescriptor, useSessionStore, diff --git a/packages/app/src/panels/agent-panel.tsx b/packages/app/src/panels/agent-panel.tsx index f1249c8d7..9185fa8b1 100644 --- a/packages/app/src/panels/agent-panel.tsx +++ b/packages/app/src/panels/agent-panel.tsx @@ -1,4 +1,4 @@ -import type { DaemonClient } from "@server/client/daemon-client"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import { SquarePen } from "lucide-react-native"; import React, { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { ActivityIndicator, Text, View } from "react-native"; diff --git a/packages/app/src/panels/terminal-panel.tsx b/packages/app/src/panels/terminal-panel.tsx index 9d6ba1af5..46dc662dd 100644 --- a/packages/app/src/panels/terminal-panel.tsx +++ b/packages/app/src/panels/terminal-panel.tsx @@ -3,7 +3,7 @@ import { useQuery } from "@tanstack/react-query"; import { Terminal } from "lucide-react-native"; import { Text, View } from "react-native"; import invariant from "tiny-invariant"; -import type { ListTerminalsResponse } from "@server/shared/messages"; +import type { ListTerminalsResponse } from "@getpaseo/protocol/messages"; import { TerminalPane } from "@/components/terminal-pane"; import { usePaneContext, usePaneFocus } from "@/panels/pane-context"; import type { PanelDescriptor, PanelRegistration } from "@/panels/panel-registry"; diff --git a/packages/app/src/provider-selection/provider-selection.test.ts b/packages/app/src/provider-selection/provider-selection.test.ts index 50d45bc87..984195239 100644 --- a/packages/app/src/provider-selection/provider-selection.test.ts +++ b/packages/app/src/provider-selection/provider-selection.test.ts @@ -1,9 +1,6 @@ import { describe, expect, it } from "vitest"; -import type { - AgentModelDefinition, - ProviderSnapshotEntry, -} from "@server/server/agent/agent-sdk-types"; -import type { AgentProviderDefinition } from "@server/server/agent/provider-manifest"; +import type { AgentModelDefinition, ProviderSnapshotEntry } from "@getpaseo/protocol/agent-types"; +import type { AgentProviderDefinition } from "@getpaseo/protocol/provider-manifest"; import { buildProviderSelectorProviders, buildSelectableProviderSelectorProviders, diff --git a/packages/app/src/provider-selection/provider-selection.ts b/packages/app/src/provider-selection/provider-selection.ts index a862862af..a64bf23dd 100644 --- a/packages/app/src/provider-selection/provider-selection.ts +++ b/packages/app/src/provider-selection/provider-selection.ts @@ -3,8 +3,8 @@ import type { AgentModelDefinition, AgentProvider, ProviderSnapshotEntry, -} from "@server/server/agent/agent-sdk-types"; -import type { AgentProviderDefinition } from "@server/server/agent/provider-manifest"; +} from "@getpaseo/protocol/agent-types"; +import type { AgentProviderDefinition } from "@getpaseo/protocol/provider-manifest"; import type { DraftCommandConfig } from "@/hooks/use-agent-commands-query"; import { buildFavoriteModelKey, type FavoriteModelRow } from "@/hooks/use-form-preferences"; import { compareMatchScores, scoreTextFields } from "@/utils/score-match"; diff --git a/packages/app/src/provider-selection/resolve-agent-form.test.ts b/packages/app/src/provider-selection/resolve-agent-form.test.ts index f04fd5fe3..228e01d19 100644 --- a/packages/app/src/provider-selection/resolve-agent-form.test.ts +++ b/packages/app/src/provider-selection/resolve-agent-form.test.ts @@ -13,12 +13,12 @@ import { type UserModifiedFields, } from "./resolve-agent-form"; import { buildProviderDefinitions } from "@/utils/provider-definitions"; -import type { AgentProviderDefinition } from "@server/server/agent/provider-manifest"; +import type { AgentProviderDefinition } from "@getpaseo/protocol/provider-manifest"; import type { AgentModelDefinition, AgentProvider, ProviderSnapshotEntry, -} from "@server/server/agent/agent-sdk-types"; +} from "@getpaseo/protocol/agent-types"; const TEST_CODEX_DEFINITION: AgentProviderDefinition = { id: "codex", diff --git a/packages/app/src/provider-selection/resolve-agent-form.ts b/packages/app/src/provider-selection/resolve-agent-form.ts index 6cc351188..2b1bc9973 100644 --- a/packages/app/src/provider-selection/resolve-agent-form.ts +++ b/packages/app/src/provider-selection/resolve-agent-form.ts @@ -1,9 +1,9 @@ -import type { AgentProviderDefinition } from "@server/server/agent/provider-manifest"; +import type { AgentProviderDefinition } from "@getpaseo/protocol/provider-manifest"; import type { AgentModelDefinition, AgentProvider, ProviderSnapshotEntry, -} from "@server/server/agent/agent-sdk-types"; +} from "@getpaseo/protocol/agent-types"; import { mergeProviderPreferences, type FormPreferences, diff --git a/packages/app/src/review/store.ts b/packages/app/src/review/store.ts index 329937e4e..72da9f131 100644 --- a/packages/app/src/review/store.ts +++ b/packages/app/src/review/store.ts @@ -6,7 +6,7 @@ import type { ComposerAttachment } from "@/attachments/types"; import type { ParsedDiffFile } from "@/git/use-diff-query"; import { generateMessageId } from "@/types/stream"; import { buildNumberedDiffHunks, type NumberedDiffLine } from "@/utils/diff-layout"; -import type { AgentAttachment } from "@server/shared/messages"; +import type { AgentAttachment } from "@getpaseo/protocol/messages"; const STORE_VERSION = 1; const CONTEXT_RADIUS = 3; diff --git a/packages/app/src/runtime/host-runtime.test.ts b/packages/app/src/runtime/host-runtime.test.ts index b7bd93fa5..5a8e5bb7e 100644 --- a/packages/app/src/runtime/host-runtime.test.ts +++ b/packages/app/src/runtime/host-runtime.test.ts @@ -4,8 +4,8 @@ import type { ConnectionState, FetchAgentsEntry, FetchAgentsOptions, -} from "@server/client/daemon-client"; -import type { ConnectionOffer } from "@server/shared/connection-offer"; +} from "@getpaseo/client/internal/daemon-client"; +import type { ConnectionOffer } from "@getpaseo/protocol/connection-offer"; import type { HostConnection, HostProfile } from "@/types/host-connection"; import { useSessionStore, type Agent } from "@/stores/session-store"; import { diff --git a/packages/app/src/runtime/host-runtime.ts b/packages/app/src/runtime/host-runtime.ts index 0015d737f..41d681814 100644 --- a/packages/app/src/runtime/host-runtime.ts +++ b/packages/app/src/runtime/host-runtime.ts @@ -6,7 +6,7 @@ import { type ConnectionState, type FetchAgentsEntry, type FetchAgentsOptions, -} from "@server/client/daemon-client"; +} from "@getpaseo/client/internal/daemon-client"; import { connectionFromListen, normalizeStoredHostProfile, @@ -23,7 +23,7 @@ import { shouldUseTlsForDefaultHostedRelay, } from "@/utils/daemon-endpoints"; import { resolveAppVersion } from "@/utils/app-version"; -import { ConnectionOfferSchema, type ConnectionOffer } from "@server/shared/connection-offer"; +import { ConnectionOfferSchema, type ConnectionOffer } from "@getpaseo/protocol/connection-offer"; import { shouldUseDesktopDaemon } from "@/desktop/daemon/desktop-daemon"; import { connectToDaemon } from "@/utils/test-daemon-connection"; import { getOrCreateClientId } from "@/utils/client-id"; diff --git a/packages/app/src/screens/new-workspace-empty.ts b/packages/app/src/screens/new-workspace-empty.ts index bd1b7d522..72c49985b 100644 --- a/packages/app/src/screens/new-workspace-empty.ts +++ b/packages/app/src/screens/new-workspace-empty.ts @@ -1,7 +1,7 @@ import { navigateToWorkspace } from "@/hooks/use-workspace-navigation"; import type { normalizeWorkspaceDescriptor } from "@/stores/session-store"; import type { MessagePayload } from "@/composer/types"; -import type { AgentAttachment } from "@server/shared/messages"; +import type { AgentAttachment } from "@getpaseo/protocol/messages"; export function isEmptyWorkspaceSubmission(payload: MessagePayload): boolean { return !payload.text.trim() && payload.attachments.length === 0; diff --git a/packages/app/src/screens/new-workspace-picker-item.test.ts b/packages/app/src/screens/new-workspace-picker-item.test.ts index 6343ad061..d898fb340 100644 --- a/packages/app/src/screens/new-workspace-picker-item.test.ts +++ b/packages/app/src/screens/new-workspace-picker-item.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import type { GitHubSearchItem } from "@server/shared/messages"; +import type { GitHubSearchItem } from "@getpaseo/protocol/messages"; import { pickerItemToCheckoutRequest, type PickerItem } from "./new-workspace-picker-item"; const prItem: GitHubSearchItem = { diff --git a/packages/app/src/screens/new-workspace-picker-item.ts b/packages/app/src/screens/new-workspace-picker-item.ts index 77808b8a4..42ccd9534 100644 --- a/packages/app/src/screens/new-workspace-picker-item.ts +++ b/packages/app/src/screens/new-workspace-picker-item.ts @@ -1,5 +1,5 @@ -import type { CreatePaseoWorktreeInput } from "@server/client/daemon-client"; -import type { GitHubSearchItem } from "@server/shared/messages"; +import type { CreatePaseoWorktreeInput } from "@getpaseo/client/internal/daemon-client"; +import type { GitHubSearchItem } from "@getpaseo/protocol/messages"; export type PickerItem = | { kind: "branch"; name: string } diff --git a/packages/app/src/screens/new-workspace-picker-state.test.ts b/packages/app/src/screens/new-workspace-picker-state.test.ts index b475f2c82..fa281b066 100644 --- a/packages/app/src/screens/new-workspace-picker-state.test.ts +++ b/packages/app/src/screens/new-workspace-picker-state.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; import type { UserComposerAttachment } from "@/attachments/types"; -import type { GitHubSearchItem } from "@server/shared/messages"; +import type { GitHubSearchItem } from "@getpaseo/protocol/messages"; import { findCheckoutHintPrAttachment, syncPickerPrAttachment } from "./new-workspace-picker-state"; function makePrItem(number: number, title: string, headRefName = "feature/x"): GitHubSearchItem { diff --git a/packages/app/src/screens/new-workspace-screen.tsx b/packages/app/src/screens/new-workspace-screen.tsx index d4d8bb79e..7380aa777 100644 --- a/packages/app/src/screens/new-workspace-screen.tsx +++ b/packages/app/src/screens/new-workspace-screen.tsx @@ -31,9 +31,9 @@ import { toErrorMessage } from "@/utils/error-messages"; import { navigateToPreparedWorkspaceTab } from "@/utils/workspace-navigation"; import type { ComposerAttachment, UserComposerAttachment } from "@/attachments/types"; import type { ImageAttachment, MessagePayload } from "@/composer/types"; -import type { AgentAttachment, GitHubSearchItem } from "@server/shared/messages"; -import type { CreatePaseoWorktreeInput } from "@server/client/daemon-client"; -import type { AgentProvider } from "@server/server/agent/agent-sdk-types"; +import type { AgentAttachment, GitHubSearchItem } from "@getpaseo/protocol/messages"; +import type { CreatePaseoWorktreeInput } from "@getpaseo/client/internal/daemon-client"; +import type { AgentProvider } from "@getpaseo/protocol/agent-types"; import { isEmptyWorkspaceSubmission, runCreateEmptyWorkspace } from "./new-workspace-empty"; import { pickerItemToCheckoutRequest, diff --git a/packages/app/src/screens/project-settings-screen.tsx b/packages/app/src/screens/project-settings-screen.tsx index f1dd8e3e9..9d1411676 100644 --- a/packages/app/src/screens/project-settings-screen.tsx +++ b/packages/app/src/screens/project-settings-screen.tsx @@ -9,8 +9,8 @@ import type { PaseoConfigRaw, PaseoConfigRevision, ProjectConfigRpcError, -} from "@server/shared/messages"; -import type { DaemonClient } from "@server/client/daemon-client"; +} from "@getpaseo/protocol/messages"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import { Button } from "@/components/ui/button"; import { DropdownMenu, diff --git a/packages/app/src/screens/settings/providers-section.test.tsx b/packages/app/src/screens/settings/providers-section.test.tsx index 92e970f14..f55df4344 100644 --- a/packages/app/src/screens/settings/providers-section.test.tsx +++ b/packages/app/src/screens/settings/providers-section.test.tsx @@ -4,8 +4,8 @@ import React, { act } from "react"; import { createRoot, type Root } from "react-dom/client"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import type { ProviderSnapshotEntry } from "@server/server/agent/agent-sdk-types"; -import type { MutableDaemonConfig } from "@server/shared/messages"; +import type { ProviderSnapshotEntry } from "@getpaseo/protocol/agent-types"; +import type { MutableDaemonConfig } from "@getpaseo/protocol/messages"; const { theme, snapshotState, configState, patchConfigMock, openProviderSettingsMock } = vi.hoisted( () => ({ diff --git a/packages/app/src/screens/workspace/terminals/state.test.ts b/packages/app/src/screens/workspace/terminals/state.test.ts index af853bbce..da731331a 100644 --- a/packages/app/src/screens/workspace/terminals/state.test.ts +++ b/packages/app/src/screens/workspace/terminals/state.test.ts @@ -8,7 +8,7 @@ import { upsertCreatedTerminalPayload, type ListTerminalsPayload, } from "@/screens/workspace/terminals/state"; -import type { CreateTerminalResponse } from "@server/shared/messages"; +import type { CreateTerminalResponse } from "@getpaseo/protocol/messages"; function listedTerminal(id: string): ListTerminalsPayload["terminals"][number] { return { id, name: id, title: id }; diff --git a/packages/app/src/screens/workspace/terminals/state.ts b/packages/app/src/screens/workspace/terminals/state.ts index 1923f28fa..551867d65 100644 --- a/packages/app/src/screens/workspace/terminals/state.ts +++ b/packages/app/src/screens/workspace/terminals/state.ts @@ -1,4 +1,4 @@ -import type { CreateTerminalResponse, ListTerminalsResponse } from "@server/shared/messages"; +import type { CreateTerminalResponse, ListTerminalsResponse } from "@getpaseo/protocol/messages"; import { upsertTerminalListEntry } from "@/utils/terminal-list"; export const TERMINALS_QUERY_STALE_TIME = 5_000; diff --git a/packages/app/src/screens/workspace/terminals/use-workspace-terminals.ts b/packages/app/src/screens/workspace/terminals/use-workspace-terminals.ts index e825ca6f0..f1cfd1449 100644 --- a/packages/app/src/screens/workspace/terminals/use-workspace-terminals.ts +++ b/packages/app/src/screens/workspace/terminals/use-workspace-terminals.ts @@ -1,6 +1,6 @@ import { useCallback, useEffect, useMemo, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import type { DaemonClient } from "@server/client/daemon-client"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import type { WorkspaceDescriptor } from "@/stores/session-store"; import { buildTerminalsQueryKey, diff --git a/packages/app/src/screens/workspace/use-workspace-tab-rename.tsx b/packages/app/src/screens/workspace/use-workspace-tab-rename.tsx index 958329cf7..025ac2316 100644 --- a/packages/app/src/screens/workspace/use-workspace-tab-rename.tsx +++ b/packages/app/src/screens/workspace/use-workspace-tab-rename.tsx @@ -1,7 +1,7 @@ import { useCallback, useState } from "react"; import { type QueryClient } from "@tanstack/react-query"; -import type { DaemonClient } from "@server/client/daemon-client"; -import type { ListTerminalsResponse } from "@server/shared/messages"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; +import type { ListTerminalsResponse } from "@getpaseo/protocol/messages"; import { AdaptiveRenameModal } from "@/components/rename-modal"; import { useSessionStore } from "@/stores/session-store"; import type { WorkspaceTabDescriptor } from "@/screens/workspace/workspace-tabs-types"; diff --git a/packages/app/src/screens/workspace/workspace-bulk-close.ts b/packages/app/src/screens/workspace/workspace-bulk-close.ts index 821057725..a218fe1c7 100644 --- a/packages/app/src/screens/workspace/workspace-bulk-close.ts +++ b/packages/app/src/screens/workspace/workspace-bulk-close.ts @@ -1,4 +1,4 @@ -import type { DaemonClient } from "@server/client/daemon-client"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import type { WorkspaceTabDescriptor } from "@/screens/workspace/workspace-tabs-types"; export interface BulkClosableTabGroups { diff --git a/packages/app/src/screens/workspace/workspace-draft-agent-config.ts b/packages/app/src/screens/workspace/workspace-draft-agent-config.ts index f3e9bf613..cf122ee56 100644 --- a/packages/app/src/screens/workspace/workspace-draft-agent-config.ts +++ b/packages/app/src/screens/workspace/workspace-draft-agent-config.ts @@ -1,4 +1,4 @@ -import type { AgentSessionConfig } from "@server/server/agent/agent-sdk-types"; +import type { AgentSessionConfig } from "@getpaseo/protocol/agent-types"; export function buildWorkspaceDraftAgentConfig(input: { provider: AgentSessionConfig["provider"]; diff --git a/packages/app/src/screens/workspace/workspace-open-in-editor-button.tsx b/packages/app/src/screens/workspace/workspace-open-in-editor-button.tsx index 3376bb5c6..103dba42d 100644 --- a/packages/app/src/screens/workspace/workspace-open-in-editor-button.tsx +++ b/packages/app/src/screens/workspace/workspace-open-in-editor-button.tsx @@ -9,7 +9,7 @@ import { import { useMutation, useQuery } from "@tanstack/react-query"; import { Check, ChevronDown } from "lucide-react-native"; import { StyleSheet, withUnistyles } from "react-native-unistyles"; -import type { EditorTargetDescriptorPayload } from "@server/shared/messages"; +import type { EditorTargetDescriptorPayload } from "@getpaseo/protocol/messages"; import { EditorAppIcon } from "@/components/icons/editor-app-icons"; import { GitHubIcon } from "@/components/icons/github-icon"; import { diff --git a/packages/app/src/screens/workspace/workspace-scripts-button.test.tsx b/packages/app/src/screens/workspace/workspace-scripts-button.test.tsx index ebef75520..6c42778cd 100644 --- a/packages/app/src/screens/workspace/workspace-scripts-button.test.tsx +++ b/packages/app/src/screens/workspace/workspace-scripts-button.test.tsx @@ -4,7 +4,7 @@ import React, { type ReactElement } from "react"; import { act } from "@testing-library/react"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import type { WorkspaceScriptPayload } from "@server/shared/messages"; +import type { WorkspaceScriptPayload } from "@getpaseo/protocol/messages"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { createRoot } from "react-dom/client"; import { WorkspaceScriptsButton } from "@/screens/workspace/workspace-scripts-button"; diff --git a/packages/app/src/stores/create-flow-store.ts b/packages/app/src/stores/create-flow-store.ts index fd6af5311..296791553 100644 --- a/packages/app/src/stores/create-flow-store.ts +++ b/packages/app/src/stores/create-flow-store.ts @@ -1,6 +1,6 @@ import { create } from "zustand"; import type { UserMessageImageAttachment } from "@/types/stream"; -import type { AgentAttachment } from "@server/shared/messages"; +import type { AgentAttachment } from "@getpaseo/protocol/messages"; export type CreateFlowLifecycleState = "active" | "abandoned" | "sent"; diff --git a/packages/app/src/stores/draft-store.ts b/packages/app/src/stores/draft-store.ts index 5b278e47d..f56941e6d 100644 --- a/packages/app/src/stores/draft-store.ts +++ b/packages/app/src/stores/draft-store.ts @@ -2,7 +2,7 @@ import { create } from "zustand"; import { createJSONStorage, persist } from "zustand/middleware"; import AsyncStorage from "@react-native-async-storage/async-storage"; import type { AttachmentMetadata, UserComposerAttachment } from "@/attachments/types"; -import { GitHubSearchItemSchema } from "@server/shared/messages"; +import { GitHubSearchItemSchema } from "@getpaseo/protocol/messages"; import { garbageCollectAttachments, persistAttachmentFromDataUrl, diff --git a/packages/app/src/stores/session-store-hooks.test.ts b/packages/app/src/stores/session-store-hooks.test.ts index b5258d88f..10d948c18 100644 --- a/packages/app/src/stores/session-store-hooks.test.ts +++ b/packages/app/src/stores/session-store-hooks.test.ts @@ -4,7 +4,7 @@ import { act, renderHook } from "@testing-library/react"; import { afterEach, describe, expect, it } from "vitest"; -import type { DaemonClient } from "@server/client/daemon-client"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import { useHasWorkspaces, useRecommendedProjectPaths, diff --git a/packages/app/src/stores/session-store.test.ts b/packages/app/src/stores/session-store.test.ts index f82782e67..ef64c124e 100644 --- a/packages/app/src/stores/session-store.test.ts +++ b/packages/app/src/stores/session-store.test.ts @@ -1,7 +1,7 @@ import { afterEach, describe, expect, it } from "vitest"; -import type { DaemonClient } from "@server/client/daemon-client"; -import type { WorkspaceDescriptorPayload } from "@server/shared/messages"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; +import type { WorkspaceDescriptorPayload } from "@getpaseo/protocol/messages"; import { normalizeWorkspaceDescriptor, diff --git a/packages/app/src/stores/session-store.ts b/packages/app/src/stores/session-store.ts index 61044035e..ea7def716 100644 --- a/packages/app/src/stores/session-store.ts +++ b/packages/app/src/stores/session-store.ts @@ -1,7 +1,7 @@ import equal from "fast-deep-equal"; import { create } from "zustand"; import { subscribeWithSelector } from "zustand/middleware"; -import type { DaemonClient } from "@server/client/daemon-client"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import type { AgentDirectoryEntry } from "@/types/agent-directory"; import { appendOptimisticUserMessageToStream, @@ -11,7 +11,7 @@ import { } from "@/types/stream"; import type { PendingPermission } from "@/types/shared"; import type { ComposerAttachment } from "@/attachments/types"; -import type { AgentLifecycleStatus } from "@server/shared/agent-lifecycle"; +import type { AgentLifecycleStatus } from "@getpaseo/protocol/agent-lifecycle"; import type { AgentPermissionRequest, AgentFeature, @@ -20,13 +20,13 @@ import type { AgentCapabilityFlags, AgentUsage, AgentPersistenceHandle, -} from "@server/server/agent/agent-sdk-types"; +} from "@getpaseo/protocol/agent-types"; import type { ServerInfoStatusPayload, ProjectPlacementPayload, ServerCapabilities, WorkspaceDescriptorPayload, -} from "@server/shared/messages"; +} from "@getpaseo/protocol/messages"; import { normalizeWorkspaceOpaqueId } from "@/utils/workspace-identity"; import { resolveWorkspaceMapKeyByIdentity } from "@/utils/workspace-execution"; import { diff --git a/packages/app/src/stores/workspace-draft-submission-store.ts b/packages/app/src/stores/workspace-draft-submission-store.ts index 0857d956e..014d5f929 100644 --- a/packages/app/src/stores/workspace-draft-submission-store.ts +++ b/packages/app/src/stores/workspace-draft-submission-store.ts @@ -1,6 +1,6 @@ import { create } from "zustand"; import type { ComposerAttachment } from "@/attachments/types"; -import type { AgentProvider } from "@server/server/agent/agent-sdk-types"; +import type { AgentProvider } from "@getpaseo/protocol/agent-types"; export interface PendingWorkspaceDraftSubmission { serverId: string; diff --git a/packages/app/src/stores/workspace-setup-store.ts b/packages/app/src/stores/workspace-setup-store.ts index be5053eb7..da5e815bb 100644 --- a/packages/app/src/stores/workspace-setup-store.ts +++ b/packages/app/src/stores/workspace-setup-store.ts @@ -1,4 +1,4 @@ -import type { SessionOutboundMessage } from "@server/shared/messages"; +import type { SessionOutboundMessage } from "@getpaseo/protocol/messages"; import { create } from "zustand"; import { buildWorkspaceTabPersistenceKey } from "@/stores/workspace-tabs-store"; diff --git a/packages/app/src/stores/workspace-subagents-integration.test.ts b/packages/app/src/stores/workspace-subagents-integration.test.ts index 1b3499111..132886783 100644 --- a/packages/app/src/stores/workspace-subagents-integration.test.ts +++ b/packages/app/src/stores/workspace-subagents-integration.test.ts @@ -1,4 +1,4 @@ -import type { DaemonClient } from "@server/client/daemon-client"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import { afterEach, describe, expect, it, vi } from "vitest"; import { buildWorkspaceTabSnapshot, diff --git a/packages/app/src/stores/workspace-tabs-store.ts b/packages/app/src/stores/workspace-tabs-store.ts index da88dc800..ca0b12ca9 100644 --- a/packages/app/src/stores/workspace-tabs-store.ts +++ b/packages/app/src/stores/workspace-tabs-store.ts @@ -1,5 +1,5 @@ import AsyncStorage from "@react-native-async-storage/async-storage"; -import type { AgentProvider } from "@server/server/agent/agent-sdk-types"; +import type { AgentProvider } from "@getpaseo/protocol/agent-types"; import { create } from "zustand"; import { createJSONStorage, persist } from "zustand/middleware"; import { diff --git a/packages/app/src/subagents/select.test.ts b/packages/app/src/subagents/select.test.ts index 9191392c7..c8022735b 100644 --- a/packages/app/src/subagents/select.test.ts +++ b/packages/app/src/subagents/select.test.ts @@ -1,4 +1,4 @@ -import type { DaemonClient } from "@server/client/daemon-client"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import { afterEach, describe, expect, it } from "vitest"; import { selectSubagentsForParent } from "./select"; import { useSessionStore, type Agent } from "@/stores/session-store"; diff --git a/packages/app/src/subagents/use-archive-subagent.test.ts b/packages/app/src/subagents/use-archive-subagent.test.ts index 74db4623b..96dfb7896 100644 --- a/packages/app/src/subagents/use-archive-subagent.test.ts +++ b/packages/app/src/subagents/use-archive-subagent.test.ts @@ -2,7 +2,7 @@ * @vitest-environment jsdom */ import { act, renderHook } from "@testing-library/react"; -import type { DaemonClient } from "@server/client/daemon-client"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { useArchiveSubagent } from "@/subagents"; import { useSessionStore, type Agent } from "@/stores/session-store"; diff --git a/packages/app/src/terminal/runtime/terminal-emulator-runtime.browser.test.ts b/packages/app/src/terminal/runtime/terminal-emulator-runtime.browser.test.ts index efba45128..604c39c94 100644 --- a/packages/app/src/terminal/runtime/terminal-emulator-runtime.browser.test.ts +++ b/packages/app/src/terminal/runtime/terminal-emulator-runtime.browser.test.ts @@ -1,6 +1,6 @@ import { page } from "@vitest/browser/context"; import { afterEach, describe, expect, it, vi } from "vitest"; -import type { TerminalInputModeState } from "@server/shared/terminal-input-mode"; +import type { TerminalInputModeState } from "@getpaseo/protocol/terminal-input-mode"; import { encodeTerminalOutput, TerminalEmulatorRuntime } from "./terminal-emulator-runtime"; vi.mock("@xterm/addon-webgl", () => ({ diff --git a/packages/app/src/terminal/runtime/terminal-emulator-runtime.ts b/packages/app/src/terminal/runtime/terminal-emulator-runtime.ts index 227f81c1b..c23e801d5 100644 --- a/packages/app/src/terminal/runtime/terminal-emulator-runtime.ts +++ b/packages/app/src/terminal/runtime/terminal-emulator-runtime.ts @@ -7,12 +7,12 @@ import { WebLinksAddon } from "@xterm/addon-web-links"; import { WebglAddon } from "@xterm/addon-webgl"; import { LigaturesAddon } from "@xterm/addon-ligatures/lib/addon-ligatures.mjs"; import { Terminal, type ITheme } from "@xterm/xterm"; -import type { TerminalState } from "@server/shared/messages"; +import type { TerminalState } from "@getpaseo/protocol/messages"; import { type TerminalInputModeState, TerminalInputModeTracker, terminalInputModeStatesEqual, -} from "@server/shared/terminal-input-mode"; +} from "@getpaseo/protocol/terminal-input-mode"; import { type PendingTerminalModifiers, isAppleHandheldPlatform, diff --git a/packages/app/src/terminal/runtime/terminal-restore-options.ts b/packages/app/src/terminal/runtime/terminal-restore-options.ts index ef4c2decc..753ea86b5 100644 --- a/packages/app/src/terminal/runtime/terminal-restore-options.ts +++ b/packages/app/src/terminal/runtime/terminal-restore-options.ts @@ -1,4 +1,4 @@ -import type { SubscribeTerminalRequest } from "@server/shared/messages"; +import type { SubscribeTerminalRequest } from "@getpaseo/protocol/messages"; export const TERMINAL_VISIBLE_RESTORE_SCROLLBACK_LINES = 200; diff --git a/packages/app/src/terminal/runtime/terminal-snapshot.ts b/packages/app/src/terminal/runtime/terminal-snapshot.ts index 727101188..4b7a8e0b9 100644 --- a/packages/app/src/terminal/runtime/terminal-snapshot.ts +++ b/packages/app/src/terminal/runtime/terminal-snapshot.ts @@ -1 +1 @@ -export { renderTerminalSnapshotToAnsi } from "@server/shared/terminal-snapshot"; +export { renderTerminalSnapshotToAnsi } from "@getpaseo/protocol/terminal-snapshot"; diff --git a/packages/app/src/terminal/runtime/terminal-stream-controller.ts b/packages/app/src/terminal/runtime/terminal-stream-controller.ts index de234ffe8..01d375c52 100644 --- a/packages/app/src/terminal/runtime/terminal-stream-controller.ts +++ b/packages/app/src/terminal/runtime/terminal-stream-controller.ts @@ -1,4 +1,4 @@ -import type { SubscribeTerminalRequest, TerminalState } from "@server/shared/messages"; +import type { SubscribeTerminalRequest, TerminalState } from "@getpaseo/protocol/messages"; import type { TerminalOutputData } from "./terminal-emulator-runtime"; export interface TerminalStreamControllerClient { diff --git a/packages/app/src/terminal/runtime/workspace-terminal-session.ts b/packages/app/src/terminal/runtime/workspace-terminal-session.ts index 5dcabbd05..277f956b9 100644 --- a/packages/app/src/terminal/runtime/workspace-terminal-session.ts +++ b/packages/app/src/terminal/runtime/workspace-terminal-session.ts @@ -1,4 +1,4 @@ -import type { TerminalState } from "@server/shared/messages"; +import type { TerminalState } from "@getpaseo/protocol/messages"; export interface WorkspaceTerminalSnapshots { get: (input: { terminalId: string }) => TerminalState | null; diff --git a/packages/app/src/terminal/webview/terminal-emulator-webview-entry.ts b/packages/app/src/terminal/webview/terminal-emulator-webview-entry.ts index 866bad956..8cd13c6b6 100644 --- a/packages/app/src/terminal/webview/terminal-emulator-webview-entry.ts +++ b/packages/app/src/terminal/webview/terminal-emulator-webview-entry.ts @@ -1,7 +1,7 @@ import type { ITheme } from "@xterm/xterm"; import xtermCss from "@xterm/xterm/css/xterm.css"; -import type { TerminalState } from "@server/shared/messages"; -import type { TerminalInputModeState } from "@server/shared/terminal-input-mode"; +import type { TerminalState } from "@getpaseo/protocol/messages"; +import type { TerminalInputModeState } from "@getpaseo/protocol/terminal-input-mode"; import type { PendingTerminalModifiers } from "@/utils/terminal-keys"; import { encodeTerminalOutput, diff --git a/packages/app/src/timeline/session-stream-reducers.test.ts b/packages/app/src/timeline/session-stream-reducers.test.ts index ed7b2c33a..350e6dddd 100644 --- a/packages/app/src/timeline/session-stream-reducers.test.ts +++ b/packages/app/src/timeline/session-stream-reducers.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import type { AgentStreamEventPayload } from "@server/shared/messages"; +import type { AgentStreamEventPayload } from "@getpaseo/protocol/messages"; import { buildOptimisticUserMessage, hydrateStreamState, diff --git a/packages/app/src/timeline/session-stream-reducers.ts b/packages/app/src/timeline/session-stream-reducers.ts index 184bfdde2..9c1253ab8 100644 --- a/packages/app/src/timeline/session-stream-reducers.ts +++ b/packages/app/src/timeline/session-stream-reducers.ts @@ -1,5 +1,5 @@ -import type { AgentStreamEventPayload } from "@server/shared/messages"; -import type { AgentLifecycleStatus } from "@server/shared/agent-lifecycle"; +import type { AgentStreamEventPayload } from "@getpaseo/protocol/messages"; +import type { AgentLifecycleStatus } from "@getpaseo/protocol/agent-lifecycle"; import type { Agent } from "@/stores/session-store"; import { useSessionStore } from "@/stores/session-store"; import type { StreamItem, UserMessageItem } from "@/types/stream"; diff --git a/packages/app/src/tool-calls/presentation.test.ts b/packages/app/src/tool-calls/presentation.test.ts index 041a0b9d0..2bd1cced0 100644 --- a/packages/app/src/tool-calls/presentation.test.ts +++ b/packages/app/src/tool-calls/presentation.test.ts @@ -1,4 +1,4 @@ -import type { ToolCallDetail } from "@server/server/agent/agent-sdk-types"; +import type { ToolCallDetail } from "@getpaseo/protocol/agent-types"; import { describe, expect, it } from "vitest"; import { buildToolCallPresentation, type ToolCallPresentationIcon } from "./presentation"; diff --git a/packages/app/src/tool-calls/presentation.ts b/packages/app/src/tool-calls/presentation.ts index 8ea655d58..e43aacf77 100644 --- a/packages/app/src/tool-calls/presentation.ts +++ b/packages/app/src/tool-calls/presentation.ts @@ -1,5 +1,5 @@ import type { ComponentType } from "react"; -import type { ToolCallDetail } from "@server/server/agent/agent-sdk-types"; +import type { ToolCallDetail } from "@getpaseo/protocol/agent-types"; import type { ToolCallDisplayInput } from "@/utils/tool-call-display"; import { buildToolCallDisplayModel } from "@/utils/tool-call-display"; import { extractToolCallFilePath } from "@/utils/extract-tool-call-file-path"; diff --git a/packages/app/src/types/host-connection.ts b/packages/app/src/types/host-connection.ts index 5b1c586cd..baf11e935 100644 --- a/packages/app/src/types/host-connection.ts +++ b/packages/app/src/types/host-connection.ts @@ -1,8 +1,11 @@ -import { normalizeHostPort, normalizeLoopbackToLocalhost } from "@server/shared/daemon-endpoints"; +import { + normalizeHostPort, + normalizeLoopbackToLocalhost, +} from "@getpaseo/protocol/daemon-endpoints"; import { DirectTcpHostConnectionSchema, type DirectTcpHostConnection, -} from "@server/shared/host-connection-schema"; +} from "@getpaseo/protocol/host-connection-schema"; export { DirectTcpHostConnectionSchema, type DirectTcpHostConnection }; diff --git a/packages/app/src/types/shared.ts b/packages/app/src/types/shared.ts index b385103c3..f2100af86 100644 --- a/packages/app/src/types/shared.ts +++ b/packages/app/src/types/shared.ts @@ -1,4 +1,4 @@ -import type { AgentPermissionRequest } from "@server/server/agent/agent-sdk-types"; +import type { AgentPermissionRequest } from "@getpaseo/protocol/agent-types"; /** * Pending permission structure diff --git a/packages/app/src/types/stream-event.test.ts b/packages/app/src/types/stream-event.test.ts index adf171da8..524279b5a 100644 --- a/packages/app/src/types/stream-event.test.ts +++ b/packages/app/src/types/stream-event.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import type { AgentStreamEventPayload } from "@server/shared/messages"; +import type { AgentStreamEventPayload } from "@getpaseo/protocol/messages"; import type { ThoughtItem } from "@/types/stream"; import { applyStreamEvent } from "@/types/stream"; diff --git a/packages/app/src/types/stream.harness.test.ts b/packages/app/src/types/stream.harness.test.ts index d032abc80..0d0444f90 100644 --- a/packages/app/src/types/stream.harness.test.ts +++ b/packages/app/src/types/stream.harness.test.ts @@ -6,8 +6,8 @@ import { type AgentToolCallItem, isAgentToolCallItem, } from "./stream"; -import type { AgentStreamEventPayload } from "@server/shared/messages"; -import type { ToolCallDetail } from "@server/server/agent/agent-sdk-types"; +import type { AgentStreamEventPayload } from "@getpaseo/protocol/messages"; +import type { ToolCallDetail } from "@getpaseo/protocol/agent-types"; interface HarnessUpdate { event: AgentStreamEventPayload; diff --git a/packages/app/src/types/stream.test.ts b/packages/app/src/types/stream.test.ts index e6fe1ed5e..019f08302 100644 --- a/packages/app/src/types/stream.test.ts +++ b/packages/app/src/types/stream.test.ts @@ -14,9 +14,9 @@ import { type StreamItem, isAgentToolCallItem, } from "./stream"; -import type { AgentProvider, ToolCallDetail } from "@server/server/agent/agent-sdk-types"; -import type { AgentStreamEventPayload } from "@server/shared/messages"; -import { buildToolCallDisplayModel } from "../../../server/src/shared/tool-call-display"; +import type { AgentProvider, ToolCallDetail } from "@getpaseo/protocol/agent-types"; +import type { AgentStreamEventPayload } from "@getpaseo/protocol/messages"; +import { buildToolCallDisplayModel } from "@getpaseo/protocol/tool-call-display"; type CanonicalToolStatus = "running" | "completed" | "failed" | "canceled"; diff --git a/packages/app/src/types/stream.ts b/packages/app/src/types/stream.ts index 7bb394137..44bfa2e35 100644 --- a/packages/app/src/types/stream.ts +++ b/packages/app/src/types/stream.ts @@ -1,5 +1,5 @@ -import type { AgentProvider, ToolCallDetail } from "@server/server/agent/agent-sdk-types"; -import type { AgentAttachment, AgentStreamEventPayload } from "@server/shared/messages"; +import type { AgentProvider, ToolCallDetail } from "@getpaseo/protocol/agent-types"; +import type { AgentAttachment, AgentStreamEventPayload } from "@getpaseo/protocol/messages"; import type { AttachmentMetadata } from "@/attachments/types"; import { extractTaskEntriesFromToolCall } from "../utils/tool-call-parsers"; import { splitMarkdownBlocks } from "@/utils/split-markdown-blocks"; diff --git a/packages/app/src/utils/agent-directory-sync.test.ts b/packages/app/src/utils/agent-directory-sync.test.ts index 61a4e4456..d1c0d1df1 100644 --- a/packages/app/src/utils/agent-directory-sync.test.ts +++ b/packages/app/src/utils/agent-directory-sync.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from "vitest"; -import type { DaemonClient, FetchAgentsEntry } from "@server/client/daemon-client"; -import type { AgentSnapshotPayload } from "@server/shared/messages"; -import { PARENT_AGENT_ID_LABEL } from "@server/shared/agent-labels"; +import type { DaemonClient, FetchAgentsEntry } from "@getpaseo/client/internal/daemon-client"; +import type { AgentSnapshotPayload } from "@getpaseo/protocol/messages"; +import { PARENT_AGENT_ID_LABEL } from "@getpaseo/protocol/agent-labels"; import { useSessionStore } from "@/stores/session-store"; import { replaceFetchedAgentDirectory } from "./agent-directory-sync"; diff --git a/packages/app/src/utils/agent-directory-sync.ts b/packages/app/src/utils/agent-directory-sync.ts index cd67253f4..684aaf82b 100644 --- a/packages/app/src/utils/agent-directory-sync.ts +++ b/packages/app/src/utils/agent-directory-sync.ts @@ -1,4 +1,4 @@ -import type { FetchAgentsEntry } from "@server/client/daemon-client"; +import type { FetchAgentsEntry } from "@getpaseo/client/internal/daemon-client"; import { type Agent, useSessionStore } from "@/stores/session-store"; import { derivePendingPermissionKey, normalizeAgentSnapshot } from "@/utils/agent-snapshots"; import { resolveProjectPlacement } from "@/utils/project-placement"; diff --git a/packages/app/src/utils/agent-snapshots.test.ts b/packages/app/src/utils/agent-snapshots.test.ts index ee0b24449..b514db1a0 100644 --- a/packages/app/src/utils/agent-snapshots.test.ts +++ b/packages/app/src/utils/agent-snapshots.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; -import type { AgentSnapshotPayload } from "@server/shared/messages"; -import { PARENT_AGENT_ID_LABEL } from "@server/shared/agent-labels"; +import type { AgentSnapshotPayload } from "@getpaseo/protocol/messages"; +import { PARENT_AGENT_ID_LABEL } from "@getpaseo/protocol/agent-labels"; import { normalizeAgentSnapshot } from "./agent-snapshots"; function createSnapshot( diff --git a/packages/app/src/utils/agent-snapshots.ts b/packages/app/src/utils/agent-snapshots.ts index 1933886c6..6e4501885 100644 --- a/packages/app/src/utils/agent-snapshots.ts +++ b/packages/app/src/utils/agent-snapshots.ts @@ -1,6 +1,6 @@ -import type { AgentSnapshotPayload } from "@server/shared/messages"; -import type { AgentPermissionRequest } from "@server/server/agent/agent-sdk-types"; -import { PARENT_AGENT_ID_LABEL } from "@server/shared/agent-labels"; +import type { AgentSnapshotPayload } from "@getpaseo/protocol/messages"; +import type { AgentPermissionRequest } from "@getpaseo/protocol/agent-types"; +import { PARENT_AGENT_ID_LABEL } from "@getpaseo/protocol/agent-labels"; export function derivePendingPermissionKey( agentId: string, diff --git a/packages/app/src/utils/daemon-endpoints.ts b/packages/app/src/utils/daemon-endpoints.ts index 31b9f46b0..599f7d5f4 100644 --- a/packages/app/src/utils/daemon-endpoints.ts +++ b/packages/app/src/utils/daemon-endpoints.ts @@ -10,9 +10,9 @@ import { serializeConnectionUriForStorage, shouldUseTlsForDefaultHostedRelay, type HostPortParts, -} from "@server/shared/daemon-endpoints"; +} from "@getpaseo/protocol/daemon-endpoints"; -export { decodeOfferFragmentPayload } from "@server/shared/connection-offer"; +export { decodeOfferFragmentPayload } from "@getpaseo/protocol/connection-offer"; export type { HostPortParts }; diff --git a/packages/app/src/utils/extract-tool-call-file-path.ts b/packages/app/src/utils/extract-tool-call-file-path.ts index 63b2aaff6..e4202cc2e 100644 --- a/packages/app/src/utils/extract-tool-call-file-path.ts +++ b/packages/app/src/utils/extract-tool-call-file-path.ts @@ -1,4 +1,4 @@ -import type { ToolCallDetail } from "@server/server/agent/agent-sdk-types"; +import type { ToolCallDetail } from "@getpaseo/protocol/agent-types"; const SHELL_FILE_COMMANDS = new Set([ "cat", diff --git a/packages/app/src/utils/github-refs.ts b/packages/app/src/utils/github-refs.ts index 1c31ad103..5eb48bae3 100644 --- a/packages/app/src/utils/github-refs.ts +++ b/packages/app/src/utils/github-refs.ts @@ -1,4 +1,4 @@ -import { parseGitHubRemoteUrl } from "@server/shared/git-remote"; +import { parseGitHubRemoteUrl } from "@getpaseo/protocol/git-remote"; export type GithubRefKind = "pull" | "issues"; diff --git a/packages/app/src/utils/navigate-to-agent.test.ts b/packages/app/src/utils/navigate-to-agent.test.ts index 4af3802a7..627186b6c 100644 --- a/packages/app/src/utils/navigate-to-agent.test.ts +++ b/packages/app/src/utils/navigate-to-agent.test.ts @@ -29,7 +29,7 @@ vi.mock("@react-native-async-storage/async-storage", () => { }; }); -import type { DaemonClient } from "@server/client/daemon-client"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import { useSessionStore, type Agent, type WorkspaceDescriptor } from "@/stores/session-store"; import { useWorkspaceLayoutStore } from "@/stores/workspace-layout-store"; import { navigateToAgent } from "@/utils/navigate-to-agent"; diff --git a/packages/app/src/utils/project-config-form.test.ts b/packages/app/src/utils/project-config-form.test.ts index 29c12dc08..21fe8c6a8 100644 --- a/packages/app/src/utils/project-config-form.test.ts +++ b/packages/app/src/utils/project-config-form.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; -import { PaseoConfigRawSchema } from "@server/utils/paseo-config-schema"; -import type { PaseoConfigRaw } from "@server/shared/messages"; +import { PaseoConfigRawSchema } from "@getpaseo/protocol/paseo-config-schema"; +import type { PaseoConfigRaw } from "@getpaseo/protocol/messages"; import { applyDraftToConfig, configToDraft, type ProjectConfigDraft } from "./project-config-form"; function emptyDraft(): ProjectConfigDraft { diff --git a/packages/app/src/utils/project-config-form.ts b/packages/app/src/utils/project-config-form.ts index 99115d4ee..4d9216555 100644 --- a/packages/app/src/utils/project-config-form.ts +++ b/packages/app/src/utils/project-config-form.ts @@ -3,7 +3,7 @@ import type { PaseoMetadataGeneration, PaseoMetadataGenerationEntry, PaseoScriptEntryRaw, -} from "@server/shared/messages"; +} from "@getpaseo/protocol/messages"; export type LifecycleOriginalKind = "string" | "array" | "missing"; diff --git a/packages/app/src/utils/project-placement.ts b/packages/app/src/utils/project-placement.ts index 08c0fe30b..a9ad08361 100644 --- a/packages/app/src/utils/project-placement.ts +++ b/packages/app/src/utils/project-placement.ts @@ -1,4 +1,4 @@ -import type { ProjectPlacementPayload } from "@server/shared/messages"; +import type { ProjectPlacementPayload } from "@getpaseo/protocol/messages"; import { deriveProjectKey, deriveProjectName } from "@/utils/agent-grouping"; function normalizeWorkingDirectory(cwd: string): string { diff --git a/packages/app/src/utils/projects.test.ts b/packages/app/src/utils/projects.test.ts index eabb00fb8..203fd7174 100644 --- a/packages/app/src/utils/projects.test.ts +++ b/packages/app/src/utils/projects.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import type { ProjectPlacementPayload } from "@server/shared/messages"; +import type { ProjectPlacementPayload } from "@getpaseo/protocol/messages"; import type { WorkspaceDescriptor } from "@/stores/session-store"; import { buildProjects } from "./projects"; diff --git a/packages/app/src/utils/provider-definitions.ts b/packages/app/src/utils/provider-definitions.ts index 5ace4914a..f4a9fe2ff 100644 --- a/packages/app/src/utils/provider-definitions.ts +++ b/packages/app/src/utils/provider-definitions.ts @@ -1,10 +1,10 @@ -import type { ProviderSnapshotEntry } from "@server/server/agent/agent-sdk-types"; +import type { ProviderSnapshotEntry } from "@getpaseo/protocol/agent-types"; import { type AgentModeColorTier, type AgentModeIcon, type AgentProviderDefinition, type AgentProviderModeDefinition, -} from "@server/server/agent/provider-manifest"; +} from "@getpaseo/protocol/provider-manifest"; function buildProviderModes(entry: ProviderSnapshotEntry): AgentProviderModeDefinition[] { const entryModes = entry.modes ?? []; diff --git a/packages/app/src/utils/review-attachments.ts b/packages/app/src/utils/review-attachments.ts index 60592c6d8..a5ac3e9a3 100644 --- a/packages/app/src/utils/review-attachments.ts +++ b/packages/app/src/utils/review-attachments.ts @@ -1,4 +1,4 @@ -import type { AgentAttachment, GitHubSearchItem } from "@server/shared/messages"; +import type { AgentAttachment, GitHubSearchItem } from "@getpaseo/protocol/messages"; export function buildGitHubAttachmentFromSearchItem( item: GitHubSearchItem | null, diff --git a/packages/app/src/utils/server-info-capabilities.test.ts b/packages/app/src/utils/server-info-capabilities.test.ts index 00a9146ad..bc8992bf6 100644 --- a/packages/app/src/utils/server-info-capabilities.test.ts +++ b/packages/app/src/utils/server-info-capabilities.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import type { ServerCapabilities } from "@server/shared/messages"; +import type { ServerCapabilities } from "@getpaseo/protocol/messages"; import type { DaemonServerInfo } from "@/stores/session-store"; import { getServerCapabilities, diff --git a/packages/app/src/utils/server-info-capabilities.ts b/packages/app/src/utils/server-info-capabilities.ts index fdba66554..41d9d8486 100644 --- a/packages/app/src/utils/server-info-capabilities.ts +++ b/packages/app/src/utils/server-info-capabilities.ts @@ -1,4 +1,4 @@ -import type { ServerCapabilityState } from "@server/shared/messages"; +import type { ServerCapabilityState } from "@getpaseo/protocol/messages"; import type { DaemonServerInfo } from "@/stores/session-store"; export type VoiceReadinessMode = "dictation" | "voice"; diff --git a/packages/app/src/utils/sidebar-agent-state.ts b/packages/app/src/utils/sidebar-agent-state.ts index 91b79153c..3d46e632a 100644 --- a/packages/app/src/utils/sidebar-agent-state.ts +++ b/packages/app/src/utils/sidebar-agent-state.ts @@ -2,7 +2,7 @@ import { deriveAgentStateBucket, type AgentAttentionReason, type AgentStateBucketInput, -} from "@server/shared/agent-state-bucket"; +} from "@getpaseo/protocol/agent-state-bucket"; export type SidebarStateBucket = "needs_input" | "failed" | "running" | "attention" | "done"; export type SidebarAttentionReason = AgentAttentionReason; diff --git a/packages/app/src/utils/terminal-list.ts b/packages/app/src/utils/terminal-list.ts index 99f7ad41a..a4870d829 100644 --- a/packages/app/src/utils/terminal-list.ts +++ b/packages/app/src/utils/terminal-list.ts @@ -1,4 +1,4 @@ -import type { CreateTerminalResponse, ListTerminalsResponse } from "@server/shared/messages"; +import type { CreateTerminalResponse, ListTerminalsResponse } from "@getpaseo/protocol/messages"; type TerminalListEntry = ListTerminalsResponse["payload"]["terminals"][number]; type CreatedTerminal = NonNullable; diff --git a/packages/app/src/utils/test-daemon-connection.test.ts b/packages/app/src/utils/test-daemon-connection.test.ts index b148e5bc1..0a38735bc 100644 --- a/packages/app/src/utils/test-daemon-connection.test.ts +++ b/packages/app/src/utils/test-daemon-connection.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { DaemonClientConfig } from "@server/client/daemon-client"; +import type { DaemonClientConfig } from "@getpaseo/client/internal/daemon-client"; import type { DaemonConnectionDependencies, DaemonProbeClient } from "./test-daemon-connection"; class FakeDaemonClient implements DaemonProbeClient { diff --git a/packages/app/src/utils/test-daemon-connection.ts b/packages/app/src/utils/test-daemon-connection.ts index 11d732ffa..5a91e78b8 100644 --- a/packages/app/src/utils/test-daemon-connection.ts +++ b/packages/app/src/utils/test-daemon-connection.ts @@ -1,5 +1,5 @@ -import { DaemonClient } from "@server/client/daemon-client"; -import type { DaemonClientConfig } from "@server/client/daemon-client"; +import { DaemonClient } from "@getpaseo/client/internal/daemon-client"; +import type { DaemonClientConfig } from "@getpaseo/client/internal/daemon-client"; import type { HostConnection } from "@/types/host-connection"; import { getOrCreateClientId } from "./client-id"; import { resolveAppVersion } from "./app-version"; diff --git a/packages/app/src/utils/tool-call-detail-state.test.ts b/packages/app/src/utils/tool-call-detail-state.test.ts index e2ee5192a..1cf7d624d 100644 --- a/packages/app/src/utils/tool-call-detail-state.test.ts +++ b/packages/app/src/utils/tool-call-detail-state.test.ts @@ -1,7 +1,7 @@ import assert from "node:assert/strict"; import { describe, it } from "vitest"; -import type { ToolCallDetail } from "@server/server/agent/agent-sdk-types"; +import type { ToolCallDetail } from "@getpaseo/protocol/agent-types"; import { hasMeaningfulToolCallDetail, isPendingToolCallDetail } from "./tool-call-detail-state"; describe("tool-call detail state", () => { diff --git a/packages/app/src/utils/tool-call-detail-state.ts b/packages/app/src/utils/tool-call-detail-state.ts index 266095af9..de9e15142 100644 --- a/packages/app/src/utils/tool-call-detail-state.ts +++ b/packages/app/src/utils/tool-call-detail-state.ts @@ -1,4 +1,4 @@ -import type { ToolCallDetail } from "@server/server/agent/agent-sdk-types"; +import type { ToolCallDetail } from "@getpaseo/protocol/agent-types"; function hasMeaningfulUnknownValue(value: unknown): boolean { if (value === null || value === undefined) { diff --git a/packages/app/src/utils/tool-call-display.ts b/packages/app/src/utils/tool-call-display.ts index fc1eb80ba..ede6c5401 100644 --- a/packages/app/src/utils/tool-call-display.ts +++ b/packages/app/src/utils/tool-call-display.ts @@ -2,4 +2,4 @@ export { buildToolCallDisplayModel, type ToolCallDisplayInput, type ToolCallDisplayModel, -} from "@server/shared/tool-call-display"; +} from "@getpaseo/protocol/tool-call-display"; diff --git a/packages/app/src/utils/tool-call-icon.ts b/packages/app/src/utils/tool-call-icon.ts index db4ddc953..4643419c3 100644 --- a/packages/app/src/utils/tool-call-icon.ts +++ b/packages/app/src/utils/tool-call-icon.ts @@ -10,8 +10,8 @@ import { SquareTerminal, Wrench, } from "lucide-react-native"; -import type { ToolCallDetail, ToolCallIconName } from "@server/server/agent/agent-sdk-types"; -import { isPaseoToolName } from "@server/server/agent/tool-name-normalization"; +import type { ToolCallDetail, ToolCallIconName } from "@getpaseo/protocol/agent-types"; +import { isPaseoToolName } from "@getpaseo/protocol/tool-name-normalization"; import { PaseoLogo } from "@/components/icons/paseo-logo"; export type ToolCallIconComponent = ComponentType<{ size?: number; color?: string }>; diff --git a/packages/app/src/utils/workspace-archive-navigation.test.ts b/packages/app/src/utils/workspace-archive-navigation.test.ts index da9801e20..a0d505f80 100644 --- a/packages/app/src/utils/workspace-archive-navigation.test.ts +++ b/packages/app/src/utils/workspace-archive-navigation.test.ts @@ -1,4 +1,4 @@ -import type { DaemonClient } from "@server/client/daemon-client"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import { afterEach, describe, expect, it, vi } from "vitest"; import { buildWorkspaceArchiveRedirectRoute } from "@/utils/workspace-archive-navigation"; import type { WorkspaceDescriptor } from "@/stores/session-store"; diff --git a/packages/app/src/utils/workspace-script-links.test.ts b/packages/app/src/utils/workspace-script-links.test.ts index 961d618ce..c521f3c9a 100644 --- a/packages/app/src/utils/workspace-script-links.test.ts +++ b/packages/app/src/utils/workspace-script-links.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import type { WorkspaceScriptPayload } from "@server/shared/messages"; +import type { WorkspaceScriptPayload } from "@getpaseo/protocol/messages"; import type { ActiveConnection } from "@/runtime/host-runtime"; import { resolveWorkspaceScriptLink } from "./workspace-script-links"; diff --git a/packages/app/src/utils/workspace-script-links.ts b/packages/app/src/utils/workspace-script-links.ts index 177213961..250cac096 100644 --- a/packages/app/src/utils/workspace-script-links.ts +++ b/packages/app/src/utils/workspace-script-links.ts @@ -1,5 +1,5 @@ -import { parseHostPort } from "@server/shared/daemon-endpoints"; -import type { WorkspaceScriptPayload } from "@server/shared/messages"; +import { parseHostPort } from "@getpaseo/protocol/daemon-endpoints"; +import type { WorkspaceScriptPayload } from "@getpaseo/protocol/messages"; import type { ActiveConnection } from "@/runtime/host-runtime"; export interface ResolvedWorkspaceScriptLink { diff --git a/packages/app/src/voice/voice-runtime.ts b/packages/app/src/voice/voice-runtime.ts index 538ad583a..b43ca41eb 100644 --- a/packages/app/src/voice/voice-runtime.ts +++ b/packages/app/src/voice/voice-runtime.ts @@ -1,5 +1,5 @@ import { Buffer } from "buffer"; -import type { AgentStreamEventPayload, SessionOutboundMessage } from "@server/shared/messages"; +import type { AgentStreamEventPayload, SessionOutboundMessage } from "@getpaseo/protocol/messages"; import { resolveVoiceUnavailableMessage } from "@/utils/server-info-capabilities"; import type { DaemonServerInfo } from "@/stores/session-store"; import type { AudioEngine } from "@/voice/audio-engine-types"; diff --git a/packages/app/src/workspace/workspace-archive.test.ts b/packages/app/src/workspace/workspace-archive.test.ts index 91b6ba493..265a8e1ff 100644 --- a/packages/app/src/workspace/workspace-archive.test.ts +++ b/packages/app/src/workspace/workspace-archive.test.ts @@ -1,4 +1,4 @@ -import type { DaemonClient } from "@server/client/daemon-client"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { clearWorkspaceArchivePending, diff --git a/packages/app/tsconfig.json b/packages/app/tsconfig.json index 39940107a..1098a159e 100644 --- a/packages/app/tsconfig.json +++ b/packages/app/tsconfig.json @@ -3,8 +3,7 @@ "compilerOptions": { "strict": true, "paths": { - "@/*": ["./src/*"], - "@server/*": ["../server/src/*"] + "@/*": ["./src/*"] } }, "include": [ diff --git a/packages/app/vitest.config.ts b/packages/app/vitest.config.ts index 143ad6e54..6c6f5c888 100644 --- a/packages/app/vitest.config.ts +++ b/packages/app/vitest.config.ts @@ -84,7 +84,6 @@ export default defineConfig({ replacement: path.resolve(__dirname, "../relay/src/index.ts"), }, { find: "@", replacement: path.resolve(__dirname, "src") }, - { find: "@server", replacement: path.resolve(__dirname, "../server/src") }, // Point to the ESM build so Vite can transform its imports and apply the // react alias below (the CJS build uses require('react') which bypasses // Vite alias resolution). diff --git a/packages/cli/package.json b/packages/cli/package.json index 50c324885..9c13c5fcd 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -24,6 +24,8 @@ }, "dependencies": { "@clack/prompts": "^1.0.0", + "@getpaseo/client": "0.1.83", + "@getpaseo/protocol": "0.1.83", "@getpaseo/server": "0.1.83", "chalk": "^5.3.0", "commander": "^12.0.0", diff --git a/packages/cli/src/commands/agent/archive.ts b/packages/cli/src/commands/agent/archive.ts index 83293a75e..ff9f80afa 100644 --- a/packages/cli/src/commands/agent/archive.ts +++ b/packages/cli/src/commands/agent/archive.ts @@ -1,5 +1,5 @@ import { Command } from "commander"; -import type { DaemonClient } from "@getpaseo/server"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import { connectToDaemon, getDaemonHost, resolveAgentId } from "../../utils/client.js"; import type { CommandOptions, diff --git a/packages/cli/src/commands/agent/attach.ts b/packages/cli/src/commands/agent/attach.ts index a9628155a..6c726eef5 100644 --- a/packages/cli/src/commands/agent/attach.ts +++ b/packages/cli/src/commands/agent/attach.ts @@ -7,12 +7,9 @@ export function addAttachOptions(cmd: Command): Command { } import { connectToDaemon, getDaemonHost } from "../../utils/client.js"; import { fetchProjectedTimelineItems } from "../../utils/timeline.js"; -import type { - DaemonClient, - AgentStreamMessage, - AgentStreamEventPayload, - AgentTimelineItem, -} from "@getpaseo/server"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; +import type { AgentTimelineItem } from "@getpaseo/protocol/agent-types"; +import type { AgentStreamEventPayload, AgentStreamMessage } from "@getpaseo/protocol/messages"; export interface AgentAttachOptions { host?: string; diff --git a/packages/cli/src/commands/agent/delete.ts b/packages/cli/src/commands/agent/delete.ts index 14ae82fc2..159ea941e 100644 --- a/packages/cli/src/commands/agent/delete.ts +++ b/packages/cli/src/commands/agent/delete.ts @@ -1,5 +1,5 @@ import type { Command } from "commander"; -import type { DaemonClient } from "@getpaseo/server"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import { connectToDaemon, getDaemonHost } from "../../utils/client.js"; import { isSameOrDescendantPath } from "../../utils/paths.js"; diff --git a/packages/cli/src/commands/agent/import.ts b/packages/cli/src/commands/agent/import.ts index 32f99623a..7ca599e10 100644 --- a/packages/cli/src/commands/agent/import.ts +++ b/packages/cli/src/commands/agent/import.ts @@ -3,7 +3,7 @@ import { connectToDaemon, getDaemonHost } from "../../utils/client.js"; import { collectMultiple } from "../../utils/command-options.js"; import type { CommandError, CommandOptions, SingleResult } from "../../output/index.js"; import { agentRunSchema, type AgentRunResult } from "./run.js"; -import type { AgentSnapshotPayload } from "@getpaseo/server"; +import type { AgentSnapshotPayload } from "@getpaseo/protocol/messages"; const IMPORT_PROVIDER_LIST = ["claude", "codex", "opencode", "pi", "acp"] as const; const IMPORT_PROVIDERS = new Set(IMPORT_PROVIDER_LIST); diff --git a/packages/cli/src/commands/agent/inspect.ts b/packages/cli/src/commands/agent/inspect.ts index 3ad3992c1..f1a0c919f 100644 --- a/packages/cli/src/commands/agent/inspect.ts +++ b/packages/cli/src/commands/agent/inspect.ts @@ -1,5 +1,6 @@ import type { Command } from "commander"; -import { PARENT_AGENT_ID_LABEL, type AgentSnapshotPayload } from "@getpaseo/server"; +import { PARENT_AGENT_ID_LABEL } from "@getpaseo/protocol/agent-labels"; +import type { AgentSnapshotPayload } from "@getpaseo/protocol/messages"; import { connectToDaemon, getDaemonHost } from "../../utils/client.js"; import type { CommandOptions, ListResult, OutputSchema, CommandError } from "../../output/index.js"; diff --git a/packages/cli/src/commands/agent/logs.ts b/packages/cli/src/commands/agent/logs.ts index f5e2da743..f2b414a42 100644 --- a/packages/cli/src/commands/agent/logs.ts +++ b/packages/cli/src/commands/agent/logs.ts @@ -2,7 +2,9 @@ import { Command } from "commander"; import { connectToDaemon, getDaemonHost } from "../../utils/client.js"; import type { CommandOptions } from "../../output/index.js"; import { fetchProjectedTimelineItems } from "../../utils/timeline.js"; -import type { DaemonClient, AgentStreamMessage, AgentTimelineItem } from "@getpaseo/server"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; +import type { AgentTimelineItem } from "@getpaseo/protocol/agent-types"; +import type { AgentStreamMessage } from "@getpaseo/protocol/messages"; import { curateAgentActivity } from "@getpaseo/server"; export function addLogsOptions(cmd: Command): Command { diff --git a/packages/cli/src/commands/agent/ls.ts b/packages/cli/src/commands/agent/ls.ts index d79398666..f4fa0831e 100644 --- a/packages/cli/src/commands/agent/ls.ts +++ b/packages/cli/src/commands/agent/ls.ts @@ -1,5 +1,5 @@ import type { Command } from "commander"; -import type { AgentSnapshotPayload } from "@getpaseo/server"; +import type { AgentSnapshotPayload } from "@getpaseo/protocol/messages"; import { connectToDaemon, getDaemonHost } from "../../utils/client.js"; import type { CommandOptions, ListResult, OutputSchema, CommandError } from "../../output/index.js"; import { collectMultiple } from "../../utils/command-options.js"; diff --git a/packages/cli/src/commands/agent/mode.ts b/packages/cli/src/commands/agent/mode.ts index ee1a08599..1cd25904c 100644 --- a/packages/cli/src/commands/agent/mode.ts +++ b/packages/cli/src/commands/agent/mode.ts @@ -6,7 +6,7 @@ import type { CommandError, AnyCommandResult, } from "../../output/index.js"; -import type { AgentMode } from "@getpaseo/server"; +import type { AgentMode } from "@getpaseo/protocol/agent-types"; /** Result for setting mode */ export interface SetModeResult { diff --git a/packages/cli/src/commands/agent/reload.ts b/packages/cli/src/commands/agent/reload.ts index eed6a2dda..607dfa278 100644 --- a/packages/cli/src/commands/agent/reload.ts +++ b/packages/cli/src/commands/agent/reload.ts @@ -1,5 +1,5 @@ import { Command } from "commander"; -import type { DaemonClient } from "@getpaseo/server"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import { connectToDaemon, getDaemonHost, resolveAgentId } from "../../utils/client.js"; import type { CommandOptions, diff --git a/packages/cli/src/commands/agent/run.ts b/packages/cli/src/commands/agent/run.ts index b934013a0..977929cca 100644 --- a/packages/cli/src/commands/agent/run.ts +++ b/packages/cli/src/commands/agent/run.ts @@ -1,9 +1,6 @@ import { Command, Option } from "commander"; -import { - getStructuredAgentResponse, - StructuredAgentResponseError, - type AgentSnapshotPayload, -} from "@getpaseo/server"; +import { getStructuredAgentResponse, StructuredAgentResponseError } from "@getpaseo/server"; +import type { AgentSnapshotPayload } from "@getpaseo/protocol/messages"; import { connectToDaemon, getDaemonHost } from "../../utils/client.js"; import type { CommandOptions, diff --git a/packages/cli/src/commands/agent/stop.ts b/packages/cli/src/commands/agent/stop.ts index ef4ebefaa..23bcda19d 100644 --- a/packages/cli/src/commands/agent/stop.ts +++ b/packages/cli/src/commands/agent/stop.ts @@ -1,5 +1,5 @@ import { Command } from "commander"; -import type { DaemonClient } from "@getpaseo/server"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import { connectToDaemon, getDaemonHost } from "../../utils/client.js"; import { isSameOrDescendantPath } from "../../utils/paths.js"; import type { diff --git a/packages/cli/src/commands/permit/allow.ts b/packages/cli/src/commands/permit/allow.ts index 8123d5c09..d3c4b484d 100644 --- a/packages/cli/src/commands/permit/allow.ts +++ b/packages/cli/src/commands/permit/allow.ts @@ -1,5 +1,5 @@ import type { Command } from "commander"; -import type { AgentPermissionRequest } from "@getpaseo/server"; +import type { AgentPermissionRequest } from "@getpaseo/protocol/agent-types"; import { connectToDaemon, getDaemonHost } from "../../utils/client.js"; import type { CommandOptions, ListResult, OutputSchema, CommandError } from "../../output/index.js"; diff --git a/packages/cli/src/commands/permit/deny.ts b/packages/cli/src/commands/permit/deny.ts index f8a0b137f..bb37537c9 100644 --- a/packages/cli/src/commands/permit/deny.ts +++ b/packages/cli/src/commands/permit/deny.ts @@ -1,5 +1,5 @@ import type { Command } from "commander"; -import type { AgentPermissionRequest } from "@getpaseo/server"; +import type { AgentPermissionRequest } from "@getpaseo/protocol/agent-types"; import { connectToDaemon, getDaemonHost } from "../../utils/client.js"; import type { CommandOptions, ListResult, CommandError } from "../../output/index.js"; import { permitResponseSchema, type PermissionResponseItem } from "./allow.js"; diff --git a/packages/cli/src/commands/permit/ls.ts b/packages/cli/src/commands/permit/ls.ts index 38e344e37..adeaa70ff 100644 --- a/packages/cli/src/commands/permit/ls.ts +++ b/packages/cli/src/commands/permit/ls.ts @@ -1,5 +1,6 @@ import type { Command } from "commander"; -import type { AgentPermissionRequest, AgentSnapshotPayload } from "@getpaseo/server"; +import type { AgentPermissionRequest } from "@getpaseo/protocol/agent-types"; +import type { AgentSnapshotPayload } from "@getpaseo/protocol/messages"; import { connectToDaemon, getDaemonHost } from "../../utils/client.js"; import type { CommandOptions, ListResult, OutputSchema, CommandError } from "../../output/index.js"; diff --git a/packages/cli/src/commands/provider/ls.ts b/packages/cli/src/commands/provider/ls.ts index 21adb6476..693376ce0 100644 --- a/packages/cli/src/commands/provider/ls.ts +++ b/packages/cli/src/commands/provider/ls.ts @@ -1,6 +1,7 @@ import type { Command } from "commander"; import type { CommandOptions, ListResult, OutputSchema } from "../../output/index.js"; -import { AGENT_PROVIDER_DEFINITIONS, type ProviderSnapshotEntry } from "@getpaseo/server"; +import type { ProviderSnapshotEntry } from "@getpaseo/protocol/agent-types"; +import { AGENT_PROVIDER_DEFINITIONS } from "@getpaseo/protocol/provider-manifest"; import { tryConnectToDaemon } from "../../utils/client.js"; export interface ProviderListItem { diff --git a/packages/cli/src/commands/worktree/archive.ts b/packages/cli/src/commands/worktree/archive.ts index 5793e6456..894c157d0 100644 --- a/packages/cli/src/commands/worktree/archive.ts +++ b/packages/cli/src/commands/worktree/archive.ts @@ -1,6 +1,6 @@ import path from "path"; import type { Command } from "commander"; -import type { DaemonClient } from "@getpaseo/server"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import { connectToDaemon, getDaemonHost } from "../../utils/client.js"; import type { CommandOptions, diff --git a/packages/cli/src/commands/worktree/create-input.ts b/packages/cli/src/commands/worktree/create-input.ts index 15b741f14..02748ce14 100644 --- a/packages/cli/src/commands/worktree/create-input.ts +++ b/packages/cli/src/commands/worktree/create-input.ts @@ -1,4 +1,4 @@ -import type { DaemonClient } from "@getpaseo/server"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import type { CommandError, CommandOptions } from "../../output/index.js"; export interface WorktreeCreateOptions extends CommandOptions { diff --git a/packages/cli/src/commands/worktree/create.ts b/packages/cli/src/commands/worktree/create.ts index a7a4796b8..e59259b4c 100644 --- a/packages/cli/src/commands/worktree/create.ts +++ b/packages/cli/src/commands/worktree/create.ts @@ -1,6 +1,6 @@ import path from "node:path"; import type { Command } from "commander"; -import type { DaemonClient } from "@getpaseo/server"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import { connectToDaemon, getDaemonHost } from "../../utils/client.js"; import type { CommandError, OutputSchema, SingleResult } from "../../output/index.js"; import { buildCreateWorktreeRequest, type WorktreeCreateOptions } from "./create-input.js"; diff --git a/packages/cli/src/commands/worktree/ls.ts b/packages/cli/src/commands/worktree/ls.ts index de58de469..10f1344e1 100644 --- a/packages/cli/src/commands/worktree/ls.ts +++ b/packages/cli/src/commands/worktree/ls.ts @@ -1,7 +1,7 @@ import type { Command } from "commander"; import { homedir } from "node:os"; import { basename, join, sep } from "node:path"; -import type { DaemonClient } from "@getpaseo/server"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import { connectToDaemon, getDaemonHost } from "../../utils/client.js"; import type { CommandOptions, ListResult, OutputSchema, CommandError } from "../../output/index.js"; diff --git a/packages/cli/src/utils/client.ts b/packages/cli/src/utils/client.ts index 7b48f4434..5f936d91e 100644 --- a/packages/cli/src/utils/client.ts +++ b/packages/cli/src/utils/client.ts @@ -1,17 +1,17 @@ import { existsSync, readFileSync } from "node:fs"; +import { loadConfig, resolvePaseoHome } from "@getpaseo/server"; import { buildDaemonWebSocketUrl, buildRelayWebSocketUrl, - loadConfig, normalizeHostPort, parseConnectionUri, - parseConnectionOfferFromUrl, - DaemonClient, - resolvePaseoHome, shouldUseTlsForDefaultHostedRelay, +} from "@getpaseo/protocol/daemon-endpoints"; +import { + parseConnectionOfferFromUrl, type ConnectionOffer, - type WebSocketLike, -} from "@getpaseo/server"; +} from "@getpaseo/protocol/connection-offer"; +import { DaemonClient, type WebSocketLike } from "@getpaseo/client/internal/daemon-client"; import path from "node:path"; import { WebSocket } from "ws"; import { getOrCreateCliClientId } from "./client-id.js"; diff --git a/packages/cli/src/utils/timeline.ts b/packages/cli/src/utils/timeline.ts index 181b1d39d..77e4d3142 100644 --- a/packages/cli/src/utils/timeline.ts +++ b/packages/cli/src/utils/timeline.ts @@ -1,4 +1,5 @@ -import type { AgentTimelineItem, DaemonClient } from "@getpaseo/server"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; +import type { AgentTimelineItem } from "@getpaseo/protocol/agent-types"; interface FetchProjectedTimelineItemsInput { client: DaemonClient; diff --git a/packages/cli/tests/25-daemon-restart-supervisor.test.ts b/packages/cli/tests/25-daemon-restart-supervisor.test.ts index 5934a913f..4feb337f5 100644 --- a/packages/cli/tests/25-daemon-restart-supervisor.test.ts +++ b/packages/cli/tests/25-daemon-restart-supervisor.test.ts @@ -7,7 +7,7 @@ import assert from "node:assert"; import { spawn, spawnSync, type ChildProcess } from "node:child_process"; -import { mkdtemp, rm } from "node:fs/promises"; +import { mkdtemp, readFile, rm } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { $ } from "zx"; @@ -94,6 +94,11 @@ async function readDaemonStatus(paseoHome: string): Promise { } } +async function readCapturedSupervisorLogs(paseoHome: string, recentLogs: string): Promise { + const durableLogs = await readFile(join(paseoHome, "daemon.log"), "utf8").catch(() => ""); + return `${recentLogs}\n${durableLogs}`; +} + async function waitFor( check: () => Promise | boolean, timeoutMs: number, @@ -222,6 +227,11 @@ try { supervisorPid, "supervisor pid should remain stable across restart", ); + const capturedSupervisorLogs = await readCapturedSupervisorLogs(paseoHome, recentSupervisorLogs); + assert( + capturedSupervisorLogs.includes("Restart requested by worker. Stopping worker for restart..."), + `restart should route through supervisor restart intent, logs:\n${capturedSupervisorLogs}`, + ); console.log("✓ app-style restart keeps daemon healthy and restarts worker\n"); } finally { if (supervisorProcess?.pid && isProcessRunning(supervisorProcess.pid)) { diff --git a/packages/cli/tests/e2e/relay-host.test.ts b/packages/cli/tests/e2e/relay-host.test.ts index 65315e7a5..1c5e4bd8b 100644 --- a/packages/cli/tests/e2e/relay-host.test.ts +++ b/packages/cli/tests/e2e/relay-host.test.ts @@ -4,12 +4,10 @@ import { createRequire } from "node:module"; import net from "node:net"; import path from "node:path"; import { fileURLToPath } from "node:url"; -import { - buildRelayWebSocketUrl, - DaemonClient, - generateLocalPairingOffer, - parseConnectionOfferFromUrl, -} from "@getpaseo/server"; +import { buildRelayWebSocketUrl } from "@getpaseo/protocol/daemon-endpoints"; +import { parseConnectionOfferFromUrl } from "@getpaseo/protocol/connection-offer"; +import { generateLocalPairingOffer } from "@getpaseo/server"; +import { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import { WebSocket } from "ws"; import { getAvailablePort } from "../helpers/network.ts"; import { createE2ETestContext } from "../helpers/test-daemon.ts"; diff --git a/packages/cli/tests/run-all.ts b/packages/cli/tests/run-all.ts index b2b09b68d..d3d4cc8b2 100644 --- a/packages/cli/tests/run-all.ts +++ b/packages/cli/tests/run-all.ts @@ -16,10 +16,11 @@ import { join, dirname, delimiter } from "path"; import { fileURLToPath } from "url"; const __dirname = dirname(fileURLToPath(import.meta.url)); +const repoRoot = join(__dirname, "..", "..", ".."); // npm workspace scripts only add the local node_modules/.bin to PATH; hoisted // packages live in the root. Prepend it so `npx paseo` resolves locally. -const rootNodeModulesBin = join(__dirname, "..", "..", "..", "node_modules", ".bin"); +const rootNodeModulesBin = join(repoRoot, "node_modules", ".bin"); const args = process.argv.slice(2); const testEnvDefaults = { PASEO_LOCAL_SPEECH_AUTO_DOWNLOAD: process.env.PASEO_LOCAL_SPEECH_AUTO_DOWNLOAD ?? "0", @@ -176,9 +177,10 @@ let passed = 0; let failed = 0; const failures: Failure[] = []; -await runCommand("Building relay", "npm run build --workspace=@getpaseo/relay"); -await runCommand("Building server", "npm run build --workspace=@getpaseo/server"); -await runCommand("Building CLI", "npm run build --workspace=@getpaseo/cli"); +await runCommand( + "Building server stack", + `npm --prefix ${JSON.stringify(repoRoot)} run build:server`, +); type TestOutcome = | { status: "passed"; durationMs: number } diff --git a/packages/client/README.md b/packages/client/README.md new file mode 100644 index 000000000..e525bc5b4 --- /dev/null +++ b/packages/client/README.md @@ -0,0 +1,12 @@ +# @getpaseo/client + +Paseo's JavaScript/TypeScript client package. + +## Stability + +This package is public so Paseo's published packages can depend on it cleanly. +It is not a stable public SDK yet. + +APIs, exports, runtime behavior, and types may change or disappear in any +release without advance notice. Use it outside Paseo at your own risk until the +package is explicitly documented as stable. diff --git a/packages/client/examples/README.md b/packages/client/examples/README.md new file mode 100644 index 000000000..dc3cbfcb0 --- /dev/null +++ b/packages/client/examples/README.md @@ -0,0 +1,18 @@ +# Paseo Client SDK Examples + +These examples use only the public SDK root: + +```ts +import { createPaseoClient, type PaseoClient } from "@getpaseo/client"; +``` + +Pass the daemon WebSocket URL into the exported functions. In worktree dev, read it +from the portless banner or `portless get daemon`; for the desktop-managed daemon, +use the URL for that daemon. + +- `workspaces.ts` covers creating, opening, refetching, and archiving a workspace. +- `agents-and-providers.ts` covers creating agents and choosing providers with `client.providers.*`. +- `events-and-timeline.ts` covers subscribing to workspace, agent, and timeline events, plus refetching a timeline page. +- `provider-settings.ts` covers provider settings that are currently daemon config-backed. + +Provider profiles, provider env vars, custom binaries, and additional models are still raw daemon config behavior. The SDK exposes them through `client.config.get()` and `client.config.patch()` until first-class provider settings RPCs exist. diff --git a/packages/client/examples/agents-and-providers.ts b/packages/client/examples/agents-and-providers.ts new file mode 100644 index 000000000..ed8ad4b23 --- /dev/null +++ b/packages/client/examples/agents-and-providers.ts @@ -0,0 +1,56 @@ +import { createPaseoClient, type PaseoClient } from "@getpaseo/client"; + +export function createClient(url: string): PaseoClient { + return createPaseoClient({ + url, + }); +} + +export async function createCodexAgent(url: string, cwd: string): Promise { + const client = createClient(url); + + try { + await client.connect(); + + const agent = await client.agents.create({ + config: { + ...client.providers.codex({ + model: "gpt-5.2", + modeId: "full-auto", + }), + cwd, + }, + initialPrompt: "Inspect this repository and summarize the next useful task.", + }); + + return agent.id; + } finally { + await client.close(); + } +} + +export async function chooseProviderFromSnapshot(url: string, cwd: string): Promise { + const client = createClient(url); + + try { + await client.connect(); + + const snapshot = await client.providers.snapshot({ cwd }); + const readyProvider = snapshot.entries.find((provider) => provider.status === "ready"); + const providerConfig = readyProvider + ? client.providers.config(readyProvider.provider) + : client.providers.claude(); + + const agent = await client.agents.create({ + config: { + ...providerConfig, + cwd, + }, + initialPrompt: "Start with a quick repository map.", + }); + + return agent.id; + } finally { + await client.close(); + } +} diff --git a/packages/client/examples/events-and-timeline.ts b/packages/client/examples/events-and-timeline.ts new file mode 100644 index 000000000..533210f96 --- /dev/null +++ b/packages/client/examples/events-and-timeline.ts @@ -0,0 +1,62 @@ +import { createPaseoClient, type PaseoClient } from "@getpaseo/client"; + +export function createClient(url: string): PaseoClient { + return createPaseoClient({ + url, + }); +} + +export async function subscribeToEvents( + url: string, + agentId: string, + workspaceId: string, +): Promise<() => void> { + const client = createClient(url); + await client.connect(); + + await client.workspaces.list({ + filter: { idPrefix: workspaceId }, + subscribe: { subscriptionId: `workspace-${workspaceId}` }, + }); + + const unsubscribeAgentUpdates = client.agents.subscribe((update) => { + if (update.kind === "upsert" && update.agent.id === agentId) { + void update.agent.status; + } + }); + + const unsubscribeWorkspaceUpdates = client.workspaces.subscribe((update) => { + if (update.kind === "upsert" && update.workspace.id === workspaceId) { + void update.workspace.workspaceDirectory; + } + }); + + const unsubscribeTimeline = client.agents.ref(agentId).timeline.subscribe((event) => { + void event.event; + }); + + return () => { + unsubscribeTimeline(); + unsubscribeWorkspaceUpdates(); + unsubscribeAgentUpdates(); + void client.close(); + }; +} + +export async function refetchTimeline(url: string, agentId: string): Promise { + const client = createClient(url); + + try { + await client.connect(); + + const timeline = await client.agents.ref(agentId).timeline.refetch({ + direction: "before", + limit: 50, + projection: "projected", + }); + + return timeline.entries.length; + } finally { + await client.close(); + } +} diff --git a/packages/client/examples/provider-settings.ts b/packages/client/examples/provider-settings.ts new file mode 100644 index 000000000..d96d5b970 --- /dev/null +++ b/packages/client/examples/provider-settings.ts @@ -0,0 +1,62 @@ +import { createPaseoClient, type PaseoClient } from "@getpaseo/client"; + +export function createClient(url: string): PaseoClient { + return createPaseoClient({ + url, + }); +} + +export async function setSupportedProviderSettings(url: string): Promise { + const client = createClient(url); + + try { + await client.connect(); + + await client.config.patch({ + providers: { + codex: { + enabled: true, + additionalModels: [ + { + id: "gpt-5.2", + label: "GPT-5.2", + isDefault: true, + }, + ], + }, + }, + }); + } finally { + await client.close(); + } +} + +export async function addCustomCodexProfile(url: string): Promise { + const client = createClient(url); + + try { + await client.connect(); + + await client.config.patch({ + providers: { + "codex-proxy": { + extends: "codex", + label: "Codex Proxy", + env: { + OPENAI_API_KEY: "sk-...", + OPENAI_BASE_URL: "https://example.test/v1", + }, + models: [ + { + id: "custom-model", + label: "Custom Model", + isDefault: true, + }, + ], + }, + }, + }); + } finally { + await client.close(); + } +} diff --git a/packages/client/examples/workspaces.ts b/packages/client/examples/workspaces.ts new file mode 100644 index 000000000..3605d68b6 --- /dev/null +++ b/packages/client/examples/workspaces.ts @@ -0,0 +1,30 @@ +import { createPaseoClient, type PaseoClient } from "@getpaseo/client"; + +export function createClient(url: string): PaseoClient { + return createPaseoClient({ + url, + }); +} + +export async function createOpenAndArchiveWorkspace(url: string, cwd: string): Promise { + const client = createClient(url); + + try { + await client.connect(); + + const created = await client.workspaces.create(cwd); + if (!created.workspace) { + throw new Error(created.error ?? "Workspace creation failed"); + } + + const opened = await client.workspaces.open(cwd); + if (!opened.workspace) { + throw new Error(opened.error ?? "Workspace open failed"); + } + + await opened.workspace.refetch(); + await opened.workspace.archive(); + } finally { + await client.close(); + } +} diff --git a/packages/client/package.json b/packages/client/package.json new file mode 100644 index 000000000..aa5ef5870 --- /dev/null +++ b/packages/client/package.json @@ -0,0 +1,44 @@ +{ + "name": "@getpaseo/client", + "version": "0.1.83", + "description": "Paseo client SDK package", + "files": [ + "dist", + "README.md" + ], + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "./internal/daemon-client": { + "types": "./dist/daemon-client.d.ts", + "default": "./dist/daemon-client.js" + }, + "./internal/daemon-client-transport-types": { + "types": "./dist/daemon-client-transport-types.d.ts", + "default": "./dist/daemon-client-transport-types.js" + } + }, + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "node -e \"require('node:fs').rmSync('dist',{ recursive: true, force: true })\" && tsc -p tsconfig.json --incremental false", + "prepack": "npm run build", + "typecheck": "tsgo --noEmit", + "typecheck:examples": "tsgo -p tsconfig.examples.json --noEmit", + "test": "vitest run" + }, + "dependencies": { + "@getpaseo/protocol": "0.1.83", + "@getpaseo/relay": "0.1.83", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/node": "^20.9.0", + "typescript": "^5.2.2", + "vitest": "^4.1.6" + } +} diff --git a/packages/server/src/client/daemon-client-relay-e2ee-transport.ts b/packages/client/src/daemon-client-relay-e2ee-transport.ts similarity index 100% rename from packages/server/src/client/daemon-client-relay-e2ee-transport.ts rename to packages/client/src/daemon-client-relay-e2ee-transport.ts diff --git a/packages/server/src/client/daemon-client-runtime-metrics.ts b/packages/client/src/daemon-client-runtime-metrics.ts similarity index 99% rename from packages/server/src/client/daemon-client-runtime-metrics.ts rename to packages/client/src/daemon-client-runtime-metrics.ts index 720f256f9..d95470efd 100644 --- a/packages/server/src/client/daemon-client-runtime-metrics.ts +++ b/packages/client/src/daemon-client-runtime-metrics.ts @@ -1,4 +1,4 @@ -import type { SessionOutboundMessage } from "../shared/messages.js"; +import type { SessionOutboundMessage } from "@getpaseo/protocol/messages"; interface RuntimeMetricsLogger { info(obj: object, msg?: string): void; diff --git a/packages/server/src/client/daemon-client-transport-types.ts b/packages/client/src/daemon-client-transport-types.ts similarity index 100% rename from packages/server/src/client/daemon-client-transport-types.ts rename to packages/client/src/daemon-client-transport-types.ts diff --git a/packages/server/src/client/daemon-client-transport-utils.ts b/packages/client/src/daemon-client-transport-utils.ts similarity index 100% rename from packages/server/src/client/daemon-client-transport-utils.ts rename to packages/client/src/daemon-client-transport-utils.ts diff --git a/packages/server/src/client/daemon-client-transport.test.ts b/packages/client/src/daemon-client-transport.test.ts similarity index 100% rename from packages/server/src/client/daemon-client-transport.test.ts rename to packages/client/src/daemon-client-transport.test.ts diff --git a/packages/server/src/client/daemon-client-transport.ts b/packages/client/src/daemon-client-transport.ts similarity index 100% rename from packages/server/src/client/daemon-client-transport.ts rename to packages/client/src/daemon-client-transport.ts diff --git a/packages/server/src/client/daemon-client-websocket-transport.ts b/packages/client/src/daemon-client-websocket-transport.ts similarity index 100% rename from packages/server/src/client/daemon-client-websocket-transport.ts rename to packages/client/src/daemon-client-websocket-transport.ts diff --git a/packages/server/src/client/daemon-client.test.ts b/packages/client/src/daemon-client.test.ts similarity index 99% rename from packages/server/src/client/daemon-client.test.ts rename to packages/client/src/daemon-client.test.ts index c0cc0c927..726371dee 100644 --- a/packages/server/src/client/daemon-client.test.ts +++ b/packages/client/src/daemon-client.test.ts @@ -1,7 +1,10 @@ import { afterEach, expect, expectTypeOf, test, vi } from "vitest"; import { z } from "zod"; import { DaemonClient, type DaemonTransport } from "./daemon-client"; -import { encodeFileTransferFrame, FileTransferOpcode } from "../shared/binary-frames/index.js"; +import { + encodeFileTransferFrame, + FileTransferOpcode, +} from "@getpaseo/protocol/binary-frames/index"; import { asUint8Array, decodeTerminalResizePayload, @@ -9,7 +12,7 @@ import { encodeTerminalSnapshotPayload, encodeTerminalStreamFrame, TerminalStreamOpcode, -} from "../shared/terminal-stream-protocol.js"; +} from "@getpaseo/protocol/terminal-stream-protocol"; expectTypeOf<"getGitDiff" extends keyof DaemonClient ? true : false>().toEqualTypeOf(); expectTypeOf< diff --git a/packages/server/src/client/daemon-client.ts b/packages/client/src/daemon-client.ts similarity index 99% rename from packages/server/src/client/daemon-client.ts rename to packages/client/src/daemon-client.ts index 602ee14a9..e7ed4e057 100644 --- a/packages/server/src/client/daemon-client.ts +++ b/packages/client/src/daemon-client.ts @@ -1,5 +1,5 @@ import type { z } from "zod"; -import { CLIENT_CAPS } from "../shared/client-capabilities.js"; +import { CLIENT_CAPS } from "@getpaseo/protocol/client-capabilities"; import { AgentCreateFailedStatusPayloadSchema, AgentCreatedStatusPayloadSchema, @@ -13,7 +13,7 @@ import { SessionInboundMessageSchema, type ServerInfoStatusPayload, WSOutboundMessageSchema, -} from "../shared/messages.js"; +} from "@getpaseo/protocol/messages"; import type { AgentStreamEventPayload, AgentSnapshotPayload, @@ -79,16 +79,16 @@ import type { EditorTargetId, PaseoConfigRaw, PaseoConfigRevision, -} from "../shared/messages.js"; +} from "@getpaseo/protocol/messages"; import type { AgentPermissionRequest, AgentPermissionResponse, AgentPersistenceHandle, AgentProvider, AgentSessionConfig, -} from "../server/agent/agent-sdk-types.js"; -import type { MutableDaemonConfig, MutableDaemonConfigPatch } from "../shared/messages.js"; -import { isRelayClientWebSocketUrl } from "../shared/daemon-endpoints.js"; +} from "@getpaseo/protocol/agent-types"; +import type { MutableDaemonConfig, MutableDaemonConfigPatch } from "@getpaseo/protocol/messages"; +import { isRelayClientWebSocketUrl } from "@getpaseo/protocol/daemon-endpoints"; import { asUint8Array, decodeFileTransferFrame, @@ -96,7 +96,7 @@ import { FileTransferOpcode, TerminalStreamOpcode, type FileTransferFrame, -} from "../shared/binary-frames/index.js"; +} from "@getpaseo/protocol/binary-frames/index"; import { createRelayE2eeTransportFactory, createWebSocketTransportFactory, @@ -4263,8 +4263,8 @@ export class DaemonClient { clientType: this.config.clientType ?? "cli", protocolVersion: 1, capabilities: { - [CLIENT_CAPS.reasoningMergeEnum]: true, [CLIENT_CAPS.customModeIcons]: true, + [CLIENT_CAPS.reasoningMergeEnum]: true, }, ...(this.config.appVersion ? { appVersion: this.config.appVersion } : {}), }), diff --git a/packages/client/src/index.test.ts b/packages/client/src/index.test.ts new file mode 100644 index 000000000..e6d4ad776 --- /dev/null +++ b/packages/client/src/index.test.ts @@ -0,0 +1,795 @@ +import { afterEach, expect, test, vi } from "vitest"; +import { createPaseoClient } from "./index.js"; +import type { PaseoAgent, PaseoClient, PaseoProviderConfig, PaseoWorkspace } from "./index.js"; + +type FakeWebSocketHandler = (...args: unknown[]) => void; + +class FakeWebSocket { + static instances: FakeWebSocket[] = []; + + readyState = 1; + sent: Array = []; + onopen: FakeWebSocketHandler | null = null; + onmessage: FakeWebSocketHandler | null = null; + onclose: FakeWebSocketHandler | null = null; + onerror: FakeWebSocketHandler | null = null; + + constructor( + readonly url: string, + readonly protocols?: string | string[], + ) { + FakeWebSocket.instances.push(this); + } + + send(data: string | ArrayBuffer | Uint8Array): void { + this.sent.push(data); + } + + close(): void { + this.readyState = 3; + } + + open(): void { + this.onopen?.(); + } + + message(data: string): void { + this.onmessage?.(data); + } +} + +afterEach(() => { + vi.unstubAllGlobals(); + FakeWebSocket.instances.length = 0; +}); + +function sessionMessage(message: object): string { + return JSON.stringify({ + type: "session", + message, + }); +} + +function parseSentSessionMessage(data: string | ArrayBuffer | Uint8Array | undefined): { + type: string; + requestId?: string; + agentId?: string; + workspaceId?: string; + provider?: string; + providers?: string[]; + cwd?: string; + config?: unknown; + draftConfig?: unknown; + filter?: unknown; + page?: unknown; + text?: string; +} { + if (typeof data !== "string") { + throw new Error("Expected string WebSocket frame"); + } + const parsed = JSON.parse(data); + return parsed.message; +} + +function parseSentFrame( + data: string | ArrayBuffer | Uint8Array | undefined, +): Record { + if (typeof data !== "string") { + throw new Error("Expected string WebSocket frame"); + } + return JSON.parse(data); +} + +async function connectClient(): Promise<{ client: PaseoClient; ws: FakeWebSocket }> { + vi.stubGlobal("WebSocket", FakeWebSocket); + const client = createPaseoClient({ + url: "ws://daemon.test", + reconnect: { enabled: false }, + }); + + const connectPromise = client.connect(); + const ws = FakeWebSocket.instances[0]; + ws.open(); + const hello = parseSentFrame(ws.sent.at(-1)); + expect(hello).toMatchObject({ + type: "hello", + clientType: "cli", + protocolVersion: 1, + }); + expect(hello.clientId).toEqual(expect.stringMatching(/^paseo-sdk-/)); + ws.message( + sessionMessage({ + type: "status", + payload: { + status: "server_info", + serverId: "srv_sdk_test", + hostname: null, + version: null, + }, + }), + ); + await connectPromise; + + return { client, ws }; +} + +function createWorkspace(input: Partial = {}): PaseoWorkspace { + return { + id: "workspace_sdk", + projectId: "project_sdk", + projectDisplayName: "SDK", + projectRootPath: "/repo/sdk", + workspaceDirectory: "/repo/sdk", + projectKind: "git", + workspaceKind: "directory", + name: "sdk", + archivingAt: null, + status: "done", + activityAt: "2026-05-16T00:00:00.000Z", + scripts: [], + gitRuntime: null, + githubRuntime: null, + ...input, + }; +} + +function createAgent(input: Partial = {}): PaseoAgent { + return { + id: "agent_sdk", + provider: "codex", + cwd: "/repo/sdk", + model: null, + createdAt: "2026-05-16T00:00:00.000Z", + updatedAt: "2026-05-16T00:00:00.000Z", + lastUserMessageAt: null, + status: "idle", + capabilities: { + supportsStreaming: true, + supportsSessionPersistence: true, + supportsDynamicModes: false, + supportsMcpServers: true, + supportsReasoningStream: true, + supportsRewindBoth: false, + supportsRewindConversation: false, + supportsRewindFiles: false, + supportsToolInvocations: true, + }, + currentModeId: null, + availableModes: [], + pendingPermissions: [], + persistence: null, + title: null, + labels: {}, + archivedAt: null, + ...input, + }; +} + +test("createPaseoClient exposes workspace list through the daemon client", async () => { + const { client, ws } = await connectClient(); + + const listPromise = client.workspaces.list({ + filter: { query: "sdk" }, + page: { limit: 10 }, + }); + const request = parseSentSessionMessage(ws.sent.at(-1)); + + expect(request).toMatchObject({ + type: "fetch_workspaces_request", + filter: { query: "sdk" }, + page: { limit: 10 }, + }); + + ws.message( + sessionMessage({ + type: "fetch_workspaces_response", + payload: { + requestId: request.requestId, + entries: [], + pageInfo: { + nextCursor: null, + prevCursor: null, + hasMore: false, + }, + }, + }), + ); + + await expect(listPromise).resolves.toEqual({ + requestId: request.requestId, + entries: [], + pageInfo: { + nextCursor: null, + prevCursor: null, + hasMore: false, + }, + }); + expect(client.getConnectionState()).toEqual({ status: "connected" }); + + await client.close(); +}); + +test("workspace handles keep identity and refresh snapshots through existing driver calls", async () => { + const { client, ws } = await connectClient(); + const openedWorkspace = createWorkspace(); + + const openPromise = client.workspaces.open("/repo/sdk", "open-workspace-request"); + expect(parseSentSessionMessage(ws.sent.at(-1))).toMatchObject({ + type: "open_project_request", + cwd: "/repo/sdk", + }); + + ws.message( + sessionMessage({ + type: "open_project_response", + payload: { + requestId: "open-workspace-request", + workspace: openedWorkspace, + error: null, + }, + }), + ); + + const opened = await openPromise; + const workspace = opened.workspace; + expect(workspace?.id).toBe("workspace_sdk"); + expect(workspace?.latest()).toEqual(openedWorkspace); + + const refreshedWorkspace = createWorkspace({ name: "sdk refreshed" }); + const refetchPromise = workspace?.refetch({ requestId: "workspace-refetch-request" }); + expect(parseSentSessionMessage(ws.sent.at(-1))).toMatchObject({ + type: "fetch_workspaces_request", + requestId: "workspace-refetch-request", + filter: { idPrefix: "workspace_sdk" }, + page: { limit: 25 }, + }); + + ws.message( + sessionMessage({ + type: "fetch_workspaces_response", + payload: { + requestId: "workspace-refetch-request", + entries: [refreshedWorkspace], + pageInfo: { + nextCursor: null, + prevCursor: null, + hasMore: false, + }, + }, + }), + ); + + await expect(refetchPromise).resolves.toEqual(refreshedWorkspace); + expect(workspace?.latest()).toEqual(refreshedWorkspace); + + const updates: string[] = []; + const unsubscribe = workspace?.subscribe((update) => { + if (update.kind === "upsert") { + updates.push(update.workspace.name); + } + }); + const pushedWorkspace = createWorkspace({ name: "sdk pushed" }); + ws.message( + sessionMessage({ + type: "workspace_update", + payload: { + kind: "upsert", + workspace: pushedWorkspace, + }, + }), + ); + expect(updates).toEqual(["sdk pushed"]); + expect(workspace?.latest()).toEqual(pushedWorkspace); + + unsubscribe?.(); + ws.message( + sessionMessage({ + type: "workspace_update", + payload: { + kind: "upsert", + workspace: createWorkspace({ name: "sdk after unsubscribe" }), + }, + }), + ); + expect(updates).toEqual(["sdk pushed"]); + + await client.close(); +}); + +test("agent handles delegate create, send, timeline refetch, archive, and local updates", async () => { + const { client, ws } = await connectClient(); + const createdAgent = createAgent(); + + const createPromise = client.agents.create({ + provider: "codex", + cwd: "/repo/sdk", + initialPrompt: "ship it", + }); + const createRequest = parseSentSessionMessage(ws.sent.at(-1)); + expect(createRequest).toMatchObject({ + type: "create_agent_request", + config: { + provider: "codex", + cwd: "/repo/sdk", + }, + initialPrompt: "ship it", + }); + + ws.message( + sessionMessage({ + type: "status", + payload: { + status: "agent_created", + requestId: createRequest.requestId, + agentId: "agent_sdk", + agent: createdAgent, + }, + }), + ); + + const agent = await createPromise; + expect(agent.id).toBe("agent_sdk"); + expect(agent.latest()).toEqual(createdAgent); + + const updatedAgents: string[] = []; + const unsubscribe = agent.subscribe((update) => { + if (update.kind === "upsert") { + updatedAgents.push(update.agent.title ?? ""); + } + }); + const updatedAgent = createAgent({ title: "Updated" }); + ws.message( + sessionMessage({ + type: "agent_update", + payload: { + kind: "upsert", + agent: updatedAgent, + project: null, + }, + }), + ); + expect(updatedAgents).toEqual(["Updated"]); + expect(agent.latest()).toEqual(updatedAgent); + + const sendPromise = agent.send("hello", { messageId: "message-sdk" }); + const sendRequest = parseSentSessionMessage(ws.sent.at(-1)); + expect(sendRequest).toMatchObject({ + type: "send_agent_message_request", + agentId: "agent_sdk", + text: "hello", + messageId: "message-sdk", + }); + + ws.message( + sessionMessage({ + type: "send_agent_message_response", + payload: { + requestId: sendRequest.requestId, + agentId: "agent_sdk", + accepted: true, + error: null, + }, + }), + ); + await sendPromise; + + const timelineAgent = createAgent({ title: "Timeline" }); + const timelinePromise = agent.timeline.refetch({ limit: 5 }); + const timelineRequest = parseSentSessionMessage(ws.sent.at(-1)); + expect(timelineRequest).toMatchObject({ + type: "fetch_agent_timeline_request", + agentId: "agent_sdk", + limit: 5, + }); + ws.message( + sessionMessage({ + type: "fetch_agent_timeline_response", + payload: { + requestId: timelineRequest.requestId, + agentId: "agent_sdk", + agent: timelineAgent, + direction: "tail", + projection: "projected", + epoch: "epoch-sdk", + reset: false, + staleCursor: false, + gap: false, + window: { + minSeq: 0, + maxSeq: 0, + nextSeq: 0, + }, + startCursor: null, + endCursor: null, + hasOlder: false, + hasNewer: false, + entries: [], + error: null, + }, + }), + ); + await timelinePromise; + expect(agent.latest()).toEqual(timelineAgent); + + const archivePromise = agent.archive(); + const archiveRequest = parseSentSessionMessage(ws.sent.at(-1)); + expect(archiveRequest).toMatchObject({ + type: "archive_agent_request", + agentId: "agent_sdk", + }); + ws.message( + sessionMessage({ + type: "agent_archived", + payload: { + requestId: archiveRequest.requestId, + agentId: "agent_sdk", + archivedAt: "2026-05-16T01:00:00.000Z", + }, + }), + ); + await expect(archivePromise).resolves.toEqual({ + archivedAt: "2026-05-16T01:00:00.000Z", + }); + expect(agent.latest()?.archivedAt).toBe("2026-05-16T01:00:00.000Z"); + + unsubscribe(); + await client.close(); +}); + +test("provider actions delegate to existing provider RPCs and local snapshot updates", async () => { + const { client, ws } = await connectClient(); + + const modelsPromise = client.providers.listModels("codex", { + cwd: "/repo/sdk", + requestId: "provider-models-request", + }); + expect(parseSentSessionMessage(ws.sent.at(-1))).toMatchObject({ + type: "list_provider_models_request", + requestId: "provider-models-request", + provider: "codex", + cwd: "/repo/sdk", + }); + ws.message( + sessionMessage({ + type: "list_provider_models_response", + payload: { + requestId: "provider-models-request", + provider: "codex", + models: [{ provider: "codex", id: "gpt-5.4", label: "GPT-5.4" }], + error: null, + fetchedAt: "2026-05-16T00:00:00.000Z", + }, + }), + ); + await expect(modelsPromise).resolves.toMatchObject({ + provider: "codex", + models: [{ provider: "codex", id: "gpt-5.4", label: "GPT-5.4" }], + }); + + const modesPromise = client.providers.listModes("codex", { + cwd: "/repo/sdk", + requestId: "provider-modes-request", + }); + expect(parseSentSessionMessage(ws.sent.at(-1))).toMatchObject({ + type: "list_provider_modes_request", + requestId: "provider-modes-request", + provider: "codex", + cwd: "/repo/sdk", + }); + ws.message( + sessionMessage({ + type: "list_provider_modes_response", + payload: { + requestId: "provider-modes-request", + provider: "codex", + modes: [{ id: "full-access", label: "Full Access" }], + error: null, + fetchedAt: "2026-05-16T00:00:00.000Z", + }, + }), + ); + await expect(modesPromise).resolves.toMatchObject({ + provider: "codex", + modes: [{ id: "full-access", label: "Full Access" }], + }); + + const featuresPromise = client.providers.listFeatures( + { + provider: "codex", + cwd: "/repo/sdk", + modeId: "full-access", + model: "gpt-5.4", + thinkingOptionId: "high", + featureValues: { webSearch: true }, + }, + { requestId: "provider-features-request" }, + ); + expect(parseSentSessionMessage(ws.sent.at(-1))).toMatchObject({ + type: "list_provider_features_request", + requestId: "provider-features-request", + draftConfig: { + provider: "codex", + cwd: "/repo/sdk", + modeId: "full-access", + model: "gpt-5.4", + thinkingOptionId: "high", + featureValues: { webSearch: true }, + }, + }); + ws.message( + sessionMessage({ + type: "list_provider_features_response", + payload: { + requestId: "provider-features-request", + provider: "codex", + features: [{ type: "toggle", id: "webSearch", label: "Web Search", value: true }], + error: null, + fetchedAt: "2026-05-16T00:00:00.000Z", + }, + }), + ); + await expect(featuresPromise).resolves.toMatchObject({ + provider: "codex", + features: [{ type: "toggle", id: "webSearch", label: "Web Search", value: true }], + }); + + const availablePromise = client.providers.listAvailable({ + requestId: "providers-available-request", + }); + expect(parseSentSessionMessage(ws.sent.at(-1))).toMatchObject({ + type: "list_available_providers_request", + requestId: "providers-available-request", + }); + ws.message( + sessionMessage({ + type: "list_available_providers_response", + payload: { + requestId: "providers-available-request", + providers: [{ provider: "codex", available: true, error: null }], + error: null, + fetchedAt: "2026-05-16T00:00:00.000Z", + }, + }), + ); + await expect(availablePromise).resolves.toMatchObject({ + providers: [{ provider: "codex", available: true, error: null }], + }); + + const snapshotPromise = client.providers.snapshot({ + cwd: "/repo/sdk", + requestId: "providers-snapshot-request", + }); + expect(parseSentSessionMessage(ws.sent.at(-1))).toMatchObject({ + type: "get_providers_snapshot_request", + requestId: "providers-snapshot-request", + cwd: "/repo/sdk", + }); + ws.message( + sessionMessage({ + type: "get_providers_snapshot_response", + payload: { + requestId: "providers-snapshot-request", + entries: [{ provider: "codex", status: "ready", enabled: true }], + generatedAt: "2026-05-16T00:00:00.000Z", + }, + }), + ); + await expect(snapshotPromise).resolves.toMatchObject({ + entries: [{ provider: "codex", status: "ready", enabled: true }], + }); + + const refreshPromise = client.providers.refresh({ + cwd: "/repo/sdk", + providers: ["codex"], + requestId: "providers-refresh-request", + }); + expect(parseSentSessionMessage(ws.sent.at(-1))).toMatchObject({ + type: "refresh_providers_snapshot_request", + requestId: "providers-refresh-request", + cwd: "/repo/sdk", + providers: ["codex"], + }); + ws.message( + sessionMessage({ + type: "refresh_providers_snapshot_response", + payload: { + requestId: "providers-refresh-request", + acknowledged: true, + }, + }), + ); + await expect(refreshPromise).resolves.toEqual({ + requestId: "providers-refresh-request", + acknowledged: true, + }); + + const diagnosticPromise = client.providers.diagnostic("codex", { + requestId: "provider-diagnostic-request", + }); + expect(parseSentSessionMessage(ws.sent.at(-1))).toMatchObject({ + type: "provider_diagnostic_request", + requestId: "provider-diagnostic-request", + provider: "codex", + }); + ws.message( + sessionMessage({ + type: "provider_diagnostic_response", + payload: { + requestId: "provider-diagnostic-request", + provider: "codex", + diagnostic: "Codex is ready.", + }, + }), + ); + await expect(diagnosticPromise).resolves.toEqual({ + requestId: "provider-diagnostic-request", + provider: "codex", + diagnostic: "Codex is ready.", + }); + + const snapshotUpdates: string[] = []; + const unsubscribe = client.providers.subscribe((update) => { + snapshotUpdates.push(update.generatedAt); + }); + ws.message( + sessionMessage({ + type: "providers_snapshot_update", + payload: { + cwd: "/repo/sdk", + entries: [{ provider: "codex", status: "ready", enabled: true }], + generatedAt: "2026-05-16T01:00:00.000Z", + }, + }), + ); + expect(snapshotUpdates).toEqual(["2026-05-16T01:00:00.000Z"]); + + unsubscribe(); + await client.close(); +}); + +test("config actions delegate to existing daemon config RPCs", async () => { + const { client, ws } = await connectClient(); + + const getPromise = client.config.get("config-get-request"); + expect(parseSentSessionMessage(ws.sent.at(-1))).toMatchObject({ + type: "get_daemon_config_request", + requestId: "config-get-request", + }); + ws.message( + sessionMessage({ + type: "get_daemon_config_response", + payload: { + requestId: "config-get-request", + config: { + mcp: { injectIntoAgents: true }, + providers: {}, + autoArchiveAfterMerge: false, + }, + }, + }), + ); + await expect(getPromise).resolves.toEqual({ + requestId: "config-get-request", + config: { + mcp: { injectIntoAgents: true }, + providers: {}, + autoArchiveAfterMerge: false, + appendSystemPrompt: "", + }, + }); + + const patchPromise = client.config.patch( + { + providers: { + codex: { + enabled: false, + }, + }, + }, + "config-patch-request", + ); + expect(parseSentSessionMessage(ws.sent.at(-1))).toMatchObject({ + type: "set_daemon_config_request", + requestId: "config-patch-request", + config: { + providers: { + codex: { + enabled: false, + }, + }, + }, + }); + ws.message( + sessionMessage({ + type: "set_daemon_config_response", + payload: { + requestId: "config-patch-request", + config: { + mcp: { injectIntoAgents: true }, + providers: { + codex: { + enabled: false, + }, + }, + autoArchiveAfterMerge: false, + }, + }, + }), + ); + await expect(patchPromise).resolves.toEqual({ + requestId: "config-patch-request", + config: { + mcp: { injectIntoAgents: true }, + providers: { + codex: { + enabled: false, + }, + }, + autoArchiveAfterMerge: false, + appendSystemPrompt: "", + }, + }); + + await client.close(); +}); + +test("provider config builders shape existing create-agent config fields", async () => { + const { client, ws } = await connectClient(); + const provider = client.providers.codex({ + model: "gpt-5.4", + modeId: "full-access", + thinkingOptionId: "high", + featureValues: { webSearch: true }, + }); + const expectedProviderConfig = { + provider: "codex", + model: "gpt-5.4", + modeId: "full-access", + thinkingOptionId: "high", + featureValues: { webSearch: true }, + } satisfies PaseoProviderConfig; + + expect(provider).toEqual(expectedProviderConfig); + + const createdAgent = createAgent({ + model: "gpt-5.4", + currentModeId: "full-access", + }); + const createPromise = client.agents.create({ + config: { + ...provider, + cwd: "/repo/sdk", + }, + initialPrompt: "use configured provider", + }); + const request = parseSentSessionMessage(ws.sent.at(-1)); + expect(request).toMatchObject({ + type: "create_agent_request", + config: { + provider: "codex", + cwd: "/repo/sdk", + model: "gpt-5.4", + modeId: "full-access", + thinkingOptionId: "high", + featureValues: { webSearch: true }, + }, + initialPrompt: "use configured provider", + }); + + ws.message( + sessionMessage({ + type: "status", + payload: { + status: "agent_created", + requestId: request.requestId, + agentId: "agent_sdk", + agent: createdAgent, + }, + }), + ); + + const agent = await createPromise; + expect(agent.latest()).toEqual(createdAgent); + + await client.close(); +}); diff --git a/packages/client/src/index.ts b/packages/client/src/index.ts new file mode 100644 index 000000000..3522d4995 --- /dev/null +++ b/packages/client/src/index.ts @@ -0,0 +1,539 @@ +import type { + AgentSnapshotPayload, + CreateAgentRequestMessage, + FetchWorkspacesRequestMessage, + FetchWorkspacesResponseMessage, + GetProvidersSnapshotResponseMessage, + ListAvailableProvidersResponse, + ListProviderFeaturesRequestMessage, + ListProviderFeaturesResponseMessage, + ListProviderModelsResponseMessage, + ListProviderModesResponseMessage, + MutableDaemonConfig, + MutableDaemonConfigPatch, + ProviderDiagnosticResponseMessage, + ProjectPlacementPayload, + RefreshProvidersSnapshotResponseMessage, + SendAgentMessageRequest, + SessionOutboundMessage, + WorkspaceDescriptorPayload, +} from "@getpaseo/protocol/messages"; +import { DaemonClient } from "./daemon-client.js"; +import type { + FetchAgentTimelineCursor, + FetchAgentTimelineDirection, + FetchAgentTimelinePayload, + FetchAgentTimelineProjection, +} from "./daemon-client.js"; + +export { DaemonClient }; +export type { + DaemonClientConfig, + DaemonEvent, + WebSocketFactory, + WebSocketLike, +} from "./daemon-client.js"; + +export type ConnectionState = + | { status: "idle" } + | { status: "connecting"; attempt: number } + | { status: "connected" } + | { status: "disconnected"; reason?: string } + | { status: "disposed" }; + +export interface PaseoLogger { + debug(obj: object, msg?: string): void; + info(obj: object, msg?: string): void; + warn(obj: object, msg?: string): void; + error(obj: object, msg?: string): void; +} + +export interface PaseoClientConfig { + url: string; + clientId?: string; + appVersion?: string; + runtimeGeneration?: number | null; + password?: string; + authHeader?: string; + suppressSendErrors?: boolean; + logger?: PaseoLogger; + connectTimeoutMs?: number; + e2ee?: { + enabled?: boolean; + daemonPublicKeyB64?: string; + }; + reconnect?: { + enabled?: boolean; + baseDelayMs?: number; + maxDelayMs?: number; + }; + runtimeMetricsIntervalMs?: number; + runtimeMetricsWindowMs?: number; +} + +export type PaseoWorkspace = WorkspaceDescriptorPayload; +export type PaseoAgent = AgentSnapshotPayload; +export type PaseoWorkspaceListOptions = Omit< + FetchWorkspacesRequestMessage, + "type" | "requestId" +> & { + requestId?: string; +}; + +export interface PaseoWorkspaceListResult { + requestId: string; + subscriptionId?: string | null; + entries: PaseoWorkspace[]; + pageInfo: FetchWorkspacesResponseMessage["payload"]["pageInfo"]; +} + +export interface PaseoWorkspaceOpenOptions { + cwd: string; + requestId?: string; +} + +export interface PaseoWorkspaceOpenResult { + requestId: string; + workspace: PaseoWorkspaceHandle | null; + error: string | null; +} + +export interface PaseoWorkspaceArchiveResult { + requestId: string; + workspaceId: string; + archivedAt: string | null; + error: string | null; +} + +export type PaseoWorkspaceUpdate = Extract< + SessionOutboundMessage, + { type: "workspace_update" } +>["payload"]; + +export type PaseoWorkspaceUpdateHandler = (update: PaseoWorkspaceUpdate) => void; + +/** + * A handle is a stable typed reference to a daemon resource. Its identity is the + * daemon id, and `latest()` only returns the most recent snapshot this handle has + * seen through construction, `refetch()`, or this handle's local subscription. + */ +export interface PaseoWorkspaceHandle { + readonly id: string; + latest(): PaseoWorkspace | null; + /** + * Fetches a fresh workspace snapshot through the existing workspace list RPC, + * exact-matches this handle id from the result, and updates `latest()`. + */ + refetch(options?: { requestId?: string }): Promise; + archive(requestId?: string): Promise; + /** + * Subscribes to already-emitted daemon workspace_update events for this id. + * This returns a local unsubscribe function; it does not own app cache state or + * send a daemon unsubscribe RPC. Call `workspaces.list({ subscribe: {} })` when + * the daemon should start streaming workspace directory updates. + */ + subscribe(handler: (update: PaseoWorkspaceUpdate) => void): () => void; +} + +export interface PaseoWorkspaceActions { + list(options?: PaseoWorkspaceListOptions): Promise; + ref(workspace: string | PaseoWorkspace): PaseoWorkspaceHandle; + open( + input: string | PaseoWorkspaceOpenOptions, + requestId?: string, + ): Promise; + create( + input: string | PaseoWorkspaceOpenOptions, + requestId?: string, + ): Promise; + archive( + workspace: string | PaseoWorkspaceHandle, + requestId?: string, + ): Promise; + /** + * Local event subscription over the low-level driver's workspace_update stream. + * The returned function only removes this SDK listener. + */ + subscribe(handler: PaseoWorkspaceUpdateHandler): () => void; +} + +type PaseoAgentSessionConfig = CreateAgentRequestMessage["config"]; +type PaseoAgentProvider = PaseoAgentSessionConfig["provider"]; +type PaseoAgentConfigOverrides = Partial>; + +export interface PaseoAgentCreateOptions extends PaseoAgentConfigOverrides { + config?: PaseoAgentSessionConfig; + provider?: CreateAgentRequestMessage["config"]["provider"]; + cwd?: string; + workspaceId?: string; + initialPrompt?: string; + clientMessageId?: string; + outputSchema?: Record; + images?: CreateAgentRequestMessage["images"]; + attachments?: CreateAgentRequestMessage["attachments"]; + git?: CreateAgentRequestMessage["git"]; + worktreeName?: string; + requestId?: string; + labels?: Record; +} + +export interface PaseoAgentRefetchResult { + agent: PaseoAgent; + project: ProjectPlacementPayload | null; +} + +export interface PaseoAgentTimelineRefetchOptions { + direction?: FetchAgentTimelineDirection; + cursor?: FetchAgentTimelineCursor; + limit?: number; + projection?: FetchAgentTimelineProjection; + requestId?: string; +} + +export interface PaseoAgentSendOptions { + messageId?: string; + images?: Array<{ data: string; mimeType: string }>; + attachments?: SendAgentMessageRequest["attachments"]; +} + +export type PaseoAgentUpdate = Extract["payload"]; + +export type PaseoAgentStream = Extract["payload"]; + +export type PaseoAgentUpdateHandler = (update: PaseoAgentUpdate) => void; + +export interface PaseoAgentTimelineHandle { + /** + * Fetches a fresh timeline page through the existing daemon RPC. If the daemon + * includes an agent snapshot in the response, the parent handle's `latest()` + * is updated to that snapshot. + */ + refetch(options?: PaseoAgentTimelineRefetchOptions): Promise; + /** + * Local listener for agent_stream events matching this handle id. It does not + * retain timeline entries or own application cache state. + */ + subscribe(handler: (event: PaseoAgentStream) => void): () => void; +} + +/** + * Agent handles follow the same identity/snapshot rule as workspace handles: + * `id` is stable, while `latest()` is only the newest snapshot observed by this + * handle through construction, `refetch()`, timeline refetch, archive, or local + * agent_update subscription. + */ +export interface PaseoAgentHandle { + readonly id: string; + readonly timeline: PaseoAgentTimelineHandle; + latest(): PaseoAgent | null; + refetch(requestId?: string): Promise; + send(text: string, options?: PaseoAgentSendOptions): Promise; + archive(): Promise<{ archivedAt: string }>; + subscribe(handler: (update: PaseoAgentUpdate) => void): () => void; +} + +export interface PaseoAgentActions { + ref(agent: string | PaseoAgent): PaseoAgentHandle; + create(options: PaseoAgentCreateOptions): Promise; + /** + * Local event subscription over the low-level driver's agent_update stream. + * The returned function only removes this SDK listener. + */ + subscribe(handler: PaseoAgentUpdateHandler): () => void; +} + +export interface PaseoProviderConfig extends PaseoProviderConfigInput { + provider: PaseoAgentProvider; +} +export type PaseoProviderFeatureValues = Record; + +export interface PaseoProviderConfigInput { + model?: string; + modeId?: string; + thinkingOptionId?: string; + featureValues?: PaseoProviderFeatureValues; +} + +export type PaseoProviderModelsResult = ListProviderModelsResponseMessage["payload"]; +export type PaseoProviderModesResult = ListProviderModesResponseMessage["payload"]; +export type PaseoProviderFeaturesInput = ListProviderFeaturesRequestMessage["draftConfig"]; +export type PaseoProviderFeaturesResult = ListProviderFeaturesResponseMessage["payload"]; +export type PaseoProviderAvailabilityResult = ListAvailableProvidersResponse["payload"]; +export type PaseoProviderSnapshotResult = GetProvidersSnapshotResponseMessage["payload"]; +export type PaseoProviderSnapshotUpdate = Extract< + SessionOutboundMessage, + { type: "providers_snapshot_update" } +>["payload"]; +export type PaseoProviderRefreshResult = RefreshProvidersSnapshotResponseMessage["payload"]; +export type PaseoProviderDiagnosticResult = ProviderDiagnosticResponseMessage["payload"]; + +export interface PaseoProviderListOptions { + cwd?: string; + requestId?: string; +} + +export interface PaseoProviderRefreshOptions { + cwd?: string; + providers?: PaseoAgentProvider[]; + requestId?: string; +} + +export interface PaseoProviderActions { + codex(input?: PaseoProviderConfigInput): PaseoProviderConfig; + claude(input?: PaseoProviderConfigInput): PaseoProviderConfig; + opencode(input?: PaseoProviderConfigInput): PaseoProviderConfig; + copilot(input?: PaseoProviderConfigInput): PaseoProviderConfig; + config(provider: PaseoAgentProvider, input?: PaseoProviderConfigInput): PaseoProviderConfig; + listModels( + provider: PaseoAgentProvider, + options?: PaseoProviderListOptions, + ): Promise; + listModes( + provider: PaseoAgentProvider, + options?: PaseoProviderListOptions, + ): Promise; + listFeatures( + draftConfig: PaseoProviderFeaturesInput, + options?: { requestId?: string }, + ): Promise; + listAvailable(options?: { requestId?: string }): Promise; + snapshot(options?: PaseoProviderListOptions): Promise; + refresh(options?: PaseoProviderRefreshOptions): Promise; + diagnostic( + provider: PaseoAgentProvider, + options?: { requestId?: string }, + ): Promise; + subscribe(handler: (update: PaseoProviderSnapshotUpdate) => void): () => void; +} + +export interface PaseoConfigActions { + /** + * Reads daemon config through the existing config RPC. Provider profiles, + * custom provider entries, keys/env, custom binaries, and provider enablement + * are currently config-file-shaped daemon state, so the SDK exposes this raw + * typed surface instead of pretending there are higher-level provider-settings + * RPCs. + */ + get(requestId?: string): Promise<{ requestId: string; config: MutableDaemonConfig }>; + /** + * Patches daemon config through the existing config RPC. The daemon validates + * and persists supported fields; unsupported provider/settings workflows remain + * daemon gaps until first-class RPCs exist. + */ + patch( + config: MutableDaemonConfigPatch, + requestId?: string, + ): Promise<{ requestId: string; config: MutableDaemonConfig }>; +} + +export interface PaseoClient { + readonly workspaces: PaseoWorkspaceActions; + readonly agents: PaseoAgentActions; + readonly providers: PaseoProviderActions; + readonly config: PaseoConfigActions; + connect(): Promise; + close(): Promise; + ensureConnected(): void; + getConnectionState(): ConnectionState; +} + +export function createPaseoClient(config: PaseoClientConfig): PaseoClient { + const daemonClient = new DaemonClient({ + ...config, + clientId: config.clientId ?? createGeneratedClientId(), + clientType: "cli", + }); + const createWorkspaceHandle = createWorkspaceHandleFactory(daemonClient); + const createAgentHandle = createAgentHandleFactory(daemonClient); + + return { + workspaces: { + list: (options) => daemonClient.fetchWorkspaces(options), + ref: (workspace) => createWorkspaceHandle(workspace), + open: (input, requestId) => + openWorkspace(daemonClient, createWorkspaceHandle, input, requestId), + create: (input, requestId) => + openWorkspace(daemonClient, createWorkspaceHandle, input, requestId), + archive: (workspace, requestId) => + daemonClient.archiveWorkspace(resolveWorkspaceId(workspace), requestId), + subscribe: (handler) => + daemonClient.on("workspace_update", (message) => { + handler(message.payload); + }), + }, + agents: { + ref: (agent) => createAgentHandle(agent), + create: async (options) => { + const agent = await daemonClient.createAgent(options); + return createAgentHandle(agent); + }, + subscribe: (handler) => + daemonClient.on("agent_update", (message) => { + handler(message.payload); + }), + }, + providers: { + codex: (input) => providerConfig("codex", input), + claude: (input) => providerConfig("claude", input), + opencode: (input) => providerConfig("opencode", input), + copilot: (input) => providerConfig("copilot", input), + config: (provider, input) => providerConfig(provider, input), + listModels: (provider, options) => daemonClient.listProviderModels(provider, options), + listModes: (provider, options) => daemonClient.listProviderModes(provider, options), + listFeatures: (draftConfig, options) => + daemonClient.listProviderFeatures(draftConfig, options), + listAvailable: (options) => daemonClient.listAvailableProviders(options), + snapshot: (options) => daemonClient.getProvidersSnapshot(options), + refresh: (options) => daemonClient.refreshProvidersSnapshot(options), + diagnostic: (provider, options) => daemonClient.getProviderDiagnostic(provider, options), + subscribe: (handler) => + daemonClient.on("providers_snapshot_update", (message) => { + handler(message.payload); + }), + }, + config: { + get: (requestId) => daemonClient.getDaemonConfig(requestId), + patch: (patch, requestId) => daemonClient.patchDaemonConfig(patch, requestId), + }, + connect: () => daemonClient.connect(), + close: () => daemonClient.close(), + ensureConnected: () => daemonClient.ensureConnected(), + getConnectionState: () => daemonClient.getConnectionState(), + }; +} + +type WorkspaceHandleFactory = (workspace: string | PaseoWorkspace) => PaseoWorkspaceHandle; +type AgentHandleFactory = (agent: string | PaseoAgent) => PaseoAgentHandle; + +function createWorkspaceHandleFactory(daemonClient: DaemonClient): WorkspaceHandleFactory { + return (workspace) => { + const id = typeof workspace === "string" ? workspace : workspace.id; + let latest = typeof workspace === "string" ? null : workspace; + + return { + id, + latest: () => latest, + refetch: async (options) => { + const result = await daemonClient.fetchWorkspaces({ + requestId: options?.requestId, + filter: { idPrefix: id }, + page: { limit: 25 }, + }); + latest = result.entries.find((entry) => entry.id === id) ?? null; + return latest; + }, + archive: async (requestId) => { + const result = await daemonClient.archiveWorkspace(id, requestId); + if (latest) { + latest = { ...latest, archivingAt: result.archivedAt }; + } + return result; + }, + subscribe: (handler) => + daemonClient.on("workspace_update", (message) => { + const update = message.payload; + if (update.kind === "upsert" && update.workspace.id === id) { + latest = update.workspace; + handler(update); + } + if (update.kind === "remove" && update.id === id) { + latest = null; + handler(update); + } + }), + }; + }; +} + +function createAgentHandleFactory(daemonClient: DaemonClient): AgentHandleFactory { + return (agent) => { + const id = typeof agent === "string" ? agent : agent.id; + let latest = typeof agent === "string" ? null : agent; + + const handle: PaseoAgentHandle = { + id, + timeline: { + refetch: async (options) => { + const result = await daemonClient.fetchAgentTimeline(id, options); + if (result.agent) { + latest = result.agent; + } + return result; + }, + subscribe: (handler) => + daemonClient.on("agent_stream", (message) => { + if (message.payload.agentId === id) { + handler(message.payload); + } + }), + }, + latest: () => latest, + refetch: async (requestId) => { + const result = await daemonClient.fetchAgent(id, requestId); + latest = result?.agent ?? null; + return result; + }, + send: (text, options) => daemonClient.sendAgentMessage(id, text, options), + archive: async () => { + const result = await daemonClient.archiveAgent(id); + if (latest) { + latest = { ...latest, archivedAt: result.archivedAt }; + } + return result; + }, + subscribe: (handler) => + daemonClient.on("agent_update", (message) => { + const update = message.payload; + if (update.kind === "upsert" && update.agent.id === id) { + latest = update.agent; + handler(update); + } + if (update.kind === "remove" && update.agentId === id) { + latest = null; + handler(update); + } + }), + }; + + return handle; + }; +} + +async function openWorkspace( + daemonClient: DaemonClient, + createWorkspaceHandle: WorkspaceHandleFactory, + input: string | PaseoWorkspaceOpenOptions, + requestId?: string, +): Promise { + const options = typeof input === "string" ? { cwd: input, requestId } : input; + const result = await daemonClient.openProject(options.cwd, options.requestId); + return { + ...result, + workspace: result.workspace ? createWorkspaceHandle(result.workspace) : null, + }; +} + +function resolveWorkspaceId(workspace: string | PaseoWorkspaceHandle): string { + return typeof workspace === "string" ? workspace : workspace.id; +} + +function providerConfig( + provider: PaseoAgentProvider, + input: PaseoProviderConfigInput = {}, +): PaseoProviderConfig { + return { + provider, + ...(input.model !== undefined ? { model: input.model } : {}), + ...(input.modeId !== undefined ? { modeId: input.modeId } : {}), + ...(input.thinkingOptionId !== undefined ? { thinkingOptionId: input.thinkingOptionId } : {}), + ...(input.featureValues !== undefined ? { featureValues: input.featureValues } : {}), + }; +} + +function createGeneratedClientId(): string { + const randomId = + typeof globalThis.crypto?.randomUUID === "function" + ? globalThis.crypto.randomUUID() + : Math.random().toString(36).slice(2); + return `paseo-sdk-${randomId}`; +} diff --git a/packages/server/src/client/terminal-stream-router.test.ts b/packages/client/src/terminal-stream-router.test.ts similarity index 90% rename from packages/server/src/client/terminal-stream-router.test.ts rename to packages/client/src/terminal-stream-router.test.ts index e8f077ca1..f4a6c294c 100644 --- a/packages/server/src/client/terminal-stream-router.test.ts +++ b/packages/client/src/terminal-stream-router.test.ts @@ -1,6 +1,6 @@ +import { TerminalStreamOpcode } from "@getpaseo/protocol/binary-frames/index"; import { describe, expect, test } from "vitest"; -import { TerminalStreamOpcode } from "../shared/binary-frames/index.js"; import { TerminalStreamRouter, type TerminalStreamEvent } from "./terminal-stream-router.js"; describe("terminal-stream-router", () => { diff --git a/packages/server/src/client/terminal-stream-router.ts b/packages/client/src/terminal-stream-router.ts similarity index 96% rename from packages/server/src/client/terminal-stream-router.ts rename to packages/client/src/terminal-stream-router.ts index 1f2b99d1c..4b0e8395c 100644 --- a/packages/server/src/client/terminal-stream-router.ts +++ b/packages/client/src/terminal-stream-router.ts @@ -4,8 +4,8 @@ import { encodeTerminalStreamFrame, TerminalStreamOpcode, type TerminalStreamFrame, -} from "../shared/binary-frames/index.js"; -import type { TerminalInput, TerminalState } from "../shared/messages.js"; +} from "@getpaseo/protocol/binary-frames/index"; +import type { TerminalInput, TerminalState } from "@getpaseo/protocol/messages"; export type TerminalStreamEvent = | { terminalId: string; type: "output"; data: Uint8Array } diff --git a/packages/client/tsconfig.examples.json b/packages/client/tsconfig.examples.json new file mode 100644 index 000000000..32f76cefd --- /dev/null +++ b/packages/client/tsconfig.examples.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": true + }, + "include": ["examples/**/*.ts"] +} diff --git a/packages/client/tsconfig.json b/packages/client/tsconfig.json new file mode 100644 index 000000000..b5cdae2f2 --- /dev/null +++ b/packages/client/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "lib": ["ES2023", "DOM"], + "types": ["node"], + "skipLibCheck": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "outDir": "./dist", + "rootDir": "./src", + "declaration": true, + "declarationMap": true, + "sourceMap": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "src/**/*.test.ts"] +} diff --git a/packages/desktop/package.json b/packages/desktop/package.json index 95a6a4c38..5a6c69cf3 100644 --- a/packages/desktop/package.json +++ b/packages/desktop/package.json @@ -15,7 +15,7 @@ }, "main": "dist/main.js", "scripts": { - "build": "npm --prefix ../.. run build:daemon && npm run build:main && electron-builder --config electron-builder.yml", + "build": "npm --prefix ../.. run build:server && npm run build:main && electron-builder --config electron-builder.yml", "build:main": "tsc -p tsconfig.json", "dev": "./scripts/dev.sh", "dev:win": "powershell ./scripts/dev.ps1", diff --git a/packages/protocol/README.md b/packages/protocol/README.md new file mode 100644 index 000000000..cb1f722c3 --- /dev/null +++ b/packages/protocol/README.md @@ -0,0 +1,12 @@ +# @getpaseo/protocol + +Shared Paseo protocol schemas, codecs, and wire types. + +## Stability + +This package is public so Paseo's published packages can depend on it cleanly. +It is not a stable public API yet. + +Schemas, exports, wire helpers, and types may change or disappear in any release +without advance notice. Use it outside Paseo at your own risk until the package +is explicitly documented as stable. diff --git a/packages/protocol/package.json b/packages/protocol/package.json new file mode 100644 index 000000000..73a2140b9 --- /dev/null +++ b/packages/protocol/package.json @@ -0,0 +1,33 @@ +{ + "name": "@getpaseo/protocol", + "version": "0.1.83", + "description": "Paseo shared protocol schemas and wire types", + "files": [ + "dist", + "README.md" + ], + "type": "module", + "exports": { + "./*": { + "types": "./dist/*.d.ts", + "default": "./dist/*.js" + } + }, + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "node -e \"require('node:fs').rmSync('dist',{ recursive: true, force: true })\" && tsc -p tsconfig.json --incremental false", + "prepack": "npm run build", + "typecheck": "tsgo --noEmit", + "test": "vitest run" + }, + "dependencies": { + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/node": "^20.9.0", + "typescript": "^5.2.2", + "vitest": "^4.1.6" + } +} diff --git a/packages/server/src/shared/agent-attention-notification.test.ts b/packages/protocol/src/agent-attention-notification.test.ts similarity index 100% rename from packages/server/src/shared/agent-attention-notification.test.ts rename to packages/protocol/src/agent-attention-notification.test.ts diff --git a/packages/server/src/shared/agent-attention-notification.ts b/packages/protocol/src/agent-attention-notification.ts similarity index 100% rename from packages/server/src/shared/agent-attention-notification.ts rename to packages/protocol/src/agent-attention-notification.ts diff --git a/packages/server/src/shared/agent-feature-schemas.test.ts b/packages/protocol/src/agent-feature-schemas.test.ts similarity index 100% rename from packages/server/src/shared/agent-feature-schemas.test.ts rename to packages/protocol/src/agent-feature-schemas.test.ts diff --git a/packages/server/src/shared/agent-labels.ts b/packages/protocol/src/agent-labels.ts similarity index 100% rename from packages/server/src/shared/agent-labels.ts rename to packages/protocol/src/agent-labels.ts diff --git a/packages/server/src/shared/agent-lifecycle.ts b/packages/protocol/src/agent-lifecycle.ts similarity index 100% rename from packages/server/src/shared/agent-lifecycle.ts rename to packages/protocol/src/agent-lifecycle.ts diff --git a/packages/server/src/shared/agent-state-bucket.test.ts b/packages/protocol/src/agent-state-bucket.test.ts similarity index 100% rename from packages/server/src/shared/agent-state-bucket.test.ts rename to packages/protocol/src/agent-state-bucket.test.ts diff --git a/packages/server/src/shared/agent-state-bucket.ts b/packages/protocol/src/agent-state-bucket.ts similarity index 100% rename from packages/server/src/shared/agent-state-bucket.ts rename to packages/protocol/src/agent-state-bucket.ts diff --git a/packages/server/src/server/agent/agent-title-limits.ts b/packages/protocol/src/agent-title-limits.ts similarity index 100% rename from packages/server/src/server/agent/agent-title-limits.ts rename to packages/protocol/src/agent-title-limits.ts diff --git a/packages/protocol/src/agent-types.ts b/packages/protocol/src/agent-types.ts new file mode 100644 index 000000000..7a1f9c04b --- /dev/null +++ b/packages/protocol/src/agent-types.ts @@ -0,0 +1,466 @@ +import type { AgentAttachment } from "./messages.js"; + +export type AgentProvider = string; + +export interface AgentMetadata { + [key: string]: unknown; +} + +/** + * Stdio-based MCP server (spawns a subprocess). + */ +export interface McpStdioServerConfig { + type: "stdio"; + command: string; + args?: string[]; + env?: Record; +} + +/** + * HTTP-based MCP server. + */ +export interface McpHttpServerConfig { + type: "http"; + url: string; + headers?: Record; +} + +/** + * SSE-based MCP server (Server-Sent Events over HTTP). + */ +export interface McpSseServerConfig { + type: "sse"; + url: string; + headers?: Record; +} + +/** + * Canonical MCP server configuration. + * Discriminated union by `type` field. + * Each provider normalizes this to their expected format. + */ +export type McpServerConfig = McpStdioServerConfig | McpHttpServerConfig | McpSseServerConfig; + +export interface AgentMode { + id: string; + label: string; + description?: string; + icon?: string; + colorTier?: string; +} + +export type ProviderStatus = "ready" | "loading" | "error" | "unavailable"; + +export interface AgentModelDefinition { + provider: AgentProvider; + id: string; + label: string; + description?: string; + isDefault?: boolean; + metadata?: AgentMetadata; + thinkingOptions?: AgentSelectOption[]; + defaultThinkingOptionId?: string; +} + +export interface AgentSelectOption { + id: string; + label: string; + description?: string; + isDefault?: boolean; + metadata?: AgentMetadata; +} + +export function normalizeAgentModelDefinition(model: AgentModelDefinition): AgentModelDefinition { + const defaultThinkingOptionId = + model.defaultThinkingOptionId ?? model.thinkingOptions?.find((option) => option.isDefault)?.id; + if (!defaultThinkingOptionId || defaultThinkingOptionId === model.defaultThinkingOptionId) { + return model; + } + return { ...model, defaultThinkingOptionId }; +} + +export interface ProviderSnapshotEntry { + provider: AgentProvider; + status: ProviderStatus; + enabled: boolean; + error?: string; + models?: AgentModelDefinition[]; + modes?: AgentMode[]; + fetchedAt?: string; + label?: string; + description?: string; + defaultModeId?: string | null; +} + +export interface AgentFeatureToggle { + type: "toggle"; + id: string; + label: string; + description?: string; + tooltip?: string; + icon?: string; + value: boolean; +} + +export interface AgentFeatureSelect { + type: "select"; + id: string; + label: string; + description?: string; + tooltip?: string; + icon?: string; + value: string | null; + options: AgentSelectOption[]; +} + +export type AgentFeature = AgentFeatureToggle | AgentFeatureSelect; + +export interface AgentCapabilityFlags { + supportsStreaming: boolean; + supportsSessionPersistence: boolean; + supportsDynamicModes: boolean; + supportsMcpServers: boolean; + supportsReasoningStream: boolean; + supportsToolInvocations: boolean; + supportsRewindConversation?: boolean; + supportsRewindFiles?: boolean; + supportsRewindBoth?: boolean; +} + +export interface AgentPersistenceHandle { + provider: AgentProvider; + sessionId: string; + /** Provider specific handle (Codex thread id, Claude resume token, etc). */ + nativeHandle?: string; + metadata?: AgentMetadata; +} + +export type AgentPromptContentBlock = + | { type: "text"; text: string } + | { type: "image"; data: string; mimeType: string } + | AgentAttachment; + +export type AgentPromptInput = string | AgentPromptContentBlock[]; + +export interface AgentRunOptions { + outputSchema?: unknown; + resumeFrom?: AgentPersistenceHandle; + maxThinkingTokens?: number; +} + +export interface AgentUsage { + inputTokens?: number; + cachedInputTokens?: number; + outputTokens?: number; + totalCostUsd?: number; + contextWindowMaxTokens?: number; + contextWindowUsedTokens?: number; +} + +export const TOOL_CALL_ICON_NAMES = [ + "wrench", + "square_terminal", + "eye", + "pencil", + "search", + "bot", + "sparkles", + "brain", + "mic_vocal", +] as const; + +export type ToolCallIconName = (typeof TOOL_CALL_ICON_NAMES)[number]; + +export type ToolCallDetail = + | { + type: "shell"; + command: string; + cwd?: string; + output?: string; + exitCode?: number | null; + } + | { + type: "read"; + filePath: string; + content?: string; + offset?: number; + limit?: number; + } + | { + type: "edit"; + filePath: string; + oldString?: string; + newString?: string; + unifiedDiff?: string; + } + | { + type: "write"; + filePath: string; + content?: string; + } + | { + type: "search"; + query: string; + toolName?: "search" | "grep" | "glob" | "web_search"; + content?: string; + filePaths?: string[]; + webResults?: Array<{ + title: string; + url: string; + }>; + annotations?: string[]; + numFiles?: number; + numMatches?: number; + durationMs?: number; + durationSeconds?: number; + truncated?: boolean; + mode?: "content" | "files_with_matches" | "count"; + } + | { + type: "fetch"; + url: string; + prompt?: string; + result?: string; + code?: number; + codeText?: string; + bytes?: number; + durationMs?: number; + } + | { + type: "worktree_setup"; + worktreePath: string; + branchName: string; + log: string; + commands: Array<{ + index: number; + command: string; + cwd: string; + log: string; + status: "running" | "completed" | "failed"; + exitCode: number | null; + durationMs?: number; + }>; + truncated?: boolean; + } + | { + type: "sub_agent"; + subAgentType?: string; + description?: string; + childSessionId?: string; + log: string; + actions?: Array<{ + index: number; + toolName: string; + summary?: string; + }>; + } + | { + type: "plain_text"; + label?: string; + text?: string; + icon?: ToolCallIconName; + } + | { + type: "plan"; + text: string; + } + | { + type: "unknown"; + input: unknown; + output: unknown; + }; + +interface ToolCallBase { + [key: string]: unknown; + type: "tool_call"; + callId: string; + name: string; + detail: ToolCallDetail; + metadata?: Record; +} + +type ToolCallRunningTimelineItem = ToolCallBase & { + status: "running"; + error: null; +}; + +type ToolCallCompletedTimelineItem = ToolCallBase & { + status: "completed"; + error: null; +}; + +type ToolCallFailedTimelineItem = ToolCallBase & { + status: "failed"; + error: unknown; +}; + +type ToolCallCanceledTimelineItem = ToolCallBase & { + status: "canceled"; + error: null; +}; + +export type ToolCallTimelineItem = + | ToolCallRunningTimelineItem + | ToolCallCompletedTimelineItem + | ToolCallFailedTimelineItem + | ToolCallCanceledTimelineItem; + +export interface CompactionTimelineItem { + [key: string]: unknown; + type: "compaction"; + status: "loading" | "completed"; + trigger?: "auto" | "manual"; + preTokens?: number; +} + +export type AgentTimelineItem = + | { type: "user_message"; text: string; messageId?: string } + | { type: "assistant_message"; text: string; messageId?: string } + | { type: "reasoning"; text: string } + | ToolCallTimelineItem + | { type: "todo"; items: { text: string; completed: boolean }[] } + | { type: "error"; message: string } + | CompactionTimelineItem; + +export type AgentStreamEvent = + | { type: "thread_started"; sessionId: string; provider: AgentProvider } + | { type: "turn_started"; provider: AgentProvider; turnId?: string } + | { type: "turn_completed"; provider: AgentProvider; usage?: AgentUsage; turnId?: string } + | { type: "usage_updated"; provider: AgentProvider; usage: AgentUsage; turnId?: string } + | { + type: "mode_changed"; + provider: AgentProvider; + currentModeId: string | null; + availableModes: AgentMode[]; + } + | { type: "model_changed"; provider: AgentProvider; runtimeInfo: AgentRuntimeInfo } + | { + type: "thinking_option_changed"; + provider: AgentProvider; + thinkingOptionId: string | null; + } + | { + type: "turn_failed"; + provider: AgentProvider; + error: string; + code?: string; + diagnostic?: string; + turnId?: string; + } + | { type: "turn_canceled"; provider: AgentProvider; reason: string; turnId?: string } + | { + type: "timeline"; + item: AgentTimelineItem; + provider: AgentProvider; + turnId?: string; + timestamp?: string; + } + | { + type: "permission_requested"; + provider: AgentProvider; + request: AgentPermissionRequest; + turnId?: string; + } + | { + type: "permission_resolved"; + provider: AgentProvider; + requestId: string; + resolution: AgentPermissionResponse; + turnId?: string; + } + | { + type: "attention_required"; + provider: AgentProvider; + reason: "finished" | "error" | "permission"; + timestamp: string; + }; + +export function getAgentStreamEventTurnId(event: AgentStreamEvent): string | undefined { + return "turnId" in event ? event.turnId : undefined; +} + +export type AgentPermissionRequestKind = "tool" | "plan" | "question" | "mode" | "other"; + +export type AgentPermissionUpdate = AgentMetadata; + +export interface AgentPermissionAction { + id: string; + label: string; + behavior: "allow" | "deny"; + variant?: "primary" | "secondary" | "danger"; + intent?: "implement" | "implement_resume" | "dismiss"; +} + +export interface AgentPermissionRequest { + id: string; + provider: AgentProvider; + name: string; + kind: AgentPermissionRequestKind; + title?: string; + description?: string; + input?: AgentMetadata; + detail?: ToolCallDetail; + suggestions?: AgentPermissionUpdate[]; + actions?: AgentPermissionAction[]; + metadata?: AgentMetadata; +} + +export type AgentPermissionResponse = + | { + behavior: "allow"; + selectedActionId?: string; + updatedInput?: AgentMetadata; + updatedPermissions?: AgentPermissionUpdate[]; + } + | { + behavior: "deny"; + selectedActionId?: string; + message?: string; + interrupt?: boolean; + }; + +export interface AgentRunResult { + sessionId: string; + finalText: string; + usage?: AgentUsage; + timeline: AgentTimelineItem[]; + canceled?: boolean; +} + +export interface AgentSessionConfig { + provider: AgentProvider; + cwd: string; + /** + * Provider-agnostic system/developer instruction string. + * Mapped by each provider to its native instruction field. + */ + systemPrompt?: string; + modeId?: string; + model?: string; + thinkingOptionId?: string; + featureValues?: Record; + title?: string | null; + approvalPolicy?: string; + sandboxMode?: string; + networkAccess?: boolean; + webSearch?: boolean; + extra?: { + codex?: AgentMetadata; + claude?: AgentMetadata; + }; + mcpServers?: Record; + /** + * Internal agents are hidden from listings and don't trigger notifications. + * They are used for ephemeral system tasks like commit/PR generation. + */ + internal?: boolean; +} + +export interface AgentRuntimeInfo { + provider: AgentProvider; + sessionId: string | null; + model?: string | null; + thinkingOptionId?: string | null; + modeId?: string | null; + extra?: AgentMetadata; +} diff --git a/packages/server/src/shared/binary-frames/file-transfer.test.ts b/packages/protocol/src/binary-frames/file-transfer.test.ts similarity index 100% rename from packages/server/src/shared/binary-frames/file-transfer.test.ts rename to packages/protocol/src/binary-frames/file-transfer.test.ts diff --git a/packages/server/src/shared/binary-frames/file-transfer.ts b/packages/protocol/src/binary-frames/file-transfer.ts similarity index 100% rename from packages/server/src/shared/binary-frames/file-transfer.ts rename to packages/protocol/src/binary-frames/file-transfer.ts diff --git a/packages/server/src/shared/binary-frames/index.ts b/packages/protocol/src/binary-frames/index.ts similarity index 100% rename from packages/server/src/shared/binary-frames/index.ts rename to packages/protocol/src/binary-frames/index.ts diff --git a/packages/server/src/shared/binary-frames/terminal.test.ts b/packages/protocol/src/binary-frames/terminal.test.ts similarity index 100% rename from packages/server/src/shared/binary-frames/terminal.test.ts rename to packages/protocol/src/binary-frames/terminal.test.ts diff --git a/packages/server/src/shared/binary-frames/terminal.ts b/packages/protocol/src/binary-frames/terminal.ts similarity index 100% rename from packages/server/src/shared/binary-frames/terminal.ts rename to packages/protocol/src/binary-frames/terminal.ts diff --git a/packages/server/src/server/chat/chat-rpc-schemas.ts b/packages/protocol/src/chat/rpc-schemas.ts similarity index 97% rename from packages/server/src/server/chat/chat-rpc-schemas.ts rename to packages/protocol/src/chat/rpc-schemas.ts index 22a42f84f..b3520f4c5 100644 --- a/packages/server/src/server/chat/chat-rpc-schemas.ts +++ b/packages/protocol/src/chat/rpc-schemas.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -import { ChatMessageSchema, ChatRoomDetailSchema } from "./chat-types.js"; +import { ChatMessageSchema, ChatRoomDetailSchema } from "./types.js"; export const ChatCreateRequestSchema = z.object({ type: z.literal("chat/create"), diff --git a/packages/server/src/server/chat/chat-types.ts b/packages/protocol/src/chat/types.ts similarity index 100% rename from packages/server/src/server/chat/chat-types.ts rename to packages/protocol/src/chat/types.ts diff --git a/packages/server/src/shared/client-capabilities.ts b/packages/protocol/src/client-capabilities.ts similarity index 100% rename from packages/server/src/shared/client-capabilities.ts rename to packages/protocol/src/client-capabilities.ts diff --git a/packages/server/src/shared/connection-offer.test.ts b/packages/protocol/src/connection-offer.test.ts similarity index 100% rename from packages/server/src/shared/connection-offer.test.ts rename to packages/protocol/src/connection-offer.test.ts diff --git a/packages/server/src/shared/connection-offer.ts b/packages/protocol/src/connection-offer.ts similarity index 100% rename from packages/server/src/shared/connection-offer.ts rename to packages/protocol/src/connection-offer.ts diff --git a/packages/server/src/shared/daemon-endpoints.test.ts b/packages/protocol/src/daemon-endpoints.test.ts similarity index 100% rename from packages/server/src/shared/daemon-endpoints.test.ts rename to packages/protocol/src/daemon-endpoints.test.ts diff --git a/packages/server/src/shared/daemon-endpoints.ts b/packages/protocol/src/daemon-endpoints.ts similarity index 100% rename from packages/server/src/shared/daemon-endpoints.ts rename to packages/protocol/src/daemon-endpoints.ts diff --git a/packages/server/src/shared/error-utils.ts b/packages/protocol/src/error-utils.ts similarity index 100% rename from packages/server/src/shared/error-utils.ts rename to packages/protocol/src/error-utils.ts diff --git a/packages/server/src/shared/git-remote.ts b/packages/protocol/src/git-remote.ts similarity index 100% rename from packages/server/src/shared/git-remote.ts rename to packages/protocol/src/git-remote.ts diff --git a/packages/server/src/shared/host-connection-schema.ts b/packages/protocol/src/host-connection-schema.ts similarity index 100% rename from packages/server/src/shared/host-connection-schema.ts rename to packages/protocol/src/host-connection-schema.ts diff --git a/packages/server/src/shared/importable-providers.ts b/packages/protocol/src/importable-providers.ts similarity index 100% rename from packages/server/src/shared/importable-providers.ts rename to packages/protocol/src/importable-providers.ts diff --git a/packages/server/src/shared/literal-union.ts b/packages/protocol/src/literal-union.ts similarity index 100% rename from packages/server/src/shared/literal-union.ts rename to packages/protocol/src/literal-union.ts diff --git a/packages/server/src/server/loop/rpc-schemas.ts b/packages/protocol/src/loop/rpc-schemas.ts similarity index 98% rename from packages/server/src/server/loop/rpc-schemas.ts rename to packages/protocol/src/loop/rpc-schemas.ts index f4e392373..e5305cf61 100644 --- a/packages/server/src/server/loop/rpc-schemas.ts +++ b/packages/protocol/src/loop/rpc-schemas.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -import { AgentProviderSchema } from "../agent/provider-manifest.js"; +import { AgentProviderSchema } from "@getpaseo/protocol/provider-manifest"; export const LoopLogEntrySchema = z.object({ seq: z.number().int().positive(), diff --git a/packages/server/src/shared/messages.attachments.test.ts b/packages/protocol/src/messages.attachments.test.ts similarity index 100% rename from packages/server/src/shared/messages.attachments.test.ts rename to packages/protocol/src/messages.attachments.test.ts diff --git a/packages/server/src/shared/messages.checkout-pr-schema.test.ts b/packages/protocol/src/messages.checkout-pr-schema.test.ts similarity index 100% rename from packages/server/src/shared/messages.checkout-pr-schema.test.ts rename to packages/protocol/src/messages.checkout-pr-schema.test.ts diff --git a/packages/server/src/shared/messages.create-agent-client-message-id.test.ts b/packages/protocol/src/messages.create-agent-client-message-id.test.ts similarity index 95% rename from packages/server/src/shared/messages.create-agent-client-message-id.test.ts rename to packages/protocol/src/messages.create-agent-client-message-id.test.ts index 015c2f5c3..05447bc2d 100644 --- a/packages/server/src/shared/messages.create-agent-client-message-id.test.ts +++ b/packages/protocol/src/messages.create-agent-client-message-id.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; import { SessionInboundMessageSchema } from "./messages"; -import { MAX_EXPLICIT_AGENT_TITLE_CHARS } from "../server/agent/agent-title-limits.js"; +import { MAX_EXPLICIT_AGENT_TITLE_CHARS } from "@getpaseo/protocol/agent-title-limits"; describe("create_agent_request clientMessageId", () => { it("accepts clientMessageId for stable initial prompt transfer", () => { diff --git a/packages/server/src/shared/messages.create-agent-worktree-autoarchive.test.ts b/packages/protocol/src/messages.create-agent-worktree-autoarchive.test.ts similarity index 100% rename from packages/server/src/shared/messages.create-agent-worktree-autoarchive.test.ts rename to packages/protocol/src/messages.create-agent-worktree-autoarchive.test.ts diff --git a/packages/server/src/shared/messages.list-commands.test.ts b/packages/protocol/src/messages.list-commands.test.ts similarity index 100% rename from packages/server/src/shared/messages.list-commands.test.ts rename to packages/protocol/src/messages.list-commands.test.ts diff --git a/packages/server/src/shared/messages.providers-snapshot.test.ts b/packages/protocol/src/messages.providers-snapshot.test.ts similarity index 100% rename from packages/server/src/shared/messages.providers-snapshot.test.ts rename to packages/protocol/src/messages.providers-snapshot.test.ts diff --git a/packages/server/src/shared/messages.pull-request-timeline.test.ts b/packages/protocol/src/messages.pull-request-timeline.test.ts similarity index 100% rename from packages/server/src/shared/messages.pull-request-timeline.test.ts rename to packages/protocol/src/messages.pull-request-timeline.test.ts diff --git a/packages/server/src/shared/messages.rename-entities.test.ts b/packages/protocol/src/messages.rename-entities.test.ts similarity index 100% rename from packages/server/src/shared/messages.rename-entities.test.ts rename to packages/protocol/src/messages.rename-entities.test.ts diff --git a/packages/server/src/shared/messages.stream-parsing.test.ts b/packages/protocol/src/messages.stream-parsing.test.ts similarity index 100% rename from packages/server/src/shared/messages.stream-parsing.test.ts rename to packages/protocol/src/messages.stream-parsing.test.ts diff --git a/packages/server/src/shared/messages.terminal-restore.test.ts b/packages/protocol/src/messages.terminal-restore.test.ts similarity index 100% rename from packages/server/src/shared/messages.terminal-restore.test.ts rename to packages/protocol/src/messages.terminal-restore.test.ts diff --git a/packages/server/src/shared/messages.test.ts b/packages/protocol/src/messages.test.ts similarity index 100% rename from packages/server/src/shared/messages.test.ts rename to packages/protocol/src/messages.test.ts diff --git a/packages/server/src/shared/messages.tool-call-schema.test.ts b/packages/protocol/src/messages.tool-call-schema.test.ts similarity index 100% rename from packages/server/src/shared/messages.tool-call-schema.test.ts rename to packages/protocol/src/messages.tool-call-schema.test.ts diff --git a/packages/server/src/shared/messages.ts b/packages/protocol/src/messages.ts similarity index 99% rename from packages/server/src/shared/messages.ts rename to packages/protocol/src/messages.ts index 41c37e334..4dac9cfdc 100644 --- a/packages/server/src/shared/messages.ts +++ b/packages/protocol/src/messages.ts @@ -1,12 +1,9 @@ import { z } from "zod"; import { CLIENT_CAPS } from "./client-capabilities.js"; import { AGENT_LIFECYCLE_STATUSES } from "./agent-lifecycle.js"; -import { MAX_EXPLICIT_AGENT_TITLE_CHARS } from "../server/agent/agent-title-limits.js"; -import { AgentProviderSchema } from "../server/agent/provider-manifest.js"; -import { - normalizeAgentModelDefinition, - TOOL_CALL_ICON_NAMES, -} from "../server/agent/agent-sdk-types.js"; +import { MAX_EXPLICIT_AGENT_TITLE_CHARS } from "@getpaseo/protocol/agent-title-limits"; +import { AgentProviderSchema } from "@getpaseo/protocol/provider-manifest"; +import { normalizeAgentModelDefinition, TOOL_CALL_ICON_NAMES } from "./agent-types.js"; import { ChatCreateRequestSchema, ChatListRequestSchema, @@ -22,7 +19,7 @@ import { ChatPostResponseSchema, ChatReadResponseSchema, ChatWaitResponseSchema, -} from "../server/chat/chat-rpc-schemas.js"; +} from "./chat/rpc-schemas.js"; import { ScheduleCreateRequestSchema, ScheduleListRequestSchema, @@ -42,7 +39,7 @@ import { ScheduleDeleteResponseSchema, ScheduleRunOnceResponseSchema, ScheduleUpdateResponseSchema, -} from "../server/schedule/rpc-schemas.js"; +} from "@getpaseo/protocol/schedule/rpc-schemas"; import { LoopRunRequestSchema, LoopListRequestSchema, @@ -54,7 +51,7 @@ import { LoopInspectResponseSchema, LoopLogsResponseSchema, LoopStopResponseSchema, -} from "../server/loop/rpc-schemas.js"; +} from "@getpaseo/protocol/loop/rpc-schemas"; import { PaseoConfigRawSchema, PaseoLifecycleCommandRawSchema, @@ -70,7 +67,7 @@ import { type PaseoMetadataGenerationEntry, type PaseoScriptEntryRaw, type ProjectConfigRpcError, -} from "../utils/paseo-config-schema.js"; +} from "@getpaseo/protocol/paseo-config-schema"; export { PaseoConfigRawSchema, PaseoLifecycleCommandRawSchema, @@ -146,7 +143,7 @@ import type { ToolCallDetail, ToolCallTimelineItem, AgentUsage, -} from "../server/agent/agent-sdk-types.js"; +} from "./agent-types.js"; export const AgentStatusSchema = z.enum(AGENT_LIFECYCLE_STATUSES); diff --git a/packages/server/src/shared/messages.workspaces.test.ts b/packages/protocol/src/messages.workspaces.test.ts similarity index 100% rename from packages/server/src/shared/messages.workspaces.test.ts rename to packages/protocol/src/messages.workspaces.test.ts diff --git a/packages/server/src/utils/paseo-config-schema.test.ts b/packages/protocol/src/paseo-config-schema.test.ts similarity index 97% rename from packages/server/src/utils/paseo-config-schema.test.ts rename to packages/protocol/src/paseo-config-schema.test.ts index 6d9d22c53..49d5dd016 100644 --- a/packages/server/src/utils/paseo-config-schema.test.ts +++ b/packages/protocol/src/paseo-config-schema.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { PaseoConfigRawSchema, PaseoConfigSchema } from "./paseo-config-schema.js"; +import { PaseoConfigRawSchema, PaseoConfigSchema } from "@getpaseo/protocol/paseo-config-schema"; describe("paseo config schema", () => { it("parses an empty config without metadata generation", () => { diff --git a/packages/server/src/utils/paseo-config-schema.ts b/packages/protocol/src/paseo-config-schema.ts similarity index 100% rename from packages/server/src/utils/paseo-config-schema.ts rename to packages/protocol/src/paseo-config-schema.ts diff --git a/packages/server/src/shared/path-utils.ts b/packages/protocol/src/path-utils.ts similarity index 100% rename from packages/server/src/shared/path-utils.ts rename to packages/protocol/src/path-utils.ts diff --git a/packages/protocol/src/provider-config.ts b/packages/protocol/src/provider-config.ts new file mode 100644 index 000000000..8da64d10d --- /dev/null +++ b/packages/protocol/src/provider-config.ts @@ -0,0 +1,148 @@ +import { z } from "zod"; +import type { AgentProvider } from "./agent-types.js"; +import { AgentProviderSchema } from "./provider-manifest.js"; + +const ProviderCommandDefaultSchema = z + .object({ + mode: z.literal("default"), + }) + .strict(); + +const ProviderCommandAppendSchema = z + .object({ + mode: z.literal("append"), + args: z.array(z.string()).optional(), + }) + .strict(); + +const ProviderCommandReplaceSchema = z + .object({ + mode: z.literal("replace"), + argv: z.array(z.string().min(1)).min(1), + }) + .strict(); + +export const ProviderCommandSchema = z.discriminatedUnion("mode", [ + ProviderCommandDefaultSchema, + ProviderCommandAppendSchema, + ProviderCommandReplaceSchema, +]); + +export const ProviderRuntimeSettingsSchema = z + .object({ + command: ProviderCommandSchema.optional(), + env: z.record(z.string()).optional(), + disallowedTools: z.array(z.string()).optional(), + }) + .strict(); + +const ProviderProfileThinkingOptionSchema = z + .object({ + id: z.string(), + label: z.string(), + description: z.string().optional(), + isDefault: z.boolean().optional(), + }) + .strict(); + +export const ProviderProfileModelSchema = z + .object({ + id: z.string().min(1), + label: z.string().min(1), + description: z.string().optional(), + isDefault: z.boolean().optional(), + thinkingOptions: z.array(ProviderProfileThinkingOptionSchema).optional(), + }) + .strict(); + +export const ProviderOverrideSchema = z + .object({ + extends: z.string().optional(), + label: z.string().optional(), + description: z.string().optional(), + command: z.array(z.string().min(1)).min(1).optional(), + env: z.record(z.string()).optional(), + models: z.array(ProviderProfileModelSchema).optional(), + additionalModels: z.array(ProviderProfileModelSchema).optional(), + disallowedTools: z.array(z.string()).optional(), + enabled: z.boolean().optional(), + order: z.number().optional(), + }) + .strict(); + +const BUILTIN_PROVIDER_IDS = ["claude", "codex", "copilot", "opencode", "pi"] as const; +const PROVIDER_ID_PATTERN = /^[a-z][a-z0-9-]*$/; + +export const ProviderOverridesSchema = z + .record(ProviderOverrideSchema) + .superRefine((providers, ctx) => { + const builtinProviderIdSet = new Set(BUILTIN_PROVIDER_IDS); + const validExtendsValues = new Set([...BUILTIN_PROVIDER_IDS, "acp"]); + + for (const [providerId, provider] of Object.entries(providers)) { + if (!PROVIDER_ID_PATTERN.test(providerId)) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + path: [providerId], + message: `Provider ID "${providerId}" must match ${PROVIDER_ID_PATTERN}.`, + }); + } + + const isBuiltinProvider = builtinProviderIdSet.has(providerId); + if (!isBuiltinProvider && !provider.extends) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + path: [providerId, "extends"], + message: `Custom provider "${providerId}" must declare extends.`, + }); + } + + if (!isBuiltinProvider && !provider.label) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + path: [providerId, "label"], + message: `Custom provider "${providerId}" must declare label.`, + }); + } + + if (provider.extends && !validExtendsValues.has(provider.extends)) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + path: [providerId, "extends"], + message: `Provider "${providerId}" extends unknown provider "${provider.extends}".`, + }); + } + + if (provider.extends === "acp" && !provider.command) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + path: [providerId, "command"], + message: `Provider "${providerId}" extending "acp" must declare command.`, + }); + } + } + }); + +export const AgentProviderRuntimeSettingsMapSchema = z + .record(ProviderRuntimeSettingsSchema) + .superRefine((providers, ctx) => { + for (const providerId of Object.keys(providers)) { + const parsedProviderId = AgentProviderSchema.safeParse(providerId); + if (!parsedProviderId.success) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + path: [providerId], + message: `Invalid agent provider "${providerId}".`, + }); + } + } + }); + +export type ProviderCommand = z.infer; +export type ProviderRuntimeSettings = z.infer; +export type ProviderProfileModel = z.infer; +export type ProviderOverride = z.infer; +export type ProviderOverrides = z.infer; +export type AgentProviderRuntimeSettingsMap = Partial< + Record +>; diff --git a/packages/server/src/server/agent/provider-manifest.ts b/packages/protocol/src/provider-manifest.ts similarity index 99% rename from packages/server/src/server/agent/provider-manifest.ts rename to packages/protocol/src/provider-manifest.ts index 861fd5eb1..72d03d9a6 100644 --- a/packages/server/src/server/agent/provider-manifest.ts +++ b/packages/protocol/src/provider-manifest.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -import type { AgentMode } from "./agent-sdk-types.js"; +import type { AgentMode } from "./agent-types.js"; export type AgentModeColorTier = "safe" | "moderate" | "dangerous" | "planning" | `#${string}`; // Open string by design: the client looks icons up in a registry and falls back diff --git a/packages/server/src/server/schedule/rpc-schemas.ts b/packages/protocol/src/schedule/rpc-schemas.ts similarity index 100% rename from packages/server/src/server/schedule/rpc-schemas.ts rename to packages/protocol/src/schedule/rpc-schemas.ts diff --git a/packages/server/src/server/schedule/types.ts b/packages/protocol/src/schedule/types.ts similarity index 97% rename from packages/server/src/server/schedule/types.ts rename to packages/protocol/src/schedule/types.ts index 1178f31f1..dc3468c99 100644 --- a/packages/server/src/server/schedule/types.ts +++ b/packages/protocol/src/schedule/types.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -import { AgentProviderSchema } from "../agent/provider-manifest.js"; +import { AgentProviderSchema } from "@getpaseo/protocol/provider-manifest"; export const ScheduleStatusSchema = z.enum(["active", "paused", "completed"]); export type ScheduleStatus = z.infer; diff --git a/packages/server/src/shared/terminal-input-mode.test.ts b/packages/protocol/src/terminal-input-mode.test.ts similarity index 100% rename from packages/server/src/shared/terminal-input-mode.test.ts rename to packages/protocol/src/terminal-input-mode.test.ts diff --git a/packages/server/src/shared/terminal-input-mode.ts b/packages/protocol/src/terminal-input-mode.ts similarity index 100% rename from packages/server/src/shared/terminal-input-mode.ts rename to packages/protocol/src/terminal-input-mode.ts diff --git a/packages/server/src/shared/terminal-key-input.test.ts b/packages/protocol/src/terminal-key-input.test.ts similarity index 100% rename from packages/server/src/shared/terminal-key-input.test.ts rename to packages/protocol/src/terminal-key-input.test.ts diff --git a/packages/server/src/shared/terminal-key-input.ts b/packages/protocol/src/terminal-key-input.ts similarity index 100% rename from packages/server/src/shared/terminal-key-input.ts rename to packages/protocol/src/terminal-key-input.ts diff --git a/packages/server/src/shared/terminal-snapshot.ts b/packages/protocol/src/terminal-snapshot.ts similarity index 100% rename from packages/server/src/shared/terminal-snapshot.ts rename to packages/protocol/src/terminal-snapshot.ts diff --git a/packages/server/src/shared/terminal-stream-protocol.test.ts b/packages/protocol/src/terminal-stream-protocol.test.ts similarity index 100% rename from packages/server/src/shared/terminal-stream-protocol.test.ts rename to packages/protocol/src/terminal-stream-protocol.test.ts diff --git a/packages/server/src/shared/terminal-stream-protocol.ts b/packages/protocol/src/terminal-stream-protocol.ts similarity index 100% rename from packages/server/src/shared/terminal-stream-protocol.ts rename to packages/protocol/src/terminal-stream-protocol.ts diff --git a/packages/server/src/shared/tool-call-display.test.ts b/packages/protocol/src/tool-call-display.test.ts similarity index 100% rename from packages/server/src/shared/tool-call-display.test.ts rename to packages/protocol/src/tool-call-display.test.ts diff --git a/packages/server/src/shared/tool-call-display.ts b/packages/protocol/src/tool-call-display.ts similarity index 96% rename from packages/server/src/shared/tool-call-display.ts rename to packages/protocol/src/tool-call-display.ts index 3f6527632..9324e8e66 100644 --- a/packages/server/src/shared/tool-call-display.ts +++ b/packages/protocol/src/tool-call-display.ts @@ -1,5 +1,5 @@ -import type { ToolCallTimelineItem } from "../server/agent/agent-sdk-types.js"; -import { getPaseoToolLeafName, isPaseoToolName } from "../server/agent/tool-name-normalization.js"; +import type { ToolCallTimelineItem } from "./agent-types.js"; +import { getPaseoToolLeafName, isPaseoToolName } from "@getpaseo/protocol/tool-name-normalization"; import { stripCwdPrefix } from "./path-utils.js"; export type ToolCallDisplayInput = Pick< diff --git a/packages/server/src/server/agent/tool-name-normalization.ts b/packages/protocol/src/tool-name-normalization.ts similarity index 100% rename from packages/server/src/server/agent/tool-name-normalization.ts rename to packages/protocol/src/tool-name-normalization.ts diff --git a/packages/protocol/tsconfig.json b/packages/protocol/tsconfig.json new file mode 100644 index 000000000..b5cdae2f2 --- /dev/null +++ b/packages/protocol/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "lib": ["ES2023", "DOM"], + "types": ["node"], + "skipLibCheck": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "outDir": "./dist", + "rootDir": "./src", + "declaration": true, + "declarationMap": true, + "sourceMap": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "src/**/*.test.ts"] +} diff --git a/packages/server/CLAUDE.md b/packages/server/CLAUDE.md index c398db6c7..1324b3842 100644 --- a/packages/server/CLAUDE.md +++ b/packages/server/CLAUDE.md @@ -14,7 +14,7 @@ Paseo is a mobile + CLI app for monitoring and controlling local AI coding agent ```bash npm run dev # Start daemon + Expo in Tmux -npm run build:daemon # Build: highlight + relay + server + cli +npm run build:server # Build: highlight + relay + protocol + client + server + cli npm run typecheck # Typecheck all packages npm run test # Test all packages npm run format # Format with Biome (in-place) @@ -49,8 +49,7 @@ npm run test:ui # Vitest UI at localhost:51204 ### Other useful commands ```bash -npm run build --workspace=@getpaseo/relay # Rebuild relay before daemon -npm run build --workspace=@getpaseo/server # Rebuild server +npm run build:server # Rebuild server stack npm run db:query -- "SELECT ..." # Run arbitrary SQL npm run cli -- ls -a -g # List agents npm run cli -- daemon status # Check daemon status @@ -168,7 +167,6 @@ packages/server/src/ │ └── agent-storage.ts # File-backed JSON persistence ├── providers/ # Claude, Codex, Copilot, OpenCode, Pi adapters ├── relay-transport.ts # Outbound relay connection -└── client/daemon-client.ts # Client library for daemon connection ``` Agent state persists to `$PASEO_HOME/agents/{cwd-with-dashes}/{agent-id}.json` diff --git a/packages/server/package.json b/packages/server/package.json index 06974c25b..02bcdc80a 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -63,7 +63,9 @@ "dependencies": { "@agentclientprotocol/sdk": "^0.17.1", "@anthropic-ai/claude-agent-sdk": "^0.2.133", + "@getpaseo/client": "0.1.83", "@getpaseo/highlight": "0.1.83", + "@getpaseo/protocol": "0.1.83", "@getpaseo/relay": "0.1.83", "@isaacs/ttlcache": "^2.1.4", "@modelcontextprotocol/sdk": "^1.20.1", diff --git a/packages/server/src/server/agent-attention-policy.ts b/packages/server/src/server/agent-attention-policy.ts index b56d705d0..1c21c7e23 100644 --- a/packages/server/src/server/agent-attention-policy.ts +++ b/packages/server/src/server/agent-attention-policy.ts @@ -1,4 +1,4 @@ -import type { AgentAttentionReason } from "../shared/agent-attention-notification.js"; +import type { AgentAttentionReason } from "@getpaseo/protocol/agent-attention-notification"; export const PRESENCE_THRESHOLD_MS = 180_000; diff --git a/packages/server/src/server/agent/activity-curator.ts b/packages/server/src/server/agent/activity-curator.ts index 014e05062..7bfb5f973 100644 --- a/packages/server/src/server/agent/activity-curator.ts +++ b/packages/server/src/server/agent/activity-curator.ts @@ -1,6 +1,6 @@ import type { AgentTimelineItem } from "./agent-sdk-types.js"; -import { isLikelyExternalToolName } from "./tool-name-normalization.js"; -import { buildToolCallDisplayModel } from "../../shared/tool-call-display.js"; +import { isLikelyExternalToolName } from "@getpaseo/protocol/tool-name-normalization"; +import { buildToolCallDisplayModel } from "@getpaseo/protocol/tool-call-display"; import { projectTimelineRows } from "./timeline-projection.js"; const DEFAULT_MAX_ITEMS = 0; diff --git a/packages/server/src/server/agent/agent-manager.test.ts b/packages/server/src/server/agent/agent-manager.test.ts index 0d1e44346..a86572400 100644 --- a/packages/server/src/server/agent/agent-manager.test.ts +++ b/packages/server/src/server/agent/agent-manager.test.ts @@ -8,7 +8,7 @@ import { randomUUID } from "node:crypto"; import { createTestLogger } from "../../test-utils/test-logger.js"; import { AgentManager, type ManagedAgent } from "./agent-manager.js"; import { AgentStorage } from "./agent-storage.js"; -import { PARENT_AGENT_ID_LABEL } from "../../shared/agent-labels.js"; +import { PARENT_AGENT_ID_LABEL } from "@getpaseo/protocol/agent-labels"; import { formatSystemNotificationPrompt } from "./agent-prompt.js"; import type { StoredAgentRecord } from "./agent-storage.js"; import type { diff --git a/packages/server/src/server/agent/agent-manager.ts b/packages/server/src/server/agent/agent-manager.ts index 01db032d2..b972d2332 100644 --- a/packages/server/src/server/agent/agent-manager.ts +++ b/packages/server/src/server/agent/agent-manager.ts @@ -4,8 +4,8 @@ import { stat } from "node:fs/promises"; import { AGENT_LIFECYCLE_STATUSES, type AgentLifecycleStatus, -} from "../../shared/agent-lifecycle.js"; -import { PARENT_AGENT_ID_LABEL } from "../../shared/agent-labels.js"; +} from "@getpaseo/protocol/agent-lifecycle"; +import { PARENT_AGENT_ID_LABEL } from "@getpaseo/protocol/agent-labels"; import type { Logger } from "pino"; import { z } from "zod"; import type { TerminalManager } from "../../terminal/terminal-manager.js"; @@ -53,7 +53,7 @@ import { AgentStreamCoalescer, } from "./agent-stream-coalescer.js"; import { ForegroundRunState, type ForegroundTurnWaiter } from "./foreground-run-state.js"; -import { getAgentProviderDefinition } from "./provider-manifest.js"; +import { getAgentProviderDefinition } from "@getpaseo/protocol/provider-manifest"; import { IMPORTABLE_PROVIDERS } from "./provider-registry.js"; import { invokeRewindCapability, type RewindMode } from "./rewind/rewind.js"; import { isSystemInjectedEnvelope } from "./agent-prompt.js"; diff --git a/packages/server/src/server/agent/agent-metadata-generator.ts b/packages/server/src/server/agent/agent-metadata-generator.ts index a4d7c216f..30c90af26 100644 --- a/packages/server/src/server/agent/agent-metadata-generator.ts +++ b/packages/server/src/server/agent/agent-metadata-generator.ts @@ -8,7 +8,7 @@ import { StructuredAgentResponseError, generateStructuredAgentResponseWithFallback, } from "./agent-response-loop.js"; -import { MAX_AUTO_AGENT_TITLE_CHARS } from "./agent-title-limits.js"; +import { MAX_AUTO_AGENT_TITLE_CHARS } from "@getpaseo/protocol/agent-title-limits"; import { buildMetadataPrompt } from "../../utils/build-metadata-prompt.js"; import type { WorkspaceGitService } from "../workspace-git-service.js"; diff --git a/packages/server/src/server/agent/agent-metadata-generator.unit.test.ts b/packages/server/src/server/agent/agent-metadata-generator.unit.test.ts index d05053b62..46a9a5235 100644 --- a/packages/server/src/server/agent/agent-metadata-generator.unit.test.ts +++ b/packages/server/src/server/agent/agent-metadata-generator.unit.test.ts @@ -5,7 +5,7 @@ import { afterEach, describe, expect, it, vi } from "vitest"; import { createTestLogger } from "../../test-utils/test-logger.js"; import { createNoopWorkspaceGitService } from "../test-utils/workspace-git-service-stub.js"; -import { MAX_AUTO_AGENT_TITLE_CHARS } from "./agent-title-limits.js"; +import { MAX_AUTO_AGENT_TITLE_CHARS } from "@getpaseo/protocol/agent-title-limits"; import { generateAndApplyAgentMetadata, type AgentMetadataGeneratorDeps, diff --git a/packages/server/src/server/agent/agent-response-loop.ts b/packages/server/src/server/agent/agent-response-loop.ts index 1f85b2ece..66b46040d 100644 --- a/packages/server/src/server/agent/agent-response-loop.ts +++ b/packages/server/src/server/agent/agent-response-loop.ts @@ -3,7 +3,7 @@ import { zodToJsonSchema } from "zod-to-json-schema"; import Ajv, { type ErrorObject, type Options as AjvOptions } from "ajv"; import type { AgentProvider, AgentSessionConfig } from "./agent-sdk-types.js"; import type { AgentManager } from "./agent-manager.js"; -import { getAgentProviderDefinition } from "./provider-manifest.js"; +import { getAgentProviderDefinition } from "@getpaseo/protocol/provider-manifest"; export interface StructuredGenerationLogger { info: (obj: object, msg?: string) => void; diff --git a/packages/server/src/server/agent/agent-sdk-types.ts b/packages/server/src/server/agent/agent-sdk-types.ts index 195f1d943..9d28a34d9 100644 --- a/packages/server/src/server/agent/agent-sdk-types.ts +++ b/packages/server/src/server/agent/agent-sdk-types.ts @@ -1,5 +1,5 @@ import type { Options as ClaudeAgentOptions } from "@anthropic-ai/claude-agent-sdk"; -import type { AgentAttachment } from "../../shared/messages.js"; +import type { AgentAttachment } from "@getpaseo/protocol/messages"; export type AgentProvider = string; diff --git a/packages/server/src/server/agent/create-agent-title.ts b/packages/server/src/server/agent/create-agent-title.ts index 71b0e66b1..0922cbe8f 100644 --- a/packages/server/src/server/agent/create-agent-title.ts +++ b/packages/server/src/server/agent/create-agent-title.ts @@ -1,4 +1,4 @@ -import { MAX_EXPLICIT_AGENT_TITLE_CHARS } from "./agent-title-limits.js"; +import { MAX_EXPLICIT_AGENT_TITLE_CHARS } from "@getpaseo/protocol/agent-title-limits"; const MAX_INITIAL_AGENT_TITLE_CHARS = Math.min(60, MAX_EXPLICIT_AGENT_TITLE_CHARS); diff --git a/packages/server/src/server/agent/create-agent/create.ts b/packages/server/src/server/agent/create-agent/create.ts index bfdf18aa3..36bc48f01 100644 --- a/packages/server/src/server/agent/create-agent/create.ts +++ b/packages/server/src/server/agent/create-agent/create.ts @@ -1,6 +1,6 @@ import type { Logger } from "pino"; -import { PARENT_AGENT_ID_LABEL } from "../../../shared/agent-labels.js"; +import { PARENT_AGENT_ID_LABEL } from "@getpaseo/protocol/agent-labels"; import type { TerminalManager } from "../../../terminal/terminal-manager.js"; import type { CreatePaseoWorktreeInput } from "../../paseo-worktree-service.js"; import { expandUserPath, resolvePathFromBase } from "../../path-utils.js"; @@ -23,7 +23,7 @@ import type { AgentSessionConfig, } from "../agent-sdk-types.js"; import type { AgentStorage } from "../agent-storage.js"; -import { getAgentProviderDefinition } from "../provider-manifest.js"; +import { getAgentProviderDefinition } from "@getpaseo/protocol/provider-manifest"; import type { ProviderDefinition } from "../provider-registry.js"; import { setupFinishNotification, startCreatedAgentInitialPrompt } from "../agent-prompt.js"; import { resolveAndValidateCreateAgentMode } from "../create-agent-mode.js"; diff --git a/packages/server/src/server/agent/import-sessions.test.ts b/packages/server/src/server/agent/import-sessions.test.ts index 3c4a870b0..cfeef0501 100644 --- a/packages/server/src/server/agent/import-sessions.test.ts +++ b/packages/server/src/server/agent/import-sessions.test.ts @@ -4,7 +4,7 @@ import { tmpdir } from "node:os"; import path from "node:path"; import type { AgentManager, ManagedAgent } from "./agent-manager.js"; import type { AgentStorage, StoredAgentRecord } from "./agent-storage.js"; -import type { FetchRecentProviderSessionsRequestMessage } from "../../shared/messages.js"; +import type { FetchRecentProviderSessionsRequestMessage } from "@getpaseo/protocol/messages"; import type { AgentTimelineItem, PersistedAgentDescriptor } from "./agent-sdk-types.js"; import { ImportSessionsRequestError, diff --git a/packages/server/src/server/agent/import-sessions.ts b/packages/server/src/server/agent/import-sessions.ts index 29992a648..6b295ef07 100644 --- a/packages/server/src/server/agent/import-sessions.ts +++ b/packages/server/src/server/agent/import-sessions.ts @@ -18,7 +18,7 @@ import type { FetchRecentProviderSessionsRequestMessage, ImportAgentRequestMessageSchema, RecentProviderSessionDescriptorPayload, -} from "../../shared/messages.js"; +} from "@getpaseo/protocol/messages"; import type { WorkspaceGitService } from "../workspace-git-service.js"; import { createRealpathAwarePathMatcher } from "../../utils/path.js"; diff --git a/packages/server/src/server/agent/mcp-parity.e2e.test.ts b/packages/server/src/server/agent/mcp-parity.e2e.test.ts index 9ee49887e..7c248981d 100644 --- a/packages/server/src/server/agent/mcp-parity.e2e.test.ts +++ b/packages/server/src/server/agent/mcp-parity.e2e.test.ts @@ -9,7 +9,7 @@ import { z } from "zod"; import { AGENT_WAIT_TIMEOUT_MS } from "./mcp-shared.js"; import { createTestPaseoDaemon, type TestPaseoDaemon } from "../test-utils/paseo-daemon.js"; -import { PARENT_AGENT_ID_LABEL } from "../../shared/agent-labels.js"; +import { PARENT_AGENT_ID_LABEL } from "@getpaseo/protocol/agent-labels"; interface StructuredContent { [key: string]: unknown; diff --git a/packages/server/src/server/agent/mcp-server.test.ts b/packages/server/src/server/agent/mcp-server.test.ts index 79d448daf..ba99577de 100644 --- a/packages/server/src/server/agent/mcp-server.test.ts +++ b/packages/server/src/server/agent/mcp-server.test.ts @@ -13,13 +13,16 @@ import { createAgentMcpServer } from "./mcp-server.js"; import type { AgentManager, ManagedAgent } from "./agent-manager.js"; import type { AgentStorage, StoredAgentRecord } from "./agent-storage.js"; import type { ProviderDefinition } from "./provider-registry.js"; -import { AgentListItemPayloadSchema, AgentSnapshotPayloadSchema } from "../../shared/messages.js"; +import { + AgentListItemPayloadSchema, + AgentSnapshotPayloadSchema, +} from "@getpaseo/protocol/messages"; import type { PersistedProjectRecord, PersistedWorkspaceRecord } from "../workspace-registry.js"; import type { CreateScheduleInput, StoredSchedule, UpdateScheduleInput, -} from "../schedule/types.js"; +} from "@getpaseo/protocol/schedule/types"; import type { ScheduleService } from "../schedule/service.js"; import type { WorkspaceGitService } from "../workspace-git-service.js"; import { @@ -30,7 +33,7 @@ import type { CreatePaseoWorktreeWorkflowFn } from "../worktree-session.js"; import { WorkspaceGitServiceImpl } from "../workspace-git-service.js"; import type { GitHubService } from "../../services/github-service.js"; import type { TerminalManager } from "../../terminal/terminal-manager.js"; -import { PARENT_AGENT_ID_LABEL } from "../../shared/agent-labels.js"; +import { PARENT_AGENT_ID_LABEL } from "@getpaseo/protocol/agent-labels"; const REPO_CWD = resolvePath("/tmp/repo"); const TARGET_CWD = resolvePath("/tmp/target"); diff --git a/packages/server/src/server/agent/mcp-server.ts b/packages/server/src/server/agent/mcp-server.ts index f87989696..448724f65 100644 --- a/packages/server/src/server/agent/mcp-server.ts +++ b/packages/server/src/server/agent/mcp-server.ts @@ -44,8 +44,9 @@ import { ScheduleRunSchema, ScheduleSummarySchema, StoredScheduleSchema, -} from "../schedule/types.js"; -import type { ScheduleCadence, UpdateScheduleInput } from "../schedule/types.js"; + type ScheduleCadence, + type UpdateScheduleInput, +} from "@getpaseo/protocol/schedule/types"; import type { ProviderDefinition } from "./provider-registry.js"; import { resolveSnapshotCwd } from "./provider-snapshot-manager.js"; import { diff --git a/packages/server/src/server/agent/mcp-shared.ts b/packages/server/src/server/agent/mcp-shared.ts index acbe84c10..db545fc06 100644 --- a/packages/server/src/server/agent/mcp-shared.ts +++ b/packages/server/src/server/agent/mcp-shared.ts @@ -7,7 +7,7 @@ import { curateAgentActivity } from "./activity-curator.js"; import { selectItemsByProjectedLimit } from "./timeline-projection.js"; import type { AgentStorage } from "./agent-storage.js"; import { serializeAgentSnapshot } from "../messages.js"; -import { StoredScheduleSchema } from "../schedule/types.js"; +import { StoredScheduleSchema } from "@getpaseo/protocol/schedule/types"; import type { AgentProvider } from "./agent-sdk-types.js"; export const AgentProviderEnum = z.string(); diff --git a/packages/server/src/server/agent/prompt-attachments.ts b/packages/server/src/server/agent/prompt-attachments.ts index 049239bcc..9d31b41d0 100644 --- a/packages/server/src/server/agent/prompt-attachments.ts +++ b/packages/server/src/server/agent/prompt-attachments.ts @@ -1,4 +1,4 @@ -import type { AgentAttachment } from "../../shared/messages.js"; +import type { AgentAttachment } from "@getpaseo/protocol/messages"; const REVIEW_LINE_MARKERS = { add: "+", remove: "-", context: " " } as const; diff --git a/packages/server/src/server/agent/provider-launch-config.ts b/packages/server/src/server/agent/provider-launch-config.ts index 7272dd888..52d5398de 100644 --- a/packages/server/src/server/agent/provider-launch-config.ts +++ b/packages/server/src/server/agent/provider-launch-config.ts @@ -1,91 +1,29 @@ -import { z } from "zod"; - import { isAbsolute } from "node:path"; import { executableExists, findExecutable } from "../../utils/executable.js"; import { createExternalProcessEnv, type ProcessEnvRecord } from "../paseo-env.js"; -import type { AgentProvider } from "./agent-sdk-types.js"; -import { AgentProviderSchema } from "./provider-manifest.js"; - -const ProviderCommandDefaultSchema = z - .object({ - mode: z.literal("default"), - }) - .strict(); - -const ProviderCommandAppendSchema = z - .object({ - mode: z.literal("append"), - args: z.array(z.string()).optional(), - }) - .strict(); - -const ProviderCommandReplaceSchema = z - .object({ - mode: z.literal("replace"), - argv: z.array(z.string().min(1)).min(1), - }) - .strict(); - -export const ProviderCommandSchema = z.discriminatedUnion("mode", [ - ProviderCommandDefaultSchema, - ProviderCommandAppendSchema, - ProviderCommandReplaceSchema, -]); - -export const ProviderRuntimeSettingsSchema = z - .object({ - command: ProviderCommandSchema.optional(), - env: z.record(z.string()).optional(), - disallowedTools: z.array(z.string()).optional(), - }) - .strict(); - -const ProviderProfileThinkingOptionSchema = z - .object({ - id: z.string(), - label: z.string(), - description: z.string().optional(), - isDefault: z.boolean().optional(), - }) - .strict(); - -export const ProviderProfileModelSchema = z - .object({ - id: z.string().min(1), - label: z.string().min(1), - description: z.string().optional(), - isDefault: z.boolean().optional(), - thinkingOptions: z.array(ProviderProfileThinkingOptionSchema).optional(), - }) - .strict(); - -export const ProviderOverrideSchema = z - .object({ - extends: z.string().optional(), - label: z.string().optional(), - description: z.string().optional(), - command: z.array(z.string().min(1)).min(1).optional(), - env: z.record(z.string()).optional(), - models: z.array(ProviderProfileModelSchema).optional(), - additionalModels: z.array(ProviderProfileModelSchema).optional(), - disallowedTools: z.array(z.string()).optional(), - enabled: z.boolean().optional(), - order: z.number().optional(), - }) - .strict(); - -export const AgentProviderRuntimeSettingsMapSchema = z.record( - AgentProviderSchema, +export { + AgentProviderRuntimeSettingsMapSchema, + ProviderCommandSchema, + ProviderOverrideSchema, + ProviderOverridesSchema, + ProviderProfileModelSchema, ProviderRuntimeSettingsSchema, -); - -export type ProviderCommand = z.infer; -export type ProviderRuntimeSettings = z.infer; -export type ProviderProfileModel = z.infer; -export type ProviderOverride = z.infer; -export type AgentProviderRuntimeSettingsMap = Partial< - Record ->; + type AgentProviderRuntimeSettingsMap, + type ProviderCommand, + type ProviderOverride, + type ProviderOverrides, + type ProviderProfileModel, + type ProviderRuntimeSettings, +} from "@getpaseo/protocol/provider-config"; +import { + ProviderOverrideSchema, + ProviderOverridesSchema, + ProviderRuntimeSettingsSchema, + type ProviderCommand, + type ProviderOverride, + type ProviderOverrides, + type ProviderRuntimeSettings, +} from "@getpaseo/protocol/provider-config"; export interface ProviderCommandPrefix { command: string; @@ -223,7 +161,7 @@ export function resolveShellEnv(): Record { export function migrateProviderSettings( raw: Record, builtinProviderIds: string[], -): Record { +): ProviderOverrides { const migrated: Record = {}; const builtinProviderIdSet = new Set(builtinProviderIds); @@ -256,7 +194,7 @@ export function migrateProviderSettings( migrated[providerId] = nextEntry; } - return migrated; + return ProviderOverridesSchema.parse(migrated); } // Env vars that indicate a running Claude Code session. If the daemon itself is diff --git a/packages/server/src/server/agent/provider-registry.ts b/packages/server/src/server/agent/provider-registry.ts index 677e74024..b479f93e1 100644 --- a/packages/server/src/server/agent/provider-registry.ts +++ b/packages/server/src/server/agent/provider-registry.ts @@ -38,7 +38,7 @@ import { DEV_AGENT_PROVIDER_DEFINITIONS, getAgentProviderDefinition, type AgentProviderDefinition, -} from "./provider-manifest.js"; +} from "@getpaseo/protocol/provider-manifest"; function isNonEmptyStringArray(value: string[]): value is [string, ...string[]] { return value.length > 0; @@ -61,7 +61,7 @@ export interface ProviderDefinition extends AgentProviderDefinition { fetchModes: (options: ListModesOptions) => Promise; } -export { IMPORTABLE_PROVIDERS } from "../../shared/importable-providers.js"; +export { IMPORTABLE_PROVIDERS } from "@getpaseo/protocol/importable-providers"; export interface BuildProviderRegistryOptions { runtimeSettings?: AgentProviderRuntimeSettingsMap; diff --git a/packages/server/src/server/agent/providers/claude/sidechain-tracker.ts b/packages/server/src/server/agent/providers/claude/sidechain-tracker.ts index 7cea3f8b5..d1634117d 100644 --- a/packages/server/src/server/agent/providers/claude/sidechain-tracker.ts +++ b/packages/server/src/server/agent/providers/claude/sidechain-tracker.ts @@ -1,7 +1,7 @@ import type { SDKMessage } from "@anthropic-ai/claude-agent-sdk"; import { mapClaudeRunningToolCall } from "./tool-call-mapper.js"; -import { buildToolCallDisplayModel } from "../../../../shared/tool-call-display.js"; +import { buildToolCallDisplayModel } from "@getpaseo/protocol/tool-call-display"; import type { AgentMetadata, AgentStreamEvent, AgentTimelineItem } from "../../agent-sdk-types.js"; diff --git a/packages/server/src/server/agent/providers/claude/tool-call-mapper.ts b/packages/server/src/server/agent/providers/claude/tool-call-mapper.ts index 5c79eb01e..cc8ed529f 100644 --- a/packages/server/src/server/agent/providers/claude/tool-call-mapper.ts +++ b/packages/server/src/server/agent/providers/claude/tool-call-mapper.ts @@ -1,7 +1,7 @@ import { z } from "zod"; import type { ToolCallTimelineItem } from "../../agent-sdk-types.js"; -import { isSpeakToolName } from "../../tool-name-normalization.js"; +import { isSpeakToolName } from "@getpaseo/protocol/tool-name-normalization"; import { deriveClaudeToolDetail } from "./tool-call-detail-parser.js"; interface MapperParams { diff --git a/packages/server/src/server/agent/providers/codex/tool-call-detail-parser.ts b/packages/server/src/server/agent/providers/codex/tool-call-detail-parser.ts index 378ba88e5..df650e865 100644 --- a/packages/server/src/server/agent/providers/codex/tool-call-detail-parser.ts +++ b/packages/server/src/server/agent/providers/codex/tool-call-detail-parser.ts @@ -1,7 +1,7 @@ import { z } from "zod"; import type { ToolCallDetail } from "../../agent-sdk-types.js"; -import { stripCwdPrefix } from "../../../../shared/path-utils.js"; +import { stripCwdPrefix } from "@getpaseo/protocol/path-utils"; import { ToolEditInputSchema, ToolEditOutputSchema, diff --git a/packages/server/src/server/agent/providers/codex/tool-call-mapper.ts b/packages/server/src/server/agent/providers/codex/tool-call-mapper.ts index 38cb94126..c4bdf9077 100644 --- a/packages/server/src/server/agent/providers/codex/tool-call-mapper.ts +++ b/packages/server/src/server/agent/providers/codex/tool-call-mapper.ts @@ -7,7 +7,7 @@ import { truncateDiffText, } from "../tool-call-mapper-utils.js"; import { deriveCodexToolDetail, normalizeCodexFilePath } from "./tool-call-detail-parser.js"; -import { isSpeakToolName } from "../../tool-name-normalization.js"; +import { isSpeakToolName } from "@getpaseo/protocol/tool-name-normalization"; interface CodexMapperOptions { cwd?: string | null; diff --git a/packages/server/src/server/agent/providers/mock-load-test-agent.ts b/packages/server/src/server/agent/providers/mock-load-test-agent.ts index aac74df1c..64d34bc34 100644 --- a/packages/server/src/server/agent/providers/mock-load-test-agent.ts +++ b/packages/server/src/server/agent/providers/mock-load-test-agent.ts @@ -27,7 +27,7 @@ import type { ToolCallDetail, ToolCallTimelineItem, } from "../agent-sdk-types.js"; -import { getAgentProviderDefinition } from "../provider-manifest.js"; +import { getAgentProviderDefinition } from "@getpaseo/protocol/provider-manifest"; export const MOCK_LOAD_TEST_PROVIDER_ID = "mock"; export const MOCK_LOAD_TEST_DEFAULT_MODEL_ID = "five-minute-stream"; diff --git a/packages/server/src/server/agent/providers/opencode-agent.ts b/packages/server/src/server/agent/providers/opencode-agent.ts index cdc5ca08a..0657355f3 100644 --- a/packages/server/src/server/agent/providers/opencode-agent.ts +++ b/packages/server/src/server/agent/providers/opencode-agent.ts @@ -53,7 +53,7 @@ import { } from "../provider-launch-config.js"; import { withTimeout } from "../../../utils/promise-timeout.js"; import { execCommand } from "../../../utils/spawn.js"; -import { buildToolCallDisplayModel } from "../../../shared/tool-call-display.js"; +import { buildToolCallDisplayModel } from "@getpaseo/protocol/tool-call-display"; import { mapOpencodeToolCall } from "./opencode/tool-call-mapper.js"; import { OpenCodeServerManager } from "./opencode/server-manager.js"; import { diff --git a/packages/server/src/server/agent/tool-name-normalization.test.ts b/packages/server/src/server/agent/tool-name-normalization.test.ts index 4c20f2001..fadabaaa3 100644 --- a/packages/server/src/server/agent/tool-name-normalization.test.ts +++ b/packages/server/src/server/agent/tool-name-normalization.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; -import { getPaseoToolLeafName, isPaseoToolName } from "./tool-name-normalization.js"; +import { getPaseoToolLeafName, isPaseoToolName } from "@getpaseo/protocol/tool-name-normalization"; describe("isPaseoToolName", () => { it("detects Claude Code format", () => { diff --git a/packages/server/src/server/chat/chat-service.ts b/packages/server/src/server/chat/chat-service.ts index e3554ec8a..2eb5eb0f0 100644 --- a/packages/server/src/server/chat/chat-service.ts +++ b/packages/server/src/server/chat/chat-service.ts @@ -10,7 +10,7 @@ import { type ChatMessage, type ChatRoom, type ChatRoomDetail, -} from "./chat-types.js"; +} from "@getpaseo/protocol/chat/types"; const ChatStorePayloadSchema = z.object({ rooms: z.array(ChatRoomSchema), diff --git a/packages/server/src/server/checkout/status-projection.test.ts b/packages/server/src/server/checkout/status-projection.test.ts index 45abefca8..20db8b927 100644 --- a/packages/server/src/server/checkout/status-projection.test.ts +++ b/packages/server/src/server/checkout/status-projection.test.ts @@ -1,6 +1,6 @@ import { describe, expect, test } from "vitest"; -import { CheckoutPrStatusSchema } from "../../shared/messages.js"; +import { CheckoutPrStatusSchema } from "@getpaseo/protocol/messages"; import { normalizeCheckoutPrStatusPayload } from "./status-projection.js"; describe("checkout status projection", () => { diff --git a/packages/server/src/server/checkout/status-projection.ts b/packages/server/src/server/checkout/status-projection.ts index ac7cff270..72c088238 100644 --- a/packages/server/src/server/checkout/status-projection.ts +++ b/packages/server/src/server/checkout/status-projection.ts @@ -2,7 +2,7 @@ import type { CheckoutPrStatusResponse, CheckoutStatusResponse, SessionOutboundMessage, -} from "../../shared/messages.js"; +} from "@getpaseo/protocol/messages"; import type { WorkspaceGitRuntimeSnapshot } from "../workspace-git-service.js"; type CheckoutPrStatusPayload = Extract< diff --git a/packages/server/src/server/client-activity.e2e.test.ts b/packages/server/src/server/client-activity.e2e.test.ts index 15d65a56c..c572654d5 100644 --- a/packages/server/src/server/client-activity.e2e.test.ts +++ b/packages/server/src/server/client-activity.e2e.test.ts @@ -1,7 +1,7 @@ import { afterEach, beforeEach, describe, expect, test } from "vitest"; import { createTestPaseoDaemon, type TestPaseoDaemon } from "./test-utils/paseo-daemon.js"; import { DaemonClient } from "./test-utils/daemon-client.js"; -import type { AgentStreamEventPayload } from "../shared/messages.js"; +import type { AgentStreamEventPayload } from "@getpaseo/protocol/messages"; import type { AgentSnapshotPayload } from "./messages.js"; import type { PushNotificationSender, PushPayload } from "./push/notifications.js"; import { PRESENCE_THRESHOLD_MS } from "./agent-attention-policy.js"; diff --git a/packages/server/src/server/config.ts b/packages/server/src/server/config.ts index 3a6f2ed28..2a76bdf00 100644 --- a/packages/server/src/server/config.ts +++ b/packages/server/src/server/config.ts @@ -15,7 +15,7 @@ import type { ProviderOverride, } from "./agent/provider-launch-config.js"; import { ProviderOverrideSchema } from "./agent/provider-launch-config.js"; -import { AgentProviderSchema } from "./agent/provider-manifest.js"; +import { AgentProviderSchema } from "@getpaseo/protocol/provider-manifest"; import { hashDaemonPassword } from "./auth.js"; import { resolveSpeechConfig } from "./speech/speech-config-resolver.js"; import { mergeHostnames, parseHostnamesEnv, type HostnamesConfig } from "./hostnames.js"; diff --git a/packages/server/src/server/connection-offer.ts b/packages/server/src/server/connection-offer.ts index 59b7ab8b3..d435049f0 100644 --- a/packages/server/src/server/connection-offer.ts +++ b/packages/server/src/server/connection-offer.ts @@ -1,6 +1,6 @@ import os from "node:os"; -import { ConnectionOfferV2Schema, type ConnectionOffer } from "../shared/connection-offer.js"; +import { ConnectionOfferV2Schema, type ConnectionOffer } from "@getpaseo/protocol/connection-offer"; interface BuildOfferEndpointsArgs { listenHost: string; diff --git a/packages/server/src/server/daemon-config-store.ts b/packages/server/src/server/daemon-config-store.ts index b7852eb05..49b3959fc 100644 --- a/packages/server/src/server/daemon-config-store.ts +++ b/packages/server/src/server/daemon-config-store.ts @@ -4,12 +4,15 @@ import { type PersistedConfig, } from "./persisted-config.js"; import { ProviderOverrideSchema } from "./agent/provider-launch-config.js"; -import { MutableDaemonConfigSchema, MutableDaemonConfigPatchSchema } from "../shared/messages.js"; +import { + MutableDaemonConfigSchema, + MutableDaemonConfigPatchSchema, +} from "@getpaseo/protocol/messages"; -export type { MutableDaemonConfig, MutableDaemonConfigPatch } from "../shared/messages.js"; +export type { MutableDaemonConfig, MutableDaemonConfigPatch } from "@getpaseo/protocol/messages"; -type MutableDaemonConfig = import("../shared/messages.js").MutableDaemonConfig; -type MutableDaemonConfigPatch = import("../shared/messages.js").MutableDaemonConfigPatch; +type MutableDaemonConfig = import("@getpaseo/protocol/messages").MutableDaemonConfig; +type MutableDaemonConfigPatch = import("@getpaseo/protocol/messages").MutableDaemonConfigPatch; type ProviderOverride = import("./agent/provider-launch-config.js").ProviderOverride; interface LoggerLike { diff --git a/packages/server/src/server/daemon-e2e/checkout-pr-merge.e2e.test.ts b/packages/server/src/server/daemon-e2e/checkout-pr-merge.e2e.test.ts index 36a097927..e7907bd88 100644 --- a/packages/server/src/server/daemon-e2e/checkout-pr-merge.e2e.test.ts +++ b/packages/server/src/server/daemon-e2e/checkout-pr-merge.e2e.test.ts @@ -11,7 +11,7 @@ import { type DaemonTestContext, } from "../test-utils/index.js"; import { createWorktree as createWorktreePrimitive } from "../../utils/worktree.js"; -import type { PullRequestMergeable } from "../../shared/messages.js"; +import type { PullRequestMergeable } from "@getpaseo/protocol/messages"; const GhPrViewSchema = z.object({ state: z.string(), diff --git a/packages/server/src/server/daemon-e2e/daemon-restart-resume.e2e.test.ts b/packages/server/src/server/daemon-e2e/daemon-restart-resume.e2e.test.ts index b02d34933..6486f8e04 100644 --- a/packages/server/src/server/daemon-e2e/daemon-restart-resume.e2e.test.ts +++ b/packages/server/src/server/daemon-e2e/daemon-restart-resume.e2e.test.ts @@ -4,7 +4,7 @@ import { tmpdir } from "node:os"; import path from "node:path"; import { createDaemonTestContext, type DaemonTestContext } from "../test-utils/index.js"; -import type { PersistenceHandle } from "../../shared/messages.js"; +import type { PersistenceHandle } from "@getpaseo/protocol/messages"; function tmpCwd(): string { return mkdtempSync(path.join(tmpdir(), "daemon-restart-resume-")); diff --git a/packages/server/src/server/daemon-e2e/opencode-rewind.real.e2e.test.ts b/packages/server/src/server/daemon-e2e/opencode-rewind.real.e2e.test.ts index dbb2d91b4..2a203969c 100644 --- a/packages/server/src/server/daemon-e2e/opencode-rewind.real.e2e.test.ts +++ b/packages/server/src/server/daemon-e2e/opencode-rewind.real.e2e.test.ts @@ -6,7 +6,7 @@ import { afterAll, beforeAll, describe, expect, test } from "vitest"; import { OpenCodeAgentClient } from "../agent/providers/opencode-agent.js"; import type { AgentTimelineItem } from "../agent/agent-sdk-types.js"; -import type { AgentLifecycleStatus } from "../../shared/agent-lifecycle.js"; +import type { AgentLifecycleStatus } from "@getpaseo/protocol/agent-lifecycle"; import { DaemonClient } from "../test-utils/daemon-client.js"; import { createTestPaseoDaemon, type TestPaseoDaemon } from "../test-utils/paseo-daemon.js"; import { getFullAccessConfig } from "./agent-configs.js"; diff --git a/packages/server/src/server/daemon-e2e/relay-transport.e2e.test.ts b/packages/server/src/server/daemon-e2e/relay-transport.e2e.test.ts index 0793c3310..7b5a1ab54 100644 --- a/packages/server/src/server/daemon-e2e/relay-transport.e2e.test.ts +++ b/packages/server/src/server/daemon-e2e/relay-transport.e2e.test.ts @@ -18,9 +18,9 @@ import { generateKeyPair, importPublicKey, } from "@getpaseo/relay"; -import { buildRelayWebSocketUrl } from "../../shared/daemon-endpoints.js"; -import { ConnectionOfferSchema } from "../../shared/connection-offer.js"; -import { WSOutboundMessageSchema } from "../../shared/messages.js"; +import { buildRelayWebSocketUrl } from "@getpaseo/protocol/daemon-endpoints"; +import { ConnectionOfferSchema } from "@getpaseo/protocol/connection-offer"; +import { WSOutboundMessageSchema } from "@getpaseo/protocol/messages"; const nodeMajor = Number((process.versions.node ?? "0").split(".")[0] ?? "0"); const shouldRunRelayE2e = process.env.FORCE_RELAY_E2E === "1" || nodeMajor < 25; diff --git a/packages/server/src/server/daemon-e2e/terminal.e2e.test.ts b/packages/server/src/server/daemon-e2e/terminal.e2e.test.ts index 63b4a4c89..7b3667a0e 100644 --- a/packages/server/src/server/daemon-e2e/terminal.e2e.test.ts +++ b/packages/server/src/server/daemon-e2e/terminal.e2e.test.ts @@ -3,19 +3,19 @@ import { mkdtempSync, rmSync } from "fs"; import { tmpdir } from "os"; import path from "path"; import { WebSocket } from "ws"; -import { DaemonClient } from "../../client/daemon-client.js"; +import { DaemonClient } from "@getpaseo/client/internal/daemon-client"; import { WSOutboundMessageSchema, type TerminalState, type WSOutboundMessage, -} from "../../shared/messages.js"; +} from "@getpaseo/protocol/messages"; import { decodeTerminalSnapshotPayload, decodeTerminalStreamFrame, encodeTerminalStreamFrame, TerminalStreamOpcode, type TerminalStreamFrame, -} from "../../shared/terminal-stream-protocol.js"; +} from "@getpaseo/protocol/terminal-stream-protocol"; import { createDaemonTestContext, type DaemonTestContext } from "../test-utils/index.js"; type RawSessionEnvelope = Extract; diff --git a/packages/server/src/server/daemon-e2e/two-cycle-resume.e2e.test.ts b/packages/server/src/server/daemon-e2e/two-cycle-resume.e2e.test.ts index 8fb160d93..6ce7456f6 100644 --- a/packages/server/src/server/daemon-e2e/two-cycle-resume.e2e.test.ts +++ b/packages/server/src/server/daemon-e2e/two-cycle-resume.e2e.test.ts @@ -5,7 +5,7 @@ import path from "node:path"; import { createDaemonTestContext, type DaemonTestContext } from "../test-utils/index.js"; import { createMessageCollector, type MessageCollector } from "../test-utils/message-collector.js"; -import type { PersistenceHandle } from "../../shared/messages.js"; +import type { PersistenceHandle } from "@getpaseo/protocol/messages"; function tmpCwd(): string { return mkdtempSync(path.join(tmpdir(), "two-cycle-resume-")); diff --git a/packages/server/src/server/editor-targets.ts b/packages/server/src/server/editor-targets.ts index 2e113b7fe..16bfc4429 100644 --- a/packages/server/src/server/editor-targets.ts +++ b/packages/server/src/server/editor-targets.ts @@ -5,7 +5,7 @@ import type { EditorTargetDescriptorPayload, EditorTargetId, KnownEditorTargetId, -} from "../shared/messages.js"; +} from "@getpaseo/protocol/messages"; import { createExternalProcessEnv } from "./paseo-env.js"; import { findExecutable } from "../utils/executable.js"; import { spawnProcess } from "../utils/spawn.js"; diff --git a/packages/server/src/server/exports.test.ts b/packages/server/src/server/exports.test.ts new file mode 100644 index 000000000..9c9a5af9b --- /dev/null +++ b/packages/server/src/server/exports.test.ts @@ -0,0 +1,19 @@ +import { expect, test } from "vitest"; + +test("keeps daemon-client APIs out of the server public entry", async () => { + const serverExports = await import("./exports.js"); + + expect(serverExports.createPaseoDaemon).toBeTypeOf("function"); + expect(serverExports.resolvePaseoHome).toBeTypeOf("function"); + + for (const name of [ + "DaemonClient", + "DaemonClientConfig", + "ConnectionState", + "DaemonEvent", + "WebSocketFactory", + "WebSocketLike", + ]) { + expect(serverExports).not.toHaveProperty(name); + } +}); diff --git a/packages/server/src/server/exports.ts b/packages/server/src/server/exports.ts index 82b68a24f..1673770c1 100644 --- a/packages/server/src/server/exports.ts +++ b/packages/server/src/server/exports.ts @@ -16,28 +16,21 @@ export { decodeOfferFragmentPayload, parseConnectionOfferFromUrl, type ConnectionOffer, -} from "../shared/connection-offer.js"; -export { buildRelayWebSocketUrl } from "../shared/daemon-endpoints.js"; -export { - DaemonClient, - type DaemonClientConfig, - type ConnectionState, - type DaemonEvent, -} from "../client/daemon-client.js"; -export type { WebSocketFactory, WebSocketLike } from "../client/daemon-client-transport-types.js"; +} from "@getpaseo/protocol/connection-offer"; +export { buildRelayWebSocketUrl } from "@getpaseo/protocol/daemon-endpoints"; export { buildDaemonWebSocketUrl, deriveLabelFromEndpoint, normalizeHostPort, parseConnectionUri, shouldUseTlsForDefaultHostedRelay, -} from "../shared/daemon-endpoints.js"; -export { PARENT_AGENT_ID_LABEL } from "../shared/agent-labels.js"; +} from "@getpaseo/protocol/daemon-endpoints"; +export { PARENT_AGENT_ID_LABEL } from "@getpaseo/protocol/agent-labels"; export { DirectTcpHostConnectionSchema, type DirectTcpHostConnection, type NormalizedDirectTcpHostConnection, -} from "../shared/host-connection-schema.js"; +} from "@getpaseo/protocol/host-connection-schema"; export { ensureLocalSpeechModels, listLocalSpeechModels, @@ -68,7 +61,7 @@ export { AGENT_PROVIDER_DEFINITIONS, BUILTIN_PROVIDER_IDS, type AgentProviderDefinition, -} from "./agent/provider-manifest.js"; +} from "@getpaseo/protocol/provider-manifest"; // Agent SDK types for CLI commands export type { @@ -102,4 +95,4 @@ export type { AgentSnapshotPayload, AgentStreamEventPayload, AgentStreamMessage, -} from "../shared/messages.js"; +} from "@getpaseo/protocol/messages"; diff --git a/packages/server/src/server/loop-service.ts b/packages/server/src/server/loop-service.ts index eac7e92bb..f53140fcb 100644 --- a/packages/server/src/server/loop-service.ts +++ b/packages/server/src/server/loop-service.ts @@ -14,7 +14,7 @@ import type { AgentProvider, } from "./agent/agent-sdk-types.js"; import { execCommand, platformShell } from "../utils/spawn.js"; -import { getUnattendedModeId } from "./agent/provider-manifest.js"; +import { getUnattendedModeId } from "@getpaseo/protocol/provider-manifest"; const LOOP_ID_LENGTH = 8; const DEFAULT_LOOP_PROVIDER: AgentProvider = "claude"; diff --git a/packages/server/src/server/messages.ts b/packages/server/src/server/messages.ts index 1916c1e41..3258c9e88 100644 --- a/packages/server/src/server/messages.ts +++ b/packages/server/src/server/messages.ts @@ -1,10 +1,10 @@ import type { ManagedAgent } from "./agent/agent-manager.js"; import { toAgentPayload } from "./agent/agent-projections.js"; import type { AgentStreamEvent } from "./agent/agent-sdk-types.js"; -import type { AgentSnapshotPayload, AgentStreamEventPayload } from "../shared/messages.js"; -import { AgentStreamEventPayloadSchema as AgentStreamEventPayloadRuntimeSchema } from "../shared/messages.js"; +import type { AgentSnapshotPayload, AgentStreamEventPayload } from "@getpaseo/protocol/messages"; +import { AgentStreamEventPayloadSchema as AgentStreamEventPayloadRuntimeSchema } from "@getpaseo/protocol/messages"; -export * from "../shared/messages.js"; +export * from "@getpaseo/protocol/messages"; function validateStreamEventPayload(payload: unknown): AgentStreamEventPayload | null { const parsed = AgentStreamEventPayloadRuntimeSchema.safeParse(payload); diff --git a/packages/server/src/server/paseo-worktree-service.ts b/packages/server/src/server/paseo-worktree-service.ts index 7f770fce1..ec7554071 100644 --- a/packages/server/src/server/paseo-worktree-service.ts +++ b/packages/server/src/server/paseo-worktree-service.ts @@ -21,7 +21,7 @@ import { } from "../utils/worktree-metadata.js"; import type { WorktreeCreationIntent } from "./resolve-worktree-creation-intent.js"; import { buildAgentBranchNameSeed } from "./agent/prompt-attachments.js"; -import type { FirstAgentContext } from "../shared/messages.js"; +import type { FirstAgentContext } from "@getpaseo/protocol/messages"; export interface CreatePaseoWorktreeInput extends CreateWorktreeCoreInput { projectId?: string; diff --git a/packages/server/src/server/persisted-config.ts b/packages/server/src/server/persisted-config.ts index 011721416..5ed59ba39 100644 --- a/packages/server/src/server/persisted-config.ts +++ b/packages/server/src/server/persisted-config.ts @@ -5,7 +5,7 @@ import { z } from "zod"; import { AgentProviderRuntimeSettingsMapSchema, migrateProviderSettings, - ProviderOverrideSchema, + ProviderOverridesSchema, } from "./agent/provider-launch-config.js"; import type { AgentProviderRuntimeSettingsMap } from "./agent/provider-launch-config.js"; import { ensurePrivateFile, writePrivateFileSync } from "./private-files.js"; @@ -132,57 +132,6 @@ const FeatureVoiceModeSchema = z .strict(); const BUILTIN_PROVIDER_IDS = ["claude", "codex", "copilot", "opencode", "pi"] as const; -const PROVIDER_ID_PATTERN = /^[a-z][a-z0-9-]*$/; - -const ProviderOverridesSchema = z - .record(z.string(), ProviderOverrideSchema) - .superRefine((providers, ctx) => { - const builtinProviderIdSet = new Set(BUILTIN_PROVIDER_IDS); - const validExtendsValues = new Set([...BUILTIN_PROVIDER_IDS, "acp"]); - - for (const [providerId, provider] of Object.entries(providers)) { - if (!PROVIDER_ID_PATTERN.test(providerId)) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - path: [providerId], - message: `Provider ID "${providerId}" must match ${PROVIDER_ID_PATTERN}.`, - }); - } - - const isBuiltinProvider = builtinProviderIdSet.has(providerId); - if (!isBuiltinProvider && !provider.extends) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - path: [providerId, "extends"], - message: `Custom provider "${providerId}" must declare extends.`, - }); - } - - if (!isBuiltinProvider && !provider.label) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - path: [providerId, "label"], - message: `Custom provider "${providerId}" must declare label.`, - }); - } - - if (provider.extends && !validExtendsValues.has(provider.extends)) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - path: [providerId, "extends"], - message: `Provider "${providerId}" extends unknown provider "${provider.extends}".`, - }); - } - - if (provider.extends === "acp" && !provider.command) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - path: [providerId, "command"], - message: `Provider "${providerId}" extending "acp" must declare command.`, - }); - } - } - }); function isLegacyProviderEntry(value: unknown): boolean { if (!value || typeof value !== "object" || Array.isArray(value)) { diff --git a/packages/server/src/server/relay-transport.ts b/packages/server/src/server/relay-transport.ts index 18e8571a2..fcd4fad79 100644 --- a/packages/server/src/server/relay-transport.ts +++ b/packages/server/src/server/relay-transport.ts @@ -8,7 +8,7 @@ import { type Transport as RelayTransport, type KeyPair, } from "@getpaseo/relay/e2ee"; -import { buildRelayWebSocketUrl } from "../shared/daemon-endpoints.js"; +import { buildRelayWebSocketUrl } from "@getpaseo/protocol/daemon-endpoints"; import type { ExternalSocketMetadata } from "./websocket-server.js"; interface RelayTransportOptions { @@ -583,5 +583,3 @@ function bufferFromWsData(data: unknown): Buffer | null { } return null; } - -// buildRelayWebSocketUrl + parseHostPort live in ../shared/daemon-endpoints.ts diff --git a/packages/server/src/server/schedule/cron.ts b/packages/server/src/server/schedule/cron.ts index 29e9a732e..10ca641ef 100644 --- a/packages/server/src/server/schedule/cron.ts +++ b/packages/server/src/server/schedule/cron.ts @@ -1,4 +1,4 @@ -import type { ScheduleCadence } from "./types.js"; +import type { ScheduleCadence } from "@getpaseo/protocol/schedule/types"; interface CronFieldMatcher { matches(value: number): boolean; diff --git a/packages/server/src/server/schedule/service.test.ts b/packages/server/src/server/schedule/service.test.ts index a41dc30b9..4c1d2aa8b 100644 --- a/packages/server/src/server/schedule/service.test.ts +++ b/packages/server/src/server/schedule/service.test.ts @@ -23,7 +23,7 @@ import type { import { createTestAgentClients } from "../test-utils/fake-agent-client.js"; import { createTestLogger } from "../../test-utils/test-logger.js"; import { ScheduleService } from "./service.js"; -import type { StoredSchedule, ScheduleExecutionResult } from "./types.js"; +import type { ScheduleExecutionResult, StoredSchedule } from "@getpaseo/protocol/schedule/types"; interface ScheduleServiceInternals { executeSchedule(schedule: StoredSchedule): Promise; diff --git a/packages/server/src/server/schedule/service.ts b/packages/server/src/server/schedule/service.ts index 39b647bdc..f36fd89b8 100644 --- a/packages/server/src/server/schedule/service.ts +++ b/packages/server/src/server/schedule/service.ts @@ -7,7 +7,7 @@ import type { AgentSessionConfig } from "../agent/agent-sdk-types.js"; import { curateAgentActivity } from "../agent/activity-curator.js"; import { ensureAgentLoaded } from "../agent/agent-loading.js"; import { formatSystemNotificationPrompt } from "../agent/agent-prompt.js"; -import { getUnattendedModeId } from "../agent/provider-manifest.js"; +import { getUnattendedModeId } from "@getpaseo/protocol/provider-manifest"; import { ScheduleStore } from "./store.js"; import { computeNextRunAt, validateScheduleCadence } from "./cron.js"; import type { @@ -18,7 +18,7 @@ import type { StoredSchedule, UpdateScheduleInput, UpdateScheduleNewAgentConfig, -} from "./types.js"; +} from "@getpaseo/protocol/schedule/types"; const SCHEDULE_TICK_INTERVAL_MS = 1000; diff --git a/packages/server/src/server/schedule/store.ts b/packages/server/src/server/schedule/store.ts index ae840cb47..7038da897 100644 --- a/packages/server/src/server/schedule/store.ts +++ b/packages/server/src/server/schedule/store.ts @@ -1,7 +1,7 @@ import { randomBytes } from "node:crypto"; import { mkdir, readFile, readdir, rm, writeFile } from "node:fs/promises"; import { join } from "node:path"; -import { StoredScheduleSchema, type StoredSchedule } from "./types.js"; +import { StoredScheduleSchema, type StoredSchedule } from "@getpaseo/protocol/schedule/types"; function generateScheduleId(): string { return randomBytes(4).toString("hex"); diff --git a/packages/server/src/server/script-status-projection.test.ts b/packages/server/src/server/script-status-projection.test.ts index 285ca88eb..2fb2a1f93 100644 --- a/packages/server/src/server/script-status-projection.test.ts +++ b/packages/server/src/server/script-status-projection.test.ts @@ -8,11 +8,11 @@ import { buildWorkspaceScriptPayloads, createScriptStatusEmitter, } from "./script-status-projection.js"; -import { WorkspaceScriptPayloadSchema } from "../shared/messages.js"; +import { WorkspaceScriptPayloadSchema } from "@getpaseo/protocol/messages"; import type { ScriptHealthState } from "./script-health-monitor.js"; import { WorkspaceScriptRuntimeStore } from "./workspace-script-runtime-store.js"; import { readPaseoConfig } from "../utils/worktree.js"; -import type { PaseoConfig } from "../utils/paseo-config-schema.js"; +import type { PaseoConfig } from "@getpaseo/protocol/paseo-config-schema"; import { createTestLogger } from "../test-utils/test-logger.js"; function createWorkspaceRepo(options?: { diff --git a/packages/server/src/server/script-status-projection.ts b/packages/server/src/server/script-status-projection.ts index 45225dd77..c9431839f 100644 --- a/packages/server/src/server/script-status-projection.ts +++ b/packages/server/src/server/script-status-projection.ts @@ -3,8 +3,8 @@ import type { ScriptStatusUpdateMessage, SessionOutboundMessage, WorkspaceScriptPayload, -} from "../shared/messages.js"; -import type { PaseoConfig } from "../utils/paseo-config-schema.js"; +} from "@getpaseo/protocol/messages"; +import type { PaseoConfig } from "@getpaseo/protocol/paseo-config-schema"; import { buildScriptHostname } from "../utils/script-hostname.js"; import { getScriptConfigs, isServiceScript, readPaseoConfig } from "../utils/worktree.js"; import { deriveProjectSlug } from "./workspace-git-metadata.js"; diff --git a/packages/server/src/server/session.test.ts b/packages/server/src/server/session.test.ts index e57a23f09..b7d868ab0 100644 --- a/packages/server/src/server/session.test.ts +++ b/packages/server/src/server/session.test.ts @@ -6,8 +6,11 @@ import { join, resolve as resolvePath } from "path"; import pino from "pino"; import { afterEach, describe, expect, test, vi } from "vitest"; -import type { WorkspaceDescriptorPayload } from "../shared/messages.js"; -import { decodeFileTransferFrame, FileTransferOpcode } from "../shared/binary-frames/index.js"; +import type { WorkspaceDescriptorPayload } from "@getpaseo/protocol/messages"; +import { + decodeFileTransferFrame, + FileTransferOpcode, +} from "@getpaseo/protocol/binary-frames/index"; import { Session } from "./session.js"; import { StructuredAgentFallbackError } from "./agent/agent-response-loop.js"; import type { diff --git a/packages/server/src/server/session.ts b/packages/server/src/server/session.ts index 94fc7daeb..bf4d31bd8 100644 --- a/packages/server/src/server/session.ts +++ b/packages/server/src/server/session.ts @@ -8,7 +8,7 @@ import { basename, resolve, sep } from "path"; import { homedir } from "node:os"; import { z } from "zod"; import type { ToolSet } from "ai"; -import { CLIENT_CAPS, type ClientCapability } from "../shared/client-capabilities.js"; +import { CLIENT_CAPS, type ClientCapability } from "@getpaseo/protocol/client-capabilities"; import { isLegacyEditorTargetId, serializeAgentStreamEvent, @@ -38,7 +38,7 @@ import { encodeFileTransferFrame, FileTransferOpcode, type TerminalStreamFrame, -} from "../shared/binary-frames/index.js"; +} from "@getpaseo/protocol/binary-frames/index"; import { CursorError } from "./pagination/cursor.js"; import { SortablePager, type SortSpec } from "./pagination/sortable-pager.js"; import { TTSManager } from "./agent/tts-manager.js"; @@ -86,8 +86,8 @@ import { spawnWorkspaceScript } from "./worktree-bootstrap.js"; import type { WorkspaceScriptRuntimeStore } from "./workspace-script-runtime-store.js"; import type { DaemonConfigStore } from "./daemon-config-store.js"; import { applyMutableProviderConfigToOverrides } from "./daemon-config-store.js"; -import { getErrorMessage, getErrorMessageOr } from "../shared/error-utils.js"; -import { getAgentStatusPriority } from "../shared/agent-state-bucket.js"; +import { getErrorMessage, getErrorMessageOr } from "@getpaseo/protocol/error-utils"; +import { getAgentStatusPriority } from "@getpaseo/protocol/agent-state-bucket"; import type { WorkspaceGitRuntimeSnapshot, WorkspaceGitService, diff --git a/packages/server/src/server/session.workspace-resolution-invariants.test.ts b/packages/server/src/server/session.workspace-resolution-invariants.test.ts index b52be77db..324301908 100644 --- a/packages/server/src/server/session.workspace-resolution-invariants.test.ts +++ b/packages/server/src/server/session.workspace-resolution-invariants.test.ts @@ -9,7 +9,7 @@ import path from "node:path"; import { expect, test, vi } from "vitest"; import { Session, type SessionOptions } from "./session.js"; -import type { SessionOutboundMessage } from "../shared/messages.js"; +import type { SessionOutboundMessage } from "@getpaseo/protocol/messages"; import { createNoopWorkspaceGitService } from "./test-utils/workspace-git-service-stub.js"; import { asInternals, createStub } from "./test-utils/class-mocks.js"; import { diff --git a/packages/server/src/server/session.workspaces.test.ts b/packages/server/src/server/session.workspaces.test.ts index 770dfc53c..8b4b80f7b 100644 --- a/packages/server/src/server/session.workspaces.test.ts +++ b/packages/server/src/server/session.workspaces.test.ts @@ -9,7 +9,7 @@ import type { AgentSnapshotPayload, EditorTargetDescriptorPayload, SessionOutboundMessage, -} from "../shared/messages.js"; +} from "@getpaseo/protocol/messages"; import { AgentManager } from "./agent/agent-manager.js"; import { AgentStorage } from "./agent/agent-storage.js"; import type { diff --git a/packages/server/src/server/test-utils/daemon-client.ts b/packages/server/src/server/test-utils/daemon-client.ts index d795c3b22..e54470735 100644 --- a/packages/server/src/server/test-utils/daemon-client.ts +++ b/packages/server/src/server/test-utils/daemon-client.ts @@ -7,7 +7,7 @@ import { type DaemonEventHandler, type SendMessageOptions, type WebSocketLike, -} from "../../client/daemon-client.js"; +} from "@getpaseo/client/internal/daemon-client"; export type DaemonClientConfig = Omit< SharedDaemonClientConfig, diff --git a/packages/server/src/server/test-utils/fake-agent-client.ts b/packages/server/src/server/test-utils/fake-agent-client.ts index 7342b7e3c..c29eeac01 100644 --- a/packages/server/src/server/test-utils/fake-agent-client.ts +++ b/packages/server/src/server/test-utils/fake-agent-client.ts @@ -22,7 +22,7 @@ import type { ListModelsOptions, } from "../agent/agent-sdk-types.js"; import type { AgentPermissionRequest, AgentPermissionResponse } from "../agent/agent-sdk-types.js"; -import { isLikelyExternalToolName } from "../agent/tool-name-normalization.js"; +import { isLikelyExternalToolName } from "@getpaseo/protocol/tool-name-normalization"; const TEST_CAPABILITIES: AgentCapabilityFlags = { supportsStreaming: true, diff --git a/packages/server/src/server/test-utils/message-collector.ts b/packages/server/src/server/test-utils/message-collector.ts index 0b3a2ef8b..fab05fbe1 100644 --- a/packages/server/src/server/test-utils/message-collector.ts +++ b/packages/server/src/server/test-utils/message-collector.ts @@ -1,5 +1,5 @@ -import type { DaemonClient } from "../../client/daemon-client.js"; -import type { SessionOutboundMessage } from "../../shared/messages.js"; +import type { DaemonClient } from "@getpaseo/client/internal/daemon-client"; +import type { SessionOutboundMessage } from "@getpaseo/protocol/messages"; export interface MessageCollector { messages: SessionOutboundMessage[]; diff --git a/packages/server/src/server/test-utils/session-stubs.ts b/packages/server/src/server/test-utils/session-stubs.ts index d7282628d..dae78d36b 100644 --- a/packages/server/src/server/test-utils/session-stubs.ts +++ b/packages/server/src/server/test-utils/session-stubs.ts @@ -3,7 +3,7 @@ import { vi } from "vitest"; import type { ProviderSnapshotEntry } from "../agent/agent-sdk-types.js"; import { ProviderSnapshotManager } from "../agent/provider-snapshot-manager.js"; import type { SessionOptions } from "../session.js"; -import type { SessionOutboundMessage } from "../../shared/messages.js"; +import type { SessionOutboundMessage } from "@getpaseo/protocol/messages"; import { asInternals, createStub } from "./class-mocks.js"; // --------------------------------------------------------------------------- diff --git a/packages/server/src/server/voice-local-agent.e2e.test.ts b/packages/server/src/server/voice-local-agent.e2e.test.ts index 8892ee5ee..72f2fd61f 100644 --- a/packages/server/src/server/voice-local-agent.e2e.test.ts +++ b/packages/server/src/server/voice-local-agent.e2e.test.ts @@ -7,7 +7,7 @@ import pino from "pino"; import { createDaemonTestContext, type DaemonTestContext } from "./test-utils/index.js"; import { getFullAccessConfig } from "./daemon-e2e/agent-configs.js"; import { OpenAITTS } from "./speech/providers/openai/tts.js"; -import type { SessionOutboundMessage } from "../shared/messages.js"; +import type { SessionOutboundMessage } from "@getpaseo/protocol/messages"; type SessionMessage = Extract< SessionOutboundMessage, diff --git a/packages/server/src/server/voice-permission-policy.ts b/packages/server/src/server/voice-permission-policy.ts index a8e1a7d79..8060c5edc 100644 --- a/packages/server/src/server/voice-permission-policy.ts +++ b/packages/server/src/server/voice-permission-policy.ts @@ -1,5 +1,5 @@ import type { AgentPermissionRequest } from "./agent/agent-sdk-types.js"; -import { isSpeakToolName } from "./agent/tool-name-normalization.js"; +import { isSpeakToolName } from "@getpaseo/protocol/tool-name-normalization"; /** Voice assistant policy: only allow the speak tool. */ export function isVoicePermissionAllowed(request: AgentPermissionRequest): boolean { diff --git a/packages/server/src/server/voice-roundtrip.e2e.test.ts b/packages/server/src/server/voice-roundtrip.e2e.test.ts index cee37567e..1b692b1c9 100644 --- a/packages/server/src/server/voice-roundtrip.e2e.test.ts +++ b/packages/server/src/server/voice-roundtrip.e2e.test.ts @@ -10,7 +10,7 @@ import { OpenAITTS } from "./speech/providers/openai/tts.js"; import { OpenAISTT } from "./speech/providers/openai/stt.js"; import { STTManager } from "./agent/stt-manager.js"; import { withTimeout } from "../utils/promise-timeout.js"; -import type { SessionOutboundMessage } from "../shared/messages.js"; +import type { SessionOutboundMessage } from "@getpaseo/protocol/messages"; type SessionMessage = Extract< SessionOutboundMessage, diff --git a/packages/server/src/server/websocket-server.relay-reconnect.test.ts b/packages/server/src/server/websocket-server.relay-reconnect.test.ts index 0a44802f7..1929f5441 100644 --- a/packages/server/src/server/websocket-server.relay-reconnect.test.ts +++ b/packages/server/src/server/websocket-server.relay-reconnect.test.ts @@ -15,8 +15,8 @@ import { decodeTerminalStreamFrame, encodeTerminalStreamFrame, TerminalStreamOpcode, -} from "../shared/terminal-stream-protocol.js"; -import { CLIENT_CAPS } from "../shared/client-capabilities.js"; +} from "@getpaseo/protocol/terminal-stream-protocol"; +import { CLIENT_CAPS } from "@getpaseo/protocol/client-capabilities"; type SocketListener = (...args: unknown[]) => void; diff --git a/packages/server/src/server/websocket-server.ts b/packages/server/src/server/websocket-server.ts index a8098a794..46e408e52 100644 --- a/packages/server/src/server/websocket-server.ts +++ b/packages/server/src/server/websocket-server.ts @@ -25,7 +25,7 @@ import { type WSOutboundMessage, wrapSessionMessage, } from "./messages.js"; -import { asUint8Array, decodeTerminalStreamFrame } from "../shared/binary-frames/index.js"; +import { asUint8Array, decodeTerminalStreamFrame } from "@getpaseo/protocol/binary-frames/index"; import type { HostnamesConfig } from "./hostnames.js"; import { isHostnameAllowed } from "./hostnames.js"; import { Session, type SessionLifecycleIntent, type SessionRuntimeMetrics } from "./session.js"; @@ -49,7 +49,7 @@ import { computeNotificationPlan, type ClientPresenceState } from "./agent-atten import { buildAgentAttentionNotificationPayload, findLatestPermissionRequest, -} from "../shared/agent-attention-notification.js"; +} from "@getpaseo/protocol/agent-attention-notification"; import { createGitHubService, type GitHubService } from "../services/github-service.js"; import { extractWsBearerProtocol, diff --git a/packages/server/src/shared/wire-compat.test.ts b/packages/server/src/server/wire-compat.test.ts similarity index 98% rename from packages/server/src/shared/wire-compat.test.ts rename to packages/server/src/server/wire-compat.test.ts index f4959753d..7f01c3ad4 100644 --- a/packages/server/src/shared/wire-compat.test.ts +++ b/packages/server/src/server/wire-compat.test.ts @@ -2,17 +2,17 @@ import pino from "pino"; import { z } from "zod"; import { describe, expect, test } from "vitest"; -import { CLIENT_CAPS } from "./client-capabilities.js"; +import { CLIENT_CAPS } from "@getpaseo/protocol/client-capabilities"; import { AgentSnapshotPayloadSchema, AgentTimelineItemPayloadSchema, FetchAgentTimelineResponseMessageSchema, SessionInboundMessageSchema, type SessionOutboundMessage, -} from "./messages.js"; -import { Session, type SessionOptions } from "../server/session.js"; -import type { AgentTimelineRow } from "../server/agent/agent-manager.js"; -import { handleCreatePaseoWorktreeRequest } from "../server/worktree-session.js"; +} from "@getpaseo/protocol/messages"; +import { Session, type SessionOptions } from "./session.js"; +import type { AgentTimelineRow } from "./agent/agent-manager.js"; +import { handleCreatePaseoWorktreeRequest } from "./worktree-session.js"; const LegacyTimelineEntryPayloadSchema = z.object({ provider: z.enum(["claude", "codex", "opencode"]), diff --git a/packages/server/src/server/workspace-directory.ts b/packages/server/src/server/workspace-directory.ts index a0e8e636c..84c143b98 100644 --- a/packages/server/src/server/workspace-directory.ts +++ b/packages/server/src/server/workspace-directory.ts @@ -10,7 +10,7 @@ import type { import { deriveAgentStateBucket, getWorkspaceStateBucketPriority, -} from "../shared/agent-state-bucket.js"; +} from "@getpaseo/protocol/agent-state-bucket"; import { SortablePager } from "./pagination/sortable-pager.js"; import type { PersistedProjectRecord, PersistedWorkspaceRecord } from "./workspace-registry.js"; import { normalizeWorkspaceId } from "./workspace-registry-model.js"; diff --git a/packages/server/src/server/workspace-git-service.ts b/packages/server/src/server/workspace-git-service.ts index 305ea91bd..3fea970e1 100644 --- a/packages/server/src/server/workspace-git-service.ts +++ b/packages/server/src/server/workspace-git-service.ts @@ -3,7 +3,7 @@ import { readFile, readdir } from "node:fs/promises"; import { join, resolve } from "node:path"; import pLimit from "p-limit"; import type pino from "pino"; -import type { ProjectCheckoutLitePayload } from "../shared/messages.js"; +import type { ProjectCheckoutLitePayload } from "@getpaseo/protocol/messages"; import type { CheckoutContext } from "../utils/checkout-git.js"; import { type BranchCheckoutResolution, diff --git a/packages/server/src/server/workspace-registry-model.ts b/packages/server/src/server/workspace-registry-model.ts index 9cb188ee5..eef8f10f1 100644 --- a/packages/server/src/server/workspace-registry-model.ts +++ b/packages/server/src/server/workspace-registry-model.ts @@ -1,6 +1,9 @@ import { resolve } from "node:path"; -import type { ProjectCheckoutLitePayload, ProjectPlacementPayload } from "../shared/messages.js"; +import type { + ProjectCheckoutLitePayload, + ProjectPlacementPayload, +} from "@getpaseo/protocol/messages"; import { parseGitRevParsePath } from "../utils/git-rev-parse-path.js"; import type { PersistedWorkspaceRecord } from "./workspace-registry.js"; diff --git a/packages/server/src/server/worktree-branch-name-generator.ts b/packages/server/src/server/worktree-branch-name-generator.ts index fe06ef18c..946fab3b1 100644 --- a/packages/server/src/server/worktree-branch-name-generator.ts +++ b/packages/server/src/server/worktree-branch-name-generator.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -import type { FirstAgentContext } from "../shared/messages.js"; +import type { FirstAgentContext } from "@getpaseo/protocol/messages"; import type { AgentManager } from "./agent/agent-manager.js"; import { DEFAULT_STRUCTURED_GENERATION_PROVIDERS, diff --git a/packages/server/src/server/worktree-core.ts b/packages/server/src/server/worktree-core.ts index d61130f8e..3891f4403 100644 --- a/packages/server/src/server/worktree-core.ts +++ b/packages/server/src/server/worktree-core.ts @@ -13,7 +13,7 @@ import { type ResolveWorktreeCreationIntentInput, type WorktreeCreationIntent, } from "./resolve-worktree-creation-intent.js"; -import type { FirstAgentContext } from "../shared/messages.js"; +import type { FirstAgentContext } from "@getpaseo/protocol/messages"; import type { WorkspaceGitService } from "./workspace-git-service.js"; export interface CreateWorktreeCoreInput { diff --git a/packages/server/src/services/github-service.test.ts b/packages/server/src/services/github-service.test.ts index c4011169f..91723248e 100644 --- a/packages/server/src/services/github-service.test.ts +++ b/packages/server/src/services/github-service.test.ts @@ -15,7 +15,7 @@ import { type GitHubCurrentPullRequestStatus, type GitHubReadOptions, } from "./github-service.js"; -import { CheckoutPrStatusResponseSchema } from "../shared/messages.js"; +import { CheckoutPrStatusResponseSchema } from "@getpaseo/protocol/messages"; const EXPECTED_GITHUB_FAST_POLL_MS = 20_000; const EXPECTED_GITHUB_SLOW_POLL_MS = 120_000; diff --git a/packages/server/src/services/github-service.ts b/packages/server/src/services/github-service.ts index 35a250538..93ec6fe68 100644 --- a/packages/server/src/services/github-service.ts +++ b/packages/server/src/services/github-service.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -import type { GitHubSearchKind } from "../shared/messages.js"; +import type { GitHubSearchKind } from "@getpaseo/protocol/messages"; import { findExecutable } from "../utils/executable.js"; import { resolveGitHubRemote } from "../utils/github-remote.js"; import { runGitCommand } from "../utils/run-git-command.js"; diff --git a/packages/server/src/terminal/terminal-capture.ts b/packages/server/src/terminal/terminal-capture.ts index 677f54236..e22d3b6f6 100644 --- a/packages/server/src/terminal/terminal-capture.ts +++ b/packages/server/src/terminal/terminal-capture.ts @@ -1,5 +1,5 @@ import stripAnsi from "strip-ansi"; -import type { TerminalCell } from "../shared/messages.js"; +import type { TerminalCell } from "@getpaseo/protocol/messages"; import type { TerminalSession } from "./terminal.js"; export interface CaptureTerminalLinesOptions { diff --git a/packages/server/src/terminal/terminal-restore.test.ts b/packages/server/src/terminal/terminal-restore.test.ts index 8e4422424..7255cba1a 100644 --- a/packages/server/src/terminal/terminal-restore.test.ts +++ b/packages/server/src/terminal/terminal-restore.test.ts @@ -1,7 +1,10 @@ import { describe, expect, test } from "vitest"; -import { TerminalStreamOpcode, decodeTerminalStreamFrame } from "../shared/binary-frames/index.js"; -import type { TerminalCell, TerminalState } from "../shared/messages.js"; +import { + TerminalStreamOpcode, + decodeTerminalStreamFrame, +} from "@getpaseo/protocol/binary-frames/index"; +import type { TerminalCell, TerminalState } from "@getpaseo/protocol/messages"; import { encodeTerminalRestoreFrame, resolveRestoreAfterOutputOverflow, diff --git a/packages/server/src/terminal/terminal-restore.ts b/packages/server/src/terminal/terminal-restore.ts index 9fdd44de1..6b31f2ac3 100644 --- a/packages/server/src/terminal/terminal-restore.ts +++ b/packages/server/src/terminal/terminal-restore.ts @@ -1,10 +1,10 @@ -import type { SubscribeTerminalRequest } from "../server/messages.js"; +import type { SubscribeTerminalRequest } from "@getpaseo/protocol/messages"; import { TerminalStreamOpcode, encodeTerminalSnapshotPayload, encodeTerminalStreamFrame, -} from "../shared/binary-frames/index.js"; -import { renderTerminalSnapshotToAnsi } from "../shared/terminal-snapshot.js"; +} from "@getpaseo/protocol/binary-frames/index"; +import { renderTerminalSnapshotToAnsi } from "@getpaseo/protocol/terminal-snapshot"; import type { TerminalStateSnapshot, TerminalStateSnapshotOptions } from "./terminal.js"; export const MAX_TERMINAL_OUTPUT_FRAME_BYTES = 256 * 1024; diff --git a/packages/server/src/terminal/terminal-session-controller.test.ts b/packages/server/src/terminal/terminal-session-controller.test.ts index a5a969c8d..37d06edb0 100644 --- a/packages/server/src/terminal/terminal-session-controller.test.ts +++ b/packages/server/src/terminal/terminal-session-controller.test.ts @@ -6,8 +6,8 @@ import { TerminalStreamOpcode, decodeTerminalStreamFrame, type TerminalStreamFrame, -} from "../shared/binary-frames/index.js"; -import type { TerminalCell, TerminalState } from "../shared/messages.js"; +} from "@getpaseo/protocol/binary-frames/index"; +import type { TerminalCell, TerminalState } from "@getpaseo/protocol/messages"; import type { ServerMessage, TerminalSession, TerminalStateSnapshot } from "./terminal.js"; import { TerminalSessionController } from "./terminal-session-controller.js"; import type { TerminalManager } from "./terminal-manager.js"; diff --git a/packages/server/src/terminal/terminal-session-controller.ts b/packages/server/src/terminal/terminal-session-controller.ts index 91db45cad..fe234c9ca 100644 --- a/packages/server/src/terminal/terminal-session-controller.ts +++ b/packages/server/src/terminal/terminal-session-controller.ts @@ -19,7 +19,7 @@ import { decodeTerminalResizePayload, encodeTerminalStreamFrame, type TerminalStreamFrame, -} from "../shared/binary-frames/index.js"; +} from "@getpaseo/protocol/binary-frames/index"; import { TerminalOutputCoalescer } from "./terminal-output-coalescer.js"; import { MAX_TERMINAL_OUTPUT_FRAME_BYTES, diff --git a/packages/server/src/terminal/terminal-worker-protocol.ts b/packages/server/src/terminal/terminal-worker-protocol.ts index a29e4ce2a..6a56f7aa9 100644 --- a/packages/server/src/terminal/terminal-worker-protocol.ts +++ b/packages/server/src/terminal/terminal-worker-protocol.ts @@ -5,7 +5,7 @@ import type { TerminalStateSnapshot, TerminalStateSnapshotOptions, } from "./terminal.js"; -import type { TerminalState } from "../shared/messages.js"; +import type { TerminalState } from "@getpaseo/protocol/messages"; import type { CaptureTerminalLinesResult } from "./terminal-capture.js"; export interface WorkerTerminalInfo { diff --git a/packages/server/src/terminal/terminal.ts b/packages/server/src/terminal/terminal.ts index da021fd6a..4d477565c 100644 --- a/packages/server/src/terminal/terminal.ts +++ b/packages/server/src/terminal/terminal.ts @@ -8,8 +8,8 @@ import { createRequire } from "node:module"; import { fileURLToPath } from "node:url"; import { createExternalProcessEnv } from "../server/paseo-env.js"; import { writePrivateFileAtomicSync } from "../server/private-files.js"; -import type { TerminalCell, TerminalState } from "../shared/messages.js"; -import { TerminalInputModeTracker } from "../shared/terminal-input-mode.js"; +import type { TerminalCell, TerminalState } from "@getpaseo/protocol/messages"; +import { TerminalInputModeTracker } from "@getpaseo/protocol/terminal-input-mode"; const { Terminal } = xterm; const require = createRequire(import.meta.url); diff --git a/packages/server/src/terminal/worker-terminal-manager.test.ts b/packages/server/src/terminal/worker-terminal-manager.test.ts index 8dd689e1e..a91bf35c5 100644 --- a/packages/server/src/terminal/worker-terminal-manager.test.ts +++ b/packages/server/src/terminal/worker-terminal-manager.test.ts @@ -6,7 +6,7 @@ import { tmpdir } from "node:os"; import { createWorkerTerminalManager } from "./worker-terminal-manager.js"; import type { TerminalManager } from "./terminal-manager.js"; import type { TerminalSession } from "./terminal.js"; -import type { TerminalState } from "../shared/messages.js"; +import type { TerminalState } from "@getpaseo/protocol/messages"; import type { TerminalWorkerRequest, TerminalWorkerToParentMessage, diff --git a/packages/server/src/terminal/worker-terminal-manager.ts b/packages/server/src/terminal/worker-terminal-manager.ts index 51e302557..fdd29e7a4 100644 --- a/packages/server/src/terminal/worker-terminal-manager.ts +++ b/packages/server/src/terminal/worker-terminal-manager.ts @@ -1,8 +1,8 @@ import { fork } from "node:child_process"; import { fileURLToPath } from "node:url"; import { randomUUID } from "node:crypto"; -import type { TerminalState } from "../shared/messages.js"; -import { TerminalInputModeTracker } from "../shared/terminal-input-mode.js"; +import type { TerminalState } from "@getpaseo/protocol/messages"; +import { TerminalInputModeTracker } from "@getpaseo/protocol/terminal-input-mode"; import type { ClientMessage, ServerMessage, diff --git a/packages/server/src/utils/build-metadata-prompt.ts b/packages/server/src/utils/build-metadata-prompt.ts index 95c892e8d..a728c705d 100644 --- a/packages/server/src/utils/build-metadata-prompt.ts +++ b/packages/server/src/utils/build-metadata-prompt.ts @@ -1,5 +1,5 @@ import { readPaseoConfigJson } from "./paseo-config-file.js"; -import { PaseoConfigSchema } from "./paseo-config-schema.js"; +import { PaseoConfigSchema } from "@getpaseo/protocol/paseo-config-schema"; import { wrapWithUserInstructions } from "./wrap-user-instructions.js"; export type MetadataConfigKey = "agentTitle" | "branchName" | "commitMessage" | "pullRequest"; diff --git a/packages/server/src/utils/github-remote.ts b/packages/server/src/utils/github-remote.ts index 8725db224..feab78d68 100644 --- a/packages/server/src/utils/github-remote.ts +++ b/packages/server/src/utils/github-remote.ts @@ -4,7 +4,7 @@ import { parseGitHubRemoteIdentity, parseGitRemoteLocation, type GitHubRemoteIdentity as ResolvedGitHubRemoteIdentity, -} from "../shared/git-remote.js"; +} from "@getpaseo/protocol/git-remote"; import { findExecutable } from "./executable.js"; import { execCommand } from "./spawn.js"; @@ -13,7 +13,7 @@ const sshHostnameResolutionCache = new Map>(); export type SshHostnameResolver = (host: string) => Promise; -export { parseGitHubRemoteUrl, type GitHubRemoteIdentity } from "../shared/git-remote.js"; +export { parseGitHubRemoteUrl, type GitHubRemoteIdentity } from "@getpaseo/protocol/git-remote"; export async function resolveGitHubRemote(input: { remoteUrl: string; diff --git a/packages/server/src/utils/paseo-config-file.ts b/packages/server/src/utils/paseo-config-file.ts index 19cb0e80f..9b31918e6 100644 --- a/packages/server/src/utils/paseo-config-file.ts +++ b/packages/server/src/utils/paseo-config-file.ts @@ -6,13 +6,13 @@ import { type PaseoConfigRaw, type PaseoConfigRevision, type ProjectConfigRpcError, -} from "./paseo-config-schema.js"; +} from "@getpaseo/protocol/paseo-config-schema"; export { PaseoConfigRevisionSchema, ProjectConfigRpcErrorSchema, type PaseoConfigRevision, type ProjectConfigRpcError, -} from "./paseo-config-schema.js"; +} from "@getpaseo/protocol/paseo-config-schema"; export const PASEO_CONFIG_FILE_NAME = "paseo.json"; diff --git a/packages/server/src/utils/tool-call-parsers.ts b/packages/server/src/utils/tool-call-parsers.ts index 8bd33a0dc..b76afe8d9 100644 --- a/packages/server/src/utils/tool-call-parsers.ts +++ b/packages/server/src/utils/tool-call-parsers.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -import { stripCwdPrefix } from "../shared/path-utils.js"; +import { stripCwdPrefix } from "@getpaseo/protocol/path-utils"; const SHELL_WRAPPER_PREFIX_PATTERN = /^\/bin\/(?:zsh|bash|sh)\s+(?:-[a-zA-Z]+\s+)?/; const CD_AND_PATTERN = /^cd\s+(?:"[^"]+"|'[^']+'|\S+)\s+&&\s+/; diff --git a/packages/server/src/utils/worktree.posix.test.ts b/packages/server/src/utils/worktree.posix.test.ts index 8599f2ad9..3f369e374 100644 --- a/packages/server/src/utils/worktree.posix.test.ts +++ b/packages/server/src/utils/worktree.posix.test.ts @@ -20,7 +20,7 @@ import { type CreateWorktreeOptions, type WorktreeConfig, } from "./worktree"; -import type { PaseoConfig } from "./paseo-config-schema.js"; +import type { PaseoConfig } from "@getpaseo/protocol/paseo-config-schema"; import { getPaseoWorktreeMetadataPath } from "./worktree-metadata.js"; import { execFileSync } from "child_process"; import { isPlatform } from "../test-utils/platform.js"; diff --git a/packages/server/src/utils/worktree.ts b/packages/server/src/utils/worktree.ts index 24538a603..418d25879 100644 --- a/packages/server/src/utils/worktree.ts +++ b/packages/server/src/utils/worktree.ts @@ -16,8 +16,8 @@ export { PaseoConfigSchema, type PaseoConfig, type PaseoConfigRaw, -} from "./paseo-config-schema.js"; -import { PaseoConfigSchema, type PaseoConfig } from "./paseo-config-schema.js"; +} from "@getpaseo/protocol/paseo-config-schema"; +import { PaseoConfigSchema, type PaseoConfig } from "@getpaseo/protocol/paseo-config-schema"; import { normalizeBaseRefName, readPaseoWorktreeMetadata, diff --git a/paseo.json b/paseo.json index 54580b815..6e3f392f6 100644 --- a/paseo.json +++ b/paseo.json @@ -2,7 +2,7 @@ "worktree": { "setup": [ "npm ci", - "npm run build:daemon", + "npm run build:server", "cp \"$PASEO_SOURCE_CHECKOUT_PATH/packages/server/.env\" \"$PASEO_WORKTREE_PATH/packages/server/.env\"" ] }, diff --git a/scripts/dev.ps1 b/scripts/dev.ps1 index 8552a6838..cbe5a9508 100644 --- a/scripts/dev.ps1 +++ b/scripts/dev.ps1 @@ -45,12 +45,6 @@ Write-Host @" # Allow any origin in dev so Electron on random ports all work. # SECURITY: wildcard CORS is unsafe in production — only acceptable here because # the daemon binds to localhost and this script is never used for production. -# Build dependencies required by the daemon (they only ship dist/) -Write-Host "Building @getpaseo/highlight..." -npm run build --workspace=@getpaseo/highlight -Write-Host "Building @getpaseo/relay..." -npm run build --workspace=@getpaseo/relay - $env:PASEO_CORS_ORIGINS = "*" # Configure the app to auto-connect to this daemon on localhost diff --git a/scripts/trace-daemon.mjs b/scripts/trace-daemon.mjs index 686eff9bc..5b7de8b41 100644 --- a/scripts/trace-daemon.mjs +++ b/scripts/trace-daemon.mjs @@ -9,7 +9,7 @@ // installPhase copies each path to $out/lib/paseo/, preserving the // directory structure node's module resolution expects. // -// Run from the repo root, after `npm run build:daemon`. Requires +// Run from the repo root, after `npm run build:server`. Requires // node_modules populated (the Nix build invokes this post-configHook). import { nodeFileTrace } from "@vercel/nft";