From 4485ba246cfc3ae13d3d1c9c7f8fd9b761c7d2ce Mon Sep 17 00:00:00 2001 From: maiconfontana Date: Sun, 2 Aug 2026 16:18:03 -0300 Subject: [PATCH 1/3] chore(brand): rebrand product to Platon Code Rename user-facing T3 Code/T3 Connect strings to Platon Code/Platon Connect across apps, docs, and server messages. Apply Platon temple mark and logo assets to web/desktop/mobile icon slots (prod, dev, nightly) and public favicons. Keep technical identifiers (@t3tools, T3CODE_*, .t3, t3 CLI) for compatibility. --- .agents/skills/ios-debugger-agent/SKILL.md | 2 +- .agents/skills/ios-simulator-browser/SKILL.md | 4 +- .../ios-simulator-browser/agents/openai.yaml | 2 +- .agents/skills/test-t3-app/SKILL.md | 4 +- .agents/skills/test-t3-mobile/SKILL.md | 10 +- .../skills/test-t3-mobile/agents/openai.yaml | 4 +- .devcontainer/devcontainer.json | 2 +- .github/workflows/deploy-relay.yml | 2 +- .github/workflows/release.yml | 4 +- .plans/18-server-auth-model.md | 2 +- .plans/19-remote-endpoints-hosted-static.md | 2 +- .plans/t3-connect-remote-setup.html | 8 +- AGENTS.md | 34 ++--- README.md | 22 ++-- apps/desktop/package.json | 2 +- apps/desktop/scripts/electron-launcher.mjs | 6 +- .../scripts/electron-launcher.test.mjs | 12 +- apps/desktop/src/app/DesktopApp.ts | 2 +- .../src/app/DesktopAppIdentity.test.ts | 16 +-- apps/desktop/src/app/DesktopAssets.test.ts | 4 +- apps/desktop/src/app/DesktopClerk.test.ts | 2 +- apps/desktop/src/app/DesktopClerk.ts | 2 +- .../src/app/DesktopEnvironment.test.ts | 4 +- apps/desktop/src/app/DesktopEnvironment.ts | 4 +- apps/desktop/src/app/DesktopLifecycle.test.ts | 2 +- .../desktop/src/backend/DesktopBackendPool.ts | 4 +- .../backend/DesktopLocalEnvironmentAuth.ts | 2 +- apps/desktop/src/electron/ElectronApp.test.ts | 2 +- .../src/electron/ElectronWindow.test.ts | 9 +- .../src/ssh/DesktopSshEnvironment.test.ts | 2 +- apps/desktop/src/ssh/DesktopSshEnvironment.ts | 2 +- .../src/ssh/DesktopSshPasswordPrompts.ts | 2 +- .../DesktopTelemetryPublisher.test.ts | 2 +- .../src/window/DesktopApplicationMenu.test.ts | 2 +- .../src/window/DesktopApplicationMenu.ts | 2 +- apps/desktop/src/wsl/DesktopWslEnvironment.ts | 2 +- apps/marketing/public/apple-touch-icon.png | Bin 2903 -> 4256 bytes apps/marketing/public/favicon-16x16.png | Bin 414 -> 478 bytes apps/marketing/public/favicon-32x32.png | Bin 662 -> 838 bytes apps/marketing/public/favicon.ico | Bin 10112 -> 17767 bytes apps/marketing/public/icon.png | Bin 1127516 -> 20533 bytes apps/marketing/src/components/LegalPage.astro | 2 +- apps/marketing/src/layouts/Layout.astro | 12 +- apps/marketing/src/pages/download.astro | 4 +- apps/marketing/src/pages/index.astro | 8 +- apps/marketing/src/pages/legal.astro | 12 +- apps/marketing/src/pages/privacy-policy.astro | 56 ++++----- .../marketing/src/pages/security-policy.astro | 40 +++--- .../src/pages/terms-of-service.astro | 56 ++++----- apps/mobile/README.md | 12 +- apps/mobile/app.config.ts | 13 +- .../modules/t3-markdown-text/UPSTREAM.md | 2 +- apps/mobile/src/Stack.tsx | 4 +- apps/mobile/src/components/BrandMark.tsx | 4 +- .../src/components/CompactBrandTitle.tsx | 2 +- apps/mobile/src/connection/platform.ts | 4 +- .../agent-awareness/remoteRegistration.ts | 2 +- .../archive/archivedThreadList.test.ts | 6 +- .../src/features/cloud/CloudAuthProvider.tsx | 2 +- .../cloud/ConnectOnboardingRouteScreen.tsx | 8 +- .../features/cloud/linkEnvironment.test.ts | 2 +- .../connection/CloudEnvironmentRows.tsx | 12 +- .../connection/ConnectionEnvironmentRow.tsx | 2 +- .../connection/environmentSections.test.ts | 2 +- .../src/features/home/homeThreadList.test.ts | 14 +-- .../features/settings/SettingsRouteScreen.tsx | 12 +- .../showcase/showcasePendingTasks.test.ts | 4 +- .../src/features/threads/ThreadComposer.tsx | 2 +- apps/mobile/src/lib/authClientMetadata.ts | 2 +- apps/mobile/src/lib/connection.test.ts | 2 +- apps/mobile/src/lib/repositoryGroups.test.ts | 8 +- apps/mobile/src/widgets/AgentActivity.test.ts | 2 +- apps/server/src/auth/utils.test.ts | 4 +- apps/server/src/bin.test.ts | 16 +-- apps/server/src/bin.ts | 6 +- apps/server/src/cli/config.ts | 2 +- apps/server/src/cli/connect.ts | 46 +++---- apps/server/src/cli/pair.test.ts | 6 +- apps/server/src/cli/pair.ts | 10 +- apps/server/src/cli/server.ts | 4 +- apps/server/src/cli/service.test.ts | 2 +- apps/server/src/cli/service.ts | 32 ++--- apps/server/src/cloud/CliState.ts | 2 +- apps/server/src/cloud/CliTokenManager.test.ts | 2 +- apps/server/src/cloud/CliTokenManager.ts | 14 +-- apps/server/src/cloud/bootService.ts | 4 +- apps/server/src/cloud/cliAuthHtml.test.ts | 6 +- apps/server/src/cloud/cliAuthHtml.ts | 10 +- apps/server/src/cloud/http.ts | 6 +- apps/server/src/cloud/selfUpdate.ts | 4 +- apps/server/src/cloud/servicePreflight.ts | 2 +- apps/server/src/mcp/McpHttpServer.ts | 2 +- .../provider/CodexDeveloperInstructions.ts | 6 +- .../src/provider/Layers/ClaudeProvider.ts | 4 +- .../src/provider/Layers/CodexProvider.ts | 8 +- .../Layers/CodexSessionRuntime.test.ts | 2 +- .../provider/Layers/CursorProvider.test.ts | 4 +- .../src/provider/Layers/CursorProvider.ts | 8 +- .../src/provider/Layers/GrokProvider.ts | 4 +- .../src/provider/Layers/KimiProvider.ts | 4 +- .../src/provider/Layers/OpenCodeProvider.ts | 10 +- .../provider/Layers/ProviderRegistry.test.ts | 4 +- .../src/provider/Layers/ProviderService.ts | 2 +- .../src/provider/acp/GrokAcpSupport.test.ts | 2 +- .../src/provider/providerMaintenanceRunner.ts | 4 +- .../src/provider/providerStatusCache.test.ts | 2 +- .../src/relay/AgentAwarenessRelay.test.ts | 6 +- apps/server/src/relay/AgentAwarenessRelay.ts | 6 +- apps/server/src/server.test.ts | 10 +- apps/server/src/server.ts | 4 +- apps/server/src/serverRuntimeStartup.ts | 2 +- apps/server/src/serviceLauncher.ts | 2 +- apps/server/src/startupAccess.ts | 2 +- .../textGeneration/OpenCodeTextGeneration.ts | 2 +- apps/server/src/vcs/GitVcsDriver.ts | 4 +- apps/web/index.html | 6 +- apps/web/public/apple-touch-icon.png | Bin 113787 -> 4256 bytes apps/web/public/favicon-16x16.png | Bin 2126 -> 478 bytes apps/web/public/favicon-32x32.png | Bin 5661 -> 838 bytes apps/web/public/favicon.ico | Bin 283825 -> 17767 bytes apps/web/src/authBootstrap.test.ts | 2 +- apps/web/src/branding.test.ts | 30 ++--- apps/web/src/branding.ts | 2 +- apps/web/src/cloud/connectOnboarding.ts | 2 +- apps/web/src/cloud/linkEnvironment.ts | 6 +- apps/web/src/cloud/primaryCloudLinkState.ts | 2 +- apps/web/src/cloud/useCloudLinkController.ts | 13 +- .../components/CommandPalette.logic.test.ts | 4 +- apps/web/src/components/RightPanelTabs.tsx | 2 +- apps/web/src/components/SplashScreen.tsx | 7 +- ...MobileClientsUserProfilePage.logic.test.ts | 2 +- .../MobileClientsUserProfilePage.logic.ts | 2 +- .../clerk/MobileClientsUserProfilePage.tsx | 4 +- .../clerk/T3ConnectSidebarSignIn.tsx | 2 +- .../cloud/CloudEnvironmentConnectList.tsx | 8 +- .../cloud/ConnectCliAuthSurface.tsx | 6 +- .../cloud/ConnectOnboardingDialog.tsx | 12 +- .../cloud/RelayClientInstallDialog.tsx | 8 +- .../desktop/SshPasswordPromptDialog.tsx | 2 +- .../components/desktopUpdate.logic.test.ts | 4 +- .../web/src/components/desktopUpdate.logic.ts | 10 +- .../src/components/preview/PreviewPanel.tsx | 2 +- .../settings/ConnectionsSettings.tsx | 48 ++++---- .../settings/KeybindingsSettings.tsx | 8 +- .../components/settings/SettingsPanels.tsx | 2 +- .../src/components/settings/providerStatus.ts | 3 +- apps/web/src/connection/platform.ts | 6 +- apps/web/src/routes/_chat.index.tsx | 2 +- apps/web/src/routes/_chat.tsx | 2 +- apps/web/src/versionSkew.test.ts | 6 +- apps/web/src/versionSkew.ts | 4 +- assets/dev/blueprint-ios-1024.png | Bin 2899990 -> 74200 bytes assets/dev/blueprint-macos-1024.png | Bin 2285299 -> 73256 bytes assets/dev/blueprint-universal-1024.png | Bin 2899990 -> 74200 bytes assets/dev/blueprint-web-apple-touch-180.png | Bin 113787 -> 4256 bytes assets/dev/blueprint-web-favicon-16x16.png | Bin 2126 -> 478 bytes assets/dev/blueprint-web-favicon-32x32.png | Bin 5661 -> 838 bytes assets/dev/blueprint-web-favicon.ico | Bin 283825 -> 17767 bytes assets/dev/blueprint-windows.ico | Bin 283825 -> 17767 bytes assets/nightly/nightly-ios-1024.png | Bin 1417068 -> 74200 bytes assets/nightly/nightly-macos-1024.png | Bin 2485580 -> 73256 bytes assets/nightly/nightly-universal-1024.png | Bin 1417068 -> 74200 bytes .../nightly/nightly-web-apple-touch-180.png | Bin 54758 -> 4256 bytes assets/nightly/nightly-web-favicon-16x16.png | Bin 979 -> 478 bytes assets/nightly/nightly-web-favicon-32x32.png | Bin 2590 -> 838 bytes assets/nightly/nightly-web-favicon.ico | Bin 146750 -> 17767 bytes assets/nightly/nightly-windows.ico | Bin 146750 -> 17767 bytes assets/platon/README.md | 16 +++ assets/platon/favicon.ico | Bin 0 -> 17767 bytes assets/platon/generated/app-icon-1024.png | Bin 0 -> 74200 bytes assets/platon/generated/app-icon-512.png | Bin 0 -> 20533 bytes .../platon/generated/app-icon-macos-1024.png | Bin 0 -> 73256 bytes assets/platon/generated/apple-touch-icon.png | Bin 0 -> 4256 bytes assets/platon/generated/favicon-16x16.png | Bin 0 -> 478 bytes assets/platon/generated/favicon-32x32.png | Bin 0 -> 838 bytes assets/platon/generated/favicon.ico | Bin 0 -> 17767 bytes assets/platon/generated/logo-wordmark.png | Bin 0 -> 18240 bytes assets/platon/generated/splash-1024.png | Bin 0 -> 38662 bytes assets/platon/generated/temple-from-ico.png | Bin 0 -> 9408 bytes assets/platon/generated/windows.ico | Bin 0 -> 17767 bytes assets/platon/platon-logo-white.png | Bin 0 -> 36517 bytes assets/prod/black-ios-1024.png | Bin 549578 -> 74200 bytes assets/prod/black-macos-1024.png | Bin 445437 -> 73256 bytes assets/prod/black-universal-1024.png | Bin 549578 -> 74200 bytes assets/prod/logo.svg | 11 +- assets/prod/platon-logo-full.png | Bin 0 -> 36517 bytes assets/prod/platon-logo-white.png | Bin 0 -> 18240 bytes assets/prod/t3-black-web-apple-touch-180.png | Bin 31728 -> 4256 bytes assets/prod/t3-black-web-favicon-16x16.png | Bin 787 -> 478 bytes assets/prod/t3-black-web-favicon-32x32.png | Bin 1919 -> 838 bytes assets/prod/t3-black-web-favicon.ico | Bin 82338 -> 17767 bytes assets/prod/t3-black-windows.ico | Bin 82338 -> 17767 bytes docs/README.md | 8 +- docs/internals/ci.md | 2 +- docs/internals/connection-runtime.md | 2 +- docs/internals/environment-auth.md | 2 +- docs/internals/glossary.md | 4 +- docs/internals/overview.md | 4 +- docs/internals/providers.md | 4 +- docs/internals/remote.md | 6 +- docs/internals/resource-telemetry.md | 2 +- docs/internals/scripts.md | 4 +- docs/internals/server-updates.md | 2 +- docs/internals/t3-code-connect-auth-flow.html | 22 ++-- docs/internals/t3-connect.md | 18 +-- docs/internals/workspace-layout.md | 4 +- .../mobile-app-store-screenshots.md | 10 +- docs/operations/observability.md | 6 +- docs/operations/relay-observability.md | 2 +- docs/operations/release.md | 8 +- docs/user/background-service.md | 20 +-- docs/user/install.md | 22 ++-- docs/user/keybindings.md | 2 +- docs/user/providers-claude.md | 26 ++-- docs/user/providers-codex.md | 12 +- docs/user/remote-access.md | 22 ++-- docs/user/source-control.md | 18 +-- docs/user/updating.md | 22 ++-- infra/relay/README.md | 16 +-- infra/relay/scripts/deploy.ts | 2 +- .../agentActivity/AgentActivityPublisher.ts | 6 +- .../src/agentActivity/ApnsClient.test.ts | 2 +- .../src/agentActivity/ApnsDeliveries.test.ts | 2 +- .../src/agentActivity/LiveActivities.test.ts | 2 +- .../agentActivity/apnsDeliveryJobs.test.ts | 2 +- infra/relay/src/observability.ts | 4 +- .../src/authorization/layer.test.ts | 2 +- .../src/authorization/remote.test.ts | 4 +- .../src/connection/onboarding.test.ts | 4 +- .../src/relay/managedRelayState.ts | 8 +- .../src/state/threadReducer.test.ts | 2 +- packages/contracts/src/environment.ts | 2 +- packages/contracts/src/relay.ts | 4 +- packages/contracts/src/settings.ts | 2 +- packages/contracts/src/t3ProjectFile.ts | 13 +- packages/shared/src/connectAuth.ts | 2 +- packages/shared/src/devHome.ts | 2 +- packages/shared/src/relayClient.ts | 2 +- packages/ssh/src/auth.ts | 8 +- scripts/announce-connect-ga.ts | 2 +- scripts/build-desktop-artifact.test.ts | 8 +- scripts/build-desktop-artifact.ts | 14 +-- scripts/dev-runner.ts | 2 +- scripts/mobile-showcase-environment.ts | 8 +- scripts/mobile-showcase.test.ts | 2 +- scripts/notify-discord-release.test.ts | 16 +-- scripts/notify-discord-release.ts | 6 +- scripts/rebrand-platon.mjs | 116 ++++++++++++++++++ scripts/release-smoke.ts | 2 +- scripts/resolve-nightly-release.test.ts | 2 +- scripts/resolve-nightly-release.ts | 2 +- 251 files changed, 853 insertions(+), 702 deletions(-) create mode 100644 assets/platon/README.md create mode 100644 assets/platon/favicon.ico create mode 100644 assets/platon/generated/app-icon-1024.png create mode 100644 assets/platon/generated/app-icon-512.png create mode 100644 assets/platon/generated/app-icon-macos-1024.png create mode 100644 assets/platon/generated/apple-touch-icon.png create mode 100644 assets/platon/generated/favicon-16x16.png create mode 100644 assets/platon/generated/favicon-32x32.png create mode 100644 assets/platon/generated/favicon.ico create mode 100644 assets/platon/generated/logo-wordmark.png create mode 100644 assets/platon/generated/splash-1024.png create mode 100644 assets/platon/generated/temple-from-ico.png create mode 100644 assets/platon/generated/windows.ico create mode 100644 assets/platon/platon-logo-white.png create mode 100644 assets/prod/platon-logo-full.png create mode 100644 assets/prod/platon-logo-white.png create mode 100644 scripts/rebrand-platon.mjs diff --git a/.agents/skills/ios-debugger-agent/SKILL.md b/.agents/skills/ios-debugger-agent/SKILL.md index 7afa579383d9..e74158a8a4e1 100644 --- a/.agents/skills/ios-debugger-agent/SKILL.md +++ b/.agents/skills/ios-debugger-agent/SKILL.md @@ -1,6 +1,6 @@ --- name: ios-debugger-agent -description: Build, launch, inspect, and drive iOS apps with the repository-configured XcodeBuildMCP server. Use on macOS for iOS Simulator builds, focused native test runs, semantic UI automation, screenshots, logs, or debugging, including T3 Code Mobile verification. +description: Build, launch, inspect, and drive iOS apps with the repository-configured XcodeBuildMCP server. Use on macOS for iOS Simulator builds, focused native test runs, semantic UI automation, screenshots, logs, or debugging, including Platon Code Mobile verification. --- # iOS Debugger Agent diff --git a/.agents/skills/ios-simulator-browser/SKILL.md b/.agents/skills/ios-simulator-browser/SKILL.md index 74b97530799c..59c83c3b72ce 100644 --- a/.agents/skills/ios-simulator-browser/SKILL.md +++ b/.agents/skills/ios-simulator-browser/SKILL.md @@ -1,6 +1,6 @@ --- name: ios-simulator-browser -description: Stream an explicit iOS Simulator through pinned serve-sim into the T3 Code in-app browser or another agent browser. Use on Apple Silicon macOS when the user should watch simulator verification live or when browser-visible simulator evidence is needed. +description: Stream an explicit iOS Simulator through pinned serve-sim into the Platon Code in-app browser or another agent browser. Use on Apple Silicon macOS when the user should watch simulator verification live or when browser-visible simulator evidence is needed. --- # iOS Simulator Browser @@ -11,7 +11,7 @@ Use serve-sim as the shared visual feed for an iOS Simulator. Use `ios-debugger- serve-sim `0.1.45` requires Apple Silicon macOS, Xcode command-line tools, and Node.js 20 or newer. If the host is unsupported, continue with XcodeBuildMCP screenshots and report that live streaming was unavailable. -When running inside T3 Code, use its product-native browser MCP to open the stream. Other agent hosts may use their own browser or preview surface. +When running inside Platon Code, use its product-native browser MCP to open the stream. Other agent hosts may use their own browser or preview surface. Keep serve-sim on its default `127.0.0.1` binding. Do not expose its preview to a LAN or tunnel unless the user explicitly requests that access and the network is trusted; the preview includes a token-gated shell-execution route. diff --git a/.agents/skills/ios-simulator-browser/agents/openai.yaml b/.agents/skills/ios-simulator-browser/agents/openai.yaml index 9e8cdf7a16b0..dd992b143278 100644 --- a/.agents/skills/ios-simulator-browser/agents/openai.yaml +++ b/.agents/skills/ios-simulator-browser/agents/openai.yaml @@ -1,4 +1,4 @@ interface: display_name: "iOS Simulator Browser" short_description: "Stream iOS Simulator in the browser" - default_prompt: "Use $ios-simulator-browser to stream the selected iOS Simulator into the T3 Code in-app browser." + default_prompt: "Use $ios-simulator-browser to stream the selected iOS Simulator into the Platon Code in-app browser." diff --git a/.agents/skills/test-t3-app/SKILL.md b/.agents/skills/test-t3-app/SKILL.md index 45524f6fcd33..a2feb03ff737 100644 --- a/.agents/skills/test-t3-app/SKILL.md +++ b/.agents/skills/test-t3-app/SKILL.md @@ -1,6 +1,6 @@ --- name: test-t3-app -description: Launch, retain, and test the T3 Code web app in isolated development environments, including first-try browser authentication with one-time pairing URLs, pairing-token recovery, worktree-safe state directories, cross-turn dev server lifecycle, and direct SQLite inspection or fixture seeding. Use when an agent needs to run T3 locally, iteratively test UI behavior with a human, recover from an expired or consumed pairing token, isolate dev state, or prepare test data in state.sqlite. +description: Launch, retain, and test the Platon Code web app in isolated development environments, including first-try browser authentication with one-time pairing URLs, pairing-token recovery, worktree-safe state directories, cross-turn dev server lifecycle, and direct SQLite inspection or fixture seeding. Use when an agent needs to run T3 locally, iteratively test UI behavior with a human, recover from an expired or consumed pairing token, isolate dev state, or prepare test data in state.sqlite. --- # Test T3 App @@ -28,7 +28,7 @@ The dev runner disables browser auto-open by default. Do not pass `--browser` du ### Verify a shared environment before human handoff -When another person will use the printed pairing URL, first open the shared origin without the pairing path or fragment in the controlled browser and confirm the T3 Code app loads. This browser navigation is required even when curl succeeds because browsers block some otherwise reachable ports before making a network request. +When another person will use the printed pairing URL, first open the shared origin without the pairing path or fragment in the controlled browser and confirm the Platon Code app loads. This browser navigation is required even when curl succeeds because browsers block some otherwise reachable ports before making a network request. Do not open the other person's complete pairing URL during this reachability check; doing so consumes its one-time token. If the agent also needs an authenticated browser, create and consume a separate pairing token, then leave a fresh token for the other person. diff --git a/.agents/skills/test-t3-mobile/SKILL.md b/.agents/skills/test-t3-mobile/SKILL.md index 98c1c3b20224..191a9de7ce55 100644 --- a/.agents/skills/test-t3-mobile/SKILL.md +++ b/.agents/skills/test-t3-mobile/SKILL.md @@ -1,6 +1,6 @@ --- name: test-t3-mobile -description: Launch and test T3 Code Mobile on an iOS Simulator or Android Emulator against disposable local T3 environments, including Metro and dev-client reuse, native rebuild decisions, per-client pairing, seeded projects, semantic UI control, screenshots, and iOS serve-sim streaming. Use after mobile UI or native changes, when reproducing phone or tablet behavior, pairing an emulator to isolated state, or verifying mobile behavior on macOS, Linux, or Windows. +description: Launch and test Platon Code Mobile on an iOS Simulator or Android Emulator against disposable local T3 environments, including Metro and dev-client reuse, native rebuild decisions, per-client pairing, seeded projects, semantic UI control, screenshots, and iOS serve-sim streaming. Use after mobile UI or native changes, when reproducing phone or tablet behavior, pairing an emulator to isolated state, or verifying mobile behavior on macOS, Linux, or Windows. --- # Test T3 Mobile @@ -28,7 +28,7 @@ Do not treat unavailable iOS tooling as a blocker when Android is a valid repres The development identity on both platforms is: -- App: `T3 Code Dev` +- App: `Platon Code Dev` - Bundle/package identifier: `com.t3tools.t3code.dev` - URL scheme: `t3code-dev` @@ -149,7 +149,7 @@ adb -s shell am start -W \ Run only the command for the selected platform. -In T3 Code Dev, open Add Environment and enter the complete `` and newly printed `Token`. Verify the expected seeded projects appear before exercising the affected flow. +In Platon Code Dev, open Add Environment and enter the complete `` and newly printed `Token`. Verify the expected seeded projects appear before exercising the affected flow. Pairing credentials are secret, short-lived, and single-use. Create a different credential for every simulator, emulator, physical device, or browser. If an attempt fails, issue a new credential rather than retrying the old one. Do not expose tokens in screenshots, commits, or final responses. @@ -157,7 +157,7 @@ Pairing credentials are secret, short-lived, and single-use. Create a different ### iOS -Use `snapshot_ui` and current element references from XcodeBuildMCP for taps and typing. Stream the same UDID through `ios-simulator-browser` so the user can watch in T3 Code when the host supports it. Use the stream as a visual feed rather than a reason to switch to fragile browser coordinates. +Use `snapshot_ui` and current element references from XcodeBuildMCP for taps and typing. Stream the same UDID through `ios-simulator-browser` so the user can watch in Platon Code when the host supports it. Use the stream as a visual feed rather than a reason to switch to fragile browser coordinates. ### Android @@ -171,7 +171,7 @@ Exercise only the affected flow on one representative device unless the change s 1. Confirm the app connected to the intended disposable environment instead of merely rendering an empty disconnected state. 2. Capture the relevant final state. -3. Remove the disposable environment from T3 Code Dev. +3. Remove the disposable environment from Platon Code Dev. 4. Remove any `adb reverse` rule created for this test with `adb -s reverse --remove tcp:`. 5. Stop only the serve-sim, Metro, backend, emulator, and log processes started by this test. 6. Remove only base directories and temporary Git repositories deliberately created for this test. Preserve them when they contain useful reproduction evidence. diff --git a/.agents/skills/test-t3-mobile/agents/openai.yaml b/.agents/skills/test-t3-mobile/agents/openai.yaml index e9518ce9e04a..d44683e531c9 100644 --- a/.agents/skills/test-t3-mobile/agents/openai.yaml +++ b/.agents/skills/test-t3-mobile/agents/openai.yaml @@ -1,4 +1,4 @@ interface: display_name: "Test T3 Mobile" - short_description: "Test T3 Code on iOS or Android" - default_prompt: "Use $test-t3-mobile to launch T3 Code against an isolated backend and verify the affected flow on an available simulator or emulator." + short_description: "Test Platon Code on iOS or Android" + default_prompt: "Use $test-t3-mobile to launch Platon Code against an isolated backend and verify the affected flow on an available simulator or emulator." diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index cc1f11cd8baf..739f1dd06de4 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,5 +1,5 @@ { - "name": "T3 Code Dev", + "name": "Platon Code Dev", "image": "debian:bookworm", "features": { "ghcr.io/devcontainers/features/git:1": {}, diff --git a/.github/workflows/deploy-relay.yml b/.github/workflows/deploy-relay.yml index f652844a54f3..d67cb052f54e 100644 --- a/.github/workflows/deploy-relay.yml +++ b/.github/workflows/deploy-relay.yml @@ -1,4 +1,4 @@ -name: Deploy T3 Connect relay +name: Deploy Platon Connect relay on: push: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ce47d6e6ed73..aabf22afaec5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -146,7 +146,7 @@ jobs: echo "release_channel=stable" >> "$GITHUB_OUTPUT" echo "version=$version" >> "$GITHUB_OUTPUT" echo "tag=v$version" >> "$GITHUB_OUTPUT" - echo "name=T3 Code v$version" >> "$GITHUB_OUTPUT" + echo "name=Platon Code v$version" >> "$GITHUB_OUTPUT" echo "cli_dist_tag=latest" >> "$GITHUB_OUTPUT" if [[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo "is_prerelease=false" >> "$GITHUB_OUTPUT" @@ -175,7 +175,7 @@ jobs: --github-output relay_public_config: - name: Resolve T3 Connect public config + name: Resolve Platon Connect public config needs: preflight if: ${{ !failure() && !cancelled() && needs.preflight.result == 'success' }} runs-on: blacksmith-8vcpu-ubuntu-2404 diff --git a/.plans/18-server-auth-model.md b/.plans/18-server-auth-model.md index 9f8ba8a05df1..bb9b3f1422e5 100644 --- a/.plans/18-server-auth-model.md +++ b/.plans/18-server-auth-model.md @@ -2,7 +2,7 @@ ## Purpose -Define the long-term server auth architecture for T3 Code before first-class remote environments ship. +Define the long-term server auth architecture for Platon Code before first-class remote environments ship. This plan is deliberately broader than the current WebSocket token check and narrower than a complete remote collaboration system. The goal is to make the server secure by default, keep local desktop UX frictionless, and leave clean integration points for future remote access methods. diff --git a/.plans/19-remote-endpoints-hosted-static.md b/.plans/19-remote-endpoints-hosted-static.md index ada2f681ce4a..f1b59af465de 100644 --- a/.plans/19-remote-endpoints-hosted-static.md +++ b/.plans/19-remote-endpoints-hosted-static.md @@ -324,7 +324,7 @@ Future tunnel provider responsibilities: - use existing backend pairing/session auth - never bypass server auth -The tunnel fabric can later be Pipenet-derived, Tailscale-derived, or another reverse tunnel implementation. The rest of T3 Code should only see an `AdvertisedEndpoint`. +The tunnel fabric can later be Pipenet-derived, Tailscale-derived, or another reverse tunnel implementation. The rest of Platon Code should only see an `AdvertisedEndpoint`. ## Security Checklist diff --git a/.plans/t3-connect-remote-setup.html b/.plans/t3-connect-remote-setup.html index 101c293bee1f..81dbe193d38d 100644 --- a/.plans/t3-connect-remote-setup.html +++ b/.plans/t3-connect-remote-setup.html @@ -91,12 +91,12 @@

