Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions docs/data-model.md
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,43 @@ rather than storing something it cannot describe. That is why the client gates t
UI on `server_info.features.agentProfiles` instead of letting a save appear to succeed against an
older daemon.

### Agent provider Paseo tools

`agents.providers` is keyed by the exact provider ID used to launch the agent. The built-in IDs are
`claude`, `codex`, `copilot`, `opencode`, `pi`, and `omp`. Custom provider IDs are their literal
configuration keys, such as `my-claude` or `zai`, not the provider named by `extends`.

Each entry may include a Paseo-tool policy:

```json
{
"agents": {
"providers": {
"my-claude": {
"extends": "claude",
"label": "My Claude",
"paseoTools": {
"enabled": true,
"disabledTools": ["browser_evaluate"]
}
}
}
}
}
```

Absent `paseoTools`, or absent fields within it, means Paseo tools are enabled and all tools are
allowed. `enabled: false` disables the provider's Paseo catalog; `disabledTools` lists exact tool
IDs to omit. The policy covers the core and browser catalog, not the voice-only `speak` tool.
Browser tools also require `daemon.browserTools.enabled` and a connected browser host.

`daemon.mcp.injectIntoAgents` is the global override. When it is `false`, no provider receives
Paseo tools; otherwise the provider policy applies. Provider and global policy are resolved when a
session is created, resumed, imported, or reloaded, so configuration changes affect the next
session rather than an already-running one.

`agents.metadataGeneration.providers` controls the preferred structured-generation fallback order for daemon-side metadata tasks such as commit messages, PR text, branch names, and generated agent titles. Entries are tried first in the configured order, then Paseo falls through to dynamically discovered defaults and finally the current selection when available.

### Git process limits

