From e5ab81f267e37310d29d7254047b5b24f844bf84 Mon Sep 17 00:00:00 2001 From: Olaf Lessenich Date: Thu, 30 Jul 2026 21:50:05 +0000 Subject: [PATCH 1/9] fix: correct Pi metadata and provider support Signed-off-by: Olaf Lessenich --- extensions/tools/pi/README.md | 16 ++-- extensions/tools/pi/gateway-allowlist.conf | 6 ++ extensions/tools/pi/spec.yaml | 38 +++++++- .../config/testdata/golden/tool-ext-pi.json | 21 +++- internal/config/testdata/golden/tool-pi.json | 95 ++++++++++++++++++- 5 files changed, 159 insertions(+), 17 deletions(-) diff --git a/extensions/tools/pi/README.md b/extensions/tools/pi/README.md index 90cd4bb..44d5046 100644 --- a/extensions/tools/pi/README.md +++ b/extensions/tools/pi/README.md @@ -1,7 +1,7 @@ # Pi Pi is a coding agent by Mario Zechner (`@earendil-works/pi-coding-agent`). It -supports multiple LLM providers (OpenAI, Anthropic, Google). +supports multiple LLM providers (OpenAI, Anthropic, Google, Mistral). ## Configuration @@ -17,25 +17,29 @@ supports multiple LLM providers (OpenAI, Anthropic, Google). | `OPENAI_API_KEY` | OpenAI API access | | `ANTHROPIC_API_KEY` | Anthropic API access | | `GEMINI_API_KEY` | Google Gemini API access | +| `MISTRAL_API_KEY` | Mistral API access | ## Auth Files - `agent/auth.json` -Pi uses Codex OAuth for OpenAI subscriptions. enclave auto-maps port 1455 -when the `openai-codex` entry is missing from `agent/auth.json`; add `-p 1455` -(or `-p 1455:1455`) to re-login. +Enclave recognizes Pi's `openai`, `openai-codex`, `anthropic`, `google`, and +`mistral` credentials in this file. For browser-based login, enclave auto-maps +port 1455 for Codex OAuth and port 53692 for Anthropic OAuth when the corresponding entry +is missing. Add an explicit mapping for the relevant port to re-login. ## Network Access -Allowlisted domains include OpenAI, Anthropic, Google, GitHub, and common -package registries (npm, PyPI, Go, CDNs, TLS/OCSP). +Allowlisted domains include Pi's model catalog, OpenAI, Anthropic, Google, +Mistral, GitHub, and common package registries (npm, PyPI, Go, CDNs, TLS/OCSP). ## Settings Pi settings are seeded from `templates/settings.json` on first run. The upstream Pi settings schema supports `defaultProjectTrust`, but the default template stays empty so host settings passthrough behaves the same inside and outside Enclave. +Enclave disables Pi's install telemetry and version check while leaving model +catalog refresh enabled. Enclave runs Pi with `--approve` by default, so project-local Pi resources are trusted inside the sandbox without showing Pi's project trust prompt. This diff --git a/extensions/tools/pi/gateway-allowlist.conf b/extensions/tools/pi/gateway-allowlist.conf index e0a4cc4..52f7d57 100644 --- a/extensions/tools/pi/gateway-allowlist.conf +++ b/extensions/tools/pi/gateway-allowlist.conf @@ -10,6 +10,9 @@ no-resolv no-poll address=/#/ +# Pi model catalogs +server=/pi.dev/8.8.8.8 + # OpenAI conf-file=/etc/dnsmasq.allowlists/fragments/openai.conf @@ -19,6 +22,9 @@ conf-file=/etc/dnsmasq.allowlists/fragments/anthropic.conf # Google / Gemini conf-file=/etc/dnsmasq.allowlists/fragments/google.conf +# Mistral +conf-file=/etc/dnsmasq.allowlists/fragments/mistral.conf + # Common Infrastructure conf-file=/etc/dnsmasq.allowlists/fragments/github.conf conf-file=/etc/dnsmasq.allowlists/fragments/npm.conf diff --git a/extensions/tools/pi/spec.yaml b/extensions/tools/pi/spec.yaml index 6ce810e..f6e6b1d 100644 --- a/extensions/tools/pi/spec.yaml +++ b/extensions/tools/pi/spec.yaml @@ -8,8 +8,8 @@ schemaVersion: "1" kind: sandbox name: pi -displayName: Anthropic Claude Pi -description: Anthropic Claude Pi +displayName: Pi Coding Agent +description: Coding agent CLI with read, bash, edit, write tools and session management sandbox: entrypoint: { run: [pi] } @@ -31,11 +31,17 @@ sandbox: - agent/skills/ - agent/themes/ +environment: + variables: + PI_SKIP_VERSION_CHECK: "1" + PI_TELEMETRY: "0" + credentials: sources: openai-api-key: { env: [OPENAI_API_KEY] } anthropic-api-key: { env: [ANTHROPIC_API_KEY] } gemini-api-key: { env: [GEMINI_API_KEY] } + mistral-api-key: { env: [MISTRAL_API_KEY] } network: serviceDomains: @@ -44,21 +50,43 @@ network: api.anthropic.com: anthropic-api-key "*.anthropic.com": anthropic-api-key generativelanguage.googleapis.com: gemini-api-key + api.mistral.ai: mistral-api-key + codestral.mistral.ai: mistral-api-key serviceAuth: openai-api-key: { headerName: authorization, valueFormat: "Bearer %s" } anthropic-api-key: { headerName: x-api-key } gemini-api-key: { headerName: x-goog-api-key } + mistral-api-key: { headerName: authorization, valueFormat: "Bearer %s" } providers: - - name: openai-codex + - name: openai credentials: [openai-api-key] authFiles: [agent/auth.json] authSession: - mode: any + checks: + - { file: agent/auth.json, type: json_pointer_non_null, pointer: /openai } + - name: openai-codex + authFiles: [agent/auth.json] + authSession: checks: - { file: agent/auth.json, type: json_pointer_non_null, pointer: /openai-codex } oauthPorts: [{ port: "1455" }] - name: anthropic credentials: [anthropic-api-key] - - name: gemini + authFiles: [agent/auth.json] + authSession: + checks: + - { file: agent/auth.json, type: json_pointer_non_null, pointer: /anthropic } + oauthPorts: [{ port: "53692" }] + - name: google credentials: [gemini-api-key] + authFiles: [agent/auth.json] + authSession: + checks: + - { file: agent/auth.json, type: json_pointer_non_null, pointer: /google } + - name: mistral + credentials: [mistral-api-key] + authFiles: [agent/auth.json] + authSession: + checks: + - { file: agent/auth.json, type: json_pointer_non_null, pointer: /mistral } diff --git a/internal/config/testdata/golden/tool-ext-pi.json b/internal/config/testdata/golden/tool-ext-pi.json index 152e4fd..931ea13 100644 --- a/internal/config/testdata/golden/tool-ext-pi.json +++ b/internal/config/testdata/golden/tool-ext-pi.json @@ -1,7 +1,7 @@ { "type": "sandbox", "name": "pi", - "description": "Anthropic Claude Pi", + "description": "Coding agent CLI with read, bash, edit, write tools and session management", "default_included": true, "priority": 100, "secrets": { @@ -32,6 +32,21 @@ } } }, + "mistral-api-key": { + "env_vars": [ + "MISTRAL_API_KEY" + ], + "release": { + "http": { + "hosts": [ + "api.mistral.ai", + "codestral.mistral.ai" + ], + "header": "authorization", + "format": "Bearer %s" + } + } + }, "openai-api-key": { "env_vars": [ "OPENAI_API_KEY" @@ -47,5 +62,9 @@ } } } + }, + "environment": { + "PI_SKIP_VERSION_CHECK": "1", + "PI_TELEMETRY": "0" } } diff --git a/internal/config/testdata/golden/tool-pi.json b/internal/config/testdata/golden/tool-pi.json index 3fbacf2..5f4a3ce 100644 --- a/internal/config/testdata/golden/tool-pi.json +++ b/internal/config/testdata/golden/tool-pi.json @@ -25,7 +25,7 @@ ], "providers": [ { - "name": "openai-codex", + "name": "openai", "credential_secrets": [ "openai-api-key" ], @@ -33,7 +33,23 @@ "agent/auth.json" ], "auth_session": { - "mode": "any", + "mode": "", + "checks": [ + { + "file": "agent/auth.json", + "type": "json_pointer_non_null", + "pointer": "/openai" + } + ] + } + }, + { + "name": "openai-codex", + "auth_files": [ + "agent/auth.json" + ], + "auth_session": { + "mode": "", "checks": [ { "file": "agent/auth.json", @@ -52,13 +68,63 @@ "name": "anthropic", "credential_secrets": [ "anthropic-api-key" + ], + "auth_files": [ + "agent/auth.json" + ], + "auth_session": { + "mode": "", + "checks": [ + { + "file": "agent/auth.json", + "type": "json_pointer_non_null", + "pointer": "/anthropic" + } + ] + }, + "oauth_ports": [ + { + "port": "53692" + } ] }, { - "name": "gemini", + "name": "google", "credential_secrets": [ "gemini-api-key" - ] + ], + "auth_files": [ + "agent/auth.json" + ], + "auth_session": { + "mode": "", + "checks": [ + { + "file": "agent/auth.json", + "type": "json_pointer_non_null", + "pointer": "/google" + } + ] + } + }, + { + "name": "mistral", + "credential_secrets": [ + "mistral-api-key" + ], + "auth_files": [ + "agent/auth.json" + ], + "auth_session": { + "mode": "", + "checks": [ + { + "file": "agent/auth.json", + "type": "json_pointer_non_null", + "pointer": "/mistral" + } + ] + } } ], "secrets": { @@ -89,6 +155,21 @@ } } }, + "mistral-api-key": { + "env_vars": [ + "MISTRAL_API_KEY" + ], + "release": { + "http": { + "hosts": [ + "api.mistral.ai", + "codestral.mistral.ai" + ], + "header": "authorization", + "format": "Bearer %s" + } + } + }, "openai-api-key": { "env_vars": [ "OPENAI_API_KEY" @@ -107,5 +188,9 @@ }, "host_config_dir": "", "host_credentials_file": "", - "host_oauth_json": "" + "host_oauth_json": "", + "environment": { + "PI_SKIP_VERSION_CHECK": "1", + "PI_TELEMETRY": "0" + } } From eb1268f82fc55e2ae3102af8f81b719ddabf0b38 Mon Sep 17 00:00:00 2001 From: Olaf Lessenich Date: Mon, 3 Aug 2026 13:18:27 +0000 Subject: [PATCH 2/9] fix: make Pi Anthropic OAuth opt-in Signed-off-by: Olaf Lessenich --- extensions/tools/pi/README.md | 7 ++++--- extensions/tools/pi/spec.yaml | 3 ++- internal/config/testdata/golden/tool-pi.json | 4 +++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/extensions/tools/pi/README.md b/extensions/tools/pi/README.md index 44d5046..38666d8 100644 --- a/extensions/tools/pi/README.md +++ b/extensions/tools/pi/README.md @@ -24,9 +24,10 @@ supports multiple LLM providers (OpenAI, Anthropic, Google, Mistral). - `agent/auth.json` Enclave recognizes Pi's `openai`, `openai-codex`, `anthropic`, `google`, and -`mistral` credentials in this file. For browser-based login, enclave auto-maps -port 1455 for Codex OAuth and port 53692 for Anthropic OAuth when the corresponding entry -is missing. Add an explicit mapping for the relevant port to re-login. +`mistral` credentials in this file. For browser-based login, Enclave auto-maps +port 1455 when the `openai-codex` entry is missing. Anthropic OAuth is opt-in; +add `-p 53692` when logging in. Add `-p 1455` to re-login with Codex when an +entry already exists. ## Network Access diff --git a/extensions/tools/pi/spec.yaml b/extensions/tools/pi/spec.yaml index f6e6b1d..275b9c3 100644 --- a/extensions/tools/pi/spec.yaml +++ b/extensions/tools/pi/spec.yaml @@ -77,7 +77,8 @@ providers: authSession: checks: - { file: agent/auth.json, type: json_pointer_non_null, pointer: /anthropic } - oauthPorts: [{ port: "53692" }] + oauthPorts: + - { port: "53692", autoHintWhenNoSession: false, requireMappingWhenNoCredentials: false } - name: google credentials: [gemini-api-key] authFiles: [agent/auth.json] diff --git a/internal/config/testdata/golden/tool-pi.json b/internal/config/testdata/golden/tool-pi.json index 5f4a3ce..c05181c 100644 --- a/internal/config/testdata/golden/tool-pi.json +++ b/internal/config/testdata/golden/tool-pi.json @@ -84,7 +84,9 @@ }, "oauth_ports": [ { - "port": "53692" + "port": "53692", + "auto_hint_when_no_session": false, + "require_mapping_when_no_credentials": false } ] }, From a50de04ea2916d38f23cfe384ca15dee2be5d1c7 Mon Sep 17 00:00:00 2001 From: Olaf Lessenich Date: Mon, 3 Aug 2026 13:19:03 +0000 Subject: [PATCH 3/9] fix: restrict Pi Mistral credential release Signed-off-by: Olaf Lessenich --- extensions/tools/pi/spec.yaml | 1 - internal/config/testdata/golden/tool-ext-pi.json | 3 +-- internal/config/testdata/golden/tool-pi.json | 3 +-- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/extensions/tools/pi/spec.yaml b/extensions/tools/pi/spec.yaml index 275b9c3..d9ab228 100644 --- a/extensions/tools/pi/spec.yaml +++ b/extensions/tools/pi/spec.yaml @@ -51,7 +51,6 @@ network: "*.anthropic.com": anthropic-api-key generativelanguage.googleapis.com: gemini-api-key api.mistral.ai: mistral-api-key - codestral.mistral.ai: mistral-api-key serviceAuth: openai-api-key: { headerName: authorization, valueFormat: "Bearer %s" } anthropic-api-key: { headerName: x-api-key } diff --git a/internal/config/testdata/golden/tool-ext-pi.json b/internal/config/testdata/golden/tool-ext-pi.json index 931ea13..daebc4f 100644 --- a/internal/config/testdata/golden/tool-ext-pi.json +++ b/internal/config/testdata/golden/tool-ext-pi.json @@ -39,8 +39,7 @@ "release": { "http": { "hosts": [ - "api.mistral.ai", - "codestral.mistral.ai" + "api.mistral.ai" ], "header": "authorization", "format": "Bearer %s" diff --git a/internal/config/testdata/golden/tool-pi.json b/internal/config/testdata/golden/tool-pi.json index c05181c..b22d94e 100644 --- a/internal/config/testdata/golden/tool-pi.json +++ b/internal/config/testdata/golden/tool-pi.json @@ -164,8 +164,7 @@ "release": { "http": { "hosts": [ - "api.mistral.ai", - "codestral.mistral.ai" + "api.mistral.ai" ], "header": "authorization", "format": "Bearer %s" From 78f3ad4f494ce3fc0423073a62b176960af5dbef Mon Sep 17 00:00:00 2001 From: Olaf Lessenich Date: Mon, 3 Aug 2026 13:19:23 +0000 Subject: [PATCH 4/9] docs: name Pi model catalog domain Signed-off-by: Olaf Lessenich --- extensions/tools/pi/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/extensions/tools/pi/README.md b/extensions/tools/pi/README.md index 38666d8..ab0cebd 100644 --- a/extensions/tools/pi/README.md +++ b/extensions/tools/pi/README.md @@ -31,8 +31,9 @@ entry already exists. ## Network Access -Allowlisted domains include Pi's model catalog, OpenAI, Anthropic, Google, -Mistral, GitHub, and common package registries (npm, PyPI, Go, CDNs, TLS/OCSP). +Allowlisted domains include `pi.dev` for Pi's model catalog, OpenAI, Anthropic, +Google, Mistral, GitHub, and common package registries (npm, PyPI, Go, CDNs, +TLS/OCSP). ## Settings From 28cb7ba47d996e4cfd774a994b47219b7a4eaa87 Mon Sep 17 00:00:00 2001 From: Olaf Lessenich Date: Mon, 3 Aug 2026 15:28:41 +0200 Subject: [PATCH 5/9] fix: make kit-init.sh readable in container images The entrypoint sources /usr/local/share/enclave/kit-init.sh as the unprivileged agent user, but neither image build path relaxed its mode. A restrictive host umask (0007) left the copy root-owned 0660, so the source failed with "Permission denied" and no feature entrypoint ran. Signed-off-by: Olaf Lessenich --- Dockerfile | 3 ++- runtime-assets/microvm/alpine/build-bundle.sh | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 1d24956..e6b8bd7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -335,7 +335,8 @@ COPY entrypoint.sh /usr/local/bin/entrypoint.sh RUN chmod a+rx /usr/local/bin/entrypoint.sh \ /usr/local/share/enclave/auth-reconcile.sh \ /usr/local/share/enclave/net.sh && \ - chmod a+r /usr/local/share/enclave/tmux-session.conf + chmod a+r /usr/local/share/enclave/tmux-session.conf \ + /usr/local/share/enclave/kit-init.sh USER ${USERNAME} ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] CMD ["/bin/bash"] diff --git a/runtime-assets/microvm/alpine/build-bundle.sh b/runtime-assets/microvm/alpine/build-bundle.sh index 2c4fc1b..edd4445 100755 --- a/runtime-assets/microvm/alpine/build-bundle.sh +++ b/runtime-assets/microvm/alpine/build-bundle.sh @@ -114,6 +114,7 @@ cp /src/runtime-assets/auth-reconcile.sh "$root/usr/local/share/enclave/auth-rec cp /src/runtime-assets/net.sh "$root/usr/local/share/enclave/net.sh" cp /src/runtime-assets/kit-init.sh "$root/usr/local/share/enclave/kit-init.sh" chmod 0755 "$root/usr/local/bin/entrypoint.sh" "$root/usr/local/share/enclave/auth-reconcile.sh" "$root/usr/local/share/enclave/net.sh" +chmod 0644 "$root/usr/local/share/enclave/kit-init.sh" if [ -d /src/docs ]; then cp -a /src/docs "$root/usr/share/doc/enclave/docs"; fi From e43669739b9848804a34e7daec6b1e53db8d11fe Mon Sep 17 00:00:00 2001 From: Olaf Lessenich Date: Mon, 3 Aug 2026 14:12:18 +0000 Subject: [PATCH 6/9] fix: narrow Pi Mistral allowlist Signed-off-by: Olaf Lessenich --- extensions/tools/pi/gateway-allowlist.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/tools/pi/gateway-allowlist.conf b/extensions/tools/pi/gateway-allowlist.conf index 52f7d57..52abbd6 100644 --- a/extensions/tools/pi/gateway-allowlist.conf +++ b/extensions/tools/pi/gateway-allowlist.conf @@ -23,7 +23,7 @@ conf-file=/etc/dnsmasq.allowlists/fragments/anthropic.conf conf-file=/etc/dnsmasq.allowlists/fragments/google.conf # Mistral -conf-file=/etc/dnsmasq.allowlists/fragments/mistral.conf +server=/api.mistral.ai/8.8.8.8 # Common Infrastructure conf-file=/etc/dnsmasq.allowlists/fragments/github.conf From 7c167fb93814fd748074a39b29b1211861109d74 Mon Sep 17 00:00:00 2001 From: Olaf Lessenich Date: Mon, 3 Aug 2026 22:13:14 +0000 Subject: [PATCH 7/9] docs: explain Pi Mistral allowlist exception Signed-off-by: Olaf Lessenich --- extensions/tools/pi/gateway-allowlist.conf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extensions/tools/pi/gateway-allowlist.conf b/extensions/tools/pi/gateway-allowlist.conf index 52abbd6..857f20c 100644 --- a/extensions/tools/pi/gateway-allowlist.conf +++ b/extensions/tools/pi/gateway-allowlist.conf @@ -22,7 +22,8 @@ conf-file=/etc/dnsmasq.allowlists/fragments/anthropic.conf # Google / Gemini conf-file=/etc/dnsmasq.allowlists/fragments/google.conf -# Mistral +# Pi uses Mistral's general API; the shared fragment also allows Codestral, +# which uses a separate credential. server=/api.mistral.ai/8.8.8.8 # Common Infrastructure From ae4f698df8308b9b51edb0d67b841f906d675643 Mon Sep 17 00:00:00 2001 From: Olaf Lessenich Date: Tue, 4 Aug 2026 10:34:01 +0000 Subject: [PATCH 8/9] fix: address Pi extension review feedback --- extensions/tools/pi/README.md | 8 ++++++-- extensions/tools/pi/spec.yaml | 2 +- internal/app/build_permissions.go | 1 + internal/app/build_permissions_test.go | 2 ++ internal/config/testdata/golden/tool-ext-pi.json | 2 +- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/extensions/tools/pi/README.md b/extensions/tools/pi/README.md index ab0cebd..038356a 100644 --- a/extensions/tools/pi/README.md +++ b/extensions/tools/pi/README.md @@ -10,6 +10,12 @@ supports multiple LLM providers (OpenAI, Anthropic, Google, Mistral). - **Config directory**: `~/.pi` - **Settings file**: `~/.pi/agent/settings.json` +## Environment + +Enclave sets `PI_TELEMETRY=0` and `PI_SKIP_VERSION_CHECK=1` to disable Pi's +install/update telemetry and version check while leaving model catalog refresh +enabled. See Pi's upstream [environment-variable reference](https://github.com/earendil-works/pi/blob/main/packages/coding-agent/docs/environment-variables.md). + ## API Keys | Variable | Purpose | @@ -40,8 +46,6 @@ TLS/OCSP). Pi settings are seeded from `templates/settings.json` on first run. The upstream Pi settings schema supports `defaultProjectTrust`, but the default template stays empty so host settings passthrough behaves the same inside and outside Enclave. -Enclave disables Pi's install telemetry and version check while leaving model -catalog refresh enabled. Enclave runs Pi with `--approve` by default, so project-local Pi resources are trusted inside the sandbox without showing Pi's project trust prompt. This diff --git a/extensions/tools/pi/spec.yaml b/extensions/tools/pi/spec.yaml index d9ab228..bf334ee 100644 --- a/extensions/tools/pi/spec.yaml +++ b/extensions/tools/pi/spec.yaml @@ -9,7 +9,7 @@ schemaVersion: "1" kind: sandbox name: pi displayName: Pi Coding Agent -description: Coding agent CLI with read, bash, edit, write tools and session management +description: A minimal terminal coding harness sandbox: entrypoint: { run: [pi] } diff --git a/internal/app/build_permissions.go b/internal/app/build_permissions.go index aa419dc..ce26d3e 100644 --- a/internal/app/build_permissions.go +++ b/internal/app/build_permissions.go @@ -50,6 +50,7 @@ func collectAppRootModeIssues(appRoot string) ([]string, error) { } for _, rel := range []string{ filepath.ToSlash(filepath.Join("runtime-assets", "auth-reconcile.sh")), + filepath.ToSlash(filepath.Join("runtime-assets", "kit-init.sh")), filepath.ToSlash(filepath.Join("runtime-assets", "net.sh")), filepath.ToSlash(filepath.Join("runtime-assets", "tmux-session.conf")), } { diff --git a/internal/app/build_permissions_test.go b/internal/app/build_permissions_test.go index f284787..96c053b 100644 --- a/internal/app/build_permissions_test.go +++ b/internal/app/build_permissions_test.go @@ -20,6 +20,7 @@ func TestCollectAppRootModeIssuesReportsRestrictiveAssets(t *testing.T) { writeModeTestFile(t, filepath.Join(root, "runtime-assets", "build-scripts", "lib", "common.sh"), 0o640) writeModeTestFile(t, filepath.Join(root, "runtime-assets", "build-scripts", "bin", "helper"), 0o644) writeModeTestFile(t, filepath.Join(root, "runtime-assets", "auth-reconcile.sh"), 0o640) + writeModeTestFile(t, filepath.Join(root, "runtime-assets", "kit-init.sh"), 0o640) writeModeTestFile(t, filepath.Join(root, "runtime-assets", "net.sh"), 0o644) writeModeTestFile(t, filepath.Join(root, "runtime-assets", "tmux-session.conf"), 0o644) writeModeTestFile(t, filepath.Join(root, "extensions", "tools", "claude", "spec.yaml"), 0o640) @@ -35,6 +36,7 @@ func TestCollectAppRootModeIssuesReportsRestrictiveAssets(t *testing.T) { "runtime-assets/build-scripts/lib/common.sh lacks world read/execute permission", "runtime-assets/build-scripts/bin/helper lacks world execute permission", "runtime-assets/auth-reconcile.sh lacks world read permission", + "runtime-assets/kit-init.sh lacks world read permission", "extensions/tools/claude/spec.yaml lacks world read permission", "extensions/tools/claude/install.sh lacks world execute permission", } { diff --git a/internal/config/testdata/golden/tool-ext-pi.json b/internal/config/testdata/golden/tool-ext-pi.json index daebc4f..3d2fb91 100644 --- a/internal/config/testdata/golden/tool-ext-pi.json +++ b/internal/config/testdata/golden/tool-ext-pi.json @@ -1,7 +1,7 @@ { "type": "sandbox", "name": "pi", - "description": "Coding agent CLI with read, bash, edit, write tools and session management", + "description": "A minimal terminal coding harness", "default_included": true, "priority": 100, "secrets": { From 04affaf4d94e259dbe39ed8b11458b0b501bb76e Mon Sep 17 00:00:00 2001 From: Olaf Lessenich Date: Thu, 6 Aug 2026 09:49:40 +0000 Subject: [PATCH 9/9] docs: document Pi Anthropic OAuth port --- docs/auth.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/auth.md b/docs/auth.md index 5b8bad4..9d15735 100644 --- a/docs/auth.md +++ b/docs/auth.md @@ -118,6 +118,10 @@ are denied. Codex OAuth note: the OAuth callback redirects to `http://localhost:1455/auth/callback`. enclave auto-maps port 1455 when no session exists. If you need to re-login, add `-p 1455`. Gateway logs will show `Loopback proxy (socat) enabled on port 1455` when forwarding is active. +Pi Anthropic OAuth note: Enclave does not auto-map the callback port. Add +`-p 53692` when starting a Pi session in which you intend to log in with +Anthropic OAuth. + OpenCode ChatGPT subscription note: for `opencode`, complete OpenAI browser auth from the CLI inside the container rather than from `/connect` in the TUI. Use: ```bash