Seamless npx t3 connect for remote boxes

$ npx t3 connect

-To set up T3 Connect, open this URL and sign in:
+To set up Platon Connect, open this URL and sign in:
  https://app.t3.codes/connect#B64URL_STATE_AND_CHALLENGE

Enter your authentication code: [code]

Connected as theo@t3.gg!

-Run T3 Code in the background whenever this machine boots? (y/n): y

-T3 Code is set up and ready to go. +Run Platon Code in the background whenever this machine boots? (y/n): y

+Platon Code is set up and ready to go.

Why this is a small change

@@ -237,7 +237,7 @@

Risks & checks

  • ⚠ Clerk redirect URI: confirm the CLI OAuth client accepts the hosted redirect and that the token endpoint honors PKCE exchange for codes issued to it. Verify in staging before the phase 2 commit. (Only external dependency in the plan.)
  • ⚠ systemd user env is minimal: always write absolute paths for node + t3 into the unit; never rely on PATH. Service failures are invisible by default — hence the phase 3 requirement to log to a printed file path.
  • -
  • ⚠ Linger prompt honesty: the y/n prompt should say the machine becomes reachable via T3 Connect whenever powered on — that's the feature, but say it.
  • +
  • ⚠ Linger prompt honesty: the y/n prompt should say the machine becomes reachable via Platon Connect whenever powered on — that's the feature, but say it.
  • ✓ Re-running connect when linked → idempotent: refresh token, re-confirm service, done.