Git process limits are global to one daemon. The start-rate limit defaults to `64` processes per
Expand Down
4 changes: 3 additions & 1 deletion docs/providers.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,9 @@ Existing direct providers: `claude` (in `providers/claude/agent.ts`), `codex` (`

Claude first-party model metadata lives in `packages/server/src/server/agent/providers/claude/model-manifest.ts`. When adding or updating a Claude model, update that manifest only; the model picker thinking options and Claude-specific feature gates are derived from the manifest. Do not add model-specific Claude capability lists in feature code.

Paseo tools are not implemented as MCP tools internally. They live in a shared tool catalog under `packages/server/src/server/agent/tools/`; MCP is only the fallback adapter. A provider that can register runtime tools directly should set `supportsNativePaseoTools: true` and consume `launchContext.paseoTools` in `createSession`/`resumeSession`. When native tools are present, `AgentManager` strips the internal Paseo MCP server from the provider launch config so the provider does not receive the same tools twice. Providers that only know MCP should keep `supportsMcpServers: true` and let the daemon inject `/mcp/agents`.
Paseo tools are not implemented as MCP tools internally. They live in a shared tool catalog under `packages/server/src/server/agent/tools/`; MCP is only the fallback adapter. The daemon resolves `agents.providers.<provider>.paseoTools` by the exact provider ID. The catalog policy belongs to the caller: it filters the tools exposed to the current agent. When that agent calls `create_agent`, the child receives the policy for the child provider ID; the caller's policy is not inherited.

A provider that can register runtime tools directly should set `supportsNativePaseoTools: true` and consume the already-filtered `launchContext.paseoTools` in `createSession`/`resumeSession`. When native tools are present, `AgentManager` strips the internal Paseo MCP server from the provider launch config so the provider does not receive the same tools twice. Providers that only know MCP should keep `supportsMcpServers: true` and let the daemon inject `/mcp/agents`; the MCP server builds the same policy-filtered catalog for that caller. Filtering is enforced at catalog registration in both paths, not only in the UI. Browser tools remain subject to the daemon browser-tools setting and browser-host availability.

Pi is a process-backed provider. Paseo requires the user to have the `pi` binary installed and talks to it through `pi --mode rpc`; the server package does not embed Pi's SDK/runtime packages.

Expand Down
5 changes: 4 additions & 1 deletion packages/app/e2e/browser/provider-removal.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,10 @@ test.describe("provider removal", () => {
await openSettingsHost(page, getServerId());
await openSettingsHostSection(page, getServerId(), "providers");

await expect(page.getByTestId("provider-actions-claude")).toHaveCount(0);
await page.getByTestId("provider-actions-claude").click();
await expect(page.getByTestId("provider-configure-tools-claude")).toBeVisible();
await expect(page.getByTestId("provider-remove-claude")).toHaveCount(0);
await page.keyboard.press("Escape");
await openAddProviderArea(page);
await installAcpCatalogProvider(page, CUSTOM_PROVIDER.name);
await expectProviderInstalledInSettings(page, CUSTOM_PROVIDER.name);
Expand Down
28 changes: 28 additions & 0 deletions packages/app/src/i18n/resources/ar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2326,9 +2326,37 @@ export const ar: TranslationResources = {
updateErrorTitle: "غير قادر على تحديث الموفر",
actions: {
menu: "{{name}} actions",
configureTools: "تكوين الأدوات",
remove: "Remove provider",
removing: "Removing...",
},
tools: {
title: "تكوين أدوات {{name}}",
searchPlaceholder: "البحث في الأدوات",
updateRequired: {
title: "حدّث المضيف لتهيئة أدوات Paseo",
description: "إعدادات أدوات Paseo لكل مزود غير متاحة على هذا المضيف.",
},
master: {
title: "تمكين أدوات Paseo",
hint: "السماح لموفر الخدمة هذا باستخدام أدوات Paseo",
accessibilityLabel: "تمكين أدوات Paseo لـ {{name}}",
},
enableAll: "تمكين الكل",
disableAll: "تعطيل الكل",
globalOverride: {
title: "أدوات Paseo معطلة",
description: "إعداد حقن أدوات Paseo العام يتجاوز اختيارات الموفر والأدوات المحفوظة",
},
browserUnavailable: {
title: "أدوات المتصفح غير متاحة",
description:
"فعّل أدوات المتصفح في إعدادات المضيف لاستخدامها. تظل الاختيارات المحفوظة دون تغيير",
},
toolAccessibilityLabel: "أداة Paseo: {{name}}",
noSearchMatches: "لا توجد أدوات تطابق بحثك",
updateErrorTitle: "تعذر تحديث إعدادات أدوات Paseo",
},
remove: {
confirmTitle: "Remove {{name}}?",
confirmMessage: "This deletes the provider entry from config.json. It cannot be undone.",
Expand Down
29 changes: 29 additions & 0 deletions packages/app/src/i18n/resources/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2384,9 +2384,38 @@ export const en = {
updateErrorTitle: "Unable to update provider",
actions: {
menu: "{{name}} actions",
configureTools: "Configure tools",
remove: "Remove provider",
removing: "Removing...",
},
tools: {
title: "Configure {{name}} tools",
searchPlaceholder: "Search tools",
updateRequired: {
title: "Update the host to configure Paseo tools",
description: "Per-provider tool settings are unavailable on this host.",
},
master: {
title: "Enable Paseo tools",
hint: "Allow this provider to use Paseo tools",
accessibilityLabel: "Enable Paseo tools for {{name}}",
},
enableAll: "Enable all",
disableAll: "Disable all",
globalOverride: {
title: "Paseo tools are disabled",
description:
"The global Inject Paseo tools setting overrides these saved provider and tool choices",
},
browserUnavailable: {
title: "Browser tools are unavailable",
description:
"Turn on Browser tools in host settings to use these tools. Saved choices remain unchanged",
},
toolAccessibilityLabel: "{{name}} Paseo tool",
noSearchMatches: "No tools match your search",
updateErrorTitle: "Unable to update Paseo tool settings",
},
remove: {
confirmTitle: "Remove {{name}}?",
confirmMessage: "This deletes the provider entry from config.json. It cannot be undone.",
Expand Down
30 changes: 30 additions & 0 deletions packages/app/src/i18n/resources/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2380,9 +2380,39 @@ export const es: TranslationResources = {
updateErrorTitle: "No se puede actualizar el proveedor",
actions: {
menu: "{{name}} actions",
configureTools: "Configurar herramientas",
remove: "Remove provider",
removing: "Removing...",
},
tools: {
title: "Configurar herramientas de {{name}}",
searchPlaceholder: "Buscar herramientas",
updateRequired: {
title: "Actualiza el host para configurar las herramientas de Paseo",
description:
"Los ajustes de herramientas por proveedor no están disponibles en este host.",
},
master: {
title: "Activar herramientas de Paseo",
hint: "Permitir que este proveedor use herramientas de Paseo",
accessibilityLabel: "Activar herramientas de Paseo para {{name}}",
},
enableAll: "Activar todas",
disableAll: "Desactivar todas",
globalOverride: {
title: "Las herramientas de Paseo están desactivadas",
description:
"El ajuste global de inyectar herramientas de Paseo anula estas elecciones guardadas",
},
browserUnavailable: {
title: "Las herramientas del navegador no están disponibles",
description:
"Activa las herramientas del navegador en los ajustes del host para usarlas. Las elecciones guardadas no cambian",
},
toolAccessibilityLabel: "Herramienta de Paseo: {{name}}",
noSearchMatches: "No hay herramientas que coincidan con tu búsqueda",
updateErrorTitle: "No se pudieron actualizar los ajustes de herramientas de Paseo",
},
remove: {
confirmTitle: "Remove {{name}}?",
confirmMessage: "This deletes the provider entry from config.json. It cannot be undone.",
Expand Down
30 changes: 30 additions & 0 deletions packages/app/src/i18n/resources/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2386,9 +2386,39 @@ export const fr: TranslationResources = {
updateErrorTitle: "Impossible de mettre à jour le fournisseur",
actions: {
menu: "{{name}} actions",
configureTools: "Configurer les outils",
remove: "Remove provider",
removing: "Removing...",
},
tools: {
title: "Configurer les outils de {{name}}",
searchPlaceholder: "Rechercher des outils",
updateRequired: {
title: "Mettez à jour l’hôte pour configurer les outils Paseo",
description:
"Les réglages des outils par fournisseur ne sont pas disponibles sur cet hôte.",
},
master: {
title: "Activer les outils Paseo",
hint: "Autoriser ce fournisseur à utiliser les outils Paseo",
accessibilityLabel: "Activer les outils Paseo pour {{name}}",
},
enableAll: "Tout activer",
disableAll: "Tout désactiver",
globalOverride: {
title: "Les outils Paseo sont désactivés",
description:
"Le réglage global d'injection des outils Paseo remplace ces choix enregistrés",
},
browserUnavailable: {
title: "Les outils du navigateur sont indisponibles",
description:
"Activez les outils du navigateur dans les réglages de l'hôte pour les utiliser. Les choix enregistrés restent inchangés",
},
toolAccessibilityLabel: "Outil Paseo : {{name}}",
noSearchMatches: "Aucun outil ne correspond à votre recherche",
updateErrorTitle: "Impossible de mettre à jour les réglages des outils Paseo",
},
remove: {
confirmTitle: "Remove {{name}}?",
confirmMessage: "This deletes the provider entry from config.json. It cannot be undone.",
Expand Down
29 changes: 29 additions & 0 deletions packages/app/src/i18n/resources/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2350,9 +2350,38 @@ export const ja: TranslationResources = {
updateErrorTitle: "プロバイダーを更新できません",
actions: {
menu: "{{name}} actions",
configureTools: "ツールを設定",
remove: "Remove provider",
removing: "Removing...",
},
tools: {
title: "{{name}} のツールを設定",
searchPlaceholder: "ツールを検索",
updateRequired: {
title: "ホストを更新してPaseoツールを設定",
description: "このホストではプロバイダーごとのツール設定を利用できません。",
},
master: {
title: "Paseo ツールを有効にする",
hint: "このプロバイダーが Paseo ツールを使用できるようにします",
accessibilityLabel: "{{name}} の Paseo ツールを有効にする",
},
enableAll: "すべて有効にする",
disableAll: "すべて無効にする",
globalOverride: {
title: "Paseo ツールは無効です",
description:
"グローバルの Paseo ツール注入設定が、保存済みのプロバイダーとツールの選択を上書きします",
},
browserUnavailable: {
title: "ブラウザツールは利用できません",
description:
"使用するにはホスト設定でブラウザツールを有効にしてください。保存済みの選択は変更されません",
},
toolAccessibilityLabel: "{{name}} Paseo ツール",
noSearchMatches: "検索に一致するツールがありません",
updateErrorTitle: "Paseo ツール設定を更新できません",
},
remove: {
confirmTitle: "Remove {{name}}?",
confirmMessage: "This deletes the provider entry from config.json. It cannot be undone.",
Expand Down
29 changes: 29 additions & 0 deletions packages/app/src/i18n/resources/ko.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2342,9 +2342,38 @@ export const ko: TranslationResources = {
updateErrorTitle: "프로바이더를 업데이트할 수 없습니다",
actions: {
menu: "{{name}} 작업",
configureTools: "도구 구성",
remove: "프로바이더 제거",
removing: "제거 중...",
},
tools: {
title: "{{name}} 도구 구성",
searchPlaceholder: "도구 검색",
updateRequired: {
title: "Paseo 도구를 구성하려면 호스트를 업데이트하세요",
description: "이 호스트에서는 프로바이더별 도구 설정을 사용할 수 없습니다.",
},
master: {
title: "Paseo 도구 활성화",
hint: "이 프로바이더가 Paseo 도구를 사용하도록 허용합니다",
accessibilityLabel: "{{name}}에 대한 Paseo 도구 활성화",
},
enableAll: "모두 활성화",
disableAll: "모두 비활성화",
globalOverride: {
title: "Paseo 도구가 비활성화되었습니다",
description:
"전역 Paseo 도구 주입 설정이 저장된 프로바이더 및 도구 선택 항목보다 우선 적용됩니다.",
},
browserUnavailable: {
title: "브라우저 도구를 사용할 수 없습니다",
description:
"이 도구들을 사용하려면 호스트 설정에서 브라우저 도구를 켜세요. 저장된 선택 항목은 변경되지 않습니다.",
},
toolAccessibilityLabel: "{{name}} Paseo 도구",
noSearchMatches: "검색과 일치하는 도구가 없습니다",
updateErrorTitle: "Paseo 도구 설정을 업데이트할 수 없습니다",
},
remove: {
confirmTitle: "{{name}}를 제거하시겠습니까?",
confirmMessage:
Expand Down
30 changes: 30 additions & 0 deletions packages/app/src/i18n/resources/pt-BR.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2365,9 +2365,39 @@ export const ptBR: TranslationResources = {
updateErrorTitle: "Não foi possível atualizar provedor",
actions: {
menu: "{{name}} actions",
configureTools: "Configurar ferramentas",
remove: "Remove provider",
removing: "Removing...",
},
tools: {
title: "Configurar ferramentas de {{name}}",
searchPlaceholder: "Buscar ferramentas",
updateRequired: {
title: "Atualize o host para configurar as ferramentas do Paseo",
description:
"As configurações de ferramentas por provedor não estão disponíveis neste host.",
},
master: {
title: "Ativar ferramentas do Paseo",
hint: "Permitir que este provedor use ferramentas do Paseo",
accessibilityLabel: "Ativar ferramentas do Paseo para {{name}}",
},
enableAll: "Ativar todas",
disableAll: "Desativar todas",
globalOverride: {
title: "As ferramentas do Paseo estão desativadas",
description:
"A configuração global de injetar ferramentas do Paseo substitui estas escolhas salvas",
},
browserUnavailable: {
title: "As ferramentas do navegador estão indisponíveis",
description:
"Ative as ferramentas do navegador nas configurações do host para usá-las. As escolhas salvas não mudam",
},
toolAccessibilityLabel: "Ferramenta do Paseo: {{name}}",
noSearchMatches: "Nenhuma ferramenta corresponde à sua busca",
updateErrorTitle: "Não foi possível atualizar as configurações das ferramentas do Paseo",
},
remove: {
confirmTitle: "Remove {{name}}?",
confirmMessage: "This deletes the provider entry from config.json. It cannot be undone.",
Expand Down
Loading