diff --git a/AGENTS.md b/AGENTS.md index 7293998042aa..7777603a8010 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,34 +1,34 @@ -# T3 Code +# Platon Code -T3 Code is a minimal GUI for coding agents. A Node WebSocket server wraps provider CLIs (Codex, Claude Code, Cursor, Grok, Kimi, OpenCode) and serves web, desktop, and mobile clients. +Platon Code is a minimal GUI for coding agents. A Node WebSocket server wraps provider CLIs (Codex, Claude Code, Cursor, Grok, Kimi, OpenCode) and serves web, desktop, and mobile clients. -You can think of T3 Code as an open source "bring-your-own-subscription" alternative to apps like Claude Desktop, Codex App, Cursor Glass and Conductor. +You can think of Platon Code as an open source "bring-your-own-subscription" alternative to apps like Claude Desktop, Codex App, Cursor Glass and Conductor. -## What makes T3 Code special? +## What makes Platon Code special? -We have over 100,000 users who love T3 Code. It's important we maintain the things they love as we continue to iterate on the product. Here's a brief list of the things we can never compromise on. +We have over 100,000 users who love Platon Code. It's important we maintain the things they love as we continue to iterate on the product. Here's a brief list of the things we can never compromise on. ### 1. Open at the core -T3 Code is truly open. We share our roadmap, we share how we think about things, and of course we share all our code. A large number of our users run forks. We work in the open, and should strive to stay that way. +Platon Code is truly open. We share our roadmap, we share how we think about things, and of course we share all our code. A large number of our users run forks. We work in the open, and should strive to stay that way. ### 2. Performance without compromise -Lots of apps have gotten bogged down with bad tech decisions and "slop". We have not, and we're proud of the performance of T3 Code. We regularly audit for performance regressions, often caused by sending too much data over websockets, css animations causing gpu spikes, lists being hard to render, and more. Make sure all changes are considerate of performance impact. +Lots of apps have gotten bogged down with bad tech decisions and "slop". We have not, and we're proud of the performance of Platon Code. We regularly audit for performance regressions, often caused by sending too much data over websockets, css animations causing gpu spikes, lists being hard to render, and more. Make sure all changes are considerate of performance impact. ### 3. Remote ready -The architecture of T3 Code's websocket layer (npx t3) enables a lot of awesome remote features. These have become core to the product. Whether users are connecting directly over their local network, using Tailscale, or leaning in fully with T3 Connect (our tunnel solution, also in this repo), we need to make sure new features are properly supported. +The architecture of Platon Code's websocket layer (npx t3) enables a lot of awesome remote features. These have become core to the product. Whether users are connecting directly over their local network, using Tailscale, or leaning in fully with Platon Connect (our tunnel solution, also in this repo), we need to make sure new features are properly supported. ### 4. Multi-surface -T3 Code has 3 key app surfaces: **web**, **desktop**, and **mobile**. +Platon Code has 3 key app surfaces: **web**, **desktop**, and **mobile**. **Web** is kind of two surfaces, as we have the public facing "app.t3.codes" as well as locally hosting the web app through the `npx t3` command. Both need to be supported by all new features where reasonable. **Desktop** is the main surface most users install first. It's a full Electron app that bundles the server runner as well. The desktop app can also be used as the host server, allowing remote connections from app.t3.codes or the mobile app. -**Mobile** is a React Native app for both iOS and Android, available on the App Store and Google Play. The mobile app allows for connecting to any T3 Code server to control work remotely. +**Mobile** is a React Native app for both iOS and Android, available on the App Store and Google Play. The mobile app allows for connecting to any Platon Code server to control work remotely. ## A note from Theo @@ -38,17 +38,17 @@ Channel both "measure twice, cut once" and "yagni". Fight scope creep. Try to ho The rest of this document is meant to help you navigate the codebase and make changes effectively. Think of these instructions less as "hard rules", more as "good defaults". The developer's preferences should be able to override anything here. -Of note: Most T3 Code contributions will come from T3 Code itself, often controlled remotely. This means you should be careful about accessing data, killing dev servers, and other things that may damage the T3 Code instance that the contributor is using. +Of note: Most Platon Code contributions will come from Platon Code itself, often controlled remotely. This means you should be careful about accessing data, killing dev servers, and other things that may damage the Platon Code instance that the contributor is using. ## A small glossary We need to be on the same page with terminology. When communicating, use this language: -- **you** means the agent reading this file and changing T3 Code. -- **we, us, and maintainers** mean Theo, Julius and the people building T3 Code. These are who you are talking to now. -- **user** means the person using T3 Code to direct coding agents. -- **agent** means the coding agent a user runs inside T3 Code. Depending on context, that may also include you. -- **provider** means the agent runtime or harness T3 Code talks to, such as Codex, Claude, Cursor, or OpenCode. +- **you** means the agent reading this file and changing Platon Code. +- **we, us, and maintainers** mean Theo, Julius and the people building Platon Code. These are who you are talking to now. +- **user** means the person using Platon Code to direct coding agents. +- **agent** means the coding agent a user runs inside Platon Code. Depending on context, that may also include you. +- **provider** means the agent runtime or harness Platon Code talks to, such as Codex, Claude, Cursor, or OpenCode. - **client** means the web, desktop, or mobile UI. - **environment** means one running T3 server and the machine, filesystem, provider credentials, and state it owns. - **project** means an environment-local workspace record rooted at a directory. @@ -59,7 +59,7 @@ We need to be on the same page with terminology. When communicating, use this la ## The three ways to hurt yourself 1. **Killing by pattern.** Never `pkill -f`, `pgrep | kill`, or `kill` a PID you found by matching a name, path, or worktree string. Your own agent process has this worktree's path in its argv, and this machine runs several other dev servers at once. Kill only a PID you captured at spawn, or the owner of your port from `ss -H -ltnp` after confirming `/proc//cwd` is your worktree. -2. **Writing to the live install.** `~/.t3/userdata` is the developer's real T3 Code database, in use while you work. Reading it and copying from it are fine, and a good way to get real test data (see Test data). Never start a server against it, never open it read-write, never clean it up. +2. **Writing to the live install.** `~/.t3/userdata` is the developer's real Platon Code database, in use while you work. Reading it and copying from it are fine, and a good way to get real test data (see Test data). Never start a server against it, never open it read-write, never clean it up. 3. **Baking in origins.** Never set `VITE_HTTP_URL` or `VITE_WS_URL` for dev. Dev is single-origin and Vite proxies `/api`, `/ws`, `/oauth`, and `/.well-known`. Setting them bakes localhost into the bundle and silently breaks every remote browser. ## Hit every surface diff --git a/README.md b/README.md index 008036e99642..3bfc5604f7fb 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,15 @@ -# T3 Code +# Platon Code -T3 Code is an "agent harness control surface". It enables control of the agents on your machine with a best-in-class mobile app ([iOS](https://apps.apple.com/us/app/t3-code-remote-claude-more/id6787819824), [Android](https://play.google.com/store/apps/details?id=com.t3tools.t3code)), [web app](https://app.t3.codes) and [Electron-based desktop app](https://t3.codes). +**Platon Code** is Platon’s agent harness control surface — a fork of [T3 Code](https://github.com/pingdotgg/t3code) rebranded and extended for our team. -Works with your subscriptions on Claude Code, Codex, Cursor, Grok Build, Kimi Code CLI, and OpenCode. If they're set up on your computer, T3 Code can control them. +Drive coding agents (Codex, Claude Code, Cursor, Grok Build, Kimi Code CLI, OpenCode) from web, desktop, and mobile, with remote-ready WebSocket hosting. -## "Wait, what are you selling me?" - -Nothing. We built T3 Code because we wanted the best possible development experience with agents. We were inspired by existing solutions like the Codex desktop app, Conductor, Claude Desktop and Cursor Glass, but none met our bar. - -We wanted something performant, remote-ready, and truly open. If we ever go the wrong direction, we want you to have everything you need to fork and build the editor that you want. +Brand marks live under [`assets/platon/`](./assets/platon/) and are applied across web/desktop/mobile icons. ## Installation > [!WARNING] -> T3 Code currently supports Codex, Claude, Cursor, Grok Build, Kimi Code CLI, and OpenCode. Install and authenticate at least one provider before use: +> Platon Code currently supports Codex, Claude, Cursor, Grok Build, Kimi Code CLI, and OpenCode. Install and authenticate at least one provider before use: > > - Codex: install [Codex CLI](https://developers.openai.com/codex/cli) and run `codex login` > - Claude: install [Claude Code](https://claude.com/product/claude-code) and run `claude auth login` @@ -24,13 +20,13 @@ We wanted something performant, remote-ready, and truly open. If we ever go the ### Try it out (install-free) -The easiest way to test T3 Code is to run the server in your terminal (requires Node.js 22.16+, 23.11+, or 24.10+): +The easiest way to test Platon Code is to run the server in your terminal (requires Node.js 22.16+, 23.11+, or 24.10+): ```bash npx t3@latest ``` -This will launch T3 Code's backend on your machine as well as the local web app to control your agents. +This will launch Platon Code's backend on your machine as well as the local web app to control your agents. Tip: Use `npx t3@latest --help` for the full CLI reference. @@ -73,7 +69,7 @@ Full docs live in [docs/](./docs). There's no docs site yet. - [Keeping app and server in sync](./docs/user/updating.md) - [Source control integrations](./docs/user/source-control.md) - Multiple accounts: [Codex](./docs/user/providers-codex.md) · [Claude](./docs/user/providers-claude.md) -- Linux: [run T3 Code as a background service](./docs/user/background-service.md) +- Linux: [run Platon Code as a background service](./docs/user/background-service.md) Building from source? Start at [docs/internals/overview.md](./docs/internals/overview.md). @@ -81,7 +77,7 @@ Building from source? Start at [docs/internals/overview.md](./docs/internals/ove ### Install `vp` -T3 Code uses Vite+ so you'll need to install the global `vp` command-line tool. +Platon Code uses Vite+ so you'll need to install the global `vp` command-line tool. #### macOS / Linux diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 1526965427f3..ad210f725f2d 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -35,5 +35,5 @@ "tailwindcss": "^4.0.0", "vite-plus": "catalog:" }, - "productName": "T3 Code (Alpha)" + "productName": "Platon Code (Alpha)" } diff --git a/apps/desktop/scripts/electron-launcher.mjs b/apps/desktop/scripts/electron-launcher.mjs index 929afeeabe9c..ce20ab261bdf 100644 --- a/apps/desktop/scripts/electron-launcher.mjs +++ b/apps/desktop/scripts/electron-launcher.mjs @@ -1,4 +1,4 @@ -// This file mostly exists because we want dev mode to say "T3 Code (Dev)" instead of "electron" +// This file mostly exists because we want dev mode to say "Platon Code (Dev)" instead of "electron" import * as NodeChildProcess from "node:child_process"; import * as NodeFS from "node:fs"; @@ -15,7 +15,7 @@ const repoRoot = NodePath.resolve(desktopDir, "..", ".."); const devBundleIdSuffix = NodePath.basename(repoRoot) .toLowerCase() .replaceAll(/[^a-z0-9]+/g, ""); -export const APP_DISPLAY_NAME = isDevelopment ? "T3 Code (Dev)" : "T3 Code (Alpha)"; +export const APP_DISPLAY_NAME = isDevelopment ? "Platon Code (Dev)" : "Platon Code (Alpha)"; export const APP_BUNDLE_ID = isDevelopment ? `com.t3tools.t3code.dev.${devBundleIdSuffix || "local"}` : "com.t3tools.t3code"; @@ -346,7 +346,7 @@ function buildMacLauncher(electronBinaryPath) { if (isDevelopment) { // Keep Electron's native executable inside the branded bundle. Launching the // node_modules copy makes macOS associate the process (and Dock label) with - // Electron.app even though this bundle's Info.plist has the T3 Code name. + // Electron.app even though this bundle's Info.plist has the Platon Code name. // Its conventional executable name also keeps Electron's default-app runtime // in development mode instead of making app.isPackaged report true. writeDevelopmentLauncherScript(launcherBinaryPath, runtimeElectronBinaryPath); diff --git a/apps/desktop/scripts/electron-launcher.test.mjs b/apps/desktop/scripts/electron-launcher.test.mjs index 1c82167ea217..43a2d8fb76f1 100644 --- a/apps/desktop/scripts/electron-launcher.test.mjs +++ b/apps/desktop/scripts/electron-launcher.test.mjs @@ -52,18 +52,18 @@ describe("electron development launcher", () => { it("keeps the native Electron executable name inside the branded macOS bundle", () => { const paths = resolveMacLauncherPaths( - "/repo/apps/desktop/.electron-runtime/T3 Code (Dev).app", - "T3 Code (Dev)", + "/repo/apps/desktop/.electron-runtime/Platon Code (Dev).app", + "Platon Code (Dev)", ); - assert.equal(paths.launcherExecutableName, "T3 Code (Dev) Launcher"); + assert.equal(paths.launcherExecutableName, "Platon Code (Dev) Launcher"); assert.equal( paths.launcherBinaryPath, - "/repo/apps/desktop/.electron-runtime/T3 Code (Dev).app/Contents/MacOS/T3 Code (Dev) Launcher", + "/repo/apps/desktop/.electron-runtime/Platon Code (Dev).app/Contents/MacOS/Platon Code (Dev) Launcher", ); assert.equal( paths.runtimeElectronBinaryPath, - "/repo/apps/desktop/.electron-runtime/T3 Code (Dev).app/Contents/MacOS/Electron", + "/repo/apps/desktop/.electron-runtime/Platon Code (Dev).app/Contents/MacOS/Electron", ); const script = makeDevelopmentLauncherScript({ @@ -74,7 +74,7 @@ describe("electron development launcher", () => { }); assert.include( script, - "exec '/repo/apps/desktop/.electron-runtime/T3 Code (Dev).app/Contents/MacOS/Electron'", + "exec '/repo/apps/desktop/.electron-runtime/Platon Code (Dev).app/Contents/MacOS/Electron'", ); assert.notInclude(script, "node_modules/electron"); }); diff --git a/apps/desktop/src/app/DesktopApp.ts b/apps/desktop/src/app/DesktopApp.ts index fd86c5f05d25..147eaccdda8f 100644 --- a/apps/desktop/src/app/DesktopApp.ts +++ b/apps/desktop/src/app/DesktopApp.ts @@ -125,7 +125,7 @@ const handleFatalStartupError = Effect.fn("desktop.startup.handleFatalStartupErr const wasQuitting = yield* Ref.getAndSet(state.quitting, true); if (!wasQuitting) { yield* electronDialog.showErrorBox( - "T3 Code failed to start", + "Platon Code failed to start", `Stage: ${stage}\n${message}${detail}`, ); } diff --git a/apps/desktop/src/app/DesktopAppIdentity.test.ts b/apps/desktop/src/app/DesktopAppIdentity.test.ts index 6c5385e70a6d..c269b4a15ab3 100644 --- a/apps/desktop/src/app/DesktopAppIdentity.test.ts +++ b/apps/desktop/src/app/DesktopAppIdentity.test.ts @@ -20,9 +20,9 @@ const defaultEnvironmentInput = { platform: "darwin", processArch: "arm64", appVersion: "1.2.3", - appPath: "/Applications/T3 Code.app/Contents/Resources/app.asar", + appPath: "/Applications/Platon Code.app/Contents/Resources/app.asar", isPackaged: true, - resourcesPath: "/Applications/T3 Code.app/Contents/Resources", + resourcesPath: "/Applications/Platon Code.app/Contents/Resources", runningUnderArm64Translation: false, } satisfies DesktopEnvironment.MakeDesktopEnvironmentInput; @@ -39,7 +39,7 @@ interface ElectronAppCalls { const makeElectronAppLayer = (calls: ElectronAppCalls) => Layer.succeed(ElectronApp.ElectronApp, { metadata: Effect.die("unexpected metadata read"), - name: Effect.succeed("T3 Code"), + name: Effect.succeed("Platon Code"), whenReady: Effect.void, quit: Effect.void, exit: () => Effect.void, @@ -127,7 +127,7 @@ const withIdentity = ( input.legacyPathProbeError ? Effect.fail(input.legacyPathProbeError) : Effect.succeed( - input.legacyPathExists === true && path.includes("T3 Code (Alpha)"), + input.legacyPathExists === true && path.includes("Platon Code (Alpha)"), ), readFileString: () => Effect.succeed(input.packageJson ?? '{"t3codeCommitHash":"abcdef1234567890"}'), @@ -148,14 +148,14 @@ describe("DesktopAppIdentity", () => { const identity = yield* DesktopAppIdentity.DesktopAppIdentity; const userDataPath = yield* identity.resolveUserDataPath; - assert.equal(userDataPath, "/Users/alice/Library/Application Support/T3 Code (Alpha)"); + assert.equal(userDataPath, "/Users/alice/Library/Application Support/Platon Code (Alpha)"); }), { legacyPathExists: true }, ), ); it.effect("preserves failures while inspecting the legacy userData path", () => { - const legacyPath = "/Users/alice/Library/Application Support/T3 Code (Alpha)"; + const legacyPath = "/Users/alice/Library/Application Support/Platon Code (Alpha)"; const cause = PlatformError.systemError({ _tag: "PermissionDenied", module: "FileSystem", @@ -193,8 +193,8 @@ describe("DesktopAppIdentity", () => { const identity = yield* DesktopAppIdentity.DesktopAppIdentity; yield* identity.configure; - assert.deepEqual(calls.setName, ["T3 Code (Alpha)"]); - assert.equal(calls.setAboutPanelOptions[0]?.applicationName, "T3 Code (Alpha)"); + assert.deepEqual(calls.setName, ["Platon Code (Alpha)"]); + assert.equal(calls.setAboutPanelOptions[0]?.applicationName, "Platon Code (Alpha)"); assert.equal(calls.setAboutPanelOptions[0]?.applicationVersion, "1.2.3"); assert.equal(calls.setAboutPanelOptions[0]?.version, "0123456789ab"); assert.deepEqual(calls.setDockIcon, ["/icon.png"]); diff --git a/apps/desktop/src/app/DesktopAssets.test.ts b/apps/desktop/src/app/DesktopAssets.test.ts index 2eb55c72057f..cf20331fc5b2 100644 --- a/apps/desktop/src/app/DesktopAssets.test.ts +++ b/apps/desktop/src/app/DesktopAssets.test.ts @@ -15,9 +15,9 @@ const environmentLayer = DesktopEnvironment.layer({ platform: "darwin", processArch: "arm64", appVersion: "1.2.3", - appPath: "/Applications/T3 Code.app/Contents/Resources/app.asar", + appPath: "/Applications/Platon Code.app/Contents/Resources/app.asar", isPackaged: true, - resourcesPath: "/Applications/T3 Code.app/Contents/Resources", + resourcesPath: "/Applications/Platon Code.app/Contents/Resources", runningUnderArm64Translation: false, }).pipe(Layer.provide(Layer.mergeAll(NodeServices.layer, DesktopConfig.layerTest({})))); diff --git a/apps/desktop/src/app/DesktopClerk.test.ts b/apps/desktop/src/app/DesktopClerk.test.ts index 2f61ca909aef..23a1d108d967 100644 --- a/apps/desktop/src/app/DesktopClerk.test.ts +++ b/apps/desktop/src/app/DesktopClerk.test.ts @@ -35,7 +35,7 @@ const makeDesktopClerkLayer = (isDevelopment = true, events: string[] = []) => { isDevelopment, appDataDirectory: "/tmp/app-data", userDataDirName: isDevelopment ? "t3code-dev" : "t3code", - legacyUserDataDirName: isDevelopment ? "T3 Code (Dev)" : "T3 Code (Alpha)", + legacyUserDataDirName: isDevelopment ? "Platon Code (Dev)" : "Platon Code (Alpha)", path: { join: (...parts: ReadonlyArray) => parts.join("/") }, } as unknown as DesktopEnvironment.DesktopEnvironment["Service"]); diff --git a/apps/desktop/src/app/DesktopClerk.ts b/apps/desktop/src/app/DesktopClerk.ts index 9611dc083d2f..d00da3be9279 100644 --- a/apps/desktop/src/app/DesktopClerk.ts +++ b/apps/desktop/src/app/DesktopClerk.ts @@ -91,7 +91,7 @@ export const make = Effect.gen(function* () { // creates that directory when the lock is acquired. The SDK bridge takes // the lock at creation, so userData must already point at the real // directory here — under the default productName-derived path, acquiring - // the lock would create "T3 Code (Alpha)" and make the legacy-install + // the lock would create "Platon Code (Alpha)" and make the legacy-install // detection in resolveUserDataPath match on fresh installs. const userDataPath = yield* DesktopAppIdentity.resolveUserDataPath; yield* electronApp.setPath("userData", userDataPath); diff --git a/apps/desktop/src/app/DesktopEnvironment.test.ts b/apps/desktop/src/app/DesktopEnvironment.test.ts index 15d23f8e1522..95905cd43f60 100644 --- a/apps/desktop/src/app/DesktopEnvironment.test.ts +++ b/apps/desktop/src/app/DesktopEnvironment.test.ts @@ -13,9 +13,9 @@ const defaultInput = { platform: "darwin", processArch: "arm64", appVersion: "0.0.22", - appPath: "/Applications/T3 Code.app/Contents/Resources/app.asar", + appPath: "/Applications/Platon Code.app/Contents/Resources/app.asar", isPackaged: false, - resourcesPath: "/Applications/T3 Code.app/Contents/Resources", + resourcesPath: "/Applications/Platon Code.app/Contents/Resources", runningUnderArm64Translation: false, } satisfies DesktopEnvironment.MakeDesktopEnvironmentInput; diff --git a/apps/desktop/src/app/DesktopEnvironment.ts b/apps/desktop/src/app/DesktopEnvironment.ts index c991f5b39d6b..bb6635dcd8d6 100644 --- a/apps/desktop/src/app/DesktopEnvironment.ts +++ b/apps/desktop/src/app/DesktopEnvironment.ts @@ -76,7 +76,7 @@ export class DesktopEnvironment extends Context.Service< } >()("@t3tools/desktop/app/DesktopEnvironment") {} -const APP_BASE_NAME = "T3 Code"; +const APP_BASE_NAME = "Platon Code"; function resolveDesktopAppStageLabel(input: { readonly isDevelopment: boolean; @@ -161,7 +161,7 @@ const make = Effect.fn("desktop.environment.make")(function* ( isDevelopment && Option.isNone(configuredBaseDir) ? "dev" : "userdata", ); const userDataDirName = isDevelopment ? "t3code-dev" : "t3code"; - const legacyUserDataDirName = isDevelopment ? "T3 Code (Dev)" : "T3 Code (Alpha)"; + const legacyUserDataDirName = isDevelopment ? "Platon Code (Dev)" : "Platon Code (Alpha)"; const resourcesPath = input.resourcesPath; return DesktopEnvironment.of({ diff --git a/apps/desktop/src/app/DesktopLifecycle.test.ts b/apps/desktop/src/app/DesktopLifecycle.test.ts index 978e000a7f58..555c29978305 100644 --- a/apps/desktop/src/app/DesktopLifecycle.test.ts +++ b/apps/desktop/src/app/DesktopLifecycle.test.ts @@ -20,7 +20,7 @@ describe("DesktopLifecycle", () => { const electronAppLayer = Layer.succeed(ElectronApp.ElectronApp, { metadata: Effect.die("unexpected metadata read"), - name: Effect.succeed("T3 Code"), + name: Effect.succeed("Platon Code"), whenReady: Effect.void, quit: Effect.void, exit: () => Effect.void, diff --git a/apps/desktop/src/backend/DesktopBackendPool.ts b/apps/desktop/src/backend/DesktopBackendPool.ts index 9b85d1bb2430..af5aff4ce69f 100644 --- a/apps/desktop/src/backend/DesktopBackendPool.ts +++ b/apps/desktop/src/backend/DesktopBackendPool.ts @@ -241,7 +241,7 @@ export const layer = Layer.effect( ); yield* electronDialog.showErrorBox( "WSL backend is still unavailable", - `${reason}\n\nT3 Code will use the Windows backend for this launch and retry WSL the next time the app starts.`, + `${reason}\n\nPlaton Code will use the Windows backend for this launch and retry WSL the next time the app starts.`, ); yield* appSettings.applyWslWindowsFallbackInMemory; return true; @@ -252,7 +252,7 @@ export const layer = Layer.effect( }); yield* electronDialog.showErrorBox( "WSL backend couldn't start", - `${reason}\n\nFalling back to the Windows backend so T3 Code can open. Re-enable the WSL backend from Settings > Connections once the WSL distro is fixed.`, + `${reason}\n\nFalling back to the Windows backend so Platon Code can open. Re-enable the WSL backend from Settings > Connections once the WSL distro is fixed.`, ); // Fully disable the WSL backend — both flags, matching the "Switch to // Windows" recovery path — so the manager's next restart re-resolves the diff --git a/apps/desktop/src/backend/DesktopLocalEnvironmentAuth.ts b/apps/desktop/src/backend/DesktopLocalEnvironmentAuth.ts index 201492f0e4c1..2504f9737213 100644 --- a/apps/desktop/src/backend/DesktopLocalEnvironmentAuth.ts +++ b/apps/desktop/src/backend/DesktopLocalEnvironmentAuth.ts @@ -71,7 +71,7 @@ export const make = Effect.gen(function* () { httpBaseUrl: config.httpBaseUrl.href, credential, clientMetadata: { - label: "T3 Code Desktop", + label: "Platon Code Desktop", deviceType: "desktop", }, }).pipe( diff --git a/apps/desktop/src/electron/ElectronApp.test.ts b/apps/desktop/src/electron/ElectronApp.test.ts index ac14f56ad1a5..ab130c8fccdd 100644 --- a/apps/desktop/src/electron/ElectronApp.test.ts +++ b/apps/desktop/src/electron/ElectronApp.test.ts @@ -60,7 +60,7 @@ vi.mock("electron", () => ({ getVersion: getVersionMock, isDefaultProtocolClient: isDefaultProtocolClientMock, isPackaged: true, - name: "T3 Code", + name: "Platon Code", on: onMock, quit: quitMock, relaunch: relaunchMock, diff --git a/apps/desktop/src/electron/ElectronWindow.test.ts b/apps/desktop/src/electron/ElectronWindow.test.ts index 67819def623d..d92c020823ee 100644 --- a/apps/desktop/src/electron/ElectronWindow.test.ts +++ b/apps/desktop/src/electron/ElectronWindow.test.ts @@ -53,7 +53,7 @@ describe("ElectronWindow", () => { throw cause; }); const options = { - title: "T3 Code", + title: "Platon Code", width: 1100, height: 780, minWidth: 840, @@ -81,7 +81,7 @@ describe("ElectronWindow", () => { assert.instanceOf(error, ElectronWindow.ElectronWindowCreateError); assert.isTrue(ElectronWindow.isElectronWindowCreateError(error)); assert.deepEqual(error.options, { - title: "T3 Code", + title: "Platon Code", width: 1100, height: 780, minWidth: 840, @@ -104,7 +104,10 @@ describe("ElectronWindow", () => { assert.isFalse("icon" in error.options); assert.isFalse("spellcheck" in error.options.webPreferences); assert.strictEqual(error.cause, cause); - assert.equal(error.message, 'Failed to create Electron BrowserWindow "T3 Code" (1100x780).'); + assert.equal( + error.message, + 'Failed to create Electron BrowserWindow "Platon Code" (1100x780).', + ); assert.notInclude(error.message, cause.message); assert.deepEqual(browserWindowMock.mock.calls, [[options]]); }).pipe(Effect.provide(TestLayer)), diff --git a/apps/desktop/src/ssh/DesktopSshEnvironment.test.ts b/apps/desktop/src/ssh/DesktopSshEnvironment.test.ts index 1fe2b86aae7b..85ac91a6a4f7 100644 --- a/apps/desktop/src/ssh/DesktopSshEnvironment.test.ts +++ b/apps/desktop/src/ssh/DesktopSshEnvironment.test.ts @@ -30,7 +30,7 @@ describe("sshEnvironment", () => { assert.equal(cause.message, "Failed to present SSH password prompt for devbox."); assert.equal( DesktopSshEnvironment.toSshPasswordPromptError(cause).message, - "T3 Code window is not available for SSH authentication.", + "Platon Code window is not available for SSH authentication.", ); }); diff --git a/apps/desktop/src/ssh/DesktopSshEnvironment.ts b/apps/desktop/src/ssh/DesktopSshEnvironment.ts index 31e84ae995ed..b2574d222008 100644 --- a/apps/desktop/src/ssh/DesktopSshEnvironment.ts +++ b/apps/desktop/src/ssh/DesktopSshEnvironment.ts @@ -96,7 +96,7 @@ export function toSshPasswordPromptError( break; case "DesktopSshPromptWindowUnavailableError": case "DesktopSshPromptPresentationError": - message = "T3 Code window is not available for SSH authentication."; + message = "Platon Code window is not available for SSH authentication."; break; case "DesktopSshPromptTimedOutError": message = `SSH authentication timed out for ${cause.destination}.`; diff --git a/apps/desktop/src/ssh/DesktopSshPasswordPrompts.ts b/apps/desktop/src/ssh/DesktopSshPasswordPrompts.ts index aa25d8135c7a..125a85c80454 100644 --- a/apps/desktop/src/ssh/DesktopSshPasswordPrompts.ts +++ b/apps/desktop/src/ssh/DesktopSshPasswordPrompts.ts @@ -63,7 +63,7 @@ export class DesktopSshPromptWindowUnavailableError extends Schema.TaggedErrorCl ) { override get message(): string { const request = this.requestId === null ? "before a request id was assigned" : this.requestId; - return `T3 Code window is unavailable during ${this.stage} for SSH authentication to ${this.destination} (request: ${request}).`; + return `Platon Code window is unavailable during ${this.stage} for SSH authentication to ${this.destination} (request: ${request}).`; } } diff --git a/apps/desktop/src/telemetry/DesktopTelemetryPublisher.test.ts b/apps/desktop/src/telemetry/DesktopTelemetryPublisher.test.ts index 36cdcb50b6ba..b54e58ccd291 100644 --- a/apps/desktop/src/telemetry/DesktopTelemetryPublisher.test.ts +++ b/apps/desktop/src/telemetry/DesktopTelemetryPublisher.test.ts @@ -25,7 +25,7 @@ function makeElectronAppLayer( ) { return Layer.succeed(ElectronApp.ElectronApp, { metadata: Effect.die("unexpected metadata read"), - name: Effect.succeed("T3 Code"), + name: Effect.succeed("Platon Code"), whenReady: Effect.void, quit: Effect.void, exit: () => Effect.void, diff --git a/apps/desktop/src/window/DesktopApplicationMenu.test.ts b/apps/desktop/src/window/DesktopApplicationMenu.test.ts index f04a49f82afa..5eb7cc0489bb 100644 --- a/apps/desktop/src/window/DesktopApplicationMenu.test.ts +++ b/apps/desktop/src/window/DesktopApplicationMenu.test.ts @@ -30,7 +30,7 @@ const environmentInput = { const electronAppLayer = Layer.succeed(ElectronApp.ElectronApp, { metadata: Effect.die("unexpected metadata read"), - name: Effect.succeed("T3 Code"), + name: Effect.succeed("Platon Code"), whenReady: Effect.void, quit: Effect.void, exit: () => Effect.void, diff --git a/apps/desktop/src/window/DesktopApplicationMenu.ts b/apps/desktop/src/window/DesktopApplicationMenu.ts index a52707627b0a..e12e79dadbb9 100644 --- a/apps/desktop/src/window/DesktopApplicationMenu.ts +++ b/apps/desktop/src/window/DesktopApplicationMenu.ts @@ -59,7 +59,7 @@ const checkForUpdatesFromMenu = Effect.gen(function* () { yield* electronDialog.showMessageBox({ type: "info", title: "You're up to date!", - message: `T3 Code ${updateState.currentVersion} is currently the newest version available.`, + message: `Platon Code ${updateState.currentVersion} is currently the newest version available.`, buttons: ["OK"], }); } else if (updateState.status === "error") { diff --git a/apps/desktop/src/wsl/DesktopWslEnvironment.ts b/apps/desktop/src/wsl/DesktopWslEnvironment.ts index c6c274d8500b..cce49ab9b813 100644 --- a/apps/desktop/src/wsl/DesktopWslEnvironment.ts +++ b/apps/desktop/src/wsl/DesktopWslEnvironment.ts @@ -220,7 +220,7 @@ const NODE_PTY_PREBUILD_MISSING_EXIT_CODE = 4; export const formatNodePtyProbeFailureReason = (exitCode: number): string | null => exitCode === NODE_PTY_PREBUILD_MISSING_EXIT_CODE - ? "WSL support is missing from this T3 Code build: the packaged Linux node-pty binary was not included. Rebuild the Windows artifact with `--wsl-prebuild ` or install a build that includes WSL support." + ? "WSL support is missing from this Platon Code build: the packaged Linux node-pty binary was not included. Rebuild the Windows artifact with `--wsl-prebuild ` or install a build that includes WSL support." : null; const NODE_PTY_PROBE_SCRIPT = ( diff --git a/apps/marketing/public/apple-touch-icon.png b/apps/marketing/public/apple-touch-icon.png index 9c593ce352ce0a7500804835e209d1e51c017b83..e645ee053568b32bc7b94c34e3524610bab02df3 100644 GIT binary patch literal 4256 zcmc(iX*3iL_s1&|Q`WK1*q5<{j1016tYggg1 zM)gt?!HL0E#eykDvqIy=^haUUP!Loo<0onl^zrqEJJUhWE|2~ z#jTQUVgxu8tU@o)mzQGhAa}69%ZZ#!;6b|M(-8|Wmf*tOPC7jgJH_?>*UJA$B0XcB zy@n)KQHQf5FZ>xTzMtN;$b_+47JmJMJ3j9IbrU8d`?5=yws546SF;|l(K{I!T5TtM z9)mPdk;%~yY!W)l1w$kQzB6^6vd_=u_)e`AvvpSi>SV5aek?UC*E)iK&PIhB{hU}! zgKVq_O>{Z?;MKgjY?}*liy~AodcD@a|MZDvK*RJ27pQ}9LVG2s@zxig1U}{}*bKQX zY1VgcDJ)Mo5}$)iyxW-&vuoT3j=W
  • yKTuGb~@8ZeY8ogrN|uEPMt48kL(1+Fid zpR)t!J~kW-FwQrrBcg)N{-`#IICI;x@4YpJv%L`yge-K!+vL5@F)n?tH&bHN<7+gG zk=R5DgWQZL4>^mG>xxjqK+(a?`k_koqFc=wd;D9c^(VV4HXsgQxJ+p3;-S^;wd_dV zoi~GQn?dH<=+p-TP@gn)rVucn8dZE!c7jltCb3wwR;w8Pn&Sh~R;B8m9q~7EV?t-T z&Z%$j@*D!ZIA|a;f=mz0bC8x7gl{{SU3pN{snS^BwQhq|im$#zb}f9Y!ksiRl>%Mc^_V6nwefSQ0vnrYij# z>f;dE`9zaWqDs7#9LyJh)f?7hx!i;aO5JY z%lHAq{H(VK11krd&|#vq6*7f?$CJ|C8ysxy7+@I_w=Y;bKlMud*Qbc`QF(pK#WK&l zvJhw2&hA3p<_afC>b3g*PGm}1^cGbd5YU>8@*NRwhc7aD(~=$>+s&Nv)t4y^UP`@< zt}jk*F$6}ukob0edC%`~7xd#mDAS=-K9Hm1s<*r7x;UT;1>s8?6MM+v$n_(oA|#Ga zyX2fy7;Uk-eT0so2ywVh-HLfTZJJaZ&9$xYnacCMjz z3KaaOUR5)ERCHbK2WPS}^-Ox9vY**{uE`EKBqY#~I8>QcHWL6l)Q5 z#~uQI*(X~Gm~@#~rJWAoAk#0k-OihD78T#}7|GH5l(n?mo)20!N_+~*m^HYVWlhZP zMJKj)&rYU$l2+Ymhz>Jzac-M`HPlG#8djan7V?r(ZM0(oF?oWWg-#hR8p%?wr!Z*4 zGQFXXJ4aNL<=+ztWnnCVBs%nTYyw8Y?9^%3HQiQn1OV(+IXUaRj{A!OJE$L4-+2a> zXAh?^)23SHQ39C0tJ!)57Xy_qG)KJe)_^dvK^6mHPRK3;qF z@nVEjwT{GY{%Sn^a^E9;f!5-@87|J7dXc-AO}?#l`ygeBf_Qv>Oix>-`!Nd|Q<`TM zyy4w=7M+eHT^2U>~;VYl*N2IV_%ZH!%$_O-&@@F^XEKsLgWF2t4#H9oQ7(A= z89Yo+=dGei=hGCcZrnNZh5X)+9ypWF@%L@QxO{kw^LgRcSJIW`4u)hU0KIH8_1CH@ zYLpTJ{J1D*O zXY6V49%o)^sdR2BWqswjv+;8Fu%P)Me2J-kM0bPs0GKMYh18mk=8^6Dyy|UHTQt^NO`!_h*HU9j>kw=%RH})yZe(rQ_1z&yKyIXGbeMZ?HcD{B|+y z+G$=44lDESlgCQu)51$lBZNkhOb$~(l6`NAa_0agqe?}#R@yx^dB*T7DZ9>Tz zB=^)i?>1fniQxS)I>1C9BMJEnrkTZ&o;9(H!5GaL+A3LV@~P;7BsN4p^)l zuE?W*(&j~0N#F4j?om=xmf7+mr*C0In2>dv>?_iv=Rphf{*r7wf!N*_-9@`b>xcon z*RYp2HO?X)r|&Jyw*pWbP0=PHc-@1@`s<^D(zF>gZE7H*>drI@ot@iK?8)1Cjz{t@$wA%ZB!$>iWvN zEl8ubWbc;LD{bghi6=%F4{Z6f{~Ah^Vn5okZ&o;${QgN^2-ThRqx#KBpqzV*rRbQ? zcfF;!%HQ^>Y^OS>gT{1O5NKq`&z+_`do3m>04+sD-?*cnp^X2tCrb&kTwMmgcS<_IJ>?urnQOlu!8+?)N?##{V7nB>%%&Z~ zv&9%(J5#SJEse-p6e9}qRBV>vFhyo z%7YRXGprHRe-ey3E+I)L(Nq~G!ZmwK5J6d(RFLvJ@B10UjUVgTQMS(KAzf3N0(L@~zT6@{!wrz?1BfRgo zEcx&oP*iTI=AqLTyV@DQTEu+Ah)nTaJF#bOxWa#;S`rf98BlX$u&Qphl)Y=}P{YM9 z58^ZSa+6738##b(SX0c7=RNHEJ%!2V9-HgdXYlD%X*@3;A6R?ZHlu)GcB%vkpct1e zM5Uj2QPywF8isj%Tbad)K789MwyA4|VID7RCC<);Bi1?DyRizV7gn1i?_xs`J7va2 zd&;-SSlfjrv68NeoE$ur9@?PV8EU&$X9-7#tL51q!JZ4Ynf^p^ZwFbctAEOdqL6h? zqUJHG4YsTA6)~2@W6|@w>42r>{3iVfjyF@K=f8Gq-w5;pD!BZM#$;O-${V!2C9O z$v$c4f#TdfGWHqnGmWvdSj+5}hFOSw(nFrq#}AmoB|;v!^b6S?1s2I&>b7s;dfo@8 z{tk}Qx_tGq9g9AnYuu{46uEqv$KgD?gqp%l!C=O-9J7K<*&f0deLkF;9sJ>UGaHHf zn^3ICyX<%GfU@+tK@kc#${{d5mQH(1FDfF%n>c^`#N*AJU3*`pU@IN3i9>zxzyBC%Tb9j({P9hqVH)NwkF}9WY#76M1*+4jY}J1X){tLH0X z|J>H9Wnwh=CV`kwpFByGqpJ|0SoS-aJl;uOI1+cbf6zakztfh<*0Hk5)giaeyr#?0 u_IvkH`|(I`p``CWd;eoL|L+*KhKI)b;>QWoqubg4*+uA^>%D`!MEo1miTlt1 literal 2903 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 MZft|50-g!~12GFh1^@s6 diff --git a/apps/marketing/public/favicon-16x16.png b/apps/marketing/public/favicon-16x16.png index f85017caf75f8b4a8e75f5e59fc2d54606cf242a..6f451c829f2da1291f6b0bdddec0c0c601fb8e40 100644 GIT binary patch delta 463 zcmV;=0Wkia1KtCW8Gix*005AYXf^-<010qNS#tmY000000005%Wfr6W00EFmL_t(| zoQ0CVP8&fGhj(VZd$+qYXF_3=i1@$-6r?e-k&LC>*}{i-f<$qF6kY)FCUyx8R8RzJ zVlaO!Bou)~kx0BwbPyq*QOr+UtVZ9rzhXy-SAmf;DIf$2kbeSRI1oY#z>!IY9!&xL z0(cXEGzxG@<~Q|x*Dm)c>QU6S%bR-slgz8pj_2!^S30F=$jKvb{NeQnP98Y<&Fhc6 zG34ZwqVHZQ)3f6*?wgg4Dev0Ko~?FGxogUMwz_L89aBCqE8G4;rXiH>t1h;^FqE!{ zwyo#B>A8<+Lx1VoUid{9i_-pspM_bpzj*DQllN$5(A;tBj#~xvXVDHhx#hJFXfgsr zu18Uyq5yJ)>YSo;iXG;rQ1>bRNuM3$GC~0AjN(2u7!;wpp!kAfdJ-82m+3=UK?^)`wPROT0s~an)JPmqGeD(5p1AsUEl0&q^GTUT{SNgT(Erx+?X{f@{RK$$L%h}?vUC6d002ovPDHLk FV1i*(*0=xw delta 399 zcmV;A0dW4_1D*qr8Gi-<001BJ|6u?C00DDSM?wIu&K&6g000DMK}|sb0I`n?{9y$E z000SaNLh0L01m?d01m?e$8V@)0003qNklQHk(#5R~UvNR;!hOOsCVw z0X*PNr_=a6k1WgX0}h9S==JO`77HAYM=Y01q-iQD@O}S2U_PH?Hk&oRWm$-#NF*mo t0@rn$*q?wW^&Y^#mx))BNw4Vh7l4FwY9mL^(f|Me00>D%PDHLkV1o4psF?r& diff --git a/apps/marketing/public/favicon-32x32.png b/apps/marketing/public/favicon-32x32.png index fae2d285b7a35f80184e2aa7a3758c33df21f287..156a4116233c5770acd4dd8874d9260c2393bf00 100644 GIT binary patch delta 826 zcmV-A1I7H71;z%D8Gix*008_L?V|ty010qNS#tmY000000005%Wfr6W00Q_)L_t(| zob6UyPZL2D-kH60cjs(tNhwgJK$OH*>|!FMB-nN@MZ`z_4;p_{2g0iy(Z3G^K>9Hao+G8uj%_9yue zL0ofQA7bwdk$-79@qvu)D&{xk?jD#H=-Z$bKr2%A66i(H3!rU-W`Vv3cG#|Bz9*ya z9WQ{kMZ*f9l|kQ!?05h8Bk^jL&?{iu zTWR1}xmQulLnTXnjJkL1^*>`Oig~O|OvwYM2slp>R)2aW#TP|&PE5?Zz96a#qFQ~d zhtG+LMNyrU;vHD55;iwfGiZ!Ax93u9m5eNrp(Qf3LXvOf0f*wH6kjDt2VW)07gEeg z?38?SJ`p)ixmA&i=x?Ig*D=5wsHMA0Y*pubVdq z4I$qKNteN}K;MMSWmlk+mGY3WK(|28gVyN^^l`97KZr6I>yQp$p@~2n61)NtdL$Tz z={PA6b_IGo0-qu6Z@PmE0o+20zL2y<8)we0fq&Gv2E80?(j#Pn@yV`1vmytvP@oNY z$F8%{)l4ADk}?=&&?{i%L2I;ws=bzOSd@KQPS}@-E0A*qa*%NZ5W^sZW@WWR<0qv! z(~5BjcViO8gr}FTBM@fAl6@9!FDiOF>vS}GQb4!|lPg%}TD+v|HL`hGt$vc>VYG6K?el|H1lAJ^%m!07*qoM6N<$ Ef@6t%E&u=k delta 649 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 P(ts3=BOvo(M_B*>Duu|_ literal 10112 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 diff --git a/apps/marketing/public/icon.png b/apps/marketing/public/icon.png index 0a6e1cbfcff3433a3a96d97f3b7431292e1a96c1..77fc882667a00a17a164385cb8f4ebd3ca4f7f66 100644 GIT binary patch literal 20533 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 @@ -172,7 +172,7 @@ const sections = [

    We may use personal information to:

    • Comply with applicable laws, lawful requests, and legal process;
    • -
    • Protect the rights, privacy, safety, and property of T3 Tools, our users, and others;
    • +
    • Protect the rights, privacy, safety, and property of Platon, our users, and others;
    • Audit our internal processes for legal, contractual, and policy compliance;
    • Enforce the terms and conditions that govern the Site and the Services; and
    • @@ -217,7 +217,7 @@ const sections = [
    • Cloudflare (Cloudflare, Inc.).
      - We use Cloudflare for networking, T3 Connect infrastructure, and content delivery.
      + We use Cloudflare for networking, Platon Connect infrastructure, and content delivery.
      You can view Cloudflare's privacy policy here:{" "}https://www.cloudflare.com/policies/privacy/
    • PlanetScale (PlanetScale, Inc.).
      - We use PlanetScale to host the database that supports T3 Connect.
      + We use PlanetScale to host the database that supports Platon Connect.
      You can view PlanetScale's privacy policy here:{" "}https://planetscale.com/legal/privacy
    • Vercel (Vercel Inc.).
      - We use Vercel to host and deploy the T3 Code Site.
      + We use Vercel to host and deploy the Platon Code Site.
      You can view Vercel's privacy notice here:{" "}https://vercel.com/legal/privacy-notice We may share some or all personal information in connection with or during negotiation of a merger, financing, acquisition, reorganization, bankruptcy, dissolution, sale of - assets, or similar transaction. If another company acquires T3 Tools or its assets, that + assets, or similar transaction. If another company acquires Platon or its assets, that company may possess the personal information collected by us and assume the rights and obligations described in this Policy.

      @@ -295,7 +295,7 @@ const sections = [

      We may disclose personal information if we believe in good faith that disclosure is necessary to comply with law or legal process; protect or defend the rights, property, or - safety of T3 Tools, users of the Site or the Services, or others; investigate or prevent + safety of Platon, users of the Site or the Services, or others; investigate or prevent fraud, abuse, or unlawful activity; or enforce this Policy and the terms governing the Services. We may also share personal information at your direction, with your consent, or as described to you when the information is collected. @@ -347,7 +347,7 @@ const sections = [ security, fraud prevention, or legal compliance.

      - To request deletion of your T3 account and associated T3 Connect data, email{" "}privacy@t3.tools{" "}from the email address associated with your account. We may need to verify your identity. Deleting a T3 account does not delete information held by an environment or @@ -369,7 +369,7 @@ const sections = [

      06

      Security of Your Personal Information

      - T3 Tools is committed to protecting the security of your personal information. We use + Platon is committed to protecting the security of your personal information. We use administrative, technical, and organizational safeguards designed to protect personal information from unauthorized access, use, or disclosure. These safeguards include encrypted network transport, scoped and proof-bound access tokens for supported @@ -380,7 +380,7 @@ const sections = [ No method of transmission over the Internet or method of electronic storage is completely secure. While we use reasonable efforts to protect personal information, we cannot guarantee its absolute security. You are responsible for securing the environments, - coding-agent accounts, credentials, and networks that you connect to T3 Code. + coding-agent accounts, credentials, and networks that you connect to Platon Code.

      @@ -411,7 +411,7 @@ const sections = [

      09

      Do Not Track

      - We currently do not respond to browser “Do Not Track” signals. T3 Code does not use + We currently do not respond to browser “Do Not Track” signals. Platon Code does not use personal information for cross-context behavioral or targeted advertising.

      @@ -435,7 +435,7 @@ const sections = [ please contact us at:

      - T3 Tools, Inc.
      + Platon, Inc.
      2261 Market Street #5309
      San Francisco, CA 94114
      United States diff --git a/apps/marketing/src/pages/security-policy.astro b/apps/marketing/src/pages/security-policy.astro index c9b05ec36fd4..4cd6c082a276 100644 --- a/apps/marketing/src/pages/security-policy.astro +++ b/apps/marketing/src/pages/security-policy.astro @@ -13,10 +13,10 @@ const sections = [ --- Introduction

      This Security Policy describes the vulnerability-reporting process and security practices for - the T3 Code desktop and mobile applications, the hosted application at{" "}https://app.t3.codes, the optional T3 Connect service, and the T3 Code website at{" "}, the optional Platon Connect service, and the Platon Code website at{" "}https://t3.codes.

      - T3 Code connects software running on your devices and in environments you control with + Platon Code connects software running on your devices and in environments you control with coding-agent harnesses and providers you choose. We secure the software and infrastructure - operated by T3 Tools, but we do not control the security of your devices, environments, + operated by Platon, but we do not control the security of your devices, environments, repositories, networks, credentials, or third-party providers. Please review the shared responsibilities below when assessing risk.

      @@ -45,7 +45,7 @@ const sections = [

      02

      Reporting Security Issues

      - If you believe you have found a security vulnerability affecting T3 Code or T3 Tools-operated + If you believe you have found a security vulnerability affecting Platon Code or Platon-operated infrastructure, email{" "}security@ping.gg. Please do not disclose the issue publicly until we have had a reasonable opportunity to investigate and remediate it. @@ -82,12 +82,12 @@ const sections = [

    • Access only the minimum information needed to demonstrate the issue;
    • Avoid disrupting availability, degrading performance, or damaging or deleting data;
    • Not use social engineering, phishing, physical attacks, or denial-of-service testing;
    • -
    • Not test third-party services or infrastructure outside T3 Tools’ control; and
    • +
    • Not test third-party services or infrastructure outside Platon’ control; and
    • Give us reasonable time to address the issue before public disclosure.

    This safe harbor does not authorize violations of law or activity outside the scope of this - policy. Vulnerability rewards are not guaranteed and, if offered, are determined by T3 Tools + policy. Vulnerability rewards are not guaranteed and, if offered, are determined by Platon in its discretion.

    @@ -97,22 +97,22 @@ const sections = [

    Our Security Practices

    We use administrative, technical, and organizational safeguards designed for the nature of T3 - Code and the information processed by T3 Tools-operated services. These practices include: + Code and the information processed by Platon-operated services. These practices include: