diff --git a/.env.example b/.env.example index 828582ff..19c41ccf 100644 --- a/.env.example +++ b/.env.example @@ -98,7 +98,13 @@ PHONE_TRANSCRIBE_API_KEY= SUPERMEMORY_API_KEY= # Optional. Defaults to https://api.supermemory.ai. Self-hosted: http://localhost:6767 SUPERMEMORY_API_URL= +# Transactional auth email (verification and password reset). Leave blank and +# those flows report "belum tersedia" instead of failing at boot. +# Format: smtp://user:pass@host:587 or smtps://user:pass@host:465 SMTP_URL= +# Sender address for the emails above. Defaults to the SMTP_URL user when the +# URL carries credentials, so it is only required for credential-free relays. +SMTP_FROM= VAPID_PUBLIC_KEY= VAPID_PRIVATE_KEY= OTEL_EXPORTER_OTLP_ENDPOINT= diff --git a/.gitattributes b/.gitattributes index 2f57ad86..cf9eb7e0 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,7 +1,8 @@ * text=auto eol=lf + *.sh text eol=lf infra/sandboxes/computer/sentrabot-browser text eol=lf infra/sandboxes/computer/fluxbox.* text eol=lf -*.png filter=lfs diff=lfs merge=lfs -text -*.jpg filter=lfs diff=lfs merge=lfs -text -*.ico filter=lfs diff=lfs merge=lfs -text +*.png binary +*.jpg binary +*.ico binary diff --git a/README.md b/README.md index 208ba0be..189e5a86 100644 --- a/README.md +++ b/README.md @@ -1,863 +1,863 @@ - - - - - -
- -sentrabot - - -### [`SENTRA / BOT`](https://sentrahai.com/) - - - Sentra Bot — Intelligence for Autonomy. - - -Operational signal: persistent agents · memory · routines · computers · human authority - -Sentra Bot
-The autonomous intelligence layer of Sentra Artificial Intelligence. - -

- GitHub   - ferdiiskandar.com   - Sentra Artificial Intelligence   - Medium   - ORCID   - X   - LinkedIn   - Hugging Face -

- -PERCEIVE → REASON → VERIFY → HUMAN AUTHORITY → ACT - -
- ---- - -### `01 / ORIGIN SIGNAL` - -**[Sentra Bot](https://sentrahai.com/)** is the operating layer for persistent, composable AI teammates you actually own — agents that can hold memory, execute routines, use computers, and work against your own models, your own data, and your own machines. - -The repository is not a single chatbot and not a thin model wrapper. It contains the full runtime surface: API, web and desktop clients, background worker, job orchestration, memory, computer providers, connectors, artifacts, realtime infrastructure, and a deliberately read-only clinical reconnaissance bridge. - -The objective is precise: **make autonomous intelligence useful without making authority invisible.** - -

- Persistent agents - Durable memory - Human authority -

- - - - - - - -
- -LAYER I · INTELLIGENCE - -Agent runtime, typed orchestration, routines, memory, search, connections, artifacts, and model access. - - - - - - - -LAYER II · COMPUTERS - -Owned or remote execution surfaces: Docker, E2B, Daytona, Box, desktop, and deterministic fake providers for tests. - - - - - - - -LAYER III · AUTHORITY - -Authentication, membership, secrets, auditability, explicit boundaries, and human review before consequential action. - - - - - -
- -**Persistent does not mean unbounded. Autonomous does not mean unaudited.** - ---- - -### `02 / DOCTRINE` - -> [!IMPORTANT] -> **Autonomy is a capability. Authority is a boundary.** Sentra Bot may perceive, reason, prepare, and execute inside an approved scope; consequential authority remains explicit. - - - - - - - - - - - - - - -
- -THE HUMAN HOLDS THE KEY - -Machines propose; a human reviews, verifies, and acts. Nothing signs itself. In clinical paths, final authority is deliberately non-delegable. - - - -READ-ONLY UNTIL PROVEN - -Clinical integrations begin strictly read-only. No write reaches a patient record until the read path has been verified end to end. - -
- -BRING YOUR OWN MODEL & COMPUTER - -Models and computer providers remain replaceable. Run locally, use a remote sandbox, or point clients at a central deployment without binding the system to one vendor. - - - -SEPARABLE BY DESIGN - -Reasoning, memory, orchestration, computers, realtime, security, and persistence are independent surfaces that can be inspected or replaced without rewriting the whole system. - -
- -DURABLE STATE OVER EPHEMERAL COMPUTE - -A sandbox is where work runs, not where truth lives. Workspace state checkpoints back to durable storage; remote computers are runtime cache. - - - -NO MAGIC WITHOUT VERIFICATION - -The system should expose where work runs, where state lives, what boundary applies, and which human or policy controls the next action. - -
- ---- - -### `03 / SYSTEM TOPOLOGY` - -

- Hono API - Typed RPC - Postgres 16 - Graphile jobs - Better Auth -

- -

- Sentra Bot runtime signal -

- -
-LIVE TOPOLOGY // CONTROL & EXECUTION PLANE - -```mermaid -%%{init: {"flowchart": {"htmlLabels": false, "padding": 20}, "themeVariables": {"fontFamily": "monospace", "fontSize": "11px"}}}%% -flowchart TB - HUMAN["HUMAN / OPERATOR"] - CLIENT["WEB / ELECTRON CLIENT"] - API["API · :3100 · HONO + ORPC"] - DB["POSTGRESQL 16"] - JOBS["GRAPHILE JOB QUEUE"] - WORKER["BACKGROUND WORKER"] - SUP["SANDBOX SUPERVISOR · :7091"] - COMPUTER["BOT COMPUTER"] - DATA["DURABLE DATA_DIR"] - - HUMAN -->|intent / review| CLIENT - CLIENT -->|/api · /rpc · /health| API - API -->|Prisma / SQL| DB - API -->|publish work| JOBS - JOBS --> WORKER - WORKER -->|sandbox API| SUP - SUP -->|spawn / manage| COMPUTER - COMPUTER -->|checkpoint workspace| DATA - DATA -->|restore state| COMPUTER - DB -. LISTEN / NOTIFY .-> API - - classDef authority fill:#0D1117,stroke:#F59E0B,color:#ffffff,stroke-width:2px; - classDef agent fill:#0D1117,stroke:#8B5CF6,color:#ffffff,stroke-width:2px; - classDef control fill:#0D1117,stroke:#14B8A6,color:#ffffff,stroke-width:2px; - classDef core fill:#0D1117,stroke:#5B8CFF,color:#ffffff,stroke-width:2px; - classDef shared fill:#0D1117,stroke:#64748B,color:#ffffff,stroke-width:1.5px; - classDef surface fill:#0D1117,stroke:#22D3EE,color:#ffffff,stroke-width:1.5px; - - class HUMAN authority; - class WORKER,COMPUTER agent; - class SUP,JOBS control; - class API core; - class DB,DATA shared; - class CLIENT surface; -``` - -
- -**Runtime flow** - -1. Client calls the API over typed RPC under `/rpc/*`. -2. API enforces authentication and workspace membership. -3. State persists to Postgres through Prisma. -4. Thread events fan out through Postgres `LISTEN/NOTIFY`, with in-memory fanout available in tests. -5. Background work is published to the configured job driver and consumed by the worker. -6. Bot computers execute inside the configured sandbox provider. -7. Workspace state checkpoints back to durable `DATA_DIR`. - -> **Cloud sandboxes are runtime cache. Durable state is the source of truth.** - ---- - -### `04 / THE ENGINE ROOM` - - - - - - - - - - -
- -APPLICATIONS - -- `apps/api` — HTTP API, auth, typed orchestration -- `apps/web` — React + Vite client -- `apps/desktop` — Electron shell for Sentra Bot -- `apps/worker` — routines, wakeups, jobs, run continuation - - - -CORE PACKAGES - -- `adapter-kit` — ports and interfaces -- `adapters` — concrete execution + provider adapters -- `contracts` — shared typed RPC contracts -- `core` — pure domain logic -- `db` — Prisma schema, migrations, repositories -- `memory` — per-bot markdown memory - -
- -SHARED SURFACES - -- `auth` — Better Auth sessions + signup policy -- `chat-ui` — cross-platform markdown rendering -- `ui-tokens` — design tokens / theme primitives -- `ui-web` — shared React UI components -- `testkit` — topology, canary, computer E2E, performance - - - -INFRASTRUCTURE - -- `infra/compose` — Docker Compose topologies, Caddy, deployment assets -- `infra/sandboxes` — bot computer images + supervisor -- `scripts` — backup / restore utilities - -
- -
-REPOSITORY MAP // CANONICAL LAYOUT - -```text -sentra-agent/ -├── apps/ -│ ├── api/ # HTTP API + auth + orchestration (Hono, port 3100) -│ ├── web/ # React + Vite client (port 5173) -│ ├── desktop/ # Electron shell hosting the web client -│ └── worker/ # Background worker: routines, wakeups, jobs -├── packages/ -│ ├── adapter-kit/ # Shared ports & interfaces -│ ├── adapters/ # Sandboxes, executors, realtime, connectors, secrets -│ ├── auth/ # Better Auth wiring -│ ├── chat-ui/ # Cross-platform markdown rendering -│ ├── contracts/ # Shared typed RPC / service contracts -│ ├── core/ # Pure domain logic -│ ├── db/ # Prisma schema + migrations + repositories -│ ├── memory/ # Per-bot markdown memory -│ ├── testkit/ # Test and performance harnesses -│ ├── ui-tokens/ # Design tokens / theme primitives -│ └── ui-web/ # Shared React UI components -├── infra/ -│ ├── compose/ # Compose topologies + Dockerfile + Caddy + DEPLOY.md -│ └── sandboxes/ # Computer, desktop, supervisor images -└── scripts/ # backup.sh / restore.sh -``` - -
- - - - - - - - - - -
- -API - -apps/api · PORT 3100
-Hono + @orpc/server. Owns auth routes, typed RPC, trusted-origin CORS, health reporting, and wiring across database, realtime, jobs, sandboxes, secrets, memory, artifacts, runtime, and auth. - -
- -Web - -apps/web · PORT 5173
-React + Vite SPA. Talks to the API over RPC; Compose proxies `/api` and `/rpc` to the API container. - -
- -Desktop - -apps/desktop
-Electron shell with productName: "Sentra Bot". It is a client of the same API — not a second backend — and supports the trusted-host desktop sandbox path. - -
- -Worker - -apps/worker
-Long-running process that consumes the job queue, executes bot runs, reconciles scheduled routines, handles wakeups, and shares the same packages as the API. - -
- ---- - -### `05 / DATA & MEMORY PLANE` - -PRISMA · POSTGRESQL 16 · GRAPHILE · LISTEN/NOTIFY · DURABLE BOT STATE - - - - - - - - - - -
- -DATABASE - -**ORM:** Prisma -**Schema:** `packages/db/prisma/schema.prisma` -**Migrations:** `packages/db/prisma/migrations/` - -Core models include user, session, workspace, membership, bot, thread, message, run, event, routine, computer, lease, artifact, secret, model credential, connection, memory document, usage record, and deployment settings. - - - -MEMORY & DURABLE STATE - -Per-bot markdown memory lives behind the memory package. Computer workspaces checkpoint back to `DATA_DIR`, keeping persistent state independent from ephemeral cloud sandboxes. - -
- -JOBS - -`WAKEUP_DRIVER=graphile` uses a Postgres-backed Graphile Worker queue. -`WAKEUP_DRIVER=memory` swaps in an in-memory queue for tests and development. - - - -REALTIME - -Thread events fan out through Postgres `LISTEN/NOTIFY` via `PostgresRealtimeFanout`, with an in-memory implementation when no pool exists. - -
- -#### Database backends - -| Backend | Connection posture | Use | -| --- | --- | --- | -| **Local Compose Postgres 16** | `127.0.0.1:5433`, named volume `pgdata` | Local / self-hosted | -| **Supabase** | pooled `DATABASE_URL` on `6543`; direct `DIRECT_URL` on `5432` | Central deployment | - -> [!CAUTION] -> Prisma migrations run against `DIRECT_URL`. A pooled PgBouncer connection is not the migration surface. - ---- - -### `06 / COMPUTER & DEPLOYMENT MATRIX` - -

- Docker - E2B - Daytona - Box - Desktop -

- - - - - - - -
- -LOCAL DEV - -`docker-compose.yml` - -Postgres, supervisor, computer image, data-init, API, worker, and web. Postgres is published on loopback only. The supervisor — not the API — owns the Docker socket. - - - -SINGLE-VM PROD - -`docker-compose.prod.yml` - -Postgres + API + worker + web + Caddy. Hardened container posture with `no-new-privileges`, dropped capabilities, limits, internal network, and health checks. - - - -CENTRAL + SUPABASE - -`docker-compose.supabase.yml` - -API + worker + web + Caddy, without a local Postgres container. End users need only the web URL or desktop client pointed at the central origin. - -
- -#### Bot computer providers - -| Provider | Where bots run | Notes | -| --- | --- | --- | -| `docker` | Local Compose supervisor | Default local self-hosted path | -| `e2b` | Remote E2B cloud desktop | Recommended public / multi-user path; workspace checkpointed durably | -| `daytona` | Daytona sandboxes | Remote computer contract | -| `box` | Box by ASCII managed desktop | Shared desktop, `noEnv`, 2h TTL refresh | -| `desktop` | API / worker host | Trusted owned host only | -| `fake` | No real computer | Tests only | - -
-EDGE & HOST POSTURE - -**Caddy** - -`/health`, `/api/*`, and `/rpc/*` route to `api:3100`; everything else routes to `web:5173`. zstd + gzip are enabled. `CADDYFILE_PATH` and `Caddyfile.cloudflare.example` support a Cloudflare allowlist front for Full (strict) TLS. - -**Host hardening** - -```bash -sudo DEPLOY_USER=deploy bash infra/compose/harden-host.sh -``` - -The script disables SSH passwords/root login, rate-limits SSH, configures UFW allowlists, fail2ban, unattended upgrades, AppArmor, and audit rules. `docker-daemon.json` enables live-restore and bounded logs. - -**Backup / restore** - -```bash -./scripts/backup.sh -./scripts/restore.sh backups/ -``` - -Production uses `backup-prod.sh` with a systemd timer, seven-day rotation, and mode `0600`. - -
- ---- - -### `07 / CONFIGURATION SURFACE` - -> [!WARNING] -> Copy `.env.example` to `.env`. Never commit `.env`. It is gitignored and excluded from the Docker build context. - -| Variable | Purpose | -| --- | --- | -| `DATABASE_URL` | App DB connection; Supabase uses pooled / transaction port `6543`. | -| `DIRECT_URL` | Direct DB URL on `5432` for Prisma migrations. | -| `BETTER_AUTH_SECRET` | Auth secret, minimum 32 characters. | -| `BETTER_AUTH_URL` / `WEB_ORIGIN` / `API_URL` | Public origins for auth, cookies, and CORS. | -| `ENCRYPTION_KEY` | Encryption for stored credentials. | -| `DATA_DIR` | Durable bot homes, browser profiles, artifacts, workspace state. | -| `SIGNUPS_ENABLED` / `SIGNUP_ALLOWLIST` | Registration control. | -| `SANDBOX_PROVIDER` | `docker` / `e2b` / `daytona` / `box` / `desktop` / `fake`. | -| `SANDBOX_SUPERVISOR_URL` / `SANDBOX_SUPERVISOR_TOKEN` | Supervisor endpoint and shared credential. | -| `SANDBOX_IDLE_MS` / `SANDBOX_COMMAND_TIMEOUT_MS` | Sandbox idle and command timing. | -| `AGENT_RUNTIME` | `pi` for production; `scripted` for tests. | -| `WAKEUP_DRIVER` | `graphile` for production; `memory` for tests. | -| `OPENROUTER_API_KEY` / `PI_DEFAULT_PROVIDER` / `PI_DEFAULT_MODEL` | Model provider configuration and defaults. | -| `E2B_API_KEY` / `DAYTONA_API_KEY` / `DAYTONA_API_URL` / `DAYTONA_TARGET` / `BOX_API_KEY` / `BOX_API_URL` | Computer-provider credentials. | -| `COMPOSIO_API_KEY` | Optional plugins / connectors. | -| `EXPO_PUBLIC_API_URL` / `RAKAZO_WEB_URL` | Client overrides for a central origin. | -| `SMTP_URL` / `VAPID_*` | Optional email and push. | -| `OTEL_EXPORTER_OTLP_ENDPOINT` / `LOG_LEVEL` | Observability. | - ---- - -### `08 / RUN PROTOCOL` - - - - - - - - - - -
- -Local Docker - -FULL LOCAL TOPOLOGY - -```bash -cp .env.example .env -# set BETTER_AUTH_SECRET, ENCRYPTION_KEY, OPENROUTER_API_KEY - -pnpm install -pnpm sandbox:build - -docker compose --env-file .env \ - -f infra/compose/docker-compose.yml \ - up --build - -# open http://127.0.0.1:5173 -``` - -The first registered user becomes the deployment owner. - - - -Local Source - -SOURCE DEVELOPMENT - -```bash -cp .env.example .env -pnpm install -pnpm sandbox:build -pnpm dev - -# turbo: api + worker + web (+ supervisor) -# open http://127.0.0.1:5173 -``` - -
- -Single VM - -PRODUCTION - -```bash -docker compose --env-file .env \ - -f infra/compose/docker-compose.prod.yml \ - up -d --build - -curl --fail https://app.example.com/health -``` - - - -Supabase - -CENTRAL BACKEND - -1. Set pooled `DATABASE_URL` and direct `DIRECT_URL`. -2. Deploy Prisma migrations. -3. Start `docker-compose.supabase.yml`. - -```bash -pnpm --filter @rakazo/db exec prisma migrate deploy - -docker compose --env-file .env \ - -f infra/compose/docker-compose.supabase.yml \ - up -d --build -``` - -
- -#### Database migrations - -```bash -pnpm db:generate -pnpm db:migrate - -# production alternative -pnpm --filter @rakazo/db exec prisma migrate deploy -``` - ---- - -### `09 / VERIFICATION GATE` - -

- Typecheck - Biome - Vitest - Playwright - Canary -

- -```bash -pnpm check # type-check all packages -pnpm lint # biome -pnpm test # vitest unit tests -pnpm test:integration # integration harness -pnpm test:e2e -pnpm test:topology -pnpm test:canary -pnpm test:computer -pnpm perf:desktop -pnpm perf:compare -``` - -CI in `.github/workflows/ci.yml` runs check, lint, and test on pull requests and pushes. Playwright and nightly verification cover browser and longer-path checks. - -
-PROMOTION LOGIC // BUILD → VERIFY → OPERATE - -```mermaid -%%{init: {"flowchart": {"htmlLabels": false, "padding": 20}, "themeVariables": {"fontFamily": "monospace", "fontSize": "12px"}}}%% -flowchart TB - BUILD["BUILD"] - CHECK["TYPECHECK / LINT"] - TEST["UNIT / INTEGRATION"] - E2E["E2E / TOPOLOGY / CANARY"] - OPERATE["OPERATE"] - STOP["STOP / REPAIR"] - - BUILD --> CHECK - CHECK --> TEST - TEST --> E2E - E2E -->|verified| OPERATE - CHECK -. fail .-> STOP - TEST -. fail .-> STOP - E2E -. fail .-> STOP - STOP --> BUILD - - classDef authority fill:#0D1117,stroke:#F59E0B,color:#ffffff,stroke-width:2px; - classDef agent fill:#0D1117,stroke:#8B5CF6,color:#ffffff,stroke-width:2px; - classDef control fill:#0D1117,stroke:#14B8A6,color:#ffffff,stroke-width:2px; - classDef core fill:#0D1117,stroke:#5B8CFF,color:#ffffff,stroke-width:2px; - classDef surface fill:#0D1117,stroke:#22D3EE,color:#ffffff,stroke-width:1.5px; - - class OPERATE authority; - class TEST agent; - class CHECK,E2E control; - class BUILD core; - class STOP surface; -``` - -
- ---- - -### `10 / CLINICAL BOUNDARY` - -> [!CAUTION] -> **The RME bridge is read-only clinical reconnaissance. It is not a clinical write path.** - -The v0.1 adapter opens the RME in a headed Chromium browser, reads **one patient**, and produces structured, validated JSON. - -The boundary is deliberate: - -```text -MANUAL LOGIN - ↓ -ONE PATIENT - ↓ -READ-ONLY RECONNAISSANCE - ↓ -STRUCTURED JSON - ↓ -MANUAL VERIFICATION - ↓ -NO WRITE -``` - -- Credentials are never requested, stored, or committed. -- Login remains manual. -- The adapter does not write to the patient record. -- Scope does not expand to all patients or clinical AI until one-patient read behavior is manually verified end to end. - -**Clinical autonomy does not begin by granting write access. It begins by proving the read path.** - ---- - -### `11 / SENTRA OPERATING STANDARD` - -```text -No autonomy without a boundary. -No persistent agent without durable state. -No computer execution without an explicit provider. -No clinical write before the read path is proven. -No secret in source control. -No consequential action without human authority. -``` - - - - - - - - - - -
- -WHO HOLDS AUTHORITY? - -The relevant human operator or reviewer. In clinical paths, the human boundary is terminal. - - - -WHERE DOES STATE LIVE? - -Postgres and durable `DATA_DIR` — not an ephemeral cloud computer. - -
- -WHERE DOES WORK RUN? - -Inside the configured computer provider: Docker, E2B, Daytona, Box, desktop, or a fake test surface. - - - -HOW IS IT VERIFIED? - -Typed contracts, deterministic tests, topology checks, canaries, runtime health, and explicit human review where consequences require it. - -
- ---- - -### `12 / PACKAGE NAMESPACE & LICENSE` - -The product is **Sentra Bot**. - -Internal package identifiers historically retain the `@rakazo/*` namespace from the upstream codebase. This is intentional: user-facing branding changes what the product is called; compatibility-sensitive internal identifiers are not renamed without a technical reason. - -**License:** Apache 2.0 — see `LICENSE`. - -Operational contracts and security boundaries live in: - -- `SECURITY.md` -- `AGENTS.md` -- `.env.example` -- infrastructure deployment documentation under `infra/compose/` - -> Never commit secrets. - ---- - -### `13 / CREDIT` - - - - - - -
- -Rakazo upstream - -Rakazo
-Upstream open-source agent platform. - -
- -Sentra Bot is built on the shoulders of **Rakazo** — the upstream platform from which the repository inherits packaging, adapter architecture, and the persistent-bot engine. - -We thank the Rakazo authors and community. - -Everything Sentra-specific — **Sentra Bot branding, the clinical read-only direction, and the central Supabase deployment path** — is layered on top of that foundation. - -
- ---- - -### `14 / INSTRUMENTATION` - -ACTUAL REPOSITORY SURFACE · SENTRA BOT - - - - - - - - - - - - - - -
- -Runtime - -RUNTIME & APPLICATIONS
-Node.js 22 · Hono · @orpc/server · React · Vite · Electron · background worker - -
- -Data - -DATA & REALTIME
-PostgreSQL 16 · Supabase · Prisma · Graphile Worker · LISTEN/NOTIFY · durable DATA_DIR - -
- -Agent Surface - -AGENT & MEMORY
-Pi runtime · scripted test runtime · per-bot markdown memory · routines · wakeups · artifacts · connectors - -
- -Computers - -COMPUTER PROVIDERS
-Docker · E2B · Daytona · Box · desktop host · fake test provider · supervisor API - -
- -Security - -SECURITY & AUTHORITY
-Better Auth · membership enforcement · encryption key · secret store · read-only clinical boundary · host hardening · human authority - -
- -Quality - -QUALITY & OPERATIONS
-Biome · Vitest · Playwright · integration harness · topology tests · canary tests · computer E2E · performance checks · GitHub Actions - -
- ---- - -

- Sentra Bot · Intelligence for Autonomy.
- Part of the Sentra Artificial Intelligence ecosystem.
- // persistent intelligence. explicit authority. -

+ + + + + +
+ +sentrabot + + +### [`SENTRA / BOT`](https://sentrahai.com/) + + + Sentra Bot — Intelligence for Autonomy. + + +Operational signal: persistent agents · memory · routines · computers · human authority + +Sentra Bot
+The autonomous intelligence layer of Sentra Artificial Intelligence. + +

+ GitHub   + ferdiiskandar.com   + Sentra Artificial Intelligence   + Medium   + ORCID   + X   + LinkedIn   + Hugging Face +

+ +PERCEIVE → REASON → VERIFY → HUMAN AUTHORITY → ACT + +
+ +--- + +### `01 / ORIGIN SIGNAL` + +**[Sentra Bot](https://sentrahai.com/)** is the operating layer for persistent, composable AI teammates you actually own — agents that can hold memory, execute routines, use computers, and work against your own models, your own data, and your own machines. + +The repository is not a single chatbot and not a thin model wrapper. It contains the full runtime surface: API, web and desktop clients, background worker, job orchestration, memory, computer providers, connectors, artifacts, realtime infrastructure, and a deliberately read-only clinical reconnaissance bridge. + +The objective is precise: **make autonomous intelligence useful without making authority invisible.** + +

+ Persistent agents + Durable memory + Human authority +

+ + + + + + + +
+ +LAYER I · INTELLIGENCE + +Agent runtime, typed orchestration, routines, memory, search, connections, artifacts, and model access. + + + + + + + +LAYER II · COMPUTERS + +Owned or remote execution surfaces: Docker, E2B, Daytona, Box, desktop, and deterministic fake providers for tests. + + + + + + + +LAYER III · AUTHORITY + +Authentication, membership, secrets, auditability, explicit boundaries, and human review before consequential action. + + + + + +
+ +**Persistent does not mean unbounded. Autonomous does not mean unaudited.** + +--- + +### `02 / DOCTRINE` + +> [!IMPORTANT] +> **Autonomy is a capability. Authority is a boundary.** Sentra Bot may perceive, reason, prepare, and execute inside an approved scope; consequential authority remains explicit. + + + + + + + + + + + + + + +
+ +THE HUMAN HOLDS THE KEY + +Machines propose; a human reviews, verifies, and acts. Nothing signs itself. In clinical paths, final authority is deliberately non-delegable. + + + +READ-ONLY UNTIL PROVEN + +Clinical integrations begin strictly read-only. No write reaches a patient record until the read path has been verified end to end. + +
+ +BRING YOUR OWN MODEL & COMPUTER + +Models and computer providers remain replaceable. Run locally, use a remote sandbox, or point clients at a central deployment without binding the system to one vendor. + + + +SEPARABLE BY DESIGN + +Reasoning, memory, orchestration, computers, realtime, security, and persistence are independent surfaces that can be inspected or replaced without rewriting the whole system. + +
+ +DURABLE STATE OVER EPHEMERAL COMPUTE + +A sandbox is where work runs, not where truth lives. Workspace state checkpoints back to durable storage; remote computers are runtime cache. + + + +NO MAGIC WITHOUT VERIFICATION + +The system should expose where work runs, where state lives, what boundary applies, and which human or policy controls the next action. + +
+ +--- + +### `03 / SYSTEM TOPOLOGY` + +

+ Hono API + Typed RPC + Postgres 16 + Graphile jobs + Better Auth +

+ +

+ Sentra Bot runtime signal +

+ +
+LIVE TOPOLOGY // CONTROL & EXECUTION PLANE + +```mermaid +%%{init: {"flowchart": {"htmlLabels": false, "padding": 20}, "themeVariables": {"fontFamily": "monospace", "fontSize": "11px"}}}%% +flowchart TB + HUMAN["HUMAN / OPERATOR"] + CLIENT["WEB / ELECTRON CLIENT"] + API["API · :3100 · HONO + ORPC"] + DB["POSTGRESQL 16"] + JOBS["GRAPHILE JOB QUEUE"] + WORKER["BACKGROUND WORKER"] + SUP["SANDBOX SUPERVISOR · :7091"] + COMPUTER["BOT COMPUTER"] + DATA["DURABLE DATA_DIR"] + + HUMAN -->|intent / review| CLIENT + CLIENT -->|/api · /rpc · /health| API + API -->|Prisma / SQL| DB + API -->|publish work| JOBS + JOBS --> WORKER + WORKER -->|sandbox API| SUP + SUP -->|spawn / manage| COMPUTER + COMPUTER -->|checkpoint workspace| DATA + DATA -->|restore state| COMPUTER + DB -. LISTEN / NOTIFY .-> API + + classDef authority fill:#0D1117,stroke:#F59E0B,color:#ffffff,stroke-width:2px; + classDef agent fill:#0D1117,stroke:#8B5CF6,color:#ffffff,stroke-width:2px; + classDef control fill:#0D1117,stroke:#14B8A6,color:#ffffff,stroke-width:2px; + classDef core fill:#0D1117,stroke:#5B8CFF,color:#ffffff,stroke-width:2px; + classDef shared fill:#0D1117,stroke:#64748B,color:#ffffff,stroke-width:1.5px; + classDef surface fill:#0D1117,stroke:#22D3EE,color:#ffffff,stroke-width:1.5px; + + class HUMAN authority; + class WORKER,COMPUTER agent; + class SUP,JOBS control; + class API core; + class DB,DATA shared; + class CLIENT surface; +``` + +
+ +**Runtime flow** + +1. Client calls the API over typed RPC under `/rpc/*`. +2. API enforces authentication and workspace membership. +3. State persists to Postgres through Prisma. +4. Thread events fan out through Postgres `LISTEN/NOTIFY`, with in-memory fanout available in tests. +5. Background work is published to the configured job driver and consumed by the worker. +6. Bot computers execute inside the configured sandbox provider. +7. Workspace state checkpoints back to durable `DATA_DIR`. + +> **Cloud sandboxes are runtime cache. Durable state is the source of truth.** + +--- + +### `04 / THE ENGINE ROOM` + + + + + + + + + + +
+ +APPLICATIONS + +- `apps/api` — HTTP API, auth, typed orchestration +- `apps/web` — React + Vite client +- `apps/desktop` — Electron shell for Sentra Bot +- `apps/worker` — routines, wakeups, jobs, run continuation + + + +CORE PACKAGES + +- `adapter-kit` — ports and interfaces +- `adapters` — concrete execution + provider adapters +- `contracts` — shared typed RPC contracts +- `core` — pure domain logic +- `db` — Prisma schema, migrations, repositories +- `memory` — per-bot markdown memory + +
+ +SHARED SURFACES + +- `auth` — Better Auth sessions + signup policy +- `chat-ui` — cross-platform markdown rendering +- `ui-tokens` — design tokens / theme primitives +- `ui-web` — shared React UI components +- `testkit` — topology, canary, computer E2E, performance + + + +INFRASTRUCTURE + +- `infra/compose` — Docker Compose topologies, Caddy, deployment assets +- `infra/sandboxes` — bot computer images + supervisor +- `scripts` — backup / restore utilities + +
+ +
+REPOSITORY MAP // CANONICAL LAYOUT + +```text +sentra-agent/ +├── apps/ +│ ├── api/ # HTTP API + auth + orchestration (Hono, port 3100) +│ ├── web/ # React + Vite client (port 5173) +│ ├── desktop/ # Electron shell hosting the web client +│ └── worker/ # Background worker: routines, wakeups, jobs +├── packages/ +│ ├── adapter-kit/ # Shared ports & interfaces +│ ├── adapters/ # Sandboxes, executors, realtime, connectors, secrets +│ ├── auth/ # Better Auth wiring +│ ├── chat-ui/ # Cross-platform markdown rendering +│ ├── contracts/ # Shared typed RPC / service contracts +│ ├── core/ # Pure domain logic +│ ├── db/ # Prisma schema + migrations + repositories +│ ├── memory/ # Per-bot markdown memory +│ ├── testkit/ # Test and performance harnesses +│ ├── ui-tokens/ # Design tokens / theme primitives +│ └── ui-web/ # Shared React UI components +├── infra/ +│ ├── compose/ # Compose topologies + Dockerfile + Caddy + DEPLOY.md +│ └── sandboxes/ # Computer, desktop, supervisor images +└── scripts/ # backup.sh / restore.sh +``` + +
+ + + + + + + + + + +
+ +API + +apps/api · PORT 3100
+Hono + @orpc/server. Owns auth routes, typed RPC, trusted-origin CORS, health reporting, and wiring across database, realtime, jobs, sandboxes, secrets, memory, artifacts, runtime, and auth. + +
+ +Web + +apps/web · PORT 5173
+React + Vite SPA. Talks to the API over RPC; Compose proxies `/api` and `/rpc` to the API container. + +
+ +Desktop + +apps/desktop
+Electron shell with productName: "Sentra Bot". It is a client of the same API — not a second backend — and supports the trusted-host desktop sandbox path. + +
+ +Worker + +apps/worker
+Long-running process that consumes the job queue, executes bot runs, reconciles scheduled routines, handles wakeups, and shares the same packages as the API. + +
+ +--- + +### `05 / DATA & MEMORY PLANE` + +PRISMA · POSTGRESQL 16 · GRAPHILE · LISTEN/NOTIFY · DURABLE BOT STATE + + + + + + + + + + +
+ +DATABASE + +**ORM:** Prisma +**Schema:** `packages/db/prisma/schema.prisma` +**Migrations:** `packages/db/prisma/migrations/` + +Core models include user, session, workspace, membership, bot, thread, message, run, event, routine, computer, lease, artifact, secret, model credential, connection, memory document, usage record, and deployment settings. + + + +MEMORY & DURABLE STATE + +Per-bot markdown memory lives behind the memory package. Computer workspaces checkpoint back to `DATA_DIR`, keeping persistent state independent from ephemeral cloud sandboxes. + +
+ +JOBS + +`WAKEUP_DRIVER=graphile` uses a Postgres-backed Graphile Worker queue. +`WAKEUP_DRIVER=memory` swaps in an in-memory queue for tests and development. + + + +REALTIME + +Thread events fan out through Postgres `LISTEN/NOTIFY` via `PostgresRealtimeFanout`, with an in-memory implementation when no pool exists. + +
+ +#### Database backends + +| Backend | Connection posture | Use | +| --- | --- | --- | +| **Local Compose Postgres 16** | `127.0.0.1:5433`, named volume `pgdata` | Local / self-hosted | +| **Supabase** | pooled `DATABASE_URL` on `6543`; direct `DIRECT_URL` on `5432` | Central deployment | + +> [!CAUTION] +> Prisma migrations run against `DIRECT_URL`. A pooled PgBouncer connection is not the migration surface. + +--- + +### `06 / COMPUTER & DEPLOYMENT MATRIX` + +

+ Docker + E2B + Daytona + Box + Desktop +

+ + + + + + + +
+ +LOCAL DEV + +`docker-compose.yml` + +Postgres, supervisor, computer image, data-init, API, worker, and web. Postgres is published on loopback only. The supervisor — not the API — owns the Docker socket. + + + +SINGLE-VM PROD + +`docker-compose.prod.yml` + +Postgres + API + worker + web + Caddy. Hardened container posture with `no-new-privileges`, dropped capabilities, limits, internal network, and health checks. + + + +CENTRAL + SUPABASE + +`docker-compose.supabase.yml` + +API + worker + web + Caddy, without a local Postgres container. End users need only the web URL or desktop client pointed at the central origin. + +
+ +#### Bot computer providers + +| Provider | Where bots run | Notes | +| --- | --- | --- | +| `docker` | Local Compose supervisor | Default local self-hosted path | +| `e2b` | Remote E2B cloud desktop | Recommended public / multi-user path; workspace checkpointed durably | +| `daytona` | Daytona sandboxes | Remote computer contract | +| `box` | Box by ASCII managed desktop | Shared desktop, `noEnv`, 2h TTL refresh | +| `desktop` | API / worker host | Trusted owned host only | +| `fake` | No real computer | Tests only | + +
+EDGE & HOST POSTURE + +**Caddy** + +`/health`, `/api/*`, and `/rpc/*` route to `api:3100`; everything else routes to `web:5173`. zstd + gzip are enabled. `CADDYFILE_PATH` and `Caddyfile.cloudflare.example` support a Cloudflare allowlist front for Full (strict) TLS. + +**Host hardening** + +```bash +sudo DEPLOY_USER=deploy bash infra/compose/harden-host.sh +``` + +The script disables SSH passwords/root login, rate-limits SSH, configures UFW allowlists, fail2ban, unattended upgrades, AppArmor, and audit rules. `docker-daemon.json` enables live-restore and bounded logs. + +**Backup / restore** + +```bash +./scripts/backup.sh +./scripts/restore.sh backups/ +``` + +Production uses `backup-prod.sh` with a systemd timer, seven-day rotation, and mode `0600`. + +
+ +--- + +### `07 / CONFIGURATION SURFACE` + +> [!WARNING] +> Copy `.env.example` to `.env`. Never commit `.env`. It is gitignored and excluded from the Docker build context. + +| Variable | Purpose | +| --- | --- | +| `DATABASE_URL` | App DB connection; Supabase uses pooled / transaction port `6543`. | +| `DIRECT_URL` | Direct DB URL on `5432` for Prisma migrations. | +| `BETTER_AUTH_SECRET` | Auth secret, minimum 32 characters. | +| `BETTER_AUTH_URL` / `WEB_ORIGIN` / `API_URL` | Public origins for auth, cookies, and CORS. | +| `ENCRYPTION_KEY` | Encryption for stored credentials. | +| `DATA_DIR` | Durable bot homes, browser profiles, artifacts, workspace state. | +| `SIGNUPS_ENABLED` / `SIGNUP_ALLOWLIST` | Registration control. | +| `SANDBOX_PROVIDER` | `docker` / `e2b` / `daytona` / `box` / `desktop` / `fake`. | +| `SANDBOX_SUPERVISOR_URL` / `SANDBOX_SUPERVISOR_TOKEN` | Supervisor endpoint and shared credential. | +| `SANDBOX_IDLE_MS` / `SANDBOX_COMMAND_TIMEOUT_MS` | Sandbox idle and command timing. | +| `AGENT_RUNTIME` | `pi` for production; `scripted` for tests. | +| `WAKEUP_DRIVER` | `graphile` for production; `memory` for tests. | +| `OPENROUTER_API_KEY` / `PI_DEFAULT_PROVIDER` / `PI_DEFAULT_MODEL` | Model provider configuration and defaults. | +| `E2B_API_KEY` / `DAYTONA_API_KEY` / `DAYTONA_API_URL` / `DAYTONA_TARGET` / `BOX_API_KEY` / `BOX_API_URL` | Computer-provider credentials. | +| `COMPOSIO_API_KEY` | Optional plugins / connectors. | +| `EXPO_PUBLIC_API_URL` / `RAKAZO_WEB_URL` | Client overrides for a central origin. | +| `SMTP_URL` / `VAPID_*` | Optional email and push. | +| `OTEL_EXPORTER_OTLP_ENDPOINT` / `LOG_LEVEL` | Observability. | + +--- + +### `08 / RUN PROTOCOL` + + + + + + + + + + +
+ +Local Docker + +FULL LOCAL TOPOLOGY + +```bash +cp .env.example .env +# set BETTER_AUTH_SECRET, ENCRYPTION_KEY, OPENROUTER_API_KEY + +pnpm install +pnpm sandbox:build + +docker compose --env-file .env \ + -f infra/compose/docker-compose.yml \ + up --build + +# open http://127.0.0.1:5173 +``` + +The first registered user becomes the deployment owner. + + + +Local Source + +SOURCE DEVELOPMENT + +```bash +cp .env.example .env +pnpm install +pnpm sandbox:build +pnpm dev + +# turbo: api + worker + web (+ supervisor) +# open http://127.0.0.1:5173 +``` + +
+ +Single VM + +PRODUCTION + +```bash +docker compose --env-file .env \ + -f infra/compose/docker-compose.prod.yml \ + up -d --build + +curl --fail https://app.example.com/health +``` + + + +Supabase + +CENTRAL BACKEND + +1. Set pooled `DATABASE_URL` and direct `DIRECT_URL`. +2. Deploy Prisma migrations. +3. Start `docker-compose.supabase.yml`. + +```bash +pnpm --filter @rakazo/db exec prisma migrate deploy + +docker compose --env-file .env \ + -f infra/compose/docker-compose.supabase.yml \ + up -d --build +``` + +
+ +#### Database migrations + +```bash +pnpm db:generate +pnpm db:migrate + +# production alternative +pnpm --filter @rakazo/db exec prisma migrate deploy +``` + +--- + +### `09 / VERIFICATION GATE` + +

+ Typecheck + Biome + Vitest + Playwright + Canary +

+ +```bash +pnpm check # type-check all packages +pnpm lint # biome +pnpm test # vitest unit tests +pnpm test:integration # integration harness +pnpm test:e2e +pnpm test:topology +pnpm test:canary +pnpm test:computer +pnpm perf:desktop +pnpm perf:compare +``` + +CI in `.github/workflows/ci.yml` runs check, lint, and test on pull requests and pushes. Playwright and nightly verification cover browser and longer-path checks. + +
+PROMOTION LOGIC // BUILD → VERIFY → OPERATE + +```mermaid +%%{init: {"flowchart": {"htmlLabels": false, "padding": 20}, "themeVariables": {"fontFamily": "monospace", "fontSize": "12px"}}}%% +flowchart TB + BUILD["BUILD"] + CHECK["TYPECHECK / LINT"] + TEST["UNIT / INTEGRATION"] + E2E["E2E / TOPOLOGY / CANARY"] + OPERATE["OPERATE"] + STOP["STOP / REPAIR"] + + BUILD --> CHECK + CHECK --> TEST + TEST --> E2E + E2E -->|verified| OPERATE + CHECK -. fail .-> STOP + TEST -. fail .-> STOP + E2E -. fail .-> STOP + STOP --> BUILD + + classDef authority fill:#0D1117,stroke:#F59E0B,color:#ffffff,stroke-width:2px; + classDef agent fill:#0D1117,stroke:#8B5CF6,color:#ffffff,stroke-width:2px; + classDef control fill:#0D1117,stroke:#14B8A6,color:#ffffff,stroke-width:2px; + classDef core fill:#0D1117,stroke:#5B8CFF,color:#ffffff,stroke-width:2px; + classDef surface fill:#0D1117,stroke:#22D3EE,color:#ffffff,stroke-width:1.5px; + + class OPERATE authority; + class TEST agent; + class CHECK,E2E control; + class BUILD core; + class STOP surface; +``` + +
+ +--- + +### `10 / CLINICAL BOUNDARY` + +> [!CAUTION] +> **The RME bridge is read-only clinical reconnaissance. It is not a clinical write path.** + +The v0.1 adapter opens the RME in a headed Chromium browser, reads **one patient**, and produces structured, validated JSON. + +The boundary is deliberate: + +```text +MANUAL LOGIN + ↓ +ONE PATIENT + ↓ +READ-ONLY RECONNAISSANCE + ↓ +STRUCTURED JSON + ↓ +MANUAL VERIFICATION + ↓ +NO WRITE +``` + +- Credentials are never requested, stored, or committed. +- Login remains manual. +- The adapter does not write to the patient record. +- Scope does not expand to all patients or clinical AI until one-patient read behavior is manually verified end to end. + +**Clinical autonomy does not begin by granting write access. It begins by proving the read path.** + +--- + +### `11 / SENTRA OPERATING STANDARD` + +```text +No autonomy without a boundary. +No persistent agent without durable state. +No computer execution without an explicit provider. +No clinical write before the read path is proven. +No secret in source control. +No consequential action without human authority. +``` + + + + + + + + + + +
+ +WHO HOLDS AUTHORITY? + +The relevant human operator or reviewer. In clinical paths, the human boundary is terminal. + + + +WHERE DOES STATE LIVE? + +Postgres and durable `DATA_DIR` — not an ephemeral cloud computer. + +
+ +WHERE DOES WORK RUN? + +Inside the configured computer provider: Docker, E2B, Daytona, Box, desktop, or a fake test surface. + + + +HOW IS IT VERIFIED? + +Typed contracts, deterministic tests, topology checks, canaries, runtime health, and explicit human review where consequences require it. + +
+ +--- + +### `12 / PACKAGE NAMESPACE & LICENSE` + +The product is **Sentra Bot**. + +Internal package identifiers historically retain the `@rakazo/*` namespace from the upstream codebase. This is intentional: user-facing branding changes what the product is called; compatibility-sensitive internal identifiers are not renamed without a technical reason. + +**License:** Apache 2.0 — see `LICENSE`. + +Operational contracts and security boundaries live in: + +- `SECURITY.md` +- `AGENTS.md` +- `.env.example` +- infrastructure deployment documentation under `infra/compose/` + +> Never commit secrets. + +--- + +### `13 / CREDIT` + + + + + + +
+ +Rakazo upstream + +Rakazo
+Upstream open-source agent platform. + +
+ +Sentra Bot is built on the shoulders of **Rakazo** — the upstream platform from which the repository inherits packaging, adapter architecture, and the persistent-bot engine. + +We thank the Rakazo authors and community. + +Everything Sentra-specific — **Sentra Bot branding, the clinical read-only direction, and the central Supabase deployment path** — is layered on top of that foundation. + +
+ +--- + +### `14 / INSTRUMENTATION` + +ACTUAL REPOSITORY SURFACE · SENTRA BOT + + + + + + + + + + + + + + +
+ +Runtime + +RUNTIME & APPLICATIONS
+Node.js 22 · Hono · @orpc/server · React · Vite · Electron · background worker + +
+ +Data + +DATA & REALTIME
+PostgreSQL 16 · Supabase · Prisma · Graphile Worker · LISTEN/NOTIFY · durable DATA_DIR + +
+ +Agent Surface + +AGENT & MEMORY
+Pi runtime · scripted test runtime · per-bot markdown memory · routines · wakeups · artifacts · connectors + +
+ +Computers + +COMPUTER PROVIDERS
+Docker · E2B · Daytona · Box · desktop host · fake test provider · supervisor API + +
+ +Security + +SECURITY & AUTHORITY
+Better Auth · membership enforcement · encryption key · secret store · read-only clinical boundary · host hardening · human authority + +
+ +Quality + +QUALITY & OPERATIONS
+Biome · Vitest · Playwright · integration harness · topology tests · canary tests · computer E2E · performance checks · GitHub Actions + +
+ +--- + +

+ Sentra Bot · Intelligence for Autonomy.
+ Part of the Sentra Artificial Intelligence ecosystem.
+ // persistent intelligence. explicit authority. +

diff --git a/apps/api/src/app.ts b/apps/api/src/app.ts index 5f03c879..0c117b26 100644 --- a/apps/api/src/app.ts +++ b/apps/api/src/app.ts @@ -17,6 +17,7 @@ import { createJobReconciler, type createRunExecutor, createRunSecretWriter, + createSmtpEmailSender, type DestinationEmulator, destroyBot, EncryptedSecretStore, @@ -243,20 +244,32 @@ export async function createApp( phoneLocale, }); const { sandbox, home, artifacts, stack, connector, executor, jobHandlers } = composition; + // Undefined when the deployment configured no SMTP_URL. Auth flows that need email check for + // it and report that they are unavailable, so a deployment without SMTP still boots and runs. + const emailSender = createSmtpEmailSender({ + SMTP_URL: env.smtpUrl, + SMTP_FROM: env.smtpFrom, + }); const auth = createAuth(prisma, { secret: env.authSecret, baseURL: env.authUrl, webOrigin: env.webOrigin, signupsEnabled: env.signupsEnabled, signupAllowlist: env.signupAllowlist, + emailSender, + onEmailUnavailable: (reason) => console.warn(`[auth] ${reason}`), extraOrigins: [ "sentrabot://", - "exp://", - "exp://*", - "http://localhost:8081", - "http://127.0.0.1:8081", - "http://localhost:19006", - "http://127.0.0.1:19006", + ...(env.isProduction + ? [] + : [ + "exp://", + "exp://*", + "http://localhost:8081", + "http://127.0.0.1:8081", + "http://localhost:19006", + "http://127.0.0.1:19006", + ]), ], beforeDeleteUser: async (userId) => { const bots = await prisma.bot.findMany({ @@ -341,7 +354,7 @@ export async function createApp( app.on(["GET", "POST"], "/api/auth/*", async (c) => { const path = new URL(c.req.url).pathname.replace("/api/auth", ""); if (blockedAuthPaths.some((blocked) => path.startsWith(blocked))) { - return c.json({ error: "Not available in version 1" }, 404); + return c.json({ error: "Belum tersedia di versi 1" }, 404); } return auth.handler(c.req.raw); }); @@ -638,16 +651,55 @@ export async function createApp( }; } -function isTrustedOrigin(origin: string, env: AppEnv) { +/** + * `localhost` and `127.0.0.1` are different origins to a browser, but a self-host operator who + * configured one and typed the other means the same machine. Only the loopback aliases of an + * origin this deployment already declared are accepted, so this widens nothing beyond it. + */ +function matchesConfiguredLoopback(candidate: URL, env: AppEnv) { + const loopbackHosts = new Set(["localhost", "127.0.0.1", "[::1]"]); + if (!loopbackHosts.has(candidate.hostname)) return false; + return [env.webOrigin, env.apiUrl, env.authUrl].some((configured) => { + try { + const url = new URL(configured); + return ( + loopbackHosts.has(url.hostname) && + url.protocol === candidate.protocol && + url.port === candidate.port + ); + } catch { + return false; + } + }); +} + +/** + * Only ever consulted by the CORS middleware. A missing Origin means the request was not sent + * as cross-origin at all, so it is allowed here — do NOT reuse this for CSRF or authentication, + * where an absent Origin must not be treated as trusted. + */ +export function isTrustedOrigin(origin: string, env: AppEnv) { if (!origin) return true; if (origin === env.webOrigin || origin === env.apiUrl || origin === env.authUrl) return true; - if (origin.startsWith("sentrabot://") || origin.startsWith("exp://")) return true; + // Production mobile always sends the literal "sentrabot://" Origin header (never a suffixed + // variant), so this stays trusted in production but only as an exact match. + if (origin === "sentrabot://") return true; + if (!env.isProduction && origin.startsWith("exp://")) return true; + // Every check below inspects the host, so the value has to be a real Origin serialization + // first: a browser sends scheme://host[:port] and nothing else. Without this, userinfo would + // carry "http://evil.com@localhost:5173" into the loopback check on hostname alone. Custom + // schemes are all handled above — their `origin` serializes to "null", so they must never + // reach this guard. + let parsed: URL; try { - const host = new URL(origin).hostname; - return host === "localhost" || host === "127.0.0.1"; + parsed = new URL(origin); } catch { return false; } + if (parsed.origin !== origin) return false; + if (matchesConfiguredLoopback(parsed, env)) return true; + if (env.isProduction) return false; + return parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1"; } function sessionHeaders(request: Request) { diff --git a/apps/api/src/env.ts b/apps/api/src/env.ts index f4d7d4af..d1268851 100644 --- a/apps/api/src/env.ts +++ b/apps/api/src/env.ts @@ -84,6 +84,13 @@ export interface AppEnv { * so it stays unmounted unless SENTRABOT_CONTROL_PLANE_RELAY=enabled. */ controlPlaneRelay: boolean; + isProduction: boolean; + /** + * Transactional auth email. Absent means verification and password reset report that they + * are unavailable instead of the API refusing to start. + */ + smtpUrl: string | undefined; + smtpFrom: string | undefined; } export function loadEnv(source: NodeJS.ProcessEnv = process.env): AppEnv { @@ -148,6 +155,9 @@ export function loadEnv(source: NodeJS.ProcessEnv = process.env): AppEnv { .filter(Boolean), port: Number(source.API_PORT ?? 3100), controlPlaneRelay: source.SENTRABOT_CONTROL_PLANE_RELAY?.trim() === "enabled", + isProduction: source.NODE_ENV === "production", + smtpUrl: optional(source.SMTP_URL), + smtpFrom: optional(source.SMTP_FROM), gitSha: optional(source.GIT_SHA) ?? optional(source.SENTRABOT_GIT_SHA), updaterUrl, updaterToken, diff --git a/apps/api/src/is-trusted-origin.test.ts b/apps/api/src/is-trusted-origin.test.ts new file mode 100644 index 00000000..b6f27238 --- /dev/null +++ b/apps/api/src/is-trusted-origin.test.ts @@ -0,0 +1,113 @@ +import { describe, expect, it } from "vitest"; +import { isTrustedOrigin } from "./app.js"; +import { loadEnv } from "./env.js"; + +const base = { + DATABASE_URL: "postgres://sentrabot:sentrabot@127.0.0.1:5433/sentrabot", + WEB_ORIGIN: "https://app.sentrabot.test", +}; + +const devEnv = loadEnv({ ...base, NODE_ENV: "test" }); +const prodEnv = loadEnv({ + ...base, + NODE_ENV: "production", + BETTER_AUTH_SECRET: "prod-auth-secret-with-enough-length", + ENCRYPTION_KEY: "prod-encryption-key-with-enough-length", + SCREEN_PROXY_SECRET: "prod-screen-proxy-secret-with-enough-length", + SANDBOX_PROVIDER: "e2b", +}); + +describe("isTrustedOrigin", () => { + it("trusts an empty origin in every environment", () => { + expect(isTrustedOrigin("", devEnv)).toBe(true); + expect(isTrustedOrigin("", prodEnv)).toBe(true); + }); + + it("trusts env.webOrigin in every environment", () => { + expect(isTrustedOrigin(devEnv.webOrigin, devEnv)).toBe(true); + expect(isTrustedOrigin(prodEnv.webOrigin, prodEnv)).toBe(true); + }); + + it("trusts the exact sentrabot:// mobile origin in production", () => { + expect(isTrustedOrigin("sentrabot://", prodEnv)).toBe(true); + }); + + it("rejects a spoofed sentrabot:// origin with a suffix", () => { + expect(isTrustedOrigin("sentrabot://evil.example", prodEnv)).toBe(false); + expect(isTrustedOrigin("sentrabot://evil.example", devEnv)).toBe(false); + }); + + it("trusts exp:// only outside production", () => { + expect(isTrustedOrigin("exp://127.0.0.1:19000", devEnv)).toBe(true); + expect(isTrustedOrigin("exp://127.0.0.1:19000", prodEnv)).toBe(false); + }); + + it("trusts localhost only outside production", () => { + expect(isTrustedOrigin("http://localhost:5173", devEnv)).toBe(true); + expect(isTrustedOrigin("http://localhost:5173", prodEnv)).toBe(false); + }); +}); + +describe("isTrustedOrigin loopback aliases", () => { + const loopbackProd = loadEnv({ + DATABASE_URL: "postgres://sentrabot:sentrabot@127.0.0.1:5433/sentrabot", + WEB_ORIGIN: "http://127.0.0.1:5173", + NODE_ENV: "production", + BETTER_AUTH_SECRET: "prod-auth-secret-with-enough-length", + ENCRYPTION_KEY: "prod-encryption-key-with-enough-length", + SCREEN_PROXY_SECRET: "prod-screen-proxy-secret-with-enough-length", + SANDBOX_PROVIDER: "e2b", + }); + + it("accepts the loopback alias of a configured loopback origin in production", () => { + expect(isTrustedOrigin("http://localhost:5173", loopbackProd)).toBe(true); + }); + + it("rejects a different port on the same loopback host", () => { + expect(isTrustedOrigin("http://localhost:9999", loopbackProd)).toBe(false); + }); + + it("rejects a scheme the deployment did not configure", () => { + expect(isTrustedOrigin("https://localhost:5173", loopbackProd)).toBe(false); + }); + + it("does not widen a deployment whose origins are not loopback", () => { + expect(isTrustedOrigin("http://localhost:5173", prodEnv)).toBe(false); + expect(isTrustedOrigin("http://127.0.0.1:5173", prodEnv)).toBe(false); + }); + + it("still rejects hostnames that merely look like loopback", () => { + expect(isTrustedOrigin("http://localhost.evil.example:5173", loopbackProd)).toBe(false); + expect(isTrustedOrigin("http://127.0.0.1.evil.example:5173", loopbackProd)).toBe(false); + }); +}); + +describe("isTrustedOrigin rejects values that are not real Origin serializations", () => { + const loopbackProd = loadEnv({ + DATABASE_URL: "postgres://sentrabot:sentrabot@127.0.0.1:5433/sentrabot", + WEB_ORIGIN: "http://127.0.0.1:5173", + NODE_ENV: "production", + BETTER_AUTH_SECRET: "prod-auth-secret-with-enough-length", + ENCRYPTION_KEY: "prod-encryption-key-with-enough-length", + SCREEN_PROXY_SECRET: "prod-screen-proxy-secret-with-enough-length", + SANDBOX_PROVIDER: "e2b", + }); + + it("rejects userinfo smuggled in front of a loopback host", () => { + expect(isTrustedOrigin("http://evil.example@localhost:5173", loopbackProd)).toBe(false); + }); + + it("rejects an origin carrying a path", () => { + expect(isTrustedOrigin("http://localhost:5173/evil", loopbackProd)).toBe(false); + }); + + it("still trusts the mobile custom scheme, whose origin serializes to null", () => { + expect(isTrustedOrigin("sentrabot://", loopbackProd)).toBe(true); + expect(isTrustedOrigin("sentrabot://", devEnv)).toBe(true); + }); + + it("still trusts the Expo dev scheme outside production", () => { + expect(isTrustedOrigin("exp://192.168.1.5:8081", devEnv)).toBe(true); + expect(isTrustedOrigin("exp://192.168.1.5:8081", loopbackProd)).toBe(false); + }); +}); diff --git a/apps/api/src/managed-ai.test.ts b/apps/api/src/managed-ai.test.ts index ad976575..326921e6 100644 --- a/apps/api/src/managed-ai.test.ts +++ b/apps/api/src/managed-ai.test.ts @@ -96,4 +96,67 @@ describe("managed AI gateway", () => { expect.objectContaining({ reservationId: "reservation-1" }), ); }); + + it("throttles a caller that floods the route, before spending on the provider", async () => { + const { createManagedAiRoutes } = await import("./managed-ai.js"); + const authenticate = vi.fn().mockResolvedValue(null); + const app = createManagedAiRoutes({ + authenticate, + isTrustedRuntime: async () => true, + getBudgetRatio: async () => 0.1, + reserveUsage: async () => ({ reservationId: "reservation-1" }), + finalizeUsage: async () => undefined, + releaseUsage: async () => undefined, + estimateCostMicros: () => 100n, + calculateActualCostMicros: () => 42n, + providerId: "openai", + priceVersion: "test", + now: () => new Date("2026-09-02T00:00:00.000Z"), + provider: { + generate: async () => ({ + outputText: "private response", + usage: { inputTokens: 3, outputTokens: 5 }, + }), + stream: async function* () {}, + }, + }); + + const flood = () => + app.request("/v1/managed-ai/responses", { + method: "POST", + headers: { "content-type": "application/json", "x-forwarded-for": "203.0.113.7" }, + body: JSON.stringify({ + deviceId: "device-1", + runtimeId: "runtime-1", + idempotencyKey: "request-1", + complexity: "simple", + input: "private prompt", + }), + }); + + // Unauthenticated, so every allowed call stops at 401 rather than 429. + for (let attempt = 0; attempt < 60; attempt += 1) { + expect((await flood()).status).toBe(401); + } + + const throttled = await flood(); + expect(throttled.status).toBe(429); + expect(throttled.headers.get("Retry-After")).toBe("60"); + // The limiter runs before authentication, so the flood never reached it again. + expect(authenticate).toHaveBeenCalledTimes(60); + + // A different caller keeps its own budget. + const other = await app.request("/v1/managed-ai/responses", { + method: "POST", + headers: { "content-type": "application/json", "x-forwarded-for": "203.0.113.8" }, + body: JSON.stringify({ + deviceId: "device-1", + runtimeId: "runtime-1", + idempotencyKey: "request-1", + complexity: "simple", + input: "private prompt", + }), + }); + expect(other.status).toBe(401); + }); }); diff --git a/apps/api/src/managed-ai.ts b/apps/api/src/managed-ai.ts index 3a1e3ab8..0137c5bc 100644 --- a/apps/api/src/managed-ai.ts +++ b/apps/api/src/managed-ai.ts @@ -1,9 +1,18 @@ +import { getConnInfo } from "@hono/node-server/conninfo"; import type { AIProvider, AIResponse, AIUsage, ManagedAiModelClass } from "@sentrabot/adapter-kit"; import { type ManagedAiComplexity, routeManagedAi } from "@sentrabot/core"; -import { Hono } from "hono"; +import { type Context, Hono } from "hono"; +import { createFixedWindowRateLimiter } from "./rate-limiter.js"; const MAX_MANAGED_AI_INPUT_CHARACTERS = 8_000; const MAX_MANAGED_AI_OUTPUT_TOKENS = 2_048; +// This route is called by an authenticated, trusted agent runtime (not an +// end-user browser) and hits a paid model provider on every call, so the +// limit exists to bound cost/abuse from a runaway or misbehaving caller +// rather than to throttle normal interactive use. 60 requests/minute per IP +// comfortably covers a busy agent loop while capping worst-case spend. +const MANAGED_AI_RATE_LIMIT = 60; +const MANAGED_AI_RATE_WINDOW_MS = 60_000; export interface ManagedAiActor { userId: string; @@ -46,9 +55,41 @@ export interface ManagedAiRouteDependencies { provider: AIProvider; } +/** + * Proxy headers first, then the socket address. Collapsing every caller + * without a proxy header into one shared bucket would let a single busy + * runtime lock out the rest of a directly exposed deployment, so fall back to + * the connection itself before giving up on identifying the caller. + */ +function rateLimitKey(context: Context): string { + const forwarded = context.req.header("x-forwarded-for")?.split(",")[0]?.trim(); + if (forwarded) return forwarded; + const realIp = context.req.header("x-real-ip")?.trim(); + if (realIp) return realIp; + try { + const address = getConnInfo(context).remote.address; + if (address) return address; + } catch { + // No node-server binding (unit tests, other runtimes): fall through. + } + return "unknown"; +} + export function createManagedAiRoutes(dependencies: ManagedAiRouteDependencies): Hono { const app = new Hono(); + const rateLimiter = createFixedWindowRateLimiter({ + limit: MANAGED_AI_RATE_LIMIT, + windowMs: MANAGED_AI_RATE_WINDOW_MS, + now: () => dependencies.now().getTime(), + }); app.post("/v1/managed-ai/responses", async (context) => { + const clientIp = rateLimitKey(context); + const rateLimit = rateLimiter.check(clientIp); + if (!rateLimit.allowed) { + return context.json({ error: "Too many managed AI requests" }, 429, { + "Retry-After": String(rateLimit.retryAfterSeconds), + }); + } const actor = await dependencies.authenticate(context.req.raw); if (!actor) return context.json({ error: "Unauthorized" }, 401); const body = await context.req.json().catch(() => null); diff --git a/apps/api/src/onboarding.ts b/apps/api/src/onboarding.ts index 300457ba..f260b73c 100644 --- a/apps/api/src/onboarding.ts +++ b/apps/api/src/onboarding.ts @@ -32,40 +32,40 @@ const FOCUS_OPTIONS: FocusOption[] = [ { id: "day", letter: "A", - label: "Day-to-day work", - summary: "Slack, calendar, and email", + label: "Pekerjaan sehari-hari", + summary: "Slack, kalender, dan email", apps: ["slack", "gmail", "googlecalendar"], }, { id: "inbox", letter: "B", - label: "Inbox & email", - summary: "email and calendar", + label: "Kotak masuk & email", + summary: "email dan kalender", apps: ["gmail", "googlecalendar", "slack"], }, { id: "research", letter: "C", - label: "Research & writing", - summary: "the web, notes, and docs", + label: "Riset & penulisan", + summary: "web, catatan, dan dokumen", apps: ["hackernews", "notion", "googledocs"], }, { id: "everything", letter: "D", - label: "A bit of everything", - summary: "Slack, calendar, and email", + label: "Sedikit dari semuanya", + summary: "Slack, kalender, dan email", apps: ["slack", "gmail", "googlecalendar"], }, ]; const APP_DESCRIPTIONS: Record = { - slack: "Search, read, and send messages.", - gmail: "Search, read, draft, and send email.", - googlecalendar: "Search events and schedule meetings.", - notion: "Search and edit pages and databases.", - googledocs: "Draft and edit documents.", - hackernews: "Search stories and discussions.", + slack: "Cari, baca, dan kirim pesan.", + gmail: "Cari, baca, buat draf, dan kirim email.", + googlecalendar: "Cari acara dan jadwalkan pertemuan.", + notion: "Cari dan sunting halaman serta database.", + googledocs: "Buat draf dan sunting dokumen.", + hackernews: "Cari cerita dan diskusi.", }; const APP_NAMES: Record = { @@ -134,15 +134,18 @@ export async function startOnboarding( where: { id: actor.userId }, select: { name: true }, }); - const firstName = (user?.name ?? "there").split(/\s+/)[0]; + const firstName = (user?.name ?? "").split(/\s+/)[0]; const target = { workspaceId: actor.workspaceId, botId: bot.id, threadId: thread.id }; await post(deps, target, [ - { kind: "text", text: `Hey ${firstName}. Fresh start on my side, so I’ll keep this short.` }, + { + kind: "text", + text: `Halo${firstName ? ` ${firstName}` : ""}. Saya mulai dari nol, jadi saya buat singkat saja.`, + }, ]); await post(deps, target, [ { kind: "choice", - question: "What do you want me on first?", + question: "Mau saya pegang apa lebih dulu?", options: FOCUS_OPTIONS.map(({ id, letter, label }) => ({ id, letter, label })), }, ]); @@ -177,7 +180,7 @@ export async function chooseFocus( await post(deps, target, [ { kind: "text", - text: `Got it. ${capitalize(option.summary)}. I’ll see what’s already connected so I don’t make you set something up twice.`, + text: `Siap. ${capitalize(option.summary)}. Saya cek dulu apa yang sudah terhubung supaya Anda tidak perlu mengatur dua kali.`, }, ]); @@ -200,7 +203,7 @@ export async function chooseFocus( kind: "app_connect", provider: entry?.slug ?? slug, name: entry?.name ?? APP_NAMES[slug] ?? capitalize(slug), - description: APP_DESCRIPTIONS[slug] ?? `Connect ${entry?.name ?? slug} to your account.`, + description: APP_DESCRIPTIONS[slug] ?? `Hubungkan ${entry?.name ?? slug} ke akun Anda.`, logo: entry?.logo ?? null, status: entry?.connected ? "connected" : "pending", }; @@ -208,18 +211,18 @@ export async function chooseFocus( const cardNames = cards .map((card) => (card.kind === "app_connect" ? card.name : "")) .filter(Boolean); - const named = `${cardNames.slice(0, -1).join(", ")}${cardNames.length > 1 ? ", and " : ""}${cardNames.at(-1)}`; + const named = `${cardNames.slice(0, -1).join(", ")}${cardNames.length > 1 ? ", dan " : ""}${cardNames.at(-1)}`; await post(deps, target, [ { kind: "text", - text: `${named} are a good place to start. Connect them here and I’ll use what you already have.`, + text: `${named} adalah awal yang bagus. Hubungkan di sini, dan saya pakai yang sudah Anda punya.`, }, ]); await post(deps, target, cards); await post(deps, target, [ { kind: "text", - text: `Hit those ${cards.length === 1 ? "one" : cards.length === 2 ? "two" : "three"} and I’ll start pulling the picture.`, + text: `Hubungkan ${cards.length === 1 ? "satu" : cards.length === 2 ? "dua" : "tiga"} itu, dan saya mulai menyusun gambarannya.`, }, ]); } diff --git a/apps/api/src/phone-inbound.test.ts b/apps/api/src/phone-inbound.test.ts index a48c7824..1fff55ab 100644 --- a/apps/api/src/phone-inbound.test.ts +++ b/apps/api/src/phone-inbound.test.ts @@ -372,14 +372,24 @@ describe("createPhoneInboundHandler approval answers", () => { ]); }); - it("maps the third option to a denial", async () => { + it("maps the second option to a denial", async () => { const deps = createDeps({ waitingRun, runMessages: askMessages }); const handle = createPhoneInboundHandler(deps); - await handle({ ...dmEvent, content: "3" }); + await handle({ ...dmEvent, content: "2" }); expect(deps.answerRunInput).toHaveBeenCalledWith(expect.objectContaining({ answer: "deny" })); }); + it("never offers an always-allow digit over the phone", async () => { + // Phone cards drop the "always" action, so "3" is not an answer and is + // delivered as an ordinary message instead of creating a standing rule. + const deps = createDeps({ waitingRun, runMessages: askMessages }); + const handle = createPhoneInboundHandler(deps); + await handle({ ...dmEvent, content: "3" }); + + expect(deps.answerRunInput).not.toHaveBeenCalled(); + }); + it("treats a digit as an ordinary message when nothing is waiting", async () => { const deps = createDeps(); const handle = createPhoneInboundHandler(deps); diff --git a/apps/api/src/rate-limiter.test.ts b/apps/api/src/rate-limiter.test.ts new file mode 100644 index 00000000..a8a96b97 --- /dev/null +++ b/apps/api/src/rate-limiter.test.ts @@ -0,0 +1,72 @@ +import { describe, expect, it } from "vitest"; +import { createFixedWindowRateLimiter } from "./rate-limiter.js"; + +function clock(start: number) { + let current = start; + return { + now: () => current, + advance(ms: number) { + current += ms; + }, + }; +} + +describe("fixed window rate limiter", () => { + it("allows up to the limit and then reports a retry delay", () => { + const time = clock(0); + const limiter = createFixedWindowRateLimiter({ limit: 3, windowMs: 60_000, now: time.now }); + + for (let attempt = 0; attempt < 3; attempt += 1) { + expect(limiter.check("1.1.1.1")).toEqual({ allowed: true, retryAfterSeconds: 0 }); + } + + const blocked = limiter.check("1.1.1.1"); + expect(blocked.allowed).toBe(false); + expect(blocked.retryAfterSeconds).toBe(60); + }); + + it("keeps a separate bucket per key", () => { + const time = clock(0); + const limiter = createFixedWindowRateLimiter({ limit: 1, windowMs: 60_000, now: time.now }); + + expect(limiter.check("1.1.1.1").allowed).toBe(true); + expect(limiter.check("1.1.1.1").allowed).toBe(false); + // A different caller must not inherit the exhausted bucket. + expect(limiter.check("2.2.2.2").allowed).toBe(true); + }); + + it("lets a caller through again once the window elapses", () => { + const time = clock(0); + const limiter = createFixedWindowRateLimiter({ limit: 1, windowMs: 60_000, now: time.now }); + + expect(limiter.check("1.1.1.1").allowed).toBe(true); + expect(limiter.check("1.1.1.1").allowed).toBe(false); + + time.advance(60_000); + expect(limiter.check("1.1.1.1").allowed).toBe(true); + }); + + it("shortens the retry delay as the window drains", () => { + const time = clock(0); + const limiter = createFixedWindowRateLimiter({ limit: 1, windowMs: 60_000, now: time.now }); + + limiter.check("1.1.1.1"); + time.advance(45_000); + expect(limiter.check("1.1.1.1").retryAfterSeconds).toBe(15); + }); + + it("evicts expired buckets instead of growing without bound", () => { + const time = clock(0); + const limiter = createFixedWindowRateLimiter({ limit: 1, windowMs: 1_000, now: time.now }); + + for (let caller = 0; caller < 50; caller += 1) { + limiter.check(`10.0.0.${caller}`); + } + expect(limiter.size()).toBe(50); + + time.advance(1_000); + // The sweep runs on the next check, so one fresh bucket survives. + limiter.check("10.0.1.1"); + expect(limiter.size()).toBe(1); + }); +}); diff --git a/apps/api/src/rate-limiter.ts b/apps/api/src/rate-limiter.ts new file mode 100644 index 00000000..3ae4fca5 --- /dev/null +++ b/apps/api/src/rate-limiter.ts @@ -0,0 +1,46 @@ +/** + * Minimal in-memory fixed-window rate limiter. State lives in a single + * process, which is fine for a single-instance self-host; running the API + * as multiple instances would need shared storage (e.g. Redis) instead. + */ +export interface RateLimitResult { + allowed: boolean; + retryAfterSeconds: number; +} + +export function createFixedWindowRateLimiter(options: { + limit: number; + windowMs: number; + now?: () => number; +}) { + const { limit, windowMs, now = () => Date.now() } = options; + const buckets = new Map(); + + return { + check(key: string): RateLimitResult { + const current = now(); + // Sweep expired buckets on every check so the map can't grow without + // bound as distinct callers (IPs) come and go. + for (const [bucketKey, bucket] of buckets) { + if (bucket.resetAt <= current) buckets.delete(bucketKey); + } + let bucket = buckets.get(key); + if (!bucket) { + bucket = { count: 0, resetAt: current + windowMs }; + buckets.set(key, bucket); + } + bucket.count += 1; + if (bucket.count > limit) { + return { + allowed: false, + retryAfterSeconds: Math.max(1, Math.ceil((bucket.resetAt - current) / 1000)), + }; + } + return { allowed: true, retryAfterSeconds: 0 }; + }, + /** Live bucket count, so a test can assert that expired entries are swept. */ + size(): number { + return buckets.size; + }, + }; +} diff --git a/apps/api/src/router.ts b/apps/api/src/router.ts index 1e10ceee..783572c1 100644 --- a/apps/api/src/router.ts +++ b/apps/api/src/router.ts @@ -1489,7 +1489,7 @@ export function createRouter(deps: RouterDeps) { const connector = deps.connectors.managed(input.connectorId); if (!connector) { throw new ORPCError("BAD_REQUEST", { - message: `Connector ${input.connectorId} is not configured`, + message: `Konektor ${input.connectorId} belum dikonfigurasi`, }); } const row = await deps.prisma.connection.create({ @@ -1536,7 +1536,7 @@ export function createRouter(deps: RouterDeps) { const connector = deps.connectors.managed(existing.connectorId); if (!connector) { throw new ORPCError("BAD_REQUEST", { - message: `Connector ${existing.connectorId} is not configured`, + message: `Konektor ${existing.connectorId} belum dikonfigurasi`, }); } let row = existing; @@ -1585,7 +1585,7 @@ export function createRouter(deps: RouterDeps) { const connector = deps.connectors.managed(row.connectorId); if (!connector) { throw new ORPCError("BAD_REQUEST", { - message: `Connector ${row.connectorId} is not configured`, + message: `Konektor ${row.connectorId} belum dikonfigurasi`, }); } try { diff --git a/apps/api/src/whatsapp-pairing.ts b/apps/api/src/whatsapp-pairing.ts index e267a733..fe82bd6f 100644 --- a/apps/api/src/whatsapp-pairing.ts +++ b/apps/api/src/whatsapp-pairing.ts @@ -31,7 +31,7 @@ export async function beginWhatsAppPairing( }); if (!bot) throw new Error("Bot not found"); const existingIdentity = await prisma.phoneIdentity.findUnique({ where: { botId } }); - if (existingIdentity) throw new Error("That agent already has a paired number."); + if (existingIdentity) throw new Error("Agen itu sudah punya nomor yang terhubung."); await prisma.phonePairing.deleteMany({ where: { botId, usedAt: null }, diff --git a/apps/mobile/.gitignore b/apps/mobile/.gitignore new file mode 100644 index 00000000..e77b3637 --- /dev/null +++ b/apps/mobile/.gitignore @@ -0,0 +1,4 @@ + +# compiled Lingui catalogs (generated by `lingui compile`, like apps/web) +locales/**/*.mjs +locales/**/*.js diff --git a/apps/mobile/app/_layout.tsx b/apps/mobile/app/_layout.tsx index 4036f1aa..0dfd7221 100644 --- a/apps/mobile/app/_layout.tsx +++ b/apps/mobile/app/_layout.tsx @@ -1,3 +1,5 @@ +import { I18nProvider } from "@lingui/react"; +import { useLingui } from "@lingui/react/macro"; import { DarkTheme, Stack, ThemeProvider } from "expo-router"; import { StatusBar } from "expo-status-bar"; import { useEffect, useState } from "react"; @@ -6,11 +8,13 @@ import { GestureHandlerRootView } from "react-native-gesture-handler"; import { KeyboardProvider } from "react-native-keyboard-controller"; import { AvatarStyleProvider } from "../components/avatar-style"; import { currentApiBase, loadApiBase, loadSessionToken } from "../lib/api"; +import { activateLocale, i18n } from "../lib/i18n"; import { configureForegroundNotifications, resumeLiveNotifications, } from "../lib/live-notifications"; import { applyMobileUiDirection } from "../lib/ui-direction"; +import { loadUiLocale } from "../lib/ui-locale"; applyMobileUiDirection(); configureForegroundNotifications(); @@ -19,60 +23,26 @@ export default function Layout() { const [ready, setReady] = useState(false); useEffect(() => { - void loadApiBase() - .then(async () => resumeLiveNotifications(currentApiBase(), await loadSessionToken())) - .catch(() => undefined) - .finally(() => setReady(true)); + void Promise.allSettled([ + loadApiBase().then(async () => + resumeLiveNotifications(currentApiBase(), await loadSessionToken()), + ), + loadUiLocale().then(activateLocale), + ]).then(() => setReady(true)); }, []); return ( {ready ? ( - - - - - - - - - - - - - - - - - - - - - + + + + + + + + ) : ( )} @@ -80,3 +50,49 @@ export default function Layout() { ); } + +// Rendered under I18nProvider so header titles follow the active locale. +function RootStack() { + const { t } = useLingui(); + return ( + + + + + + + + + + + + + + + + + ); +} diff --git a/apps/mobile/app/account.tsx b/apps/mobile/app/account.tsx index b941bd55..81c119b7 100644 --- a/apps/mobile/app/account.tsx +++ b/apps/mobile/app/account.tsx @@ -1,3 +1,4 @@ +import { Trans, useLingui } from "@lingui/react/macro"; import type { AvatarStyle } from "@sentrabot/contracts"; import { useLocalSearchParams, useRouter } from "expo-router"; import { useEffect, useState } from "react"; @@ -26,6 +27,7 @@ import { signOut, } from "../lib/api"; import { confirmDeleteBot } from "../lib/bot-lifecycle"; +import { activateLocale } from "../lib/i18n"; import { canPostPromotedNotifications, DEFAULT_LIVE_NOTIFICATION_SETTINGS, @@ -37,6 +39,12 @@ import { } from "../lib/live-notifications"; import { native } from "../lib/native"; import { registerPushToken } from "../lib/push"; +import { persistUiLocale, type UiLocale } from "../lib/ui-locale"; + +const UI_LOCALE_OPTIONS: { locale: UiLocale; label: string }[] = [ + { locale: "id", label: "Bahasa Indonesia" }, + { locale: "en", label: "English" }, +]; export default function Account() { const router = useRouter(); @@ -60,6 +68,7 @@ export default function Account() { outputTokens: number; } | null>(null); const { avatarStyle, updateAvatarStyle } = useAvatarStyle(); + const { t, i18n } = useLingui(); useEffect(() => { void rpc("me") @@ -80,14 +89,20 @@ export default function Account() { }, []); const usageBlock = ( - - Usage + + + Usage + {usage ? ( - {usage.runs} runs · {usage.inputTokens + usage.outputTokens} tokens + + {usage.runs} runs · {usage.inputTokens + usage.outputTokens} tokens + ) : null} - Model spend uses your provider keys. + + Model spend uses your provider keys. + ); @@ -97,8 +112,8 @@ export default function Account() { setArchivedBots((bots) => bots.filter((bot) => bot.id !== botId)); } catch (restoreError) { Alert.alert( - "Could not restore bot", - restoreError instanceof Error ? restoreError.message : "Try again.", + t`Could not restore bot`, + restoreError instanceof Error ? restoreError.message : t`Try again.`, ); } } @@ -110,12 +125,18 @@ export default function Account() { try { await updateAvatarStyle(next); } catch { - setAvatarError("Couldn't update avatars"); + setAvatarError(t`Couldn't update avatars`); } finally { setAvatarPending(false); } } + async function selectLocale(locale: UiLocale) { + if (i18n.locale === locale) return; + await persistUiLocale(locale); + await activateLocale(locale); + } + async function handleSignOut() { setPending(true); await signOut(); @@ -137,7 +158,7 @@ export default function Account() { } catch (cause) { setNotifications(previous); setNotificationError( - cause instanceof Error ? cause.message : "Could not update notifications", + cause instanceof Error ? cause.message : t`Could not update notifications`, ); } finally { setNotificationPending(false); @@ -147,12 +168,12 @@ export default function Account() { function confirmDeletion() { setError(null); Alert.alert( - "Delete your account?", - "This permanently deletes your account, bots, conversations, memories, files, and saved connections. This cannot be undone.", + t`Delete your account?`, + t`This permanently deletes your account, bots, conversations, memories, files, and saved connections. This cannot be undone.`, [ - { text: "Cancel", style: "cancel" }, + { text: t`Cancel`, style: "cancel" }, { - text: "Delete account", + text: t`Delete account`, style: "destructive", onPress: () => void handleDeletion(), }, @@ -168,7 +189,7 @@ export default function Account() { router.dismissAll(); router.replace("/sign-in"); } catch (err) { - setError(err instanceof Error ? err.message : "Could not delete account"); + setError(err instanceof Error ? err.message : t`Could not delete account`); } finally { setPending(false); } @@ -179,21 +200,23 @@ export default function Account() { {focus === "usage" ? usageBlock : null} - {me?.name || "Your account"} + {me?.name || t`Your account`} {me?.email ? {me.email} : null} {focus !== "usage" ? usageBlock : null} - - Avatars + + + Avatars + {(["clay", "robot", "organic"] as const).map((style) => { const selected = avatarStyle === style; - const label = style === "clay" ? "Clay" : style === "robot" ? "Robot" : "Organic"; + const label = style === "clay" ? t`Clay` : style === "robot" ? t`Robot` : t`Organic`; return ( {avatarError} : null} + + + Language + + + {UI_LOCALE_OPTIONS.map((option) => { + const selected = i18n.locale === option.locale; + return ( + void selectLocale(option.locale)} + style={({ pressed }) => [ + styles.languageOption, + selected && styles.languageOptionSelected, + pressed && styles.pressed, + ]} + > + {option.label} + + ); + })} + + + {Platform.OS === "android" ? ( - - Notifications + + + Notifications + @@ -231,15 +283,15 @@ export default function Account() { } /> void updateNotifications({ ...notifications, messages })} /> @@ -247,8 +299,8 @@ export default function Account() { } /> @@ -260,14 +312,18 @@ export default function Account() { onPress={() => void openPromotedNotificationSettings()} style={{ minHeight: 44, justifyContent: "center" }} > - Live update settings + + Live update settings + void openLiveNotificationSettings()} style={{ minHeight: 44, justifyContent: "center" }} > - Notification settings + + Notification settings + {notificationError ? {notificationError} : null} @@ -280,8 +336,12 @@ export default function Account() { style={({ pressed }) => [styles.settingsButton, pressed && styles.pressed]} > - Models - Choose your provider and active model + + Models + + + Choose your provider and active model + @@ -293,9 +353,11 @@ export default function Account() { style={({ pressed }) => [styles.settingsButton, pressed && styles.pressed]} > - Voice + + Voice + - Speak replies aloud with ElevenLabs, OpenAI, or Cartesia + Speak replies aloud with ElevenLabs, OpenAI, or Cartesia @@ -308,8 +370,12 @@ export default function Account() { style={({ pressed }) => [styles.settingsButton, pressed && styles.pressed]} > - Integrations - Connect apps. + + Integrations + + + Connect apps. + @@ -320,19 +386,25 @@ export default function Account() { onPress={() => void handleSignOut()} style={({ pressed }) => [styles.button, pressed && styles.pressed]} > - Sign out + + Sign out + {archivedBots.length > 0 ? ( - Archived bots + + Archived bots + {archivedBots.map((bot) => ( {bot.name} void restoreBot(bot.id)} hitSlop={8}> - Restore + + Restore + @@ -342,7 +414,9 @@ export default function Account() { } hitSlop={8} > - Delete + + Delete + ))} @@ -350,13 +424,17 @@ export default function Account() { ) : null} - Delete account + + Delete account + - Enter your current password, then confirm permanent deletion of your account and all - associated data. + + Enter your current password, then confirm permanent deletion of your account and all + associated data. + ) : ( - Delete account + + Delete account + )} @@ -532,6 +612,29 @@ const styles = StyleSheet.create({ borderColor: native.label, backgroundColor: native.fillPressed, }, + languageOptions: { + flexDirection: "row", + gap: 12, + }, + languageOption: { + flex: 1, + minHeight: 48, + borderRadius: 14, + borderWidth: StyleSheet.hairlineWidth, + borderColor: native.tertiaryLabel, + alignItems: "center", + justifyContent: "center", + paddingHorizontal: 10, + }, + languageOptionSelected: { + borderColor: native.label, + backgroundColor: native.fillPressed, + }, + languageLabel: { + color: native.label, + fontSize: 14, + fontWeight: "600", + }, avatarLabel: { color: native.label, fontSize: 14, diff --git a/apps/mobile/app/bot-settings.tsx b/apps/mobile/app/bot-settings.tsx index c77ee2b8..4d14c113 100644 --- a/apps/mobile/app/bot-settings.tsx +++ b/apps/mobile/app/bot-settings.tsx @@ -1,3 +1,4 @@ +import { Trans, useLingui } from "@lingui/react/macro"; import type { ComputerStatus } from "@sentrabot/contracts"; import { BOT_DESCRIPTION_MAX_LENGTH, @@ -20,6 +21,7 @@ type BotSettingsRecord = MobileBot & { export default function BotSettingsScreen() { const router = useRouter(); const { botId } = useLocalSearchParams<{ botId: string }>(); + const { t } = useLingui(); const [bot, setBot] = useState(null); const [name, setName] = useState(""); const [title, setTitle] = useState(""); @@ -43,7 +45,7 @@ export default function BotSettingsScreen() { setComputerMode(next.computerMode); setComputer(status); }) - .catch((err) => setError(err instanceof Error ? err.message : "Could not load bot")); + .catch((err) => setError(err instanceof Error ? err.message : t`Could not load bot`)); }, [botId]); async function save() { @@ -75,7 +77,7 @@ export default function BotSettingsScreen() { } router.back(); } catch (err) { - setError(err instanceof Error ? err.message : "Could not save bot"); + setError(err instanceof Error ? err.message : t`Could not save bot`); } finally { setPending(false); } @@ -83,19 +85,21 @@ export default function BotSettingsScreen() { return ( <> - + - Name + + Name + - Title + + Title + - Description + + Description + - {pending ? "Saving…" : "Save"} + {pending ? t`Saving…` : t`Save`} diff --git a/apps/mobile/app/computer.tsx b/apps/mobile/app/computer.tsx index a086366a..eda93ae1 100644 --- a/apps/mobile/app/computer.tsx +++ b/apps/mobile/app/computer.tsx @@ -1,3 +1,4 @@ +import { Trans, useLingui } from "@lingui/react/macro"; import type { ComputerMode, ComputerReleaseReason } from "@sentrabot/contracts"; import { useLocalSearchParams, useNavigation } from "expo-router"; import { useEffect, useLayoutEffect, useRef, useState } from "react"; @@ -25,8 +26,9 @@ import { export default function Computer() { const navigation = useNavigation(); + const { t } = useLingui(); const { botId, name: nameParam } = useLocalSearchParams<{ botId?: string; name?: string }>(); - const name = nameParam || "Bot"; + const name = nameParam || t`Bot`; const [computer, setComputer] = useState(null); const [screenUrl, setScreenUrl] = useState(null); const [screenError, setScreenError] = useState(null); @@ -94,7 +96,7 @@ export default function Computer() { await refresh({ screenAttempts: SCREEN_URL_OPEN_ATTEMPTS }); setError(null); } catch (err) { - setError(err instanceof Error ? err.message : "Could not open computer"); + setError(err instanceof Error ? err.message : t`Could not open computer`); throw err; } finally { setBooting(false); @@ -161,7 +163,7 @@ export default function Computer() { autoBooted.current = null; await refresh(); } catch (err) { - setError(err instanceof Error ? err.message : "Could not switch computer"); + setError(err instanceof Error ? err.message : t`Could not switch computer`); } finally { setSwitching(false); } @@ -184,14 +186,18 @@ export default function Computer() { > {computerOpen ? ( - Open in full window + + Open in full window + ) : computer?.state === "running" && embeddedScreenUrl ? ( - setScreenError("Could not load the desktop. This device cannot reach the screen URL.") + setScreenError( + t`Could not load the desktop. This device cannot reach the screen URL.`, + ) } /> ) : ( @@ -200,7 +206,7 @@ export default function Computer() { )} void openComputer()} style={{ position: "absolute", top: 0, right: 0, bottom: 0, left: 0 }} /> @@ -230,7 +236,9 @@ export default function Computer() { borderRadius: 12, }} > - Take control + + Take control + )} @@ -260,10 +268,14 @@ export default function Computer() { gap: 8, }} > - Teach a task + + Teach a task + - Recording a live demonstration needs desktop or web with the full computer view. You can - still ask this bot to run saved skills from chat. + + Recording a live demonstration needs desktop or web with the full computer view. You can + still ask this bot to run saved skills from chat. + @@ -291,7 +303,7 @@ export default function Computer() { - Booting {label} + Booting {label} - You have control + + You have control + ) : null} @@ -373,11 +387,13 @@ export default function Computer() { justifyContent: "center", }} > - Take control + + Take control + )} setComputerOpen(false)} style={{ @@ -408,7 +424,7 @@ export default function Computer() { > {computer?.state === "suspended" - ? "Computer is asleep" + ? t`Computer is asleep` : computerLabel(computer?.mode, name)} @@ -429,13 +445,14 @@ function ComputerReleaseActions({ takeoverRequested: boolean; onRelease: (reason?: ComputerReleaseReason) => Promise; }) { + const { t } = useLingui(); const actions: Array<{ label: string; reason?: ComputerReleaseReason; primary?: boolean }> = takeoverRequested ? [ - { label: "Skip", reason: "skipped" }, - { label: "I’m done", reason: "done", primary: true }, + { label: t`Skip`, reason: "skipped" }, + { label: t`I’m done`, reason: "done", primary: true }, ] - : [{ label: "Release" }]; + : [{ label: t`Release` }]; return ( {actions.map((action) => ( diff --git a/apps/mobile/app/group-settings.tsx b/apps/mobile/app/group-settings.tsx index d3af174c..6c1067b4 100644 --- a/apps/mobile/app/group-settings.tsx +++ b/apps/mobile/app/group-settings.tsx @@ -1,3 +1,4 @@ +import { Trans, useLingui } from "@lingui/react/macro"; import { GROUP_MEMBER_MAX, GROUP_MEMBER_MIN } from "@sentrabot/contracts"; import { Stack, useLocalSearchParams, useRouter } from "expo-router"; import { useEffect, useState } from "react"; @@ -7,6 +8,7 @@ import { type MobileBot, type MobileGroup, rpc } from "../lib/api"; export default function GroupSettingsScreen() { const router = useRouter(); + const { t } = useLingui(); const { groupId } = useLocalSearchParams<{ groupId: string }>(); const [group, setGroup] = useState(null); const [bots, setBots] = useState([]); @@ -30,7 +32,7 @@ export default function GroupSettingsScreen() { setSelected(nextGroup.members.map((member) => member.botId)); setBots(nextBots.filter((bot) => !bot.archivedAt)); }) - .catch((err) => setError(err instanceof Error ? err.message : "Could not load group")); + .catch((err) => setError(err instanceof Error ? err.message : t`Could not load group`)); }, [groupId]); function toggle(botId: string) { @@ -53,7 +55,7 @@ export default function GroupSettingsScreen() { if (input.name || input.botIds) await rpc("groups/update", input); router.back(); } catch (err) { - setError(err instanceof Error ? err.message : "Could not save group"); + setError(err instanceof Error ? err.message : t`Could not save group`); } finally { setPending(false); } @@ -61,18 +63,18 @@ export default function GroupSettingsScreen() { function remove() { if (!groupId || !group) return; - Alert.alert(group.name, "Delete this group? Bots and their solo threads are kept.", [ - { text: "Cancel", style: "cancel" }, + Alert.alert(group.name, t`Delete this group? Bots and their solo threads are kept.`, [ + { text: t`Cancel`, style: "cancel" }, { - text: "Delete", + text: t`Delete`, style: "destructive", onPress: () => void rpc("groups/remove", { groupId }) .then(() => router.replace("/")) .catch((err) => Alert.alert( - "Could not delete group", - err instanceof Error ? err.message : "Try again.", + t`Could not delete group`, + err instanceof Error ? err.message : t`Try again.`, ), ), }, @@ -81,16 +83,18 @@ export default function GroupSettingsScreen() { return ( <> - + - Name + + Name + - Members ({GROUP_MEMBER_MIN}–{GROUP_MEMBER_MAX}) + + Members ({GROUP_MEMBER_MIN}–{GROUP_MEMBER_MAX}) + {bots.map((bot) => { const checked = selected.includes(bot.id); @@ -143,7 +149,7 @@ export default function GroupSettingsScreen() { }} > - {pending ? "Saving…" : "Save"} + {pending ? t`Saving…` : t`Save`} - Delete group + + Delete group + diff --git a/apps/mobile/app/index.tsx b/apps/mobile/app/index.tsx index 0f17b85f..8bb03794 100644 --- a/apps/mobile/app/index.tsx +++ b/apps/mobile/app/index.tsx @@ -1,3 +1,4 @@ +import { useLingui } from "@lingui/react/macro"; import type { RunActivityRow, SearchHit } from "@sentrabot/contracts"; import { groupBotsForSidebar } from "@sentrabot/core"; import { Redirect, useFocusEffect, useRouter } from "expo-router"; @@ -51,6 +52,7 @@ type InboxItem = | { type: "heading"; key: string; title: string }; export default function Home() { + const { t } = useLingui(); const [bots, setBots] = useState([]); const [groups, setGroups] = useState([]); const [botSections, setBotSections] = useState([]); @@ -102,7 +104,7 @@ export default function Home() { setGroups(nextGroups); } catch (err) { if (requestId !== inboxRequestId.current) return; - setError(err instanceof Error ? err.message : "Could not load bots"); + setError(err instanceof Error ? err.message : t`Could not load bots`); } }, []); @@ -255,12 +257,12 @@ export default function Home() { return ( - router.push("/account")}> + router.push("/account")}> {initials} setSearching((open) => { @@ -285,12 +287,12 @@ export default function Home() { - Alert.alert("Create", undefined, [ - { text: "New bot", onPress: () => router.push("/new") }, - { text: "New group", onPress: () => router.push("/new-group") }, - { text: "Cancel", style: "cancel" }, + Alert.alert(t`Create`, undefined, [ + { text: t`New bot`, onPress: () => router.push("/new") }, + { text: t`New group`, onPress: () => router.push("/new-group") }, + { text: t`Cancel`, style: "cancel" }, ]) } > @@ -304,7 +306,7 @@ export default function Home() { autoFocus value={query} onChangeText={setQuery} - placeholder="Search" + placeholder={t`Search`} placeholderTextColor="#6C6C70" autoCorrect={false} autoCapitalize="none" @@ -354,13 +356,13 @@ export default function Home() { {query.trim() && searching ? searchLoading - ? "Searching…" - : "No results" + ? t`Searching…` + : t`No results` : query.trim() - ? "No matching bots" + ? t`No matching bots` : searching - ? "Search conversations, files, and routines" - : "Tap + to create a bot"} + ? t`Search conversations, files, and routines` + : t`Tap + to create a bot`} } renderItem={({ item }) => @@ -429,6 +431,7 @@ function ActivitySection({ activity: { active: RunActivityRow[]; recent: RunActivityRow[] }; }) { const router = useRouter(); + const { t } = useLingui(); const openRun = (run: RunActivityRow) => { if (run.groupId) { router.push({ @@ -444,7 +447,7 @@ function ActivitySection({ {activity.active.length > 0 ? ( <> - Now + {t`Now`} {activity.active.map((run) => ( openRun(run)} /> ))} @@ -453,7 +456,7 @@ function ActivitySection({ {activity.recent.length > 0 ? ( <> 0 && styles.activityGap]}> - Recent + {t`Recent`} {activity.recent.map((run) => ( openRun(run)} /> @@ -545,15 +548,16 @@ function SearchRow({ hit, onPress }: { hit: SearchHit; onPress: () => void }) { function BotRow({ bot, onLongPress }: { bot: MobileBot; onLongPress: () => void }) { const router = useRouter(); - const preview = previewSnippet(bot.preview, 40) || bot.title || "No messages yet"; + const { t } = useLingui(); + const preview = previewSnippet(bot.preview, 40) || bot.title || t`No messages yet`; const time = bot.updatedAt ? formatThreadTime(bot.updatedAt) : ""; const tag = botTag(bot.title, bot.name); // Spelled out because an explicit label replaces the one built from the row's children. const label = [ bot.name, tag, - bot.notifyOnFinish ? null : "notifications silenced", - bot.unread ? "unread" : null, + bot.notifyOnFinish ? null : t`notifications silenced`, + bot.unread ? t`unread` : null, time, preview, ] @@ -562,7 +566,7 @@ function BotRow({ bot, onLongPress }: { bot: MobileBot; onLongPress: () => void return ( router.push({ pathname: "/thread", params: { botId: bot.id, name: bot.name } }) } @@ -608,19 +612,20 @@ function BotRow({ bot, onLongPress }: { bot: MobileBot; onLongPress: () => void function GroupRow({ group, onLongPress }: { group: MobileGroup; onLongPress: () => void }) { const router = useRouter(); + const { t } = useLingui(); const preview = previewSnippet(group.preview, 40) || group.members.map((member) => member.name).join(", "); const time = group.updatedAt ? formatThreadTime(group.updatedAt) : ""; return ( router.push({ pathname: "/group-thread", params: { groupId: group.id, name: group.name } }) } onLongPress={onLongPress} - accessibilityHint="Long press to pin or move to a section" + accessibilityHint={t`Long press to pin or move to a section`} style={({ pressed }) => [styles.row, pressed && styles.rowPressed]} > diff --git a/apps/mobile/app/integrations.tsx b/apps/mobile/app/integrations.tsx index 8c0ec583..9fef0a51 100644 --- a/apps/mobile/app/integrations.tsx +++ b/apps/mobile/app/integrations.tsx @@ -1,3 +1,4 @@ +import { Trans, useLingui } from "@lingui/react/macro"; import type { CapabilityInstall, Connection, ConnectionCatalogItem } from "@sentrabot/contracts"; import { abortableDelay, @@ -26,6 +27,7 @@ import { native } from "../lib/native"; type SourceKind = "treg" | "mcp" | "api"; export default function Integrations() { + const { t } = useLingui(); const { width } = useWindowDimensions(); const catalogColumns = width >= 480 ? 2 : 1; const [catalog, setCatalog] = useState([]); @@ -69,7 +71,7 @@ export default function Integrations() { useEffect(() => { void refresh().catch((reason) => { setCatalogReady(false); - setCatalogError(reason instanceof Error ? reason.message : "Could not load integrations"); + setCatalogError(reason instanceof Error ? reason.message : t`Could not load integrations`); }); void loadLastBotId().then(setLastBotId); return () => connectionAttempt.current?.abort(); @@ -124,12 +126,12 @@ export default function Integrations() { } if (controller.signal.aborted) return; Alert.alert( - "Connection pending", - "Finish connecting in the browser, then refresh this page.", + t`Connection pending`, + t`Finish connecting in the browser, then refresh this page.`, ); } catch (reason) { if (controller.signal.aborted) return; - setCatalogError(reason instanceof Error ? reason.message : "Could not connect"); + setCatalogError(reason instanceof Error ? reason.message : t`Could not connect`); } finally { if (connectionAttempt.current === controller) { connectionAttempt.current = null; @@ -152,11 +154,11 @@ export default function Integrations() { matches.find((connection) => connection.status === "connected") ?? matches.find((connection) => connection.status === "pending") ?? matches.find((connection) => connection.status === "error"); - if (!row) throw new Error(`No connection record found for ${item.name}.`); + if (!row) throw new Error(t`No connection record found for ${item.name}.`); await rpc("connections/revoke", { connectionId: row.id }); await refresh(); } catch (reason) { - setCatalogError(reason instanceof Error ? reason.message : "Could not revoke connection"); + setCatalogError(reason instanceof Error ? reason.message : t`Could not revoke connection`); } finally { setPending(null); } @@ -178,7 +180,7 @@ export default function Integrations() { try { await rpc("capabilities/install", { kind: sourceKind === "api" ? "api" : "mcp", - name: name.trim() || (sourceKind === "treg" ? "Treg" : "Custom connector"), + name: name.trim() || (sourceKind === "treg" ? "Treg" : t`Custom connector`), source: url.trim(), credential: credential.trim() || undefined, config: @@ -192,7 +194,7 @@ export default function Integrations() { setSourceKind(null); await refresh(); } catch (reason) { - setSourceError(reason instanceof Error ? reason.message : "Could not add source"); + setSourceError(reason instanceof Error ? reason.message : t`Could not add source`); } finally { setPending(null); } @@ -205,7 +207,7 @@ export default function Integrations() { await rpc("capabilities/remove", { id: source.id }); setSources((current) => current.filter((item) => item.id !== source.id)); } catch (reason) { - setSourceError(reason instanceof Error ? reason.message : "Could not remove source"); + setSourceError(reason instanceof Error ? reason.message : t`Could not remove source`); } finally { setPending(null); } @@ -214,7 +216,9 @@ export default function Integrations() { return ( - Connect apps. + + Connect apps. + {catalogError ? {catalogError} : null} @@ -245,18 +249,22 @@ export default function Integrations() { {tile.label} {disabled ? ( - Not in the plugin catalog + + Not in the plugin catalog + ) : null} {disabled || !item ? null : ( void (connected ? revoke(item) : connect(item))} > - {pending === key ? "Working…" : connected ? "Remove" : "Add"} + {pending === key ? t`Working…` : connected ? t`Remove` : t`Add`} )} @@ -277,12 +285,14 @@ export default function Integrations() { void (item.connected ? revoke(item) : connect(item))} > - {pending === key ? "Working…" : item.connected ? "Remove" : "Add"} + {pending === key ? t`Working…` : item.connected ? t`Remove` : t`Add`} @@ -301,7 +311,9 @@ export default function Integrations() { }} style={styles.advancedToggle} > - Advanced + + Advanced + @@ -317,10 +329,10 @@ export default function Integrations() { > {kind === "treg" - ? "Add Treg" + ? t`Add Treg` : kind === "mcp" - ? "Add MCP server" - : "Add OpenAPI"} + ? t`Add MCP server` + : t`Add OpenAPI`} ))} @@ -332,15 +344,15 @@ export default function Integrations() { {sourceKind === "treg" - ? "Connect Treg" + ? t`Connect Treg` : sourceKind === "mcp" - ? "Remote MCP server" - : "OpenAPI JSON"} + ? t`Remote MCP server` + : t`OpenAPI JSON`} @@ -366,7 +378,7 @@ export default function Integrations() { style={styles.authToggle} > - {requiresAuth ? "Bearer authentication" : "No authentication"} + {requiresAuth ? t`Bearer authentication` : t`No authentication`} ) : null} @@ -377,7 +389,7 @@ export default function Integrations() { secureTextEntry autoCapitalize="none" autoCorrect={false} - placeholder={sourceKind === "treg" ? "Treg token" : "Bearer token"} + placeholder={sourceKind === "treg" ? t`Treg token` : t`Bearer token`} placeholderTextColor={native.tertiaryLabel} style={styles.input} /> @@ -392,7 +404,9 @@ export default function Integrations() { {pending === "source" ? ( ) : ( - Verify and add + + Verify and add + )} setSourceKind(null)} style={styles.smallButton} > - Cancel + + Cancel + ) : null} - Tool sources + + Tool sources + {sources.length === 0 ? ( - No custom sources installed. + + No custom sources installed. + ) : null} {sources.map((source) => ( @@ -420,7 +440,7 @@ export default function Integrations() { void removeSource(source)}> - {pending === source.id ? "Removing…" : "Remove"} + {pending === source.id ? t`Removing…` : t`Remove`} diff --git a/apps/mobile/app/models.tsx b/apps/mobile/app/models.tsx index b89a859f..18294c3e 100644 --- a/apps/mobile/app/models.tsx +++ b/apps/mobile/app/models.tsx @@ -1,3 +1,4 @@ +import { Trans, useLingui } from "@lingui/react/macro"; import type { ModelOAuthBegin } from "@sentrabot/contracts"; import { OPENAI_COMPATIBLE_BASE_URL_HINT, @@ -32,6 +33,7 @@ type ModelSelection = { }; export default function Models() { + const { t } = useLingui(); const [catalog, setCatalog] = useState([]); const [credentials, setCredentials] = useState([]); const [me, setMe] = useState(null); @@ -112,7 +114,7 @@ export default function Models() { useCallback(() => { void load() .catch((err: unknown) => - setError(err instanceof Error ? err.message : "Could not load model settings"), + setError(err instanceof Error ? err.message : t`Could not load model settings`), ) .finally(() => setLoading(false)); return () => { @@ -214,7 +216,7 @@ export default function Models() { setNotice(openAiCompatibleProbeSuccessMessage(result.models.length)); } catch (err) { if (requestId !== probeRequestIdRef.current) return; - setError(err instanceof Error ? err.message : "Could not reach this model server"); + setError(err instanceof Error ? err.message : t`Could not reach this model server`); } finally { if (requestId === probeRequestIdRef.current) setProbing(false); } @@ -230,9 +232,9 @@ export default function Models() { try { await rpc("models/setDefault", { provider: selected.provider, modelId: activeModelId }); await load({ provider, modelId: activeModelId }); - setNotice(isOpenAiCompatible ? "Model updated." : `Now using ${selected.label}.`); + setNotice(isOpenAiCompatible ? t`Model updated.` : t`Now using ${selected.label}.`); } catch (err) { - setError(err instanceof Error ? err.message : "Could not change the default model"); + setError(err instanceof Error ? err.message : t`Could not change the default model`); } finally { setPending(null); } @@ -268,9 +270,9 @@ export default function Models() { ); setApiKey(""); await load({ provider, modelId }); - setNotice(isOpenAiCompatible ? "Saved." : `Connected and using ${selected.label}.`); + setNotice(isOpenAiCompatible ? t`Saved.` : t`Connected and using ${selected.label}.`); } catch (err) { - setError(err instanceof Error ? err.message : "Could not connect this provider"); + setError(err instanceof Error ? err.message : t`Could not connect this provider`); } finally { setPending(null); } @@ -285,7 +287,8 @@ export default function Models() { setOauth(null); await load({ provider, modelId }); if (controller.signal.aborted) return; - setNotice(`Connected and using ${selected?.label ?? "this model"}.`); + const label = selected?.label ?? t`this model`; + setNotice(t`Connected and using ${label}.`); } async function startSubscriptionSignIn() { @@ -318,7 +321,7 @@ export default function Models() { const loginId = oauthLoginIdRef.current; oauthLoginIdRef.current = null; if (loginId) void rpc("models/cancelOAuth", { loginId }).catch(() => undefined); - setError(err instanceof Error ? err.message : "Could not start sign-in"); + setError(err instanceof Error ? err.message : t`Could not start sign-in`); setOauth(null); } finally { if (!waitingForCode) { @@ -357,7 +360,7 @@ export default function Models() { retryable = true; setPasteCode(code); } - setError(err instanceof Error ? err.message : "Could not finish sign-in"); + setError(err instanceof Error ? err.message : t`Could not finish sign-in`); } finally { oauthCodeSubmittingRef.current = false; if (!retryable) { @@ -378,19 +381,23 @@ export default function Models() { - Active model + + Active model + - {currentEntry?.label ?? me?.defaultModel ?? "Deployment default"} + {currentEntry?.label ?? me?.defaultModel ?? t`Deployment default`} - {currentEntry?.providerName ?? me?.defaultProvider ?? "Configured by deployment"} + {currentEntry?.providerName ?? me?.defaultProvider ?? t`Configured by deployment`} {error ? {error} : null} {notice ? {notice} : null} - Providers + + Providers + {groups.map((group) => { const connected = credentials.some((entry) => entry.provider === group.id); @@ -408,10 +415,16 @@ export default function Models() { {group.name} - {group.entries.length} model{group.entries.length === 1 ? "" : "s"} + + {group.entries.length} model{group.entries.length === 1 ? "" : "s"} + - {connected ? Connected : null} + {connected ? ( + + Connected + + ) : null} ); })} @@ -419,12 +432,18 @@ export default function Models() { {selected ? ( <> - {!isOpenAiCompatible ? Model : null} + {!isOpenAiCompatible ? ( + + Model + + ) : null} {isOpenAiCompatible ? ( <> - Server URL + + Server URL + setShowEndpointHelp((visible) => !visible)} > - Setup help + + Setup help + {showEndpointHelp ? ( {OPENAI_COMPATIBLE_BASE_URL_HINT} @@ -454,9 +475,11 @@ export default function Models() { pressed && styles.pressed, ]} > - {probing ? "Finding…" : "Find models"} + {probing ? t`Finding…` : t`Find models`} - Model + + Model + {probeModels.length && probeModels.includes(modelId) ? ( {probeModels.map((entry) => ( @@ -491,18 +514,20 @@ export default function Models() { ]} > - Other model… + + Other model… + ) : ( <> setModelId(probeModels[0] ?? "")} > - Use a found model + + Use a found model + ) : null} @@ -549,14 +576,16 @@ export default function Models() { {!isOpenAiCompatible ? ( - Personal credential + + Personal credential + - {credential ? `Connected · ${credential.label}` : "Not connected"} + {credential ? t`Connected · ${credential.label}` : t`Not connected`} {credential - ? "Your key or subscription token is stored securely and is never shown here." - : "Connect this provider to use it as your personal model."} + ? t`Your key or subscription token is stored securely and is never shown here.` + : t`Connect this provider to use it as your personal model.`} ) : null} @@ -566,15 +595,17 @@ export default function Models() { {oauth.mode === "auth-url" ? ( <> - Finish signing in in your browser: + + Finish signing in in your browser: + void Linking.openURL(oauth.verificationUri)}> {oauth.verificationUri} - The final page may not load. Paste its URL or code here. + The final page may not load. Paste its URL or code here. - Submit + + Submit + - Waiting for sign-in… + + Waiting for sign-in… + ) : ( <> - Enter this code in your browser: + + Enter this code in your browser: + void Linking.openURL(oauth.verificationUri)}> {oauth.verificationUri} {oauth.userCode} - Waiting for sign-in… + + Waiting for sign-in… + )} @@ -620,7 +659,7 @@ export default function Models() { ]} > - {oauthPending ? "Starting…" : (selected.oauthLabel ?? "Sign in")} + {oauthPending ? t`Starting…` : (selected.oauthLabel ?? t`Sign in`)} ) @@ -635,18 +674,20 @@ export default function Models() { accessibilityState={{ expanded: showApiKey }} onPress={() => setShowApiKey((visible) => !visible)} > - API key + + API key + {showApiKey ? ( {credential - ? "Replace API key" + ? t`Replace API key` : subscriptionSignIn - ? "Or connect an API key" - : "API key"} + ? t`Or connect an API key` + : t`API key`} {pending === "connect" - ? "Saving…" + ? t`Saving…` : isOpenAiCompatible - ? "Save" + ? t`Save` : credential - ? "Replace API key" - : "Connect API key"} + ? t`Replace API key` + : t`Connect API key`} @@ -710,8 +751,10 @@ export default function Models() { {selected.auth === "oauth" && !subscriptionSignIn ? ( - This subscription sign-in is not available in Sentra Bot yet. Use a deployment - credential or choose another provider. + + This subscription sign-in is not available in Sentra Bot yet. Use a deployment + credential or choose another provider. + ) : null} @@ -727,7 +770,7 @@ export default function Models() { ]} > - {pending === "default" ? "Switching…" : "Use this model"} + {pending === "default" ? t`Switching…` : t`Use this model`} ) : null} diff --git a/apps/mobile/app/new-group.tsx b/apps/mobile/app/new-group.tsx index 5c2e010d..96446689 100644 --- a/apps/mobile/app/new-group.tsx +++ b/apps/mobile/app/new-group.tsx @@ -1,3 +1,4 @@ +import { Trans, useLingui } from "@lingui/react/macro"; import { GROUP_MEMBER_MAX, GROUP_MEMBER_MIN } from "@sentrabot/contracts"; import { Stack, useRouter } from "expo-router"; import { useEffect, useState } from "react"; @@ -7,6 +8,7 @@ import { type MobileBot, rpc } from "../lib/api"; export default function NewGroup() { const router = useRouter(); + const { t } = useLingui(); const [bots, setBots] = useState([]); const [name, setName] = useState(""); const [selected, setSelected] = useState([]); @@ -47,7 +49,7 @@ export default function NewGroup() { params: { groupId: group.id, name: group.name }, }); } catch (err) { - setError(err instanceof Error ? err.message : "Could not create group"); + setError(err instanceof Error ? err.message : t`Could not create group`); } finally { setPending(false); } @@ -55,16 +57,18 @@ export default function NewGroup() { return ( <> - + - Name + + Name + - Members ({GROUP_MEMBER_MIN}–{GROUP_MEMBER_MAX}) + + Members ({GROUP_MEMBER_MIN}–{GROUP_MEMBER_MAX}) + {bots.map((bot) => { const checked = selected.includes(bot.id); @@ -122,7 +128,7 @@ export default function NewGroup() { }} > - {pending ? "Creating…" : "Create group"} + {pending ? t`Creating…` : t`Create group`} diff --git a/apps/mobile/app/new.tsx b/apps/mobile/app/new.tsx index a19eaf7d..96922722 100644 --- a/apps/mobile/app/new.tsx +++ b/apps/mobile/app/new.tsx @@ -1,3 +1,4 @@ +import { Trans, useLingui } from "@lingui/react/macro"; import { BOT_DESCRIPTION_MAX_LENGTH, BOT_NAME_MAX_LENGTH, @@ -13,6 +14,7 @@ import { type MobileBot, rpc } from "../lib/api"; export default function NewBot() { const router = useRouter(); + const { t } = useLingui(); const [name, setName] = useState(""); const [title, setTitle] = useState(""); const [description, setDescription] = useState(""); @@ -44,7 +46,7 @@ export default function NewBot() { }); router.replace({ pathname: "/thread", params: { botId: bot.id, name: bot.name } }); } catch (err) { - setError(err instanceof Error ? err.message : "Could not create bot"); + setError(err instanceof Error ? err.message : t`Could not create bot`); } finally { setPending(false); } @@ -59,9 +61,11 @@ export default function NewBot() { onPress={close} hitSlop={12} accessibilityRole="button" - accessibilityLabel="Cancel" + accessibilityLabel={t`Cancel`} > - Cancel + + Cancel + ), }} @@ -72,12 +76,14 @@ export default function NewBot() { keyboardShouldPersistTaps="handled" keyboardDismissMode="on-drag" > - Name + + Name + - Title + + Title + - Description + + Description + - {pending ? "Creating…" : "Create"} + + {pending ? t`Creating…` : t`Create`} + diff --git a/apps/mobile/app/sign-in.tsx b/apps/mobile/app/sign-in.tsx index b8c630b1..f5a67c79 100644 --- a/apps/mobile/app/sign-in.tsx +++ b/apps/mobile/app/sign-in.tsx @@ -1,3 +1,4 @@ +import { Trans, useLingui } from "@lingui/react/macro"; import { Redirect, useRouter } from "expo-router"; import { StatusBar } from "expo-status-bar"; import { useEffect, useState } from "react"; @@ -27,6 +28,7 @@ import { export default function SignIn() { const router = useRouter(); + const { t } = useLingui(); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [error, setError] = useState(null); @@ -46,7 +48,9 @@ export default function SignIn() { if (!ready) { return ( - Loading… + + Loading… + ); } @@ -59,7 +63,7 @@ export default function SignIn() { await signIn(email.trim(), password); router.replace("/"); } catch (err) { - setError(err instanceof Error ? err.message : "Could not sign in"); + setError(err instanceof Error ? err.message : t`Could not sign in`); } finally { setPending(false); } @@ -72,15 +76,15 @@ export default function SignIn() { - Sign in to Sentra Bot + Sign in to Sentra Bot - Same Better Auth session as the web app. + Same Better Auth session as the web app. - {pending ? "Working…" : "Continue with email"} + {pending ? t`Working…` : t`Continue with email`} setServerOpen(true)} @@ -134,13 +138,17 @@ export default function SignIn() { > {custom ? ( <> - Custom server + + Custom server + {displayApiHost(apiBase)} ) : ( - Use a custom server + + Use a custom server + )} void; onSaved: (url: string) => void; }) { + const { t } = useLingui(); const [draft, setDraft] = useState(current); const [error, setError] = useState(null); const [pending, setPending] = useState(false); @@ -236,18 +245,24 @@ function ServerSheet({ }} > - Cancel + + Cancel + - Server + + Server + void save()} disabled={pending} hitSlop={8}> - {pending ? "Checking…" : "Save"} + {pending ? t`Checking…` : t`Save`} - Point this app at your self-hosted Sentra Bot origin — the same HTTPS URL you open in a - browser. + + Point this app at your self-hosted Sentra Bot origin — the same HTTPS URL you open in + a browser. + - Use default server + + Use default server + ) : null} diff --git a/apps/mobile/app/thread.tsx b/apps/mobile/app/thread.tsx index 321f0c83..b6fd796d 100644 --- a/apps/mobile/app/thread.tsx +++ b/apps/mobile/app/thread.tsx @@ -1,3 +1,4 @@ +import { Trans, useLingui } from "@lingui/react/macro"; import { ChatMarkdown } from "@sentrabot/chat-ui/native"; import type { AgentSkillCatalogEntry, @@ -103,12 +104,15 @@ function newClientNonce(): string { return `m-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`; } -function formatApprovalAnswer(answer: string | undefined): string { - if (!answer) return "Answered"; - if (answer === "allow") return "Allowed once"; - if (answer === "always") return "Always allowed"; - if (answer === "deny") return "Denied"; - return `Answered: ${answer}`; +function formatApprovalAnswer( + t: ReturnType["t"], + answer: string | undefined, +): string { + if (!answer) return t`Answered`; + if (answer === "allow") return t`Allowed once`; + if (answer === "always") return t`Always allowed`; + if (answer === "deny") return t`Denied`; + return t`Answered: ${answer}`; } function isWorkingStatus(status: string | undefined): boolean { @@ -118,6 +122,7 @@ function isWorkingStatus(status: string | undefined): boolean { export default function Thread() { const navigation = useNavigation(); const router = useRouter(); + const { t } = useLingui(); const headerHeight = useHeaderHeight(); const insets = useSafeAreaInsets(); const { botId, groupId, name, messageId } = useLocalSearchParams<{ @@ -361,7 +366,7 @@ export default function Thread() { useLayoutEffect(() => { navigation.setOptions({ - title: name || "Thread", + title: name || t`Thread`, headerTitle: () => ( ) : null} - {name || "Thread"} + {name || t`Thread`} ), headerRight: () => inGroup ? ( router.push({ @@ -400,7 +405,7 @@ export default function Thread() { ) : ( - + ), @@ -425,26 +430,26 @@ export default function Thread() { ); }) .catch((err: unknown) => - setError(err instanceof Error ? err.message : "Could not clear conversation"), + setError(err instanceof Error ? err.message : t`Could not clear conversation`), ); } function showBotActions() { if (!botId) return; - const bot = { id: botId, name: name || "Bot" }; - Alert.alert(bot.name, "Archive keeps everything and can be undone. Delete is permanent.", [ - { text: "Cancel", style: "cancel" }, + const bot = { id: botId, name: name || t`Bot` }; + Alert.alert(bot.name, t`Archive keeps everything and can be undone. Delete is permanent.`, [ + { text: t`Cancel`, style: "cancel" }, { - text: "Clear conversation", + text: t`Clear conversation`, style: "destructive", onPress: () => { Alert.alert( - "Clear conversation?", - "This removes every message and stops current work. The bot, computer, memory, and routines are kept.", + t`Clear conversation?`, + t`This removes every message and stops current work. The bot, computer, memory, and routines are kept.`, [ - { text: "Cancel", style: "cancel" }, + { text: t`Cancel`, style: "cancel" }, { - text: "Clear", + text: t`Clear`, style: "destructive", onPress: clearConversation, }, @@ -453,19 +458,19 @@ export default function Thread() { }, }, { - text: "Archive", + text: t`Archive`, onPress: () => void rpc("bots/archive", { botId }) .then(leaveBot) .catch((error) => Alert.alert( - "Could not archive bot", - error instanceof Error ? error.message : "Try again.", + t`Could not archive bot`, + error instanceof Error ? error.message : t`Try again.`, ), ), }, { - text: "Delete…", + text: t`Delete…`, style: "destructive", onPress: () => confirmDeleteBot(bot, leaveBot), }, @@ -547,7 +552,7 @@ export default function Thread() { setSnap((prev) => prependMobileMessagePage(prev, page)); } catch (err) { loadingOlderContent.current = false; - setError(err instanceof Error ? err.message : "Could not load earlier messages"); + setError(err instanceof Error ? err.message : t`Could not load earlier messages`); } finally { setLoadingOlder(false); } @@ -720,7 +725,7 @@ export default function Thread() { if ((!botId && !groupId) || !messageId) return; void applyMessageJump(groupId ? { groupId, messageId } : { botId: botId!, messageId }).catch( (err) => { - setError(err instanceof Error ? err.message : "Could not open message"); + setError(err instanceof Error ? err.message : t`Could not open message`); }, ); }, [botId, groupId, messageId]); @@ -847,7 +852,7 @@ export default function Thread() { pathname: "/group-thread", params: { groupId: groupTarget, - name: plan.rerouteGroupName ?? "Group", + name: plan.rerouteGroupName ?? t`Group`, }, }); return; @@ -894,7 +899,7 @@ export default function Thread() { pathname: "/group-thread", params: { groupId: groupTarget, - name: plan.rerouteGroupName ?? "Group", + name: plan.rerouteGroupName ?? t`Group`, }, }); return; @@ -904,9 +909,9 @@ export default function Thread() { } } catch (err) { if (reroutedToGroup && groupTarget) { - setError(err instanceof Error ? err.message : "Failed to send message"); + setError(err instanceof Error ? err.message : t`Failed to send message`); } else if (isCurrentTarget(botTarget, groupTarget)) { - setError(err instanceof Error ? err.message : "Failed to send message"); + setError(err instanceof Error ? err.message : t`Failed to send message`); } } finally { setSending(false); @@ -937,21 +942,25 @@ export default function Thread() { const speak = useCallback( (message: MobileMessage) => - void speakMessage(message.botId ?? botId ?? snap?.members?.[0]?.botId ?? "", message).catch( - (err) => Alert.alert("Could not speak", err instanceof Error ? err.message : "Try again."), + void speakMessage( + t, + message.botId ?? botId ?? snap?.members?.[0]?.botId ?? "", + message, + ).catch((err) => + Alert.alert(t`Could not speak`, err instanceof Error ? err.message : t`Try again.`), ), - [botId, snap?.members], + [botId, snap?.members, t], ); function showAttachMenu() { - Alert.alert("Attach", undefined, [ + Alert.alert(t`Attach`, undefined, [ { - text: "Photo library", + text: t`Photo library`, onPress: () => void addAttachments(pickFromLibrary), }, - { text: "Camera", onPress: () => void addAttachments(takePhoto) }, - { text: "File", onPress: () => void addAttachments(pickDocuments) }, - { text: "Cancel", style: "cancel" }, + { text: t`Camera`, onPress: () => void addAttachments(takePhoto) }, + { text: t`File`, onPress: () => void addAttachments(pickDocuments) }, + { text: t`Cancel`, style: "cancel" }, ]); } @@ -1074,14 +1083,16 @@ export default function Thread() { }} > setReplyTarget(message)} style={{ alignSelf: message.role === "user" ? "flex-end" : "flex-start", marginBottom: 4, }} > - Reply + + Reply + - {currentBot.name} is working + + {currentBot.name} is working + ) : inGroup && workingGroupBots.length > 0 ? ( {workingGroupBots.length === 1 - ? `${workingGroupBots[0]?.name ?? "Agent"} is working` - : `${workingGroupBots.length} agents working`} + ? t`${workingGroupBots[0]?.name ?? defaultAgentName} is working` + : t`${workingGroupBots.length} agents working`} ) : null; @@ -1165,7 +1179,7 @@ export default function Thread() { }} > - {loadingOlder ? "Loading…" : "Load earlier messages"} + {loadingOlder ? t`Loading…` : t`Load earlier messages`} ) : null; @@ -1238,7 +1252,7 @@ export default function Thread() { { performScroll(scrollBehavior.current.jumpToLatest()); @@ -1293,12 +1307,14 @@ export default function Thread() { }} > - Replying to + + Replying to + - {previewMessageText(replyTarget)} + {previewMessageText(t, replyTarget)} - setReplyTarget(null)}> + setReplyTarget(null)}> @@ -1342,7 +1358,7 @@ export default function Thread() { {attachment.name} setPendingAttachments((current) => current.filter((item) => item.id !== attachment.id), @@ -1415,7 +1431,7 @@ export default function Thread() { {slashSkillOptions.map((skill) => ( insertSkill(skill)} style={{ flexDirection: "row", @@ -1470,7 +1486,7 @@ export default function Thread() { }} > setSelectedSkill(null)} > @@ -1545,7 +1561,7 @@ export default function Thread() { {mention.name} setSelectedMentions((current) => @@ -1562,7 +1578,7 @@ export default function Thread() { { if ( event.nativeEvent.key === "Backspace" && @@ -1572,7 +1588,7 @@ export default function Thread() { removeLastChip(); } }} - placeholder={selectedSkill || selectedMentions.length ? undefined : "Message…"} + placeholder={selectedSkill || selectedMentions.length ? undefined : t`Message…`} placeholderTextColor="#6C6C70" keyboardAppearance="dark" multiline @@ -1614,7 +1630,9 @@ export default function Thread() { asChild > - Open computer → + + Open computer → + ) : null} @@ -1732,7 +1750,7 @@ function MentionChipIcon({ mention }: { mention: ComposerMention }) { ); } -function previewMessageText(message: MobileMessage): string { +function previewMessageText(t: ReturnType["t"], message: MobileMessage): string { const text = message.blocks .flatMap((block) => { if (block.kind === "phone_channel_message" && block.text) { @@ -1744,9 +1762,9 @@ function previewMessageText(message: MobileMessage): string { .trim(); if (text) return text; if (message.blocks.some((block) => block.kind === "image" || block.kind === "file")) { - return "Attachment"; + return t`Attachment`; } - return "Message"; + return t`Message`; } function memberName( @@ -1757,14 +1775,18 @@ function memberName( return members.find((member) => member.botId === botId)?.name; } -async function speakMessage(botId: string, message: MobileMessage) { +async function speakMessage( + t: ReturnType["t"], + botId: string, + message: MobileMessage, +) { const text = blockText(message); if (!text.trim()) return; const prepared = await rpc<{ ready: boolean; utterances: string[] }>("voice/prepare", { text, botId, }); - if (!prepared.ready) throw new Error("Add a voice provider in Voice settings."); + if (!prepared.ready) throw new Error(t`Add a voice provider in Voice settings.`); for (const utterance of prepared.utterances) { await playMpeg(await speakUtterance(utterance, { botId })); } @@ -1795,6 +1817,7 @@ const MessageBubble = memo(function MessageBubble({ onPreviewMarkdown: (target: MarkdownArtifactPreviewTarget) => void; onSpeak?: (message: MobileMessage) => void; }) { + const { t } = useLingui(); const [peerExpanded, setPeerExpanded] = useState(false); const artifactTarget: MobileArtifactTarget = groupId ? { groupId } : { botId }; const cardBotId = message.botId ?? botId; @@ -1822,11 +1845,11 @@ const MessageBubble = memo(function MessageBubble({ } const handoff = message.blocks.find((block) => block.kind === "handoff"); if (handoff) { - const from = memberName(members, handoff.fromBotId) ?? "bot"; - const to = memberName(members, handoff.toBotId) ?? "bot"; + const from = memberName(members, handoff.fromBotId) ?? t`bot`; + const to = memberName(members, handoff.toBotId) ?? t`bot`; return ( setPeerExpanded((expanded) => !expanded)} @@ -1844,7 +1867,7 @@ const MessageBubble = memo(function MessageBubble({ const peer = sent ? peerMessage.toBotName : peerMessage.fromBotName; return ( setPeerExpanded((expanded) => !expanded)} @@ -1859,7 +1882,9 @@ const MessageBubble = memo(function MessageBubble({ return ( - iMessage · {phoneChannel.fromLabel}: {phoneChannel.text} + + iMessage · {phoneChannel.fromLabel}: {phoneChannel.text} + ); @@ -1890,7 +1915,7 @@ const MessageBubble = memo(function MessageBubble({ }} > - {special.name || "subagent"} + {special.name || t`subagent`} - {running ? "subagent" : special.status} + {running ? t`subagent` : special.status} {special.task ? ( @@ -1919,7 +1944,7 @@ const MessageBubble = memo(function MessageBubble({ return ( onOpenBot(special.botId ?? "", special.name ?? "Bot")} + onPress={() => onOpenBot(special.botId ?? "", special.name ?? t`Bot`)} style={{ width: "90%", borderRadius: 18, @@ -1939,14 +1964,14 @@ const MessageBubble = memo(function MessageBubble({ }} > - {special.name || "Bot"} + {special.name || t`Bot`} {special.status === "archived" - ? "archived" + ? t`archived` : special.status === "deleted" - ? "deleted" - : "bot"} + ? t`deleted` + : t`bot`} {removed ? special.status === "archived" - ? "Archived. Chat, memory, and files kept." - : "Removed with chat, computer, and memory." - : special.title || "Opened its thread."} + ? t`Archived. Chat, memory, and files kept.` + : t`Removed with chat, computer, and memory.` + : special.title || t`Opened its thread.`} ); @@ -2017,7 +2042,7 @@ const MessageBubble = memo(function MessageBubble({ fontWeight: "600", }} > - {formatApprovalAnswer(askBlock.answer)} + {formatApprovalAnswer(t, askBlock.answer)} ) : canAnswer && onAnswer ? ( ) : ( - No longer active + No longer active )} @@ -2068,7 +2093,7 @@ const MessageBubble = memo(function MessageBubble({ ) : null} {replyPreview ? ( - {previewMessageText(replyPreview)} + {previewMessageText(t, replyPreview)} ) : null} {caption ? ( @@ -2090,12 +2115,12 @@ const MessageBubble = memo(function MessageBubble({ ? void openMobileArtifact( artifactTarget, attachment.artifactId, - attachment.name ?? "Image", + attachment.name ?? t`Image`, attachment.mimeType ?? "image/png", ).catch((err) => Alert.alert( - "Could not open image", - err instanceof Error ? err.message : "Try again.", + t`Could not open image`, + err instanceof Error ? err.message : t`Try again.`, ), ) : undefined @@ -2107,7 +2132,7 @@ const MessageBubble = memo(function MessageBubble({ fontSize: 15, }} > - 🖼 {attachment.name ?? "Image"} + 🖼 {attachment.name ?? t`Image`} ) : ( @@ -2118,18 +2143,18 @@ const MessageBubble = memo(function MessageBubble({ ? attachment.mimeType === "text/markdown" ? onPreviewMarkdown({ artifactId: attachment.artifactId, - name: attachment.name ?? "Markdown file", + name: attachment.name ?? t`Markdown file`, mimeType: attachment.mimeType, }) : void openMobileArtifact( artifactTarget, attachment.artifactId, - attachment.name ?? "File", + attachment.name ?? t`File`, attachment.mimeType ?? "text/plain", ).catch((err) => Alert.alert( - "Could not open file", - err instanceof Error ? err.message : "Try again.", + t`Could not open file`, + err instanceof Error ? err.message : t`Try again.`, ), ) : undefined @@ -2141,11 +2166,13 @@ const MessageBubble = memo(function MessageBubble({ fontSize: 15, }} > - 📎 {attachment.name ?? "File"} + 📎 {attachment.name ?? t`File`} {attachment.size ? ( - {attachment.mimeType ?? "file"} · {attachment.size} bytes + + {attachment.mimeType ?? t`file`} · {attachment.size} bytes + ) : null} @@ -2198,6 +2225,7 @@ function MessageTextCard({ replyPreview?: MobileMessage; onSpeak?: () => void; }) { + const { t } = useLingui(); const contentText = blockText(message); if (!contentText) return null; return ( @@ -2218,7 +2246,7 @@ function MessageTextCard({ ) : null} {replyPreview ? ( - {previewMessageText(replyPreview)} + {previewMessageText(t, replyPreview)} ) : null} {message.role === "user" ? ( @@ -2229,12 +2257,14 @@ function MessageTextCard({ {onSpeak ? ( - Speak + + Speak + ) : null} @@ -2254,11 +2284,12 @@ function AgentEventLabel({ expanded: boolean; onToggle: () => void; }) { + const { t } = useLingui(); return ( ↔ {label} @@ -2287,6 +2318,7 @@ function ExpandableToolBlock({ }: { block: Extract; }) { + const { t } = useLingui(); const [expanded, setExpanded] = useState(false); const provider = block.kind === "progress" ? /^Using\s+([^:]+)/i.exec(block.text)?.[1] : undefined; @@ -2299,7 +2331,7 @@ function ExpandableToolBlock({ : []), ...(block.pendingToolNames ?? []), ].filter(Boolean); - const title = provider ? `Using ${provider}` : "Tools"; + const title = provider ? t`Using ${provider}` : t`Tools`; return ( setExpanded((current) => !current)} style={{ flexDirection: "row", @@ -2356,6 +2388,8 @@ function AskBlock({ canAnswer: boolean; onAnswer: (answer: string) => Promise; }) { + const { t } = useLingui(); + const doneLabel = t`Done`; const [answer, setAnswer] = useState(""); const [error, setError] = useState(null); const [submitting, setSubmitting] = useState(false); @@ -2371,7 +2405,7 @@ function AskBlock({ try { await onAnswer(submitValue); } catch (cause) { - setError(cause instanceof Error ? cause.message : "Could not send answer"); + setError(cause instanceof Error ? cause.message : t`Could not send answer`); } finally { setSubmitting(false); } @@ -2394,15 +2428,15 @@ function AskBlock({ {ask.detail ? {ask.detail} : null} {answered ? ( - {secretInput ? "Submitted" : `Answered: ${ask.answer ?? "Done"}`} + {secretInput ? t`Submitted` : t`Answered: ${ask.answer ?? doneLabel}`} ) : canAnswer ? ( <> void submit()} style={{ @@ -2432,12 +2466,14 @@ function AskBlock({ }} > - {submitting ? "Sending…" : "Send answer"} + {submitting ? t`Sending…` : t`Send answer`} ) : ( - Waiting for this bot’s response. + + Waiting for this bot’s response. + )} {error ? {error} : null} diff --git a/apps/mobile/app/voice.tsx b/apps/mobile/app/voice.tsx index 792ea88d..5e536813 100644 --- a/apps/mobile/app/voice.tsx +++ b/apps/mobile/app/voice.tsx @@ -1,3 +1,4 @@ +import { Trans, useLingui } from "@lingui/react/macro"; import { useFocusEffect } from "expo-router"; import { useCallback, useState } from "react"; import { @@ -33,6 +34,7 @@ type VoiceStatus = { type VoiceInfo = { id: string; label: string; description?: string }; export default function VoiceSettings() { + const { t } = useLingui(); const [catalog, setCatalog] = useState([]); const [credentials, setCredentials] = useState([]); const [status, setStatus] = useState(null); @@ -70,7 +72,7 @@ export default function VoiceSettings() { setLoading(true); void load() .catch((err: unknown) => - setError(err instanceof Error ? err.message : "Could not load voice settings"), + setError(err instanceof Error ? err.message : t`Could not load voice settings`), ) .finally(() => setLoading(false)); }, [load]), @@ -91,9 +93,9 @@ export default function VoiceSettings() { }); setApiKey(""); await load(selected.id); - setNotice(`Connected ${selected.name}.`); + setNotice(t`Connected ${selected.name}.`); } catch (err) { - setError(err instanceof Error ? err.message : "Could not connect"); + setError(err instanceof Error ? err.message : t`Could not connect`); } finally { setPending(false); } @@ -106,7 +108,7 @@ export default function VoiceSettings() { await rpc("voice/setVoice", { voiceId: nextVoiceId, provider: selected?.id }); await load(selected?.id); } catch (err) { - setError(err instanceof Error ? err.message : "Could not save that voice"); + setError(err instanceof Error ? err.message : t`Could not save that voice`); } finally { setPending(false); } @@ -117,15 +119,15 @@ export default function VoiceSettings() { setError(null); try { const prepared = await rpc<{ ready: boolean; utterances: string[] }>("voice/prepare", { - text: "Hi, this is how I'll sound when I read replies out loud.", + text: t`Hi, this is how I'll sound when I read replies out loud.`, }); - if (!prepared.ready) throw new Error("Connect a voice provider first."); + if (!prepared.ready) throw new Error(t`Connect a voice provider first.`); for (const utterance of prepared.utterances) { await playMpeg(await speakUtterance(utterance)); } - setNotice("If you heard that, voice is ready."); + setNotice(t`If you heard that, voice is ready.`); } catch (err) { - setError(err instanceof Error ? err.message : "Could not play a sample"); + setError(err instanceof Error ? err.message : t`Could not play a sample`); } finally { setPending(false); } @@ -138,7 +140,10 @@ export default function VoiceSettings() { {error ? {error} : null} {notice ? {notice} : null} - Bring your own key. ElevenLabs, OpenAI, and Cartesia all plug into the same speak buttons. + + Bring your own key. ElevenLabs, OpenAI, and Cartesia all plug into the same speak + buttons. + {catalog.map((entry) => { const connected = credentials.some((cred) => cred.provider === entry.id); @@ -153,7 +158,11 @@ export default function VoiceSettings() { > {entry.name} - {connected ? "Connected" : entry.transcribe ? "Speak + transcribe" : "Speak only"} + {connected + ? t`Connected` + : entry.transcribe + ? t`Speak + transcribe` + : t`Speak only`} ); @@ -169,7 +178,7 @@ export default function VoiceSettings() { importantForAutofill="no" value={apiKey} onChangeText={setApiKey} - placeholder={credential ? "Paste a replacement key" : "Paste your API key"} + placeholder={credential ? t`Paste a replacement key` : t`Paste your API key`} placeholderTextColor="#6C6C70" secureTextEntry style={styles.input} @@ -180,7 +189,7 @@ export default function VoiceSettings() { onPress={() => void connect()} style={[styles.button, (pending || apiKey.trim().length < 8) && styles.disabled]} > - {credential ? "Replace key" : "Connect"} + {credential ? t`Replace key` : t`Connect`} {voices.length ? ( @@ -202,7 +211,9 @@ export default function VoiceSettings() { onPress={() => void testVoice()} style={styles.secondary} > - Hear a sample + + Hear a sample + ) : null} diff --git a/apps/mobile/babel.config.js b/apps/mobile/babel.config.js new file mode 100644 index 00000000..bb1fb356 --- /dev/null +++ b/apps/mobile/babel.config.js @@ -0,0 +1,9 @@ +// Expo's default preset plus the Lingui macro, so `t` and `` compile to +// catalog lookups the same way they do in apps/web. +module.exports = (api) => { + api.cache(true); + return { + presets: ["babel-preset-expo"], + plugins: ["@lingui/babel-plugin-lingui-macro"], + }; +}; diff --git a/apps/mobile/components/bot-organize-modal.tsx b/apps/mobile/components/bot-organize-modal.tsx index da797a3a..f23647a9 100644 --- a/apps/mobile/components/bot-organize-modal.tsx +++ b/apps/mobile/components/bot-organize-modal.tsx @@ -1,3 +1,4 @@ +import { Trans, useLingui } from "@lingui/react/macro"; import { useState } from "react"; import { Modal, Pressable, ScrollView, StyleSheet, Text, TextInput, View } from "react-native"; import type { MobileBot, MobileBotSection } from "../lib/api"; @@ -24,6 +25,7 @@ export function BotOrganizeModal({ onUpdate: (update: BotOrganizationUpdate) => Promise; onCreateSection: (name: string) => Promise; }) { + const { t } = useLingui(); const [creating, setCreating] = useState(false); const [name, setName] = useState(""); const [saving, setSaving] = useState(false); @@ -37,7 +39,7 @@ export function BotOrganizeModal({ await request(); onClose(); } catch (err) { - setError(err instanceof Error ? err.message : "Could not update chat"); + setError(err instanceof Error ? err.message : t`Could not update chat`); setSaving(false); } } @@ -46,7 +48,7 @@ export function BotOrganizeModal({ @@ -65,7 +67,7 @@ export function BotOrganizeModal({ android={bot.pinned ? "pin-outline" : "pin"} size={18} /> - {bot.pinned ? "Unpin" : "Pin"} + {bot.pinned ? t`Unpin` : t`Pin`} {typeof bot.notifyOnFinish === "boolean" ? ( - {bot.notifyOnFinish ? "Silence notifications" : "Resume notifications"} + {bot.notifyOnFinish ? t`Silence notifications` : t`Resume notifications`} ) : null} - Move to + + Move to + {sections.map((section) => ( ))} void save(() => onUpdate({ sectionId: null }))} @@ -109,18 +113,20 @@ export function BotOrganizeModal({ value={name} onChangeText={setName} maxLength={60} - placeholder="Section name" + placeholder={t`Section name`} placeholderTextColor={native.secondaryLabel} style={styles.newSectionInput} /> void save(() => onCreateSection(name.trim()))} style={styles.newSectionSubmit} > - Create + + Create + ) : ( @@ -130,12 +136,16 @@ export function BotOrganizeModal({ style={({ pressed }) => [styles.action, pressed && styles.pressed]} > - New section + + New section + )} {error ? {error} : null} - Cancel + + Cancel + diff --git a/apps/mobile/components/computer-mode-picker.tsx b/apps/mobile/components/computer-mode-picker.tsx index 980300e9..7d2fc105 100644 --- a/apps/mobile/components/computer-mode-picker.tsx +++ b/apps/mobile/components/computer-mode-picker.tsx @@ -1,3 +1,4 @@ +import { Trans, useLingui } from "@lingui/react/macro"; import type { ComputerMode } from "@sentrabot/contracts"; import { Pressable, Text, View } from "react-native"; @@ -10,9 +11,12 @@ export function ComputerModePicker({ onChange: (mode: ComputerMode) => void; disabled?: boolean; }) { + const { t } = useLingui(); return ( - Computer + + Computer + {(["team", "dedicated"] as const).map((mode) => ( - {mode === "team" ? "Team" : "Private"} + {mode === "team" ? t`Team` : t`Private`} ))} diff --git a/apps/mobile/lib/i18n.ts b/apps/mobile/lib/i18n.ts new file mode 100644 index 00000000..dfb0c412 --- /dev/null +++ b/apps/mobile/lib/i18n.ts @@ -0,0 +1,17 @@ +import { i18n } from "@lingui/core"; +import type { UiLocale } from "./ui-locale"; + +export { i18n }; + +// Static import paths so Metro can resolve the compiled catalogs at bundle time. +const loaders: Record Promise<{ messages: Record }>> = { + en: () => import("../locales/en/messages.mjs"), + id: () => import("../locales/id/messages.mjs"), +}; + +/** Load the compiled catalog for `locale` and make it the active one. */ +export async function activateLocale(locale: UiLocale): Promise { + const { messages } = await loaders[locale](); + i18n.load(locale, messages as Parameters[1]); + i18n.activate(locale); +} diff --git a/apps/mobile/lib/lingui-catalogs.d.ts b/apps/mobile/lib/lingui-catalogs.d.ts new file mode 100644 index 00000000..7df688e6 --- /dev/null +++ b/apps/mobile/lib/lingui-catalogs.d.ts @@ -0,0 +1,3 @@ +declare module "*/messages.mjs" { + export const messages: Record; +} diff --git a/apps/mobile/lib/ui-locale.test.ts b/apps/mobile/lib/ui-locale.test.ts new file mode 100644 index 00000000..ae98e9d6 --- /dev/null +++ b/apps/mobile/lib/ui-locale.test.ts @@ -0,0 +1,34 @@ +import { describe, expect, it } from "vitest"; +import { isUiLocale, resolveUiLocale } from "./ui-locale"; + +describe("mobile ui locale", () => { + it("recognises only supported locales", () => { + expect(isUiLocale("en")).toBe(true); + expect(isUiLocale("id")).toBe(true); + expect(isUiLocale("fr")).toBe(false); + expect(isUiLocale(null)).toBe(false); + expect(isUiLocale(42)).toBe(false); + }); + + it("prefers the saved choice", () => { + expect(resolveUiLocale({ saved: "en", deviceLanguage: "id-ID" })).toBe("en"); + }); + + it("ignores a saved value that is not supported", () => { + expect(resolveUiLocale({ saved: "klingon", deviceLanguage: "en-US" })).toBe("en"); + }); + + it("takes the primary subtag of the device language", () => { + expect(resolveUiLocale({ deviceLanguage: "en-US" })).toBe("en"); + expect(resolveUiLocale({ deviceLanguage: "id-ID" })).toBe("id"); + }); + + it("falls back to id for an unsupported device language", () => { + expect(resolveUiLocale({ deviceLanguage: "fr-FR" })).toBe("id"); + }); + + it("falls back to id when nothing is known", () => { + expect(resolveUiLocale({})).toBe("id"); + expect(resolveUiLocale({ saved: null, deviceLanguage: null })).toBe("id"); + }); +}); diff --git a/apps/mobile/lib/ui-locale.ts b/apps/mobile/lib/ui-locale.ts new file mode 100644 index 00000000..1b9d0127 --- /dev/null +++ b/apps/mobile/lib/ui-locale.ts @@ -0,0 +1,53 @@ +export const UI_LOCALES = ["en", "id"] as const; + +export type UiLocale = (typeof UI_LOCALES)[number]; + +export const UI_LOCALE_STORAGE_KEY = "ui-locale"; + +export function isUiLocale(value: unknown): value is UiLocale { + return typeof value === "string" && (UI_LOCALES as readonly string[]).includes(value); +} + +/** Order: saved choice → device language when supported → `id` (Bahasa Indonesia). */ +export function resolveUiLocale(input: { + saved?: string | null; + deviceLanguage?: string | null; +}): UiLocale { + if (isUiLocale(input.saved)) return input.saved; + + const device = input.deviceLanguage; + if (typeof device === "string" && device) { + const primary = device.trim().toLowerCase().replace("_", "-").split("-")[0] ?? ""; + if (isUiLocale(primary)) return primary; + } + + return "id"; +} + +/** Read the saved choice (SecureStore) and the device language, then resolve. */ +export async function loadUiLocale(): Promise { + let saved: string | null = null; + let deviceLanguage: string | null = null; + try { + const SecureStore = await import("expo-secure-store"); + saved = await SecureStore.getItemAsync(UI_LOCALE_STORAGE_KEY); + } catch { + saved = null; + } + try { + const Localization = await import("expo-localization"); + deviceLanguage = Localization.getLocales()[0]?.languageTag ?? null; + } catch { + deviceLanguage = null; + } + return resolveUiLocale({ saved, deviceLanguage }); +} + +export async function persistUiLocale(locale: UiLocale): Promise { + try { + const SecureStore = await import("expo-secure-store"); + await SecureStore.setItemAsync(UI_LOCALE_STORAGE_KEY, locale); + } catch { + // Ignore keychain failures; the in-memory locale still applies this session. + } +} diff --git a/apps/mobile/lingui.config.ts b/apps/mobile/lingui.config.ts new file mode 100644 index 00000000..a26d5a19 --- /dev/null +++ b/apps/mobile/lingui.config.ts @@ -0,0 +1,17 @@ +import { defineConfig } from "@lingui/conf"; + +// Mirrors apps/web/lingui.config.ts: English source strings, Indonesian as the +// product default, catalogs kept next to the app so Metro can bundle them. +export default defineConfig({ + sourceLocale: "en", + locales: ["en", "id"], + catalogs: [ + { + path: "/locales/{locale}/messages", + include: ["app", "components", "lib"], + exclude: ["**/*.test.*", "**/locales/**"], + }, + ], + format: "po", + compileNamespace: "es", +}); diff --git a/apps/mobile/locales/en/messages.po b/apps/mobile/locales/en/messages.po new file mode 100644 index 00000000..15cbec5f --- /dev/null +++ b/apps/mobile/locales/en/messages.po @@ -0,0 +1,1323 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2026-09-04 17:30+0700\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: en\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#. placeholder {0}: attachment.mimeType ?? t`file` +#. placeholder {1}: attachment.size +#: app/thread.tsx:2173 +msgid "{0} · {1} bytes" +msgstr "{0} · {1} bytes" + +#. placeholder {0}: workingGroupBots.length +#: app/thread.tsx:1165 +msgid "{0} agents working" +msgstr "{0} agents working" + +#. placeholder {0}: currentBot.name +#. placeholder {0}: workingGroupBots[0]?.name ?? defaultAgentName +#: app/thread.tsx:1136 +#: app/thread.tsx:1164 +msgid "{0} is working" +msgstr "{0} is working" + +#. placeholder {0}: group.entries.length +#. placeholder {1}: group.entries.length === 1 ? "" : "s" +#: app/models.tsx:418 +msgid "{0} model{1}" +msgstr "{0} model{1}" + +#. placeholder {0}: usage.runs +#. placeholder {1}: usage.inputTokens + usage.outputTokens +#: app/account.tsx:98 +msgid "{0} runs · {1} tokens" +msgstr "{0} runs · {1} tokens" + +#: app/thread.tsx:1852 +msgid "{from} messaged {to}" +msgstr "{from} messaged {to}" + +#: app/account.tsx:219 +msgid "{label} avatars" +msgstr "{label} avatars" + +#: app/_layout.tsx:69 +#: app/index.tsx:260 +msgid "Account" +msgstr "Account" + +#: app/models.tsx:385 +msgid "Active model" +msgstr "Active model" + +#: app/index.tsx:265 +msgid "Activity" +msgstr "Activity" + +#: app/integrations.tsx:267 +#: app/integrations.tsx:295 +msgid "Add" +msgstr "Add" + +#. placeholder {0}: item.name +#. placeholder {0}: tile.label +#: app/integrations.tsx:261 +#: app/integrations.tsx:289 +msgid "Add {0}" +msgstr "Add {0}" + +#: app/integrations.tsx:334 +msgid "Add MCP server" +msgstr "Add MCP server" + +#: app/integrations.tsx:335 +msgid "Add OpenAPI" +msgstr "Add OpenAPI" + +#: app/integrations.tsx:332 +msgid "Add Treg" +msgstr "Add Treg" + +#: app/integrations.tsx:315 +msgid "Advanced" +msgstr "Advanced" + +#: app/thread.tsx:1117 +msgid "Agent" +msgstr "Agent" + +#: app/account.tsx:286 +msgid "Agent messages" +msgstr "Agent messages" + +#: app/account.tsx:294 +msgid "Alerts from routines" +msgstr "Alerts from routines" + +#: app/thread.tsx:2436 +msgid "Answer" +msgstr "Answer" + +#. placeholder {0}: ask.answer ?? doneLabel +#: app/thread.tsx:2431 +msgid "Answered: {0}" +msgstr "Answered: {0}" + +#: app/models.tsx:678 +#: app/models.tsx:683 +#: app/models.tsx:706 +#: app/models.tsx:709 +msgid "API key" +msgstr "API key" + +#: app/thread.tsx:461 +msgid "Archive" +msgstr "Archive" + +#: app/thread.tsx:440 +msgid "Archive keeps everything and can be undone. Delete is permanent." +msgstr "Archive keeps everything and can be undone. Delete is permanent." + +#: app/thread.tsx:1971 +msgid "archived" +msgstr "archived" + +#: app/account.tsx:397 +msgid "Archived bots" +msgstr "Archived bots" + +#: app/thread.tsx:1987 +msgid "Archived. Chat, memory, and files kept." +msgstr "Archived. Chat, memory, and files kept." + +#: app/thread.tsx:956 +msgid "Attach" +msgstr "Attach" + +#: app/thread.tsx:1489 +msgid "Attach file" +msgstr "Attach file" + +#: app/models.tsx:608 +msgid "Authorization code" +msgstr "Authorization code" + +#: app/account.tsx:208 +msgid "Avatar style" +msgstr "Avatar style" + +#: app/account.tsx:210 +msgid "Avatars" +msgstr "Avatars" + +#: app/integrations.tsx:381 +msgid "Bearer authentication" +msgstr "Bearer authentication" + +#: app/integrations.tsx:392 +msgid "Bearer token" +msgstr "Bearer token" + +#: app/computer.tsx:306 +msgid "Booting {label}" +msgstr "Booting {label}" + +#: app/thread.tsx:1848 +#: app/thread.tsx:1849 +#: app/thread.tsx:1974 +msgid "bot" +msgstr "bot" + +#: app/computer.tsx:31 +#: app/thread.tsx:439 +#: app/thread.tsx:1947 +#: app/thread.tsx:1967 +msgid "Bot" +msgstr "Bot" + +#: app/thread.tsx:408 +msgid "Bot actions" +msgstr "Bot actions" + +#: app/voice.tsx:143 +msgid "Bring your own key. ElevenLabs, OpenAI, and Cartesia all plug into the same speak buttons." +msgstr "Bring your own key. ElevenLabs, OpenAI, and Cartesia all plug into the same speak buttons." + +#: app/thread.tsx:961 +msgid "Camera" +msgstr "Camera" + +#: app/account.tsx:174 +#: app/group-settings.tsx:67 +#: app/index.tsx:295 +#: app/integrations.tsx:418 +#: app/new.tsx:64 +#: app/new.tsx:67 +#: app/sign-in.tsx:249 +#: app/thread.tsx:441 +#: app/thread.tsx:450 +#: app/thread.tsx:963 +#: components/bot-organize-modal.tsx:147 +msgid "Cancel" +msgstr "Cancel" + +#: app/thread.tsx:1317 +msgid "Cancel reply" +msgstr "Cancel reply" + +#: app/_layout.tsx:92 +#: app/bot-settings.tsx:88 +msgid "Chat settings" +msgstr "Chat settings" + +#: app/sign-in.tsx:257 +msgid "Checking…" +msgstr "Checking…" + +#: app/account.tsx:343 +msgid "Choose your provider and active model" +msgstr "Choose your provider and active model" + +#: app/account.tsx:215 +msgid "Clay" +msgstr "Clay" + +#: app/thread.tsx:452 +msgid "Clear" +msgstr "Clear" + +#: app/thread.tsx:443 +msgid "Clear conversation" +msgstr "Clear conversation" + +#: app/thread.tsx:447 +msgid "Clear conversation?" +msgstr "Clear conversation?" + +#: components/bot-organize-modal.tsx:51 +msgid "Close chat organization" +msgstr "Close chat organization" + +#: app/computer.tsx:396 +msgid "Close computer" +msgstr "Close computer" + +#: app/thread.tsx:2436 +#: app/thread.tsx:2439 +msgid "Code" +msgstr "Code" + +#: app/_layout.tsx:95 +#: components/computer-mode-picker.tsx:18 +msgid "Computer" +msgstr "Computer" + +#: app/computer.tsx:427 +msgid "Computer is asleep" +msgstr "Computer is asleep" + +#: app/models.tsx:391 +msgid "Configured by deployment" +msgstr "Configured by deployment" + +#: app/voice.tsx:192 +msgid "Connect" +msgstr "Connect" + +#: app/voice.tsx:124 +msgid "Connect a voice provider first." +msgstr "Connect a voice provider first." + +#: app/models.tsx:746 +msgid "Connect API key" +msgstr "Connect API key" + +#: app/account.tsx:377 +#: app/integrations.tsx:220 +msgid "Connect apps." +msgstr "Connect apps." + +#: app/models.tsx:588 +msgid "Connect this provider to use it as your personal model." +msgstr "Connect this provider to use it as your personal model." + +#: app/integrations.tsx:347 +msgid "Connect Treg" +msgstr "Connect Treg" + +#: app/models.tsx:425 +#: app/voice.tsx:162 +msgid "Connected" +msgstr "Connected" + +#. placeholder {0}: credential.label +#: app/models.tsx:583 +msgid "Connected · {0}" +msgstr "Connected · {0}" + +#. placeholder {0}: selected.name +#: app/voice.tsx:96 +msgid "Connected {0}." +msgstr "Connected {0}." + +#. placeholder {0}: selected.label +#: app/models.tsx:273 +msgid "Connected and using {0}." +msgstr "Connected and using {0}." + +#: app/models.tsx:291 +msgid "Connected and using {label}." +msgstr "Connected and using {label}." + +#: app/integrations.tsx:129 +msgid "Connection pending" +msgstr "Connection pending" + +#: app/sign-in.tsx:126 +msgid "Continue with email" +msgstr "Continue with email" + +#: app/integrations.tsx:197 +msgid "Could not add source" +msgstr "Could not add source" + +#: app/thread.tsx:467 +msgid "Could not archive bot" +msgstr "Could not archive bot" + +#: app/models.tsx:237 +msgid "Could not change the default model" +msgstr "Could not change the default model" + +#: app/thread.tsx:433 +msgid "Could not clear conversation" +msgstr "Could not clear conversation" + +#: app/integrations.tsx:134 +#: app/voice.tsx:98 +msgid "Could not connect" +msgstr "Could not connect" + +#: app/models.tsx:275 +msgid "Could not connect this provider" +msgstr "Could not connect this provider" + +#: app/new.tsx:49 +msgid "Could not create bot" +msgstr "Could not create bot" + +#: app/new-group.tsx:52 +msgid "Could not create group" +msgstr "Could not create group" + +#: app/account.tsx:192 +msgid "Could not delete account" +msgstr "Could not delete account" + +#: app/group-settings.tsx:76 +msgid "Could not delete group" +msgstr "Could not delete group" + +#: app/models.tsx:363 +msgid "Could not finish sign-in" +msgstr "Could not finish sign-in" + +#: app/bot-settings.tsx:48 +msgid "Could not load bot" +msgstr "Could not load bot" + +#: app/index.tsx:107 +msgid "Could not load bots" +msgstr "Could not load bots" + +#: app/thread.tsx:555 +msgid "Could not load earlier messages" +msgstr "Could not load earlier messages" + +#: app/group-settings.tsx:35 +msgid "Could not load group" +msgstr "Could not load group" + +#: app/integrations.tsx:74 +msgid "Could not load integrations" +msgstr "Could not load integrations" + +#: app/models.tsx:117 +msgid "Could not load model settings" +msgstr "Could not load model settings" + +#: app/computer.tsx:199 +msgid "Could not load the desktop. This device cannot reach the screen URL." +msgstr "Could not load the desktop. This device cannot reach the screen URL." + +#: app/voice.tsx:75 +msgid "Could not load voice settings" +msgstr "Could not load voice settings" + +#: app/computer.tsx:99 +msgid "Could not open computer" +msgstr "Could not open computer" + +#: app/thread.tsx:2156 +msgid "Could not open file" +msgstr "Could not open file" + +#: app/thread.tsx:2122 +msgid "Could not open image" +msgstr "Could not open image" + +#: app/thread.tsx:728 +msgid "Could not open message" +msgstr "Could not open message" + +#: app/voice.tsx:130 +msgid "Could not play a sample" +msgstr "Could not play a sample" + +#: app/models.tsx:219 +msgid "Could not reach this model server" +msgstr "Could not reach this model server" + +#: app/integrations.tsx:210 +msgid "Could not remove source" +msgstr "Could not remove source" + +#: app/account.tsx:115 +msgid "Could not restore bot" +msgstr "Could not restore bot" + +#: app/integrations.tsx:161 +msgid "Could not revoke connection" +msgstr "Could not revoke connection" + +#: app/bot-settings.tsx:80 +msgid "Could not save bot" +msgstr "Could not save bot" + +#: app/group-settings.tsx:58 +msgid "Could not save group" +msgstr "Could not save group" + +#: app/voice.tsx:111 +msgid "Could not save that voice" +msgstr "Could not save that voice" + +#: app/thread.tsx:2408 +msgid "Could not send answer" +msgstr "Could not send answer" + +#: app/sign-in.tsx:66 +msgid "Could not sign in" +msgstr "Could not sign in" + +#: app/thread.tsx:950 +msgid "Could not speak" +msgstr "Could not speak" + +#: app/models.tsx:324 +msgid "Could not start sign-in" +msgstr "Could not start sign-in" + +#: app/computer.tsx:166 +msgid "Could not switch computer" +msgstr "Could not switch computer" + +#: components/bot-organize-modal.tsx:42 +msgid "Could not update chat" +msgstr "Could not update chat" + +#: app/account.tsx:161 +msgid "Could not update notifications" +msgstr "Could not update notifications" + +#: app/account.tsx:128 +msgid "Couldn't update avatars" +msgstr "Couldn't update avatars" + +#: app/index.tsx:290 +#: app/index.tsx:292 +#: app/new.tsx:148 +#: components/bot-organize-modal.tsx:128 +msgid "Create" +msgstr "Create" + +#: app/new-group.tsx:131 +msgid "Create group" +msgstr "Create group" + +#: components/bot-organize-modal.tsx:122 +msgid "Create section" +msgstr "Create section" + +#: app/new-group.tsx:131 +#: app/new.tsx:148 +msgid "Creating…" +msgstr "Creating…" + +#: app/account.tsx:437 +#: app/account.tsx:445 +msgid "Current password" +msgstr "Current password" + +#: app/integrations.tsx:183 +msgid "Custom connector" +msgstr "Custom connector" + +#: app/sign-in.tsx:142 +msgid "Custom server" +msgstr "Custom server" + +#. placeholder {0}: displayApiHost(apiBase) +#: app/sign-in.tsx:133 +msgid "Custom server {0}" +msgstr "Custom server {0}" + +#: app/account.tsx:418 +#: app/group-settings.tsx:69 +msgid "Delete" +msgstr "Delete" + +#: app/account.tsx:176 +#: app/account.tsx:428 +#: app/account.tsx:467 +msgid "Delete account" +msgstr "Delete account" + +#: app/group-settings.tsx:167 +msgid "Delete group" +msgstr "Delete group" + +#: app/group-settings.tsx:66 +msgid "Delete this group? Bots and their solo threads are kept." +msgstr "Delete this group? Bots and their solo threads are kept." + +#: app/account.tsx:171 +msgid "Delete your account?" +msgstr "Delete your account?" + +#: app/thread.tsx:473 +msgid "Delete…" +msgstr "Delete…" + +#: app/thread.tsx:1973 +msgid "deleted" +msgstr "deleted" + +#: app/models.tsx:388 +msgid "Deployment default" +msgstr "Deployment default" + +#: app/bot-settings.tsx:119 +#: app/new.tsx:103 +msgid "Describe what this bot does" +msgstr "Describe what this bot does" + +#: app/bot-settings.tsx:130 +#: app/new.tsx:114 +msgid "Description" +msgstr "Description" + +#: app/integrations.tsx:355 +msgid "Display name" +msgstr "Display name" + +#: app/thread.tsx:2392 +msgid "Done" +msgstr "Done" + +#: app/sign-in.tsx:87 +msgid "Email" +msgstr "Email" + +#: app/models.tsx:638 +msgid "Enter this code in your browser:" +msgstr "Enter this code in your browser:" + +#: app/account.tsx:431 +msgid "Enter your current password, then confirm permanent deletion of your account and all associated data." +msgstr "Enter your current password, then confirm permanent deletion of your account and all associated data." + +#: app/models.tsx:530 +msgid "exact-model-id" +msgstr "exact-model-id" + +#: app/thread.tsx:912 +#: app/thread.tsx:914 +msgid "Failed to send message" +msgstr "Failed to send message" + +#: app/thread.tsx:2174 +msgid "file" +msgstr "file" + +#: app/thread.tsx:962 +#: app/thread.tsx:2152 +#: app/thread.tsx:2169 +msgid "File" +msgstr "File" + +#: app/models.tsx:478 +msgid "Find models" +msgstr "Find models" + +#: app/models.tsx:478 +msgid "Finding…" +msgstr "Finding…" + +#: app/integrations.tsx:130 +msgid "Finish connecting in the browser, then refresh this page." +msgstr "Finish connecting in the browser, then refresh this page." + +#: app/models.tsx:599 +msgid "Finish signing in in your browser:" +msgstr "Finish signing in in your browser:" + +#: app/_layout.tsx:90 +#: app/thread.tsx:855 +#: app/thread.tsx:902 +msgid "Group" +msgstr "Group" + +#: app/group-settings.tsx:97 +msgid "Group name" +msgstr "Group name" + +#: app/_layout.tsx:91 +#: app/group-settings.tsx:86 +#: app/thread.tsx:396 +msgid "Group settings" +msgstr "Group settings" + +#: app/voice.tsx:215 +msgid "Hear a sample" +msgstr "Hear a sample" + +#: app/voice.tsx:122 +msgid "Hi, this is how I'll sound when I read replies out loud." +msgstr "Hi, this is how I'll sound when I read replies out loud." + +#: app/thread.tsx:2292 +msgid "Hide {label}" +msgstr "Hide {label}" + +#: app/thread.tsx:2345 +msgid "Hide tool details" +msgstr "Hide tool details" + +#: app/computer.tsx:453 +msgid "I’m done" +msgstr "I’m done" + +#: app/voice.tsx:128 +msgid "If you heard that, voice is ready." +msgstr "If you heard that, voice is ready." + +#: app/thread.tsx:2118 +#: app/thread.tsx:2135 +msgid "Image" +msgstr "Image" + +#. placeholder {0}: phoneChannel.fromLabel +#. placeholder {1}: phoneChannel.text +#: app/thread.tsx:1885 +msgid "iMessage · {0}: {1}" +msgstr "iMessage · {0}: {1}" + +#: app/_layout.tsx:72 +#: app/account.tsx:374 +msgid "Integrations" +msgstr "Integrations" + +#: app/thread.tsx:1255 +msgid "Jump to latest" +msgstr "Jump to latest" + +#: app/thread.tsx:1255 +msgid "Jump to latest, new messages" +msgstr "Jump to latest, new messages" + +#: app/account.tsx:244 +#: app/account.tsx:246 +msgid "Language" +msgstr "Language" + +#: app/account.tsx:316 +msgid "Live update settings" +msgstr "Live update settings" + +#: app/account.tsx:277 +msgid "Live working status" +msgstr "Live working status" + +#: app/thread.tsx:1182 +msgid "Load earlier messages" +msgstr "Load earlier messages" + +#: app/sign-in.tsx:52 +#: app/thread.tsx:1182 +msgid "Loading…" +msgstr "Loading…" + +#: app/index.tsx:628 +msgid "Long press to pin or move to a section" +msgstr "Long press to pin or move to a section" + +#: app/index.tsx:569 +msgid "Long press to pin, move, or silence notifications" +msgstr "Long press to pin, move, or silence notifications" + +#: app/thread.tsx:2146 +msgid "Markdown file" +msgstr "Markdown file" + +#: app/group-settings.tsx:109 +#: app/new-group.tsx:83 +msgid "Members ({GROUP_MEMBER_MIN}–{GROUP_MEMBER_MAX})" +msgstr "Members ({GROUP_MEMBER_MIN}–{GROUP_MEMBER_MAX})" + +#: app/thread.tsx:1581 +msgid "Message" +msgstr "Message" + +#: app/thread.tsx:1870 +msgid "Message from {peer}" +msgstr "Message from {peer}" + +#: app/thread.tsx:1591 +msgid "Message…" +msgstr "Message…" + +#: app/thread.tsx:1870 +msgid "Messaged {peer}" +msgstr "Messaged {peer}" + +#: app/models.tsx:437 +#: app/models.tsx:481 +msgid "Model" +msgstr "Model" + +#: app/models.tsx:525 +msgid "Model id" +msgstr "Model id" + +#: app/account.tsx:104 +msgid "Model spend uses your provider keys." +msgstr "Model spend uses your provider keys." + +#: app/models.tsx:235 +msgid "Model updated." +msgstr "Model updated." + +#: app/_layout.tsx:70 +#: app/account.tsx:340 +msgid "Models" +msgstr "Models" + +#: components/bot-organize-modal.tsx:90 +msgid "Move to" +msgstr "Move to" + +#: app/bot-settings.tsx:96 +#: app/group-settings.tsx:92 +#: app/new-group.tsx:66 +#: app/new.tsx:80 +msgid "Name" +msgstr "Name" + +#: app/bot-settings.tsx:102 +#: app/new.tsx:86 +msgid "Name this bot" +msgstr "Name this bot" + +#: app/new-group.tsx:71 +msgid "Name this group" +msgstr "Name this group" + +#: app/account.tsx:302 +msgid "Needs attention" +msgstr "Needs attention" + +#: app/_layout.tsx:76 +#: app/index.tsx:293 +msgid "New bot" +msgstr "New bot" + +#: app/_layout.tsx:85 +#: app/index.tsx:294 +#: app/new-group.tsx:60 +msgid "New group" +msgstr "New group" + +#: components/bot-organize-modal.tsx:140 +msgid "New section" +msgstr "New section" + +#: app/integrations.tsx:381 +msgid "No authentication" +msgstr "No authentication" + +#. placeholder {0}: item.name +#: app/integrations.tsx:157 +msgid "No connection record found for {0}." +msgstr "No connection record found for {0}." + +#: app/integrations.tsx:430 +msgid "No custom sources installed." +msgstr "No custom sources installed." + +#: app/thread.tsx:2054 +msgid "No longer active" +msgstr "No longer active" + +#: app/index.tsx:362 +msgid "No matching bots" +msgstr "No matching bots" + +#: app/index.tsx:552 +msgid "No messages yet" +msgstr "No messages yet" + +#: app/index.tsx:360 +msgid "No results" +msgstr "No results" + +#: app/models.tsx:583 +msgid "Not connected" +msgstr "Not connected" + +#: app/integrations.tsx:253 +msgid "Not in the plugin catalog" +msgstr "Not in the plugin catalog" + +#: app/account.tsx:325 +msgid "Notification settings" +msgstr "Notification settings" + +#: app/account.tsx:272 +#: app/account.tsx:274 +msgid "Notifications" +msgstr "Notifications" + +#: app/index.tsx:559 +msgid "notifications silenced" +msgstr "notifications silenced" + +#: app/index.tsx:450 +msgid "Now" +msgstr "Now" + +#. placeholder {0}: selected.label +#: app/models.tsx:235 +msgid "Now using {0}." +msgstr "Now using {0}." + +#: app/computer.tsx:209 +msgid "Open computer" +msgstr "Open computer" + +#: app/thread.tsx:1634 +msgid "Open computer →" +msgstr "Open computer →" + +#: app/computer.tsx:190 +msgid "Open in full window" +msgstr "Open in full window" + +#: app/models.tsx:446 +msgid "OpenAI-compatible server URL" +msgstr "OpenAI-compatible server URL" + +#: app/integrations.tsx:350 +msgid "OpenAPI JSON" +msgstr "OpenAPI JSON" + +#: app/thread.tsx:1989 +msgid "Opened its thread." +msgstr "Opened its thread." + +#: app/models.tsx:690 +msgid "Optional" +msgstr "Optional" + +#: app/models.tsx:705 +msgid "Or connect an API key" +msgstr "Or connect an API key" + +#: app/account.tsx:215 +msgid "Organic" +msgstr "Organic" + +#: app/models.tsx:518 +msgid "Other model…" +msgstr "Other model…" + +#: app/sign-in.tsx:100 +msgid "Password" +msgstr "Password" + +#: app/voice.tsx:181 +msgid "Paste a replacement key" +msgstr "Paste a replacement key" + +#: app/voice.tsx:181 +msgid "Paste your API key" +msgstr "Paste your API key" + +#: app/models.tsx:580 +msgid "Personal credential" +msgstr "Personal credential" + +#: app/thread.tsx:958 +msgid "Photo library" +msgstr "Photo library" + +#: components/bot-organize-modal.tsx:70 +msgid "Pin" +msgstr "Pin" + +#: app/sign-in.tsx:262 +msgid "Point this app at your self-hosted Sentra Bot origin — the same HTTPS URL you open in a browser." +msgstr "Point this app at your self-hosted Sentra Bot origin — the same HTTPS URL you open in a browser." + +#: components/computer-mode-picker.tsx:40 +msgid "Private" +msgstr "Private" + +#: app/models.tsx:399 +msgid "Providers" +msgstr "Providers" + +#: app/account.tsx:303 +msgid "Questions, approvals, takeover" +msgstr "Questions, approvals, takeover" + +#: app/index.tsx:459 +msgid "Recent" +msgstr "Recent" + +#: app/computer.tsx:275 +msgid "Recording a live demonstration needs desktop or web with the full computer view. You can still ask this bot to run saved skills from chat." +msgstr "Recording a live demonstration needs desktop or web with the full computer view. You can still ask this bot to run saved skills from chat." + +#: app/computer.tsx:455 +msgid "Release" +msgstr "Release" + +#: app/integrations.tsx:349 +msgid "Remote MCP server" +msgstr "Remote MCP server" + +#: app/integrations.tsx:267 +#: app/integrations.tsx:295 +#: app/integrations.tsx:443 +msgid "Remove" +msgstr "Remove" + +#. placeholder {0}: attachment.name +#. placeholder {0}: item.name +#. placeholder {0}: tile.label +#: app/integrations.tsx:261 +#: app/integrations.tsx:289 +#: app/thread.tsx:1361 +msgid "Remove {0}" +msgstr "Remove {0}" + +#. placeholder {0}: mention.name +#: app/thread.tsx:1564 +msgid "Remove mention {0}" +msgstr "Remove mention {0}" + +#. placeholder {0}: selectedSkill.name +#: app/thread.tsx:1536 +msgid "Remove skill {0}" +msgstr "Remove skill {0}" + +#: app/thread.tsx:1988 +msgid "Removed with chat, computer, and memory." +msgstr "Removed with chat, computer, and memory." + +#: app/integrations.tsx:443 +msgid "Removing…" +msgstr "Removing…" + +#: app/models.tsx:703 +#: app/models.tsx:745 +msgid "Replace API key" +msgstr "Replace API key" + +#: app/voice.tsx:192 +msgid "Replace key" +msgstr "Replace key" + +#: app/account.tsx:287 +msgid "Replies and completed work" +msgstr "Replies and completed work" + +#: app/thread.tsx:1086 +#: app/thread.tsx:1094 +msgid "Reply" +msgstr "Reply" + +#: app/thread.tsx:1311 +msgid "Replying to" +msgstr "Replying to" + +#: app/account.tsx:406 +msgid "Restore" +msgstr "Restore" + +#: components/bot-organize-modal.tsx:85 +msgid "Resume notifications" +msgstr "Resume notifications" + +#: app/account.tsx:215 +msgid "Robot" +msgstr "Robot" + +#: app/_layout.tsx:94 +msgid "Routine" +msgstr "Routine" + +#: app/sign-in.tsx:82 +msgid "Same Better Auth session as the web app." +msgstr "Same Better Auth session as the web app." + +#: app/bot-settings.tsx:171 +#: app/group-settings.tsx:152 +#: app/models.tsx:743 +#: app/sign-in.tsx:257 +msgid "Save" +msgstr "Save" + +#: app/models.tsx:273 +msgid "Saved." +msgstr "Saved." + +#: app/bot-settings.tsx:171 +#: app/group-settings.tsx:152 +#: app/models.tsx:741 +msgid "Saving…" +msgstr "Saving…" + +#: app/account.tsx:293 +msgid "Scheduled tasks" +msgstr "Scheduled tasks" + +#: app/index.tsx:278 +#: app/index.tsx:309 +msgid "Search" +msgstr "Search" + +#: app/index.tsx:364 +msgid "Search conversations, files, and routines" +msgstr "Search conversations, files, and routines" + +#: app/index.tsx:359 +msgid "Searching…" +msgstr "Searching…" + +#: components/bot-organize-modal.tsx:116 +msgid "Section name" +msgstr "Section name" + +#: app/thread.tsx:2456 +#: app/thread.tsx:2469 +msgid "Send answer" +msgstr "Send answer" + +#: app/thread.tsx:2469 +msgid "Sending…" +msgstr "Sending…" + +#: app/sign-in.tsx:253 +msgid "Server" +msgstr "Server" + +#: app/models.tsx:443 +msgid "Server URL" +msgstr "Server URL" + +#: app/models.tsx:462 +msgid "Setup help" +msgstr "Setup help" + +#: app/thread.tsx:2292 +msgid "Show {label}" +msgstr "Show {label}" + +#: app/thread.tsx:2345 +msgid "Show tool details" +msgstr "Show tool details" + +#: app/models.tsx:662 +msgid "Sign in" +msgstr "Sign in" + +#: app/sign-in.tsx:79 +msgid "Sign in to Sentra Bot" +msgstr "Sign in to Sentra Bot" + +#: app/account.tsx:390 +msgid "Sign out" +msgstr "Sign out" + +#: components/bot-organize-modal.tsx:85 +msgid "Silence notifications" +msgstr "Silence notifications" + +#. placeholder {0}: skill.name +#: app/thread.tsx:1434 +msgid "Skill {0}" +msgstr "Skill {0}" + +#: app/computer.tsx:452 +msgid "Skip" +msgstr "Skip" + +#: app/thread.tsx:2266 +msgid "Speak" +msgstr "Speak" + +#: app/voice.tsx:164 +msgid "Speak + transcribe" +msgstr "Speak + transcribe" + +#: app/thread.tsx:2260 +msgid "Speak message" +msgstr "Speak message" + +#: app/voice.tsx:165 +msgid "Speak only" +msgstr "Speak only" + +#: app/account.tsx:360 +msgid "Speak replies aloud with ElevenLabs, OpenAI, or Cartesia" +msgstr "Speak replies aloud with ElevenLabs, OpenAI, or Cartesia" + +#: app/models.tsx:662 +msgid "Starting…" +msgstr "Starting…" + +#: app/thread.tsx:1918 +#: app/thread.tsx:1926 +msgid "subagent" +msgstr "subagent" + +#: app/models.tsx:628 +msgid "Submit" +msgstr "Submit" + +#: app/thread.tsx:2431 +msgid "Submitted" +msgstr "Submitted" + +#: app/models.tsx:773 +msgid "Switching…" +msgstr "Switching…" + +#: app/computer.tsx:240 +#: app/computer.tsx:391 +msgid "Take control" +msgstr "Take control" + +#: app/index.tsx:365 +msgid "Tap + to create a bot" +msgstr "Tap + to create a bot" + +#: app/computer.tsx:272 +msgid "Teach a task" +msgstr "Teach a task" + +#: components/computer-mode-picker.tsx:40 +msgid "Team" +msgstr "Team" + +#: app/models.tsx:605 +msgid "The final page may not load. Paste its URL or code here." +msgstr "The final page may not load. Paste its URL or code here." + +#: app/models.tsx:290 +msgid "this model" +msgstr "this model" + +#: app/account.tsx:172 +msgid "This permanently deletes your account, bots, conversations, memories, files, and saved connections. This cannot be undone." +msgstr "This permanently deletes your account, bots, conversations, memories, files, and saved connections. This cannot be undone." + +#: app/thread.tsx:448 +msgid "This removes every message and stops current work. The bot, computer, memory, and routines are kept." +msgstr "This removes every message and stops current work. The bot, computer, memory, and routines are kept." + +#: app/models.tsx:754 +msgid "This subscription sign-in is not available in Sentra Bot yet. Use a deployment credential or choose another provider." +msgstr "This subscription sign-in is not available in Sentra Bot yet. Use a deployment credential or choose another provider." + +#: app/_layout.tsx:93 +#: app/thread.tsx:369 +#: app/thread.tsx:389 +msgid "Thread" +msgstr "Thread" + +#: app/bot-settings.tsx:113 +#: app/new.tsx:97 +msgid "Title" +msgstr "Title" + +#: app/integrations.tsx:426 +msgid "Tool sources" +msgstr "Tool sources" + +#: app/thread.tsx:2334 +msgid "Tools" +msgstr "Tools" + +#: app/integrations.tsx:392 +msgid "Treg token" +msgstr "Treg token" + +#: app/account.tsx:116 +#: app/group-settings.tsx:77 +#: app/thread.tsx:468 +#: app/thread.tsx:950 +#: app/thread.tsx:2123 +#: app/thread.tsx:2157 +msgid "Try again." +msgstr "Try again." + +#: app/thread.tsx:2439 +msgid "Type your answer" +msgstr "Type your answer" + +#: components/bot-organize-modal.tsx:103 +msgid "Unassigned" +msgstr "Unassigned" + +#: components/bot-organize-modal.tsx:70 +msgid "Unpin" +msgstr "Unpin" + +#: app/index.tsx:560 +#: app/index.tsx:621 +msgid "unread" +msgstr "unread" + +#: app/account.tsx:92 +#: app/account.tsx:94 +msgid "Usage" +msgstr "Usage" + +#: app/sign-in.tsx:133 +#: app/sign-in.tsx:150 +msgid "Use a custom server" +msgstr "Use a custom server" + +#: app/models.tsx:541 +msgid "Use a found model" +msgstr "Use a found model" + +#: app/sign-in.tsx:302 +msgid "Use default server" +msgstr "Use default server" + +#: app/models.tsx:773 +msgid "Use this model" +msgstr "Use this model" + +#: app/thread.tsx:2334 +msgid "Using {provider}" +msgstr "Using {provider}" + +#: app/integrations.tsx:408 +msgid "Verify and add" +msgstr "Verify and add" + +#: app/_layout.tsx:71 +#: app/account.tsx:357 +msgid "Voice" +msgstr "Voice" + +#: app/models.tsx:632 +#: app/models.tsx:645 +msgid "Waiting for sign-in…" +msgstr "Waiting for sign-in…" + +#: app/thread.tsx:2475 +msgid "Waiting for this bot’s response." +msgstr "Waiting for this bot’s response." + +#: app/bot-settings.tsx:136 +#: app/new.tsx:120 +msgid "What this bot is for" +msgstr "What this bot is for" + +#: app/account.tsx:278 +msgid "While agents are working" +msgstr "While agents are working" + +#: app/integrations.tsx:267 +#: app/integrations.tsx:295 +#: app/sign-in.tsx:126 +msgid "Working…" +msgstr "Working…" + +#: app/computer.tsx:361 +msgid "You have control" +msgstr "You have control" + +#: app/account.tsx:203 +msgid "Your account" +msgstr "Your account" + +#: app/models.tsx:587 +msgid "Your key or subscription token is stored securely and is never shown here." +msgstr "Your key or subscription token is stored securely and is never shown here." diff --git a/apps/mobile/locales/id/messages.po b/apps/mobile/locales/id/messages.po new file mode 100644 index 00000000..e711e42b --- /dev/null +++ b/apps/mobile/locales/id/messages.po @@ -0,0 +1,1323 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2026-09-04 17:30+0700\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: id\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#. placeholder {0}: attachment.mimeType ?? t`file` +#. placeholder {1}: attachment.size +#: app/thread.tsx:2173 +msgid "{0} · {1} bytes" +msgstr "{0} · {1} byte" + +#. placeholder {0}: workingGroupBots.length +#: app/thread.tsx:1165 +msgid "{0} agents working" +msgstr "{0} agen sedang bekerja" + +#. placeholder {0}: currentBot.name +#. placeholder {0}: workingGroupBots[0]?.name ?? defaultAgentName +#: app/thread.tsx:1136 +#: app/thread.tsx:1164 +msgid "{0} is working" +msgstr "{0} sedang bekerja" + +#. placeholder {0}: group.entries.length +#. placeholder {1}: group.entries.length === 1 ? "" : "s" +#: app/models.tsx:418 +msgid "{0} model{1}" +msgstr "{0} model{1}" + +#. placeholder {0}: usage.runs +#. placeholder {1}: usage.inputTokens + usage.outputTokens +#: app/account.tsx:98 +msgid "{0} runs · {1} tokens" +msgstr "{0} run · {1} token" + +#: app/thread.tsx:1852 +msgid "{from} messaged {to}" +msgstr "{from} mengirim pesan ke {to}" + +#: app/account.tsx:219 +msgid "{label} avatars" +msgstr "Avatar {label}" + +#: app/_layout.tsx:69 +#: app/index.tsx:260 +msgid "Account" +msgstr "Akun" + +#: app/models.tsx:385 +msgid "Active model" +msgstr "Model aktif" + +#: app/index.tsx:265 +msgid "Activity" +msgstr "Aktivitas" + +#: app/integrations.tsx:267 +#: app/integrations.tsx:295 +msgid "Add" +msgstr "Tambah" + +#. placeholder {0}: item.name +#. placeholder {0}: tile.label +#: app/integrations.tsx:261 +#: app/integrations.tsx:289 +msgid "Add {0}" +msgstr "Tambah {0}" + +#: app/integrations.tsx:334 +msgid "Add MCP server" +msgstr "Tambah server MCP" + +#: app/integrations.tsx:335 +msgid "Add OpenAPI" +msgstr "Tambah OpenAPI" + +#: app/integrations.tsx:332 +msgid "Add Treg" +msgstr "Tambah Treg" + +#: app/integrations.tsx:315 +msgid "Advanced" +msgstr "Lanjutan" + +#: app/thread.tsx:1117 +msgid "Agent" +msgstr "Agen" + +#: app/account.tsx:286 +msgid "Agent messages" +msgstr "Pesan agen" + +#: app/account.tsx:294 +msgid "Alerts from routines" +msgstr "Peringatan dari rutinitas" + +#: app/thread.tsx:2436 +msgid "Answer" +msgstr "Jawab" + +#. placeholder {0}: ask.answer ?? doneLabel +#: app/thread.tsx:2431 +msgid "Answered: {0}" +msgstr "Dijawab: {0}" + +#: app/models.tsx:678 +#: app/models.tsx:683 +#: app/models.tsx:706 +#: app/models.tsx:709 +msgid "API key" +msgstr "API key" + +#: app/thread.tsx:461 +msgid "Archive" +msgstr "Arsipkan" + +#: app/thread.tsx:440 +msgid "Archive keeps everything and can be undone. Delete is permanent." +msgstr "Arsipkan menyimpan semuanya dan bisa dibatalkan. Hapus bersifat permanen." + +#: app/thread.tsx:1971 +msgid "archived" +msgstr "diarsipkan" + +#: app/account.tsx:397 +msgid "Archived bots" +msgstr "Bot yang diarsipkan" + +#: app/thread.tsx:1987 +msgid "Archived. Chat, memory, and files kept." +msgstr "Diarsipkan. Chat, memori, dan file tetap disimpan." + +#: app/thread.tsx:956 +msgid "Attach" +msgstr "Lampirkan" + +#: app/thread.tsx:1489 +msgid "Attach file" +msgstr "Lampirkan file" + +#: app/models.tsx:608 +msgid "Authorization code" +msgstr "Kode otorisasi" + +#: app/account.tsx:208 +msgid "Avatar style" +msgstr "Gaya avatar" + +#: app/account.tsx:210 +msgid "Avatars" +msgstr "Avatar" + +#: app/integrations.tsx:381 +msgid "Bearer authentication" +msgstr "Autentikasi bearer" + +#: app/integrations.tsx:392 +msgid "Bearer token" +msgstr "Token bearer" + +#: app/computer.tsx:306 +msgid "Booting {label}" +msgstr "Menyalakan {label}" + +#: app/thread.tsx:1848 +#: app/thread.tsx:1849 +#: app/thread.tsx:1974 +msgid "bot" +msgstr "bot" + +#: app/computer.tsx:31 +#: app/thread.tsx:439 +#: app/thread.tsx:1947 +#: app/thread.tsx:1967 +msgid "Bot" +msgstr "Bot" + +#: app/thread.tsx:408 +msgid "Bot actions" +msgstr "Tindakan bot" + +#: app/voice.tsx:143 +msgid "Bring your own key. ElevenLabs, OpenAI, and Cartesia all plug into the same speak buttons." +msgstr "Pakai kunci Anda sendiri. ElevenLabs, OpenAI, dan Cartesia semuanya terhubung ke tombol bicara yang sama." + +#: app/thread.tsx:961 +msgid "Camera" +msgstr "Kamera" + +#: app/account.tsx:174 +#: app/group-settings.tsx:67 +#: app/index.tsx:295 +#: app/integrations.tsx:418 +#: app/new.tsx:64 +#: app/new.tsx:67 +#: app/sign-in.tsx:249 +#: app/thread.tsx:441 +#: app/thread.tsx:450 +#: app/thread.tsx:963 +#: components/bot-organize-modal.tsx:147 +msgid "Cancel" +msgstr "Batal" + +#: app/thread.tsx:1317 +msgid "Cancel reply" +msgstr "Batalkan balasan" + +#: app/_layout.tsx:92 +#: app/bot-settings.tsx:88 +msgid "Chat settings" +msgstr "Pengaturan obrolan" + +#: app/sign-in.tsx:257 +msgid "Checking…" +msgstr "Memeriksa…" + +#: app/account.tsx:343 +msgid "Choose your provider and active model" +msgstr "Pilih penyedia dan model aktif Anda" + +#: app/account.tsx:215 +msgid "Clay" +msgstr "Clay" + +#: app/thread.tsx:452 +msgid "Clear" +msgstr "Bersihkan" + +#: app/thread.tsx:443 +msgid "Clear conversation" +msgstr "Bersihkan percakapan" + +#: app/thread.tsx:447 +msgid "Clear conversation?" +msgstr "Bersihkan percakapan?" + +#: components/bot-organize-modal.tsx:51 +msgid "Close chat organization" +msgstr "Tutup pengaturan susunan obrolan" + +#: app/computer.tsx:396 +msgid "Close computer" +msgstr "Tutup komputer" + +#: app/thread.tsx:2436 +#: app/thread.tsx:2439 +msgid "Code" +msgstr "Kode" + +#: app/_layout.tsx:95 +#: components/computer-mode-picker.tsx:18 +msgid "Computer" +msgstr "Komputer" + +#: app/computer.tsx:427 +msgid "Computer is asleep" +msgstr "Komputer sedang tidur" + +#: app/models.tsx:391 +msgid "Configured by deployment" +msgstr "Diatur oleh deployment" + +#: app/voice.tsx:192 +msgid "Connect" +msgstr "Sambungkan" + +#: app/voice.tsx:124 +msgid "Connect a voice provider first." +msgstr "Sambungkan penyedia suara lebih dulu." + +#: app/models.tsx:746 +msgid "Connect API key" +msgstr "Sambungkan API key" + +#: app/account.tsx:377 +#: app/integrations.tsx:220 +msgid "Connect apps." +msgstr "Sambungkan aplikasi." + +#: app/models.tsx:588 +msgid "Connect this provider to use it as your personal model." +msgstr "Sambungkan provider ini untuk memakainya sebagai model pribadi Anda." + +#: app/integrations.tsx:347 +msgid "Connect Treg" +msgstr "Sambungkan Treg" + +#: app/models.tsx:425 +#: app/voice.tsx:162 +msgid "Connected" +msgstr "Tersambung" + +#. placeholder {0}: credential.label +#: app/models.tsx:583 +msgid "Connected · {0}" +msgstr "Tersambung · {0}" + +#. placeholder {0}: selected.name +#: app/voice.tsx:96 +msgid "Connected {0}." +msgstr "{0} tersambung." + +#. placeholder {0}: selected.label +#: app/models.tsx:273 +msgid "Connected and using {0}." +msgstr "Tersambung dan memakai {0}." + +#: app/models.tsx:291 +msgid "Connected and using {label}." +msgstr "Tersambung dan memakai {label}." + +#: app/integrations.tsx:129 +msgid "Connection pending" +msgstr "Sambungan menunggu" + +#: app/sign-in.tsx:126 +msgid "Continue with email" +msgstr "Lanjutkan dengan email" + +#: app/integrations.tsx:197 +msgid "Could not add source" +msgstr "Gagal menambahkan sumber" + +#: app/thread.tsx:467 +msgid "Could not archive bot" +msgstr "Gagal mengarsipkan bot" + +#: app/models.tsx:237 +msgid "Could not change the default model" +msgstr "Gagal mengubah model default" + +#: app/thread.tsx:433 +msgid "Could not clear conversation" +msgstr "Gagal membersihkan percakapan" + +#: app/integrations.tsx:134 +#: app/voice.tsx:98 +msgid "Could not connect" +msgstr "Gagal menyambungkan" + +#: app/models.tsx:275 +msgid "Could not connect this provider" +msgstr "Gagal menyambungkan provider ini" + +#: app/new.tsx:49 +msgid "Could not create bot" +msgstr "Gagal membuat bot" + +#: app/new-group.tsx:52 +msgid "Could not create group" +msgstr "Gagal membuat grup" + +#: app/account.tsx:192 +msgid "Could not delete account" +msgstr "Gagal menghapus akun" + +#: app/group-settings.tsx:76 +msgid "Could not delete group" +msgstr "Gagal menghapus grup" + +#: app/models.tsx:363 +msgid "Could not finish sign-in" +msgstr "Gagal menyelesaikan proses masuk" + +#: app/bot-settings.tsx:48 +msgid "Could not load bot" +msgstr "Gagal memuat bot" + +#: app/index.tsx:107 +msgid "Could not load bots" +msgstr "Gagal memuat daftar bot" + +#: app/thread.tsx:555 +msgid "Could not load earlier messages" +msgstr "Gagal memuat pesan sebelumnya" + +#: app/group-settings.tsx:35 +msgid "Could not load group" +msgstr "Gagal memuat grup" + +#: app/integrations.tsx:74 +msgid "Could not load integrations" +msgstr "Gagal memuat integrasi" + +#: app/models.tsx:117 +msgid "Could not load model settings" +msgstr "Gagal memuat pengaturan model" + +#: app/computer.tsx:199 +msgid "Could not load the desktop. This device cannot reach the screen URL." +msgstr "Gagal memuat desktop. Perangkat ini tidak bisa menjangkau URL layar." + +#: app/voice.tsx:75 +msgid "Could not load voice settings" +msgstr "Gagal memuat pengaturan suara" + +#: app/computer.tsx:99 +msgid "Could not open computer" +msgstr "Gagal membuka komputer" + +#: app/thread.tsx:2156 +msgid "Could not open file" +msgstr "Gagal membuka file" + +#: app/thread.tsx:2122 +msgid "Could not open image" +msgstr "Gagal membuka gambar" + +#: app/thread.tsx:728 +msgid "Could not open message" +msgstr "Gagal membuka pesan" + +#: app/voice.tsx:130 +msgid "Could not play a sample" +msgstr "Gagal memutar contoh" + +#: app/models.tsx:219 +msgid "Could not reach this model server" +msgstr "Server model ini tidak bisa dijangkau" + +#: app/integrations.tsx:210 +msgid "Could not remove source" +msgstr "Gagal menghapus sumber" + +#: app/account.tsx:115 +msgid "Could not restore bot" +msgstr "Gagal memulihkan bot" + +#: app/integrations.tsx:161 +msgid "Could not revoke connection" +msgstr "Gagal mencabut koneksi" + +#: app/bot-settings.tsx:80 +msgid "Could not save bot" +msgstr "Gagal menyimpan bot" + +#: app/group-settings.tsx:58 +msgid "Could not save group" +msgstr "Gagal menyimpan grup" + +#: app/voice.tsx:111 +msgid "Could not save that voice" +msgstr "Gagal menyimpan suara itu" + +#: app/thread.tsx:2408 +msgid "Could not send answer" +msgstr "Gagal mengirim jawaban" + +#: app/sign-in.tsx:66 +msgid "Could not sign in" +msgstr "Gagal masuk" + +#: app/thread.tsx:950 +msgid "Could not speak" +msgstr "Gagal berbicara" + +#: app/models.tsx:324 +msgid "Could not start sign-in" +msgstr "Gagal memulai proses masuk" + +#: app/computer.tsx:166 +msgid "Could not switch computer" +msgstr "Gagal berganti komputer" + +#: components/bot-organize-modal.tsx:42 +msgid "Could not update chat" +msgstr "Gagal memperbarui obrolan" + +#: app/account.tsx:161 +msgid "Could not update notifications" +msgstr "Gagal memperbarui notifikasi" + +#: app/account.tsx:128 +msgid "Couldn't update avatars" +msgstr "Gagal memperbarui avatar" + +#: app/index.tsx:290 +#: app/index.tsx:292 +#: app/new.tsx:148 +#: components/bot-organize-modal.tsx:128 +msgid "Create" +msgstr "Buat" + +#: app/new-group.tsx:131 +msgid "Create group" +msgstr "Buat grup" + +#: components/bot-organize-modal.tsx:122 +msgid "Create section" +msgstr "Buat bagian" + +#: app/new-group.tsx:131 +#: app/new.tsx:148 +msgid "Creating…" +msgstr "Membuat…" + +#: app/account.tsx:437 +#: app/account.tsx:445 +msgid "Current password" +msgstr "Kata sandi saat ini" + +#: app/integrations.tsx:183 +msgid "Custom connector" +msgstr "Konektor kustom" + +#: app/sign-in.tsx:142 +msgid "Custom server" +msgstr "Server kustom" + +#. placeholder {0}: displayApiHost(apiBase) +#: app/sign-in.tsx:133 +msgid "Custom server {0}" +msgstr "Server kustom {0}" + +#: app/account.tsx:418 +#: app/group-settings.tsx:69 +msgid "Delete" +msgstr "Hapus" + +#: app/account.tsx:176 +#: app/account.tsx:428 +#: app/account.tsx:467 +msgid "Delete account" +msgstr "Hapus akun" + +#: app/group-settings.tsx:167 +msgid "Delete group" +msgstr "Hapus grup" + +#: app/group-settings.tsx:66 +msgid "Delete this group? Bots and their solo threads are kept." +msgstr "Hapus grup ini? Bot dan utas tunggalnya tetap disimpan." + +#: app/account.tsx:171 +msgid "Delete your account?" +msgstr "Hapus akun Anda?" + +#: app/thread.tsx:473 +msgid "Delete…" +msgstr "Hapus…" + +#: app/thread.tsx:1973 +msgid "deleted" +msgstr "dihapus" + +#: app/models.tsx:388 +msgid "Deployment default" +msgstr "Default deployment" + +#: app/bot-settings.tsx:119 +#: app/new.tsx:103 +msgid "Describe what this bot does" +msgstr "Jelaskan apa yang dikerjakan bot ini" + +#: app/bot-settings.tsx:130 +#: app/new.tsx:114 +msgid "Description" +msgstr "Deskripsi" + +#: app/integrations.tsx:355 +msgid "Display name" +msgstr "Nama tampilan" + +#: app/thread.tsx:2392 +msgid "Done" +msgstr "Selesai" + +#: app/sign-in.tsx:87 +msgid "Email" +msgstr "Email" + +#: app/models.tsx:638 +msgid "Enter this code in your browser:" +msgstr "Masukkan kode ini di browser Anda:" + +#: app/account.tsx:431 +msgid "Enter your current password, then confirm permanent deletion of your account and all associated data." +msgstr "Masukkan kata sandi Anda saat ini, lalu konfirmasi penghapusan permanen akun Anda beserta seluruh data terkait." + +#: app/models.tsx:530 +msgid "exact-model-id" +msgstr "id-model-persis" + +#: app/thread.tsx:912 +#: app/thread.tsx:914 +msgid "Failed to send message" +msgstr "Gagal mengirim pesan" + +#: app/thread.tsx:2174 +msgid "file" +msgstr "file" + +#: app/thread.tsx:962 +#: app/thread.tsx:2152 +#: app/thread.tsx:2169 +msgid "File" +msgstr "File" + +#: app/models.tsx:478 +msgid "Find models" +msgstr "Cari model" + +#: app/models.tsx:478 +msgid "Finding…" +msgstr "Mencari…" + +#: app/integrations.tsx:130 +msgid "Finish connecting in the browser, then refresh this page." +msgstr "Selesaikan penyambungan di browser, lalu muat ulang halaman ini." + +#: app/models.tsx:599 +msgid "Finish signing in in your browser:" +msgstr "Selesaikan proses masuk di browser Anda:" + +#: app/_layout.tsx:90 +#: app/thread.tsx:855 +#: app/thread.tsx:902 +msgid "Group" +msgstr "Grup" + +#: app/group-settings.tsx:97 +msgid "Group name" +msgstr "Nama grup" + +#: app/_layout.tsx:91 +#: app/group-settings.tsx:86 +#: app/thread.tsx:396 +msgid "Group settings" +msgstr "Pengaturan grup" + +#: app/voice.tsx:215 +msgid "Hear a sample" +msgstr "Dengar contoh" + +#: app/voice.tsx:122 +msgid "Hi, this is how I'll sound when I read replies out loud." +msgstr "Halo, beginilah suara saya saat membacakan balasan." + +#: app/thread.tsx:2292 +msgid "Hide {label}" +msgstr "Sembunyikan {label}" + +#: app/thread.tsx:2345 +msgid "Hide tool details" +msgstr "Sembunyikan detail alat" + +#: app/computer.tsx:453 +msgid "I’m done" +msgstr "Saya sudah selesai" + +#: app/voice.tsx:128 +msgid "If you heard that, voice is ready." +msgstr "Kalau tadi terdengar, suara sudah siap." + +#: app/thread.tsx:2118 +#: app/thread.tsx:2135 +msgid "Image" +msgstr "Gambar" + +#. placeholder {0}: phoneChannel.fromLabel +#. placeholder {1}: phoneChannel.text +#: app/thread.tsx:1885 +msgid "iMessage · {0}: {1}" +msgstr "iMessage · {0}: {1}" + +#: app/_layout.tsx:72 +#: app/account.tsx:374 +msgid "Integrations" +msgstr "Integrasi" + +#: app/thread.tsx:1255 +msgid "Jump to latest" +msgstr "Lompat ke terbaru" + +#: app/thread.tsx:1255 +msgid "Jump to latest, new messages" +msgstr "Lompat ke pesan terbaru, ada pesan baru" + +#: app/account.tsx:244 +#: app/account.tsx:246 +msgid "Language" +msgstr "Bahasa" + +#: app/account.tsx:316 +msgid "Live update settings" +msgstr "Pengaturan pembaruan langsung" + +#: app/account.tsx:277 +msgid "Live working status" +msgstr "Status kerja langsung" + +#: app/thread.tsx:1182 +msgid "Load earlier messages" +msgstr "Muat pesan sebelumnya" + +#: app/sign-in.tsx:52 +#: app/thread.tsx:1182 +msgid "Loading…" +msgstr "Memuat…" + +#: app/index.tsx:628 +msgid "Long press to pin or move to a section" +msgstr "Tekan lama untuk menyematkan atau memindahkan ke bagian" + +#: app/index.tsx:569 +msgid "Long press to pin, move, or silence notifications" +msgstr "Tekan lama untuk menyematkan, memindahkan, atau membisukan notifikasi" + +#: app/thread.tsx:2146 +msgid "Markdown file" +msgstr "File Markdown" + +#: app/group-settings.tsx:109 +#: app/new-group.tsx:83 +msgid "Members ({GROUP_MEMBER_MIN}–{GROUP_MEMBER_MAX})" +msgstr "Anggota ({GROUP_MEMBER_MIN}–{GROUP_MEMBER_MAX})" + +#: app/thread.tsx:1581 +msgid "Message" +msgstr "Pesan" + +#: app/thread.tsx:1870 +msgid "Message from {peer}" +msgstr "Pesan dari {peer}" + +#: app/thread.tsx:1591 +msgid "Message…" +msgstr "Pesan…" + +#: app/thread.tsx:1870 +msgid "Messaged {peer}" +msgstr "Mengirim pesan ke {peer}" + +#: app/models.tsx:437 +#: app/models.tsx:481 +msgid "Model" +msgstr "Model" + +#: app/models.tsx:525 +msgid "Model id" +msgstr "ID model" + +#: app/account.tsx:104 +msgid "Model spend uses your provider keys." +msgstr "Biaya model memakai key provider Anda." + +#: app/models.tsx:235 +msgid "Model updated." +msgstr "Model diperbarui." + +#: app/_layout.tsx:70 +#: app/account.tsx:340 +msgid "Models" +msgstr "Model" + +#: components/bot-organize-modal.tsx:90 +msgid "Move to" +msgstr "Pindahkan ke" + +#: app/bot-settings.tsx:96 +#: app/group-settings.tsx:92 +#: app/new-group.tsx:66 +#: app/new.tsx:80 +msgid "Name" +msgstr "Nama" + +#: app/bot-settings.tsx:102 +#: app/new.tsx:86 +msgid "Name this bot" +msgstr "Beri nama bot ini" + +#: app/new-group.tsx:71 +msgid "Name this group" +msgstr "Beri nama grup ini" + +#: app/account.tsx:302 +msgid "Needs attention" +msgstr "Perlu perhatian" + +#: app/_layout.tsx:76 +#: app/index.tsx:293 +msgid "New bot" +msgstr "Bot baru" + +#: app/_layout.tsx:85 +#: app/index.tsx:294 +#: app/new-group.tsx:60 +msgid "New group" +msgstr "Grup baru" + +#: components/bot-organize-modal.tsx:140 +msgid "New section" +msgstr "Seksi baru" + +#: app/integrations.tsx:381 +msgid "No authentication" +msgstr "Tanpa autentikasi" + +#. placeholder {0}: item.name +#: app/integrations.tsx:157 +msgid "No connection record found for {0}." +msgstr "Tidak ada catatan koneksi untuk {0}." + +#: app/integrations.tsx:430 +msgid "No custom sources installed." +msgstr "Belum ada sumber kustom yang terpasang." + +#: app/thread.tsx:2054 +msgid "No longer active" +msgstr "Sudah tidak aktif" + +#: app/index.tsx:362 +msgid "No matching bots" +msgstr "Tidak ada bot yang cocok" + +#: app/index.tsx:552 +msgid "No messages yet" +msgstr "Belum ada pesan" + +#: app/index.tsx:360 +msgid "No results" +msgstr "Tidak ada hasil" + +#: app/models.tsx:583 +msgid "Not connected" +msgstr "Belum tersambung" + +#: app/integrations.tsx:253 +msgid "Not in the plugin catalog" +msgstr "Tidak ada di katalog plugin" + +#: app/account.tsx:325 +msgid "Notification settings" +msgstr "Pengaturan notifikasi" + +#: app/account.tsx:272 +#: app/account.tsx:274 +msgid "Notifications" +msgstr "Notifikasi" + +#: app/index.tsx:559 +msgid "notifications silenced" +msgstr "notifikasi dibisukan" + +#: app/index.tsx:450 +msgid "Now" +msgstr "Sekarang" + +#. placeholder {0}: selected.label +#: app/models.tsx:235 +msgid "Now using {0}." +msgstr "Sekarang memakai {0}." + +#: app/computer.tsx:209 +msgid "Open computer" +msgstr "Buka komputer" + +#: app/thread.tsx:1634 +msgid "Open computer →" +msgstr "Buka komputer →" + +#: app/computer.tsx:190 +msgid "Open in full window" +msgstr "Buka di jendela penuh" + +#: app/models.tsx:446 +msgid "OpenAI-compatible server URL" +msgstr "URL server yang kompatibel dengan OpenAI" + +#: app/integrations.tsx:350 +msgid "OpenAPI JSON" +msgstr "JSON OpenAPI" + +#: app/thread.tsx:1989 +msgid "Opened its thread." +msgstr "Membuka percakapannya." + +#: app/models.tsx:690 +msgid "Optional" +msgstr "Opsional" + +#: app/models.tsx:705 +msgid "Or connect an API key" +msgstr "Atau sambungkan sebuah API key" + +#: app/account.tsx:215 +msgid "Organic" +msgstr "Organik" + +#: app/models.tsx:518 +msgid "Other model…" +msgstr "Model lain…" + +#: app/sign-in.tsx:100 +msgid "Password" +msgstr "Kata sandi" + +#: app/voice.tsx:181 +msgid "Paste a replacement key" +msgstr "Tempel key pengganti" + +#: app/voice.tsx:181 +msgid "Paste your API key" +msgstr "Tempel API key Anda" + +#: app/models.tsx:580 +msgid "Personal credential" +msgstr "Kredensial pribadi" + +#: app/thread.tsx:958 +msgid "Photo library" +msgstr "Galeri foto" + +#: components/bot-organize-modal.tsx:70 +msgid "Pin" +msgstr "Sematkan" + +#: app/sign-in.tsx:262 +msgid "Point this app at your self-hosted Sentra Bot origin — the same HTTPS URL you open in a browser." +msgstr "Arahkan aplikasi ini ke origin Sentra Bot yang Anda host sendiri — URL HTTPS yang sama dengan yang Anda buka di browser." + +#: components/computer-mode-picker.tsx:40 +msgid "Private" +msgstr "Privat" + +#: app/models.tsx:399 +msgid "Providers" +msgstr "Provider" + +#: app/account.tsx:303 +msgid "Questions, approvals, takeover" +msgstr "Pertanyaan, persetujuan, pengambilalihan" + +#: app/index.tsx:459 +msgid "Recent" +msgstr "Terbaru" + +#: app/computer.tsx:275 +msgid "Recording a live demonstration needs desktop or web with the full computer view. You can still ask this bot to run saved skills from chat." +msgstr "Merekam demonstrasi langsung membutuhkan desktop atau web dengan tampilan komputer penuh. Anda tetap bisa meminta bot ini menjalankan skill tersimpan dari obrolan." + +#: app/computer.tsx:455 +msgid "Release" +msgstr "Lepaskan" + +#: app/integrations.tsx:349 +msgid "Remote MCP server" +msgstr "Server MCP jarak jauh" + +#: app/integrations.tsx:267 +#: app/integrations.tsx:295 +#: app/integrations.tsx:443 +msgid "Remove" +msgstr "Hapus" + +#. placeholder {0}: attachment.name +#. placeholder {0}: item.name +#. placeholder {0}: tile.label +#: app/integrations.tsx:261 +#: app/integrations.tsx:289 +#: app/thread.tsx:1361 +msgid "Remove {0}" +msgstr "Hapus {0}" + +#. placeholder {0}: mention.name +#: app/thread.tsx:1564 +msgid "Remove mention {0}" +msgstr "Hapus sebutan {0}" + +#. placeholder {0}: selectedSkill.name +#: app/thread.tsx:1536 +msgid "Remove skill {0}" +msgstr "Hapus skill {0}" + +#: app/thread.tsx:1988 +msgid "Removed with chat, computer, and memory." +msgstr "Dihapus beserta chat, komputer, dan memorinya." + +#: app/integrations.tsx:443 +msgid "Removing…" +msgstr "Menghapus…" + +#: app/models.tsx:703 +#: app/models.tsx:745 +msgid "Replace API key" +msgstr "Ganti API key" + +#: app/voice.tsx:192 +msgid "Replace key" +msgstr "Ganti key" + +#: app/account.tsx:287 +msgid "Replies and completed work" +msgstr "Balasan dan pekerjaan yang selesai" + +#: app/thread.tsx:1086 +#: app/thread.tsx:1094 +msgid "Reply" +msgstr "Balas" + +#: app/thread.tsx:1311 +msgid "Replying to" +msgstr "Membalas" + +#: app/account.tsx:406 +msgid "Restore" +msgstr "Pulihkan" + +#: components/bot-organize-modal.tsx:85 +msgid "Resume notifications" +msgstr "Lanjutkan notifikasi" + +#: app/account.tsx:215 +msgid "Robot" +msgstr "Robot" + +#: app/_layout.tsx:94 +msgid "Routine" +msgstr "Rutinitas" + +#: app/sign-in.tsx:82 +msgid "Same Better Auth session as the web app." +msgstr "Sesi Better Auth yang sama dengan aplikasi web." + +#: app/bot-settings.tsx:171 +#: app/group-settings.tsx:152 +#: app/models.tsx:743 +#: app/sign-in.tsx:257 +msgid "Save" +msgstr "Simpan" + +#: app/models.tsx:273 +msgid "Saved." +msgstr "Tersimpan." + +#: app/bot-settings.tsx:171 +#: app/group-settings.tsx:152 +#: app/models.tsx:741 +msgid "Saving…" +msgstr "Menyimpan…" + +#: app/account.tsx:293 +msgid "Scheduled tasks" +msgstr "Tugas terjadwal" + +#: app/index.tsx:278 +#: app/index.tsx:309 +msgid "Search" +msgstr "Cari" + +#: app/index.tsx:364 +msgid "Search conversations, files, and routines" +msgstr "Cari percakapan, file, dan rutinitas" + +#: app/index.tsx:359 +msgid "Searching…" +msgstr "Mencari…" + +#: components/bot-organize-modal.tsx:116 +msgid "Section name" +msgstr "Nama bagian" + +#: app/thread.tsx:2456 +#: app/thread.tsx:2469 +msgid "Send answer" +msgstr "Kirim jawaban" + +#: app/thread.tsx:2469 +msgid "Sending…" +msgstr "Mengirim…" + +#: app/sign-in.tsx:253 +msgid "Server" +msgstr "Server" + +#: app/models.tsx:443 +msgid "Server URL" +msgstr "URL server" + +#: app/models.tsx:462 +msgid "Setup help" +msgstr "Bantuan penyiapan" + +#: app/thread.tsx:2292 +msgid "Show {label}" +msgstr "Tampilkan {label}" + +#: app/thread.tsx:2345 +msgid "Show tool details" +msgstr "Tampilkan detail alat" + +#: app/models.tsx:662 +msgid "Sign in" +msgstr "Masuk" + +#: app/sign-in.tsx:79 +msgid "Sign in to Sentra Bot" +msgstr "Masuk ke Sentra Bot" + +#: app/account.tsx:390 +msgid "Sign out" +msgstr "Keluar" + +#: components/bot-organize-modal.tsx:85 +msgid "Silence notifications" +msgstr "Bisukan notifikasi" + +#. placeholder {0}: skill.name +#: app/thread.tsx:1434 +msgid "Skill {0}" +msgstr "Skill {0}" + +#: app/computer.tsx:452 +msgid "Skip" +msgstr "Lewati" + +#: app/thread.tsx:2266 +msgid "Speak" +msgstr "Bicara" + +#: app/voice.tsx:164 +msgid "Speak + transcribe" +msgstr "Bicara + transkripsi" + +#: app/thread.tsx:2260 +msgid "Speak message" +msgstr "Bacakan pesan" + +#: app/voice.tsx:165 +msgid "Speak only" +msgstr "Bicara saja" + +#: app/account.tsx:360 +msgid "Speak replies aloud with ElevenLabs, OpenAI, or Cartesia" +msgstr "Bacakan balasan dengan ElevenLabs, OpenAI, atau Cartesia" + +#: app/models.tsx:662 +msgid "Starting…" +msgstr "Memulai…" + +#: app/thread.tsx:1918 +#: app/thread.tsx:1926 +msgid "subagent" +msgstr "subagen" + +#: app/models.tsx:628 +msgid "Submit" +msgstr "Kirim" + +#: app/thread.tsx:2431 +msgid "Submitted" +msgstr "Terkirim" + +#: app/models.tsx:773 +msgid "Switching…" +msgstr "Mengganti…" + +#: app/computer.tsx:240 +#: app/computer.tsx:391 +msgid "Take control" +msgstr "Ambil alih" + +#: app/index.tsx:365 +msgid "Tap + to create a bot" +msgstr "Ketuk + untuk membuat bot" + +#: app/computer.tsx:272 +msgid "Teach a task" +msgstr "Ajarkan sebuah tugas" + +#: components/computer-mode-picker.tsx:40 +msgid "Team" +msgstr "Tim" + +#: app/models.tsx:605 +msgid "The final page may not load. Paste its URL or code here." +msgstr "Halaman terakhir mungkin tidak termuat. Tempel URL atau kodenya di sini." + +#: app/models.tsx:290 +msgid "this model" +msgstr "model ini" + +#: app/account.tsx:172 +msgid "This permanently deletes your account, bots, conversations, memories, files, and saved connections. This cannot be undone." +msgstr "Ini menghapus permanen akun, bot, percakapan, memori, file, dan sambungan tersimpan Anda. Tindakan ini tidak bisa dibatalkan." + +#: app/thread.tsx:448 +msgid "This removes every message and stops current work. The bot, computer, memory, and routines are kept." +msgstr "Ini menghapus semua pesan dan menghentikan pekerjaan yang sedang berjalan. Bot, komputer, memori, dan rutinitas tetap disimpan." + +#: app/models.tsx:754 +msgid "This subscription sign-in is not available in Sentra Bot yet. Use a deployment credential or choose another provider." +msgstr "Proses masuk berbasis langganan ini belum tersedia di Sentra Bot. Pakai kredensial deployment atau pilih provider lain." + +#: app/_layout.tsx:93 +#: app/thread.tsx:369 +#: app/thread.tsx:389 +msgid "Thread" +msgstr "Utas" + +#: app/bot-settings.tsx:113 +#: app/new.tsx:97 +msgid "Title" +msgstr "Judul" + +#: app/integrations.tsx:426 +msgid "Tool sources" +msgstr "Sumber tool" + +#: app/thread.tsx:2334 +msgid "Tools" +msgstr "Alat" + +#: app/integrations.tsx:392 +msgid "Treg token" +msgstr "Token Treg" + +#: app/account.tsx:116 +#: app/group-settings.tsx:77 +#: app/thread.tsx:468 +#: app/thread.tsx:950 +#: app/thread.tsx:2123 +#: app/thread.tsx:2157 +msgid "Try again." +msgstr "Coba lagi." + +#: app/thread.tsx:2439 +msgid "Type your answer" +msgstr "Ketik jawaban Anda" + +#: components/bot-organize-modal.tsx:103 +msgid "Unassigned" +msgstr "Belum ditugaskan" + +#: components/bot-organize-modal.tsx:70 +msgid "Unpin" +msgstr "Lepas sematan" + +#: app/index.tsx:560 +#: app/index.tsx:621 +msgid "unread" +msgstr "belum dibaca" + +#: app/account.tsx:92 +#: app/account.tsx:94 +msgid "Usage" +msgstr "Pemakaian" + +#: app/sign-in.tsx:133 +#: app/sign-in.tsx:150 +msgid "Use a custom server" +msgstr "Pakai server kustom" + +#: app/models.tsx:541 +msgid "Use a found model" +msgstr "Pakai model yang ditemukan" + +#: app/sign-in.tsx:302 +msgid "Use default server" +msgstr "Pakai server bawaan" + +#: app/models.tsx:773 +msgid "Use this model" +msgstr "Pakai model ini" + +#: app/thread.tsx:2334 +msgid "Using {provider}" +msgstr "Memakai {provider}" + +#: app/integrations.tsx:408 +msgid "Verify and add" +msgstr "Verifikasi dan tambahkan" + +#: app/_layout.tsx:71 +#: app/account.tsx:357 +msgid "Voice" +msgstr "Suara" + +#: app/models.tsx:632 +#: app/models.tsx:645 +msgid "Waiting for sign-in…" +msgstr "Menunggu proses masuk…" + +#: app/thread.tsx:2475 +msgid "Waiting for this bot’s response." +msgstr "Menunggu balasan bot ini." + +#: app/bot-settings.tsx:136 +#: app/new.tsx:120 +msgid "What this bot is for" +msgstr "Bot ini untuk apa" + +#: app/account.tsx:278 +msgid "While agents are working" +msgstr "Saat agen sedang bekerja" + +#: app/integrations.tsx:267 +#: app/integrations.tsx:295 +#: app/sign-in.tsx:126 +msgid "Working…" +msgstr "Bekerja…" + +#: app/computer.tsx:361 +msgid "You have control" +msgstr "Anda yang memegang kendali" + +#: app/account.tsx:203 +msgid "Your account" +msgstr "Akun Anda" + +#: app/models.tsx:587 +msgid "Your key or subscription token is stored securely and is never shown here." +msgstr "Key atau token langganan Anda disimpan dengan aman dan tidak pernah ditampilkan di sini." diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 1652e24a..66fda8ee 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -14,15 +14,22 @@ "ios": "expo run:ios", "check": "expo install --check && tsc --noEmit -p tsconfig.json", "test": "vitest run --root ../.. apps/mobile/lib", - "test:e2e": "maestro test .maestro/smoke.yaml" + "test:e2e": "maestro test .maestro/smoke.yaml", + "prestart": "lingui compile", + "preandroid": "lingui compile", + "preios": "lingui compile", + "intl:extract": "lingui extract --clean", + "intl:compile": "lingui compile" }, "dependencies": { "@expo/metro-runtime": "~57.0.14", + "@lingui/core": "5.9.5", + "@lingui/react": "5.9.5", + "@react-native-vector-icons/ionicons": "13.1.2", + "@react-native-vector-icons/material-design-icons": "13.1.2", "@sentrabot/chat-ui": "workspace:*", "@sentrabot/contracts": "workspace:*", "@sentrabot/core": "workspace:*", - "@react-native-vector-icons/ionicons": "13.1.2", - "@react-native-vector-icons/material-design-icons": "13.1.2", "expo": "~57.0.18", "expo-audio": "~57.0.4", "expo-constants": "~57.0.16", @@ -54,9 +61,12 @@ "react-native-worklets": "0.10.1" }, "devDependencies": { + "@lingui/babel-plugin-lingui-macro": "5.9.5", + "@lingui/cli": "5.9.5", "@react-native/metro-config": "0.86.3", "@types/node": "^24.3.0", "@types/react": "^19.2.18", + "babel-preset-expo": "~57.0.9", "typescript": "~6.0.3", "vitest": "^4.1.10" } diff --git a/apps/site/README.md b/apps/site/README.md index 69445ba2..331689cb 100644 --- a/apps/site/README.md +++ b/apps/site/README.md @@ -20,6 +20,7 @@ pnpm --filter cora preview - `public/{privasi,ketentuan}/index.html` — extensionless-route copies kept byte-identical to their canonical `.html` pages - `IMAGE-SWAP.md` — image rebrand log (waves 11–16) - `public/assets/` — captured CSS, rebranded images, the polish layer, and self-hosted IBM Plex Sans +- `public/{favicon.ico,apple-touch-icon.png,site.webmanifest,robots.txt,sitemap.xml}` — crawler and installability surface; icons and the OG image are official brand-kit files copied unmodified ## Constraint diff --git a/apps/site/index.html b/apps/site/index.html index 09f87b61..2d5c3ccd 100644 --- a/apps/site/index.html +++ b/apps/site/index.html @@ -13,10 +13,29 @@ name="description" content="AI yang memahami cara orang Indonesia belajar, berkarier, dan mengatur keuangan. Sembilan bot Sentra, jalan di komputer Anda sendiri dengan API key Anda." /> + + + + + + + + + + + + + + + + + + - + + + - diff --git a/docs/brand/04-FAVICON-BROWSER/sentra-apple-touch-icon-180.png b/apps/site/public/apple-touch-icon.png similarity index 100% rename from docs/brand/04-FAVICON-BROWSER/sentra-apple-touch-icon-180.png rename to apps/site/public/apple-touch-icon.png diff --git a/docs/brand/07-APP-AND-DIGITAL-PRODUCT/sentra-pwa-icon-192.png b/apps/site/public/assets/favicon-192.png similarity index 100% rename from docs/brand/07-APP-AND-DIGITAL-PRODUCT/sentra-pwa-icon-192.png rename to apps/site/public/assets/favicon-192.png diff --git a/docs/brand/07-APP-AND-DIGITAL-PRODUCT/sentra-pwa-maskable-512.png b/apps/site/public/assets/favicon-maskable-512.png similarity index 100% rename from docs/brand/07-APP-AND-DIGITAL-PRODUCT/sentra-pwa-maskable-512.png rename to apps/site/public/assets/favicon-maskable-512.png diff --git a/docs/brand/03-WEBSITE/sentra-og-image-default-1200x630.png b/apps/site/public/assets/og-image-1200x630.png similarity index 100% rename from docs/brand/03-WEBSITE/sentra-og-image-default-1200x630.png rename to apps/site/public/assets/og-image-1200x630.png diff --git a/apps/site/public/daftar.html b/apps/site/public/daftar.html index 1efdb128..fa2ac327 100644 --- a/apps/site/public/daftar.html +++ b/apps/site/public/daftar.html @@ -7,8 +7,28 @@ Cara memulai | Sentra Bot + + + + + + + + + + + + + + + + + + - + + + diff --git a/apps/site/public/favicon.ico b/apps/site/public/favicon.ico new file mode 100644 index 00000000..10e5bbfa Binary files /dev/null and b/apps/site/public/favicon.ico differ diff --git a/apps/site/public/ketentuan.html b/apps/site/public/ketentuan.html index 69c3dcfd..74f9d7ff 100644 --- a/apps/site/public/ketentuan.html +++ b/apps/site/public/ketentuan.html @@ -6,8 +6,28 @@ Ketentuan Layanan | Sentra Bot + + + + + + + + + + + + + + + + + + - + + + diff --git a/apps/site/public/ketentuan/index.html b/apps/site/public/ketentuan/index.html index 69c3dcfd..74f9d7ff 100644 --- a/apps/site/public/ketentuan/index.html +++ b/apps/site/public/ketentuan/index.html @@ -6,8 +6,28 @@ Ketentuan Layanan | Sentra Bot + + + + + + + + + + + + + + + + + + - + + + diff --git a/apps/site/public/privasi.html b/apps/site/public/privasi.html index c273d5ae..05191e7c 100644 --- a/apps/site/public/privasi.html +++ b/apps/site/public/privasi.html @@ -6,8 +6,28 @@ Kebijakan Privasi | Sentra Bot + + + + + + + + + + + + + + + + + + - + + + diff --git a/apps/site/public/privasi/index.html b/apps/site/public/privasi/index.html index c273d5ae..05191e7c 100644 --- a/apps/site/public/privasi/index.html +++ b/apps/site/public/privasi/index.html @@ -6,8 +6,28 @@ Kebijakan Privasi | Sentra Bot + + + + + + + + + + + + + + + + + + - + + + diff --git a/apps/site/public/robots.txt b/apps/site/public/robots.txt new file mode 100644 index 00000000..58665a8d --- /dev/null +++ b/apps/site/public/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://sentrahai.com/sitemap.xml diff --git a/apps/site/public/site.webmanifest b/apps/site/public/site.webmanifest new file mode 100644 index 00000000..8e45b8fc --- /dev/null +++ b/apps/site/public/site.webmanifest @@ -0,0 +1,24 @@ +{ + "name": "Sentra Bot", + "short_name": "Sentra Bot", + "description": "Sembilan bot Sentra yang berjalan di komputer Anda sendiri dengan API key Anda, untuk belajar, berkarier, dan mengatur keuangan.", + "lang": "id", + "dir": "ltr", + "id": "/", + "start_url": "/", + "scope": "/", + "display": "standalone", + "background_color": "#228dcd", + "theme_color": "#228dcd", + "icons": [ + { "src": "/assets/favicon-32.png", "sizes": "32x32", "type": "image/png" }, + { "src": "/assets/favicon-192.png", "sizes": "192x192", "type": "image/png" }, + { "src": "/assets/favicon-512.png", "sizes": "512x512", "type": "image/png" }, + { + "src": "/assets/favicon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/apps/site/public/sitemap.xml b/apps/site/public/sitemap.xml new file mode 100644 index 00000000..91db3c72 --- /dev/null +++ b/apps/site/public/sitemap.xml @@ -0,0 +1,12 @@ + + + + https://sentrahai.com/ + + + https://sentrahai.com/tentang.html + + + https://sentrahai.com/daftar.html + + diff --git a/apps/site/public/tentang.html b/apps/site/public/tentang.html index c94737e1..64034616 100644 --- a/apps/site/public/tentang.html +++ b/apps/site/public/tentang.html @@ -7,8 +7,28 @@ Mengenai Sentra Artificial Intelligence + + + + + + + + + + + + + + + + + + - + + + diff --git a/apps/web/e2e/avatar-motion.spec.ts b/apps/web/e2e/avatar-motion.spec.ts index 8a022889..416d09db 100644 --- a/apps/web/e2e/avatar-motion.spec.ts +++ b/apps/web/e2e/avatar-motion.spec.ts @@ -1,24 +1,37 @@ import { expect, test } from "@playwright/test"; -test("organic avatar path stays still when reduced motion is enabled", async ({ page }) => { +const eyeTransform = (group: SVGGElement) => group.style.transform; + +test("chip avatar stays still when reduced motion is enabled", async ({ page }) => { await page.emulateMedia({ reducedMotion: "reduce" }); await page.goto("/e2e/fixtures/avatar-motion.html"); - const avatar = page.locator(".sentrabot-organic-avatar"); + const avatar = page.getByTestId("large").locator(".sentrabot-clay-avatar"); await expect(avatar).toBeVisible(); await expect(avatar.locator("animate")).toHaveCount(0); - const body = avatar.locator(".sentrabot-organic-avatar-body-working"); - const snapshot = () => - body.evaluate((path: SVGPathElement) => ({ - animationName: getComputedStyle(path).animationName, - d: getComputedStyle(path).d, - length: path.getTotalLength(), - })); - const first = await snapshot(); - await page.waitForTimeout(300); - const second = await snapshot(); - - expect(first.animationName).toBe("none"); - expect(second).toEqual(first); + const eyes = avatar.locator(".sentrabot-clay-avatar-eyes"); + await expect(eyes).toBeVisible(); + await page.mouse.move(10, 10); + await page.mouse.move(600, 400); + await page.waitForTimeout(250); + + expect(await eyes.evaluate(eyeTransform)).toBe(""); +}); + +test("only chips at 48px and above follow the pointer", async ({ page }) => { + await page.emulateMedia({ reducedMotion: "no-preference" }); + await page.goto("/e2e/fixtures/avatar-motion.html"); + + const largeEyes = page.getByTestId("large").locator(".sentrabot-clay-avatar-eyes"); + const smallEyes = page.getByTestId("small").locator(".sentrabot-clay-avatar-eyes"); + await expect(largeEyes).toBeVisible(); + await expect(smallEyes).toBeVisible(); + + await page.mouse.move(10, 10); + await page.mouse.move(700, 500); + await page.waitForTimeout(250); + + expect(await largeEyes.evaluate(eyeTransform)).toMatch(/^translate\(/); + expect(await smallEyes.evaluate(eyeTransform)).toBe(""); }); diff --git a/apps/web/e2e/fixtures/avatar-motion.tsx b/apps/web/e2e/fixtures/avatar-motion.tsx index e65026bd..5e6fd625 100644 --- a/apps/web/e2e/fixtures/avatar-motion.tsx +++ b/apps/web/e2e/fixtures/avatar-motion.tsx @@ -1,12 +1,15 @@ import { BotAvatar } from "@sentrabot/ui-web"; import { createRoot } from "react-dom/client"; +// Two sizes on purpose: pointer tracking is gated at 48px, so the large chip +// must follow the cursor and the small one must not. createRoot(document.getElementById("root")!).render( - , +
+
+ +
+
+ +
+
, ); diff --git a/apps/web/e2e/onboarding-conversation.spec.ts b/apps/web/e2e/onboarding-conversation.spec.ts index 345b85cb..c700b14a 100644 --- a/apps/web/e2e/onboarding-conversation.spec.ts +++ b/apps/web/e2e/onboarding-conversation.spec.ts @@ -13,13 +13,13 @@ test("focus choice suggests apps and preserves a completed connection", async ({ await completeOnboarding(page); await expect( - page.getByText("Hey Robin. Fresh start on my side, so I’ll keep this short."), + page.getByText("Halo Robin. Saya mulai dari nol, jadi saya buat singkat saja."), ).toBeVisible(); - await expect(page.getByText("What do you want me on first?", { exact: true })).toBeVisible(); + await expect(page.getByText("Mau saya pegang apa lebih dulu?", { exact: true })).toBeVisible(); await page.mouse.move(1, 1); await captureScreenshot(page, testInfo, "01-focus-choice"); - await page.getByRole("button", { name: /Day-to-day work/ }).click(); + await page.getByRole("button", { name: /Pekerjaan sehari-hari/ }).click(); // The focus step suggests apps but must not rename the bot: the name the // user chose during creation ("Chief") is preserved. await expect(page.locator("main").getByText("Chief", { exact: true })).toBeVisible(); @@ -28,7 +28,7 @@ test("focus choice suggests apps and preserves a completed connection", async ({ await expect(page.getByText("Gmail", { exact: true })).toBeVisible(); await page .getByTestId("transcript") - .getByText("Hit those three and I’ll start pulling the picture.") + .getByText("Hubungkan tiga itu, dan saya mulai menyusun gambarannya.") .scrollIntoViewIfNeeded(); await page.mouse.move(1, 1); await captureScreenshot(page, testInfo, "02-app-suggestions"); diff --git a/apps/web/index.html b/apps/web/index.html index a95779a2..638f604e 100644 --- a/apps/web/index.html +++ b/apps/web/index.html @@ -1,5 +1,5 @@ - + diff --git a/apps/web/public/sentrabot-bg.png b/apps/web/public/sentrabot-bg.png deleted file mode 100644 index 1705a465..00000000 --- a/apps/web/public/sentrabot-bg.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a69d5cfb6d84127ff7a00f68787b12298ab42b0b3d0defe32294015ed5add37e -size 83691 diff --git a/apps/web/public/sentrabot.png b/apps/web/public/sentrabot.png deleted file mode 100644 index 296ce495..00000000 --- a/apps/web/public/sentrabot.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:59e8242ae731e76d09e3384ac2331abf9af8272a582641e8703b8a1ae93bed25 -size 968405 diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx index bec09fdf..7a01e6be 100644 --- a/apps/web/src/App.tsx +++ b/apps/web/src/App.tsx @@ -19,6 +19,9 @@ const AuthPage = lazy(() => const OnboardingPage = lazy(() => import("./pages/Onboarding").then((module) => ({ default: module.OnboardingPage })), ); +const ResetPasswordPage = lazy(() => + import("./pages/ResetPassword").then((module) => ({ default: module.ResetPasswordPage })), +); const WelcomePage = lazy(() => import("./pages/Welcome").then((module) => ({ default: module.WelcomePage })), ); @@ -66,6 +69,7 @@ export function App() { path="/sign-up" element={user ? : } /> + } /> : } diff --git a/apps/web/src/lib/ui-locale.test.ts b/apps/web/src/lib/ui-locale.test.ts index f0b32ee3..6ac57b2c 100644 --- a/apps/web/src/lib/ui-locale.test.ts +++ b/apps/web/src/lib/ui-locale.test.ts @@ -19,11 +19,11 @@ describe("normalizeUiLocale", () => { expect(normalizeUiLocale("DE")).toBe("de"); }); - it("falls back to English for unknown locales", () => { - expect(normalizeUiLocale("fr-FR")).toBe("en"); - expect(normalizeUiLocale("he-IL")).toBe("en"); - expect(normalizeUiLocale("")).toBe("en"); - expect(normalizeUiLocale(null)).toBe("en"); + it("falls back to Indonesian for unknown locales", () => { + expect(normalizeUiLocale("fr-FR")).toBe("id"); + expect(normalizeUiLocale("he-IL")).toBe("id"); + expect(normalizeUiLocale("")).toBe("id"); + expect(normalizeUiLocale(null)).toBe("id"); }); }); @@ -48,7 +48,7 @@ describe("resolveUiLocale", () => { ).toBe("de"); }); - it("uses navigator.language next, then English", () => { + it("uses navigator.language next, then Indonesian", () => { expect( resolveUiLocale({ stored: null, @@ -56,19 +56,36 @@ describe("resolveUiLocale", () => { navigatorLanguage: "ko-KR", }), ).toBe("ko"); + expect( + resolveUiLocale({ + stored: null, + envDefault: null, + navigatorLanguage: "de-DE", + }), + ).toBe("de"); expect( resolveUiLocale({ stored: null, envDefault: null, navigatorLanguage: "fr-FR", }), - ).toBe("en"); + ).toBe("id"); expect( resolveUiLocale({ stored: null, envDefault: null, navigatorLanguage: null, }), + ).toBe("id"); + }); + + it("honours a saved English choice", () => { + expect( + resolveUiLocale({ + stored: "en", + envDefault: null, + navigatorLanguage: "id-ID", + }), ).toBe("en"); }); diff --git a/apps/web/src/lib/ui-locale.ts b/apps/web/src/lib/ui-locale.ts index 9028ef98..8864c535 100644 --- a/apps/web/src/lib/ui-locale.ts +++ b/apps/web/src/lib/ui-locale.ts @@ -26,13 +26,13 @@ export function isUiLocale(value: string | null | undefined): value is UiLocale ); } -/** Normalize BCP-47 tags (`de-DE`, `ko-KR`, `pt-BR`) to a supported UI locale, else `en`. */ +/** Normalize BCP-47 tags (`de-DE`, `ko-KR`, `pt-BR`) to a supported UI locale, else `id`. */ export function normalizeUiLocale(raw: string | null | undefined): UiLocale { - if (!raw) return "en"; + if (!raw) return "id"; const normalized = raw.trim().toLowerCase().replace("_", "-"); if (normalized === "pt" || normalized.startsWith("pt-")) return "pt-BR"; const primary = normalized.split("-")[0] ?? ""; - return isUiLocale(primary) ? primary : "en"; + return isUiLocale(primary) ? primary : "id"; } function readStoredLocale(storage: Pick | null | undefined): string | null { @@ -69,7 +69,7 @@ export type ResolveUiLocaleOptions = { /** * Order: saved choice (`localStorage`) → `VITE_DEFAULT_UI_LOCALE` → - * `navigator.language` → English. + * `navigator.language` (when it is a supported locale) → `id` (Bahasa Indonesia). */ export function resolveUiLocale(options: ResolveUiLocaleOptions = {}): UiLocale { const stored = @@ -101,7 +101,7 @@ export function resolveUiLocale(options: ResolveUiLocaleOptions = {}): UiLocale ); if (navigatorLanguage) return normalizeUiLocale(navigatorLanguage); - return "en"; + return "id"; } export function persistUiLocale( diff --git a/apps/web/src/locales/de/messages.po b/apps/web/src/locales/de/messages.po index 39790bb0..94f64de7 100644 --- a/apps/web/src/locales/de/messages.po +++ b/apps/web/src/locales/de/messages.po @@ -13,7 +13,7 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" -#: src/pages/Shell.tsx:2423 +#: src/pages/Shell.tsx:2412 msgid " (unread)" msgstr " (ungelesen)" @@ -31,12 +31,12 @@ msgid "{0, plural, one {# model} other {# models}}" msgstr "{0, plural, one {# Modell} other {# Modelle}}" #. placeholder {0}: file.name -#: src/pages/Shell.tsx:1743 +#: src/pages/Shell.tsx:1726 msgid "{0} (max {ATTACHMENT_MAX_COUNT} attachments)" msgstr "{0} (maximal {ATTACHMENT_MAX_COUNT} Anhänge)" #. placeholder {0}: file.name -#: src/pages/Shell.tsx:1747 +#: src/pages/Shell.tsx:1730 msgid "{0} (over 10 MiB)" msgstr "{0} (über 10 MiB)" @@ -46,12 +46,12 @@ msgid "{0} {unitLabel}" msgstr "{0} {unitLabel}" #. placeholder {0}: block.name -#: src/pages/Shell.tsx:6066 +#: src/components/conversation/MessageView.tsx:612 msgid "{0} connection" msgstr "{0}-Verbindung" #. placeholder {0}: computer.busyBotName -#: src/pages/Shell.tsx:2937 +#: src/pages/Shell.tsx:2931 msgid "{0} is using it" msgstr "{0} verwendet es" @@ -67,8 +67,8 @@ msgstr "{0} MB" #. placeholder {0}: usage.runs #. placeholder {1}: usage.inputTokens + usage.outputTokens -#: src/pages/AccountSettingsOverlay.tsx:216 -#: src/pages/Shell.tsx:2644 +#: src/pages/AccountSettingsOverlay.tsx:149 +#: src/pages/Shell.tsx:2633 msgid "{0} runs · {1} tokens" msgstr "{0} Läufe · {1} Tokens" @@ -81,7 +81,7 @@ msgstr "{botName} · {0, plural, one {# verbundener Bot} other {# verbundene Bot msgid "{botName} has not messaged another bot yet." msgstr "{botName} hat noch keinem anderen Bot eine Nachricht gesendet." -#: src/pages/Shell.tsx:5943 +#: src/pages/Shell.tsx:4858 msgid "{botName}’s computer" msgstr "Computer von {botName}" @@ -125,12 +125,12 @@ msgstr "{size} B" msgid "{title}, {label}" msgstr "{title}, {label}" -#: src/pages/Shell.tsx:3723 +#: src/pages/Shell.tsx:3712 msgid "{workingBotName} is working" msgstr "{workingBotName} arbeitet" #. placeholder {0}: mention.name -#: src/pages/Shell.tsx:4223 +#: src/components/composer/Composer.tsx:363 msgid "@{0}" msgstr "@{0}" @@ -146,11 +146,11 @@ msgstr "+ Aufgabe anlernen" msgid "Access token (optional)" msgstr "Zugriffstoken (optional)" -#: src/pages/AccountSettingsOverlay.tsx:128 +#: src/pages/AccountSettingsOverlay.tsx:107 msgid "Account" msgstr "Konto" -#: src/pages/Shell.tsx:5444 +#: src/pages/Shell.tsx:4359 msgid "Account default" msgstr "Kontostandard" @@ -171,17 +171,17 @@ msgstr "" msgid "Active model" msgstr "Aktives Modell" -#: src/pages/VoiceSettingsOverlay.tsx:149 +#: src/pages/VoiceSettingsOverlay.tsx:154 msgid "Active voice" msgstr "Aktive Stimme" -#: src/pages/Shell.tsx:2213 -#: src/pages/Shell.tsx:2215 +#: src/pages/Shell.tsx:2202 +#: src/pages/Shell.tsx:2204 msgid "Activity" msgstr "Aktivität" -#: src/pages/PluginsOverlay.tsx:457 -#: src/pages/PluginsOverlay.tsx:668 +#: src/pages/PluginsOverlay.tsx:458 +#: src/pages/PluginsOverlay.tsx:670 #: src/pages/ScratchpadSection.tsx:188 msgid "Add" msgstr "Hinzufügen" @@ -190,7 +190,7 @@ msgstr "Hinzufügen" msgid "Add a model in Settings to use this." msgstr "" -#: src/pages/Shell.tsx:3157 +#: src/pages/Shell.tsx:3151 msgid "Add a run time for this one-shot." msgstr "" @@ -198,7 +198,7 @@ msgstr "" msgid "Add a schedule or webhook to run this routine." msgstr "" -#: src/pages/Shell.tsx:3129 +#: src/pages/Shell.tsx:3123 msgid "Add a schedule or webhook trigger" msgstr "" @@ -222,15 +222,15 @@ msgstr "Gib eine HTTPS-Server-URL ein." msgid "Add item" msgstr "Element hinzufügen" -#: src/pages/PluginsOverlay.tsx:762 +#: src/pages/PluginsOverlay.tsx:764 msgid "Add MCP server" msgstr "MCP-Server hinzufügen" -#: src/pages/PluginsOverlay.tsx:765 +#: src/pages/PluginsOverlay.tsx:767 msgid "Add OpenAPI" msgstr "OpenAPI hinzufügen" -#: src/pages/PluginsOverlay.tsx:780 +#: src/pages/PluginsOverlay.tsx:782 msgid "Add remote MCP server" msgstr "Remote-MCP-Server hinzufügen" @@ -243,7 +243,7 @@ msgstr "Server hinzufügen" msgid "Add to routine" msgstr "Zur Routine hinzufügen" -#: src/pages/PluginsOverlay.tsx:768 +#: src/pages/PluginsOverlay.tsx:770 msgid "Add Treg" msgstr "Treg hinzufügen" @@ -252,15 +252,15 @@ msgid "Add trigger" msgstr "" #: src/pages/McpServersOverlay.tsx:363 -#: src/pages/PluginsOverlay.tsx:452 -#: src/pages/PluginsOverlay.tsx:663 +#: src/pages/PluginsOverlay.tsx:453 +#: src/pages/PluginsOverlay.tsx:665 msgid "Adding…" msgstr "Wird hinzugefügt…" -#: src/pages/AccountSettingsOverlay.tsx:247 -#: src/pages/PluginsOverlay.tsx:742 +#: src/pages/AccountSettingsOverlay.tsx:180 +#: src/pages/PluginsOverlay.tsx:744 #: src/pages/RoutineSchedule.tsx:42 -#: src/pages/Shell.tsx:5347 +#: src/pages/Shell.tsx:4262 msgid "Advanced" msgstr "Erweitert" @@ -272,7 +272,7 @@ msgstr "" msgid "Agent access for new servers" msgstr "Agent-Zugriff für neue Server" -#: src/pages/Shell.tsx:2736 +#: src/pages/Shell.tsx:2730 msgid "Agent computer" msgstr "Agent-Computer" @@ -319,7 +319,7 @@ msgstr "Kaufaktionen ohne Nachfrage erlauben" msgid "Allowed once" msgstr "Einmal erlaubt" -#: src/pages/Auth.tsx:159 +#: src/pages/Auth.tsx:169 msgid "Already have an account?" msgstr "Du hast bereits ein Konto?" @@ -331,6 +331,10 @@ msgstr "Dieses Tool immer erlauben" msgid "Always allowed" msgstr "Immer erlaubt" +#: src/pages/Auth.tsx:140 +msgid "An account with this email already exists." +msgstr "" + #: src/components/AskCard.tsx:138 msgid "Answer" msgstr "Antwort" @@ -352,14 +356,14 @@ msgstr "" #: src/pages/ModelSettingsOverlay.tsx:630 #: src/pages/ModelSettingsOverlay.tsx:633 #: src/pages/ModelSettingsOverlay.tsx:649 -#: src/pages/Onboarding.tsx:496 -#: src/pages/Onboarding.tsx:499 #: src/pages/Onboarding.tsx:510 -#: src/pages/VoiceSettingsOverlay.tsx:236 +#: src/pages/Onboarding.tsx:513 +#: src/pages/Onboarding.tsx:524 +#: src/pages/VoiceSettingsOverlay.tsx:241 msgid "API key" msgstr "API-Schlüssel" -#: src/pages/PluginsOverlay.tsx:816 +#: src/pages/PluginsOverlay.tsx:818 msgid "API key header" msgstr "API-Schlüssel-Header" @@ -371,13 +375,13 @@ msgstr "Gilt beim Hinzufügen des Servers. Mit den Agent-Chips auf jeder Serverk msgid "Approval boundaries" msgstr "Bestätigungsgrenzen" +#: src/components/conversation/MessageView.tsx:805 #: src/pages/PhoneSettingsOverlay.tsx:243 #: src/pages/PhoneSettingsOverlay.tsx:310 -#: src/pages/Shell.tsx:6259 msgid "Approve" msgstr "Genehmigen" -#: src/pages/Shell.tsx:6250 +#: src/components/conversation/MessageView.tsx:796 msgid "Approve this server to let your agent use its tools." msgstr "Genehmige diesen Server, damit dein Agent seine Tools verwenden kann." @@ -385,15 +389,15 @@ msgstr "Genehmige diesen Server, damit dein Agent seine Tools verwenden kann." msgid "Archive" msgstr "Archivieren" -#: src/pages/Shell.tsx:4892 +#: src/components/conversation/MessageView.tsx:312 msgid "archived" msgstr "archiviert" -#: src/pages/Shell.tsx:2487 +#: src/pages/Shell.tsx:2476 msgid "Archived" msgstr "Archiviert" -#: src/pages/Shell.tsx:4903 +#: src/components/conversation/MessageView.tsx:323 msgid "Archived. Chat, memory, and files kept." msgstr "Archiviert. Chat, Erinnerungen und Dateien bleiben erhalten." @@ -432,7 +436,7 @@ msgstr "Vor Käufen nachfragen" msgid "Ask before sending external email" msgstr "Vor dem Senden externer E-Mails nachfragen" -#: src/pages/Shell.tsx:2939 +#: src/pages/Shell.tsx:2933 msgid "Asleep" msgstr "Im Ruhezustand" @@ -447,16 +451,21 @@ msgstr "um {0}" msgid "at {timeSelect}" msgstr "um {timeSelect}" -#: src/pages/Shell.tsx:4297 +#: src/pages/Auth.tsx:134 +#: src/pages/ResetPassword.tsx:197 +msgid "At least 8 characters" +msgstr "" + +#: src/components/composer/Composer.tsx:437 msgid "Attach file" msgstr "Datei anhängen" -#: src/pages/Shell.tsx:4498 +#: src/components/composer/shared.ts:21 msgid "Attachment" msgstr "Anhang" #: src/pages/ModelSettingsOverlay.tsx:563 -#: src/pages/Onboarding.tsx:437 +#: src/pages/Onboarding.tsx:451 msgid "Authorization code or callback URL" msgstr "Autorisierungscode oder Callback-URL" @@ -464,12 +473,12 @@ msgstr "Autorisierungscode oder Callback-URL" msgid "Authorization expired — reconnect required" msgstr "Autorisierung abgelaufen — erneute Verbindung erforderlich" -#: src/pages/Shell.tsx:6051 +#: src/components/conversation/MessageView.tsx:597 msgid "Authorization timed out. Please try again." msgstr "Zeitüberschreitung bei der Autorisierung. Versuche es erneut." -#: src/pages/Shell.tsx:6093 -#: src/pages/Shell.tsx:6259 +#: src/components/conversation/MessageView.tsx:639 +#: src/components/conversation/MessageView.tsx:805 msgid "Authorize" msgstr "Autorisieren" @@ -477,34 +486,35 @@ msgstr "Autorisieren" msgid "Available after the routine is saved" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:161 -msgid "Avatars" -msgstr "" - #: src/pages/RoutineEditor.tsx:243 msgid "Back" msgstr "" +#: src/pages/ResetPassword.tsx:61 +#: src/pages/ResetPassword.tsx:107 +msgid "Back to sign in" +msgstr "" + #: src/pages/memory-providers/SupermemorySettingsForm.tsx:48 msgid "Base URL" msgstr "Basis-URL" -#: src/pages/PluginsOverlay.tsx:813 +#: src/pages/PluginsOverlay.tsx:815 msgid "Bearer token" msgstr "Bearer-Token" -#: src/pages/Shell.tsx:5935 +#: src/pages/Shell.tsx:4850 msgid "Booting live desktop…" msgstr "Live-Desktop wird gestartet…" #. placeholder {0}: active?.name -#: src/pages/Shell.tsx:3528 +#: src/pages/Shell.tsx:3517 msgid "Booting up {0}’s computer" msgstr "Computer von {0} wird gestartet" -#: src/pages/Shell.tsx:4752 -#: src/pages/Shell.tsx:4753 -#: src/pages/Shell.tsx:4896 +#: src/components/conversation/MessageView.tsx:172 +#: src/components/conversation/MessageView.tsx:173 +#: src/components/conversation/MessageView.tsx:316 msgid "bot" msgstr "Bot" @@ -513,7 +523,7 @@ msgstr "Bot" msgid "Bot" msgstr "" -#: src/pages/Shell.tsx:1559 +#: src/pages/Shell.tsx:1542 msgid "Bot" msgstr "Bot" @@ -521,11 +531,11 @@ msgstr "Bot" msgid "Bot messages" msgstr "Bot-Nachrichten" -#: src/pages/Shell.tsx:3625 +#: src/pages/Shell.tsx:3614 msgid "Bot screen" msgstr "Bot-Bildschirm" -#: src/pages/Shell.tsx:2903 +#: src/pages/Shell.tsx:2897 msgid "Bot screen preview" msgstr "Bot-Bildschirmvorschau" @@ -533,36 +543,36 @@ msgstr "Bot-Bildschirmvorschau" msgid "Bots act without asking by default. Add an exception only when you want to review a type of action first. These preferences apply across all your bots." msgstr "Bots handeln standardmäßig ohne Nachfrage. Füge nur dann eine Ausnahme hinzu, wenn du eine Aktionsart zuerst prüfen möchtest. Diese Einstellungen gelten für alle deine Bots." -#: src/pages/Shell.tsx:3724 +#: src/pages/Shell.tsx:3713 msgid "Bots are working" msgstr "Bots arbeiten" -#: src/pages/VoiceSettingsOverlay.tsx:130 +#: src/pages/VoiceSettingsOverlay.tsx:135 msgid "Bring your own key. The provider is swappable; your bots keep the same speak and call buttons." msgstr "Verwende deinen eigenen Schlüssel. Der Anbieter ist austauschbar; die Schaltflächen zum Sprechen und Anrufen deiner Bots bleiben gleich." #: src/pages/CallView.tsx:233 -#: src/pages/Shell.tsx:2718 -#: src/pages/Shell.tsx:2719 +#: src/pages/Shell.tsx:2712 +#: src/pages/Shell.tsx:2713 msgid "Call" msgstr "Anrufen" -#: src/App.tsx:125 +#: src/App.tsx:129 msgid "Can't reach the server." msgstr "Server nicht erreichbar." #: src/components/AskCard.tsx:161 #: src/components/ComputerMaintenanceActions.tsx:108 #: src/components/teach/TeachComputerSection.tsx:122 -#: src/pages/PluginsOverlay.tsx:864 -#: src/pages/Shell.tsx:5611 -#: src/pages/Shell.tsx:5683 -#: src/pages/Shell.tsx:5798 -#: src/pages/Shell.tsx:5874 +#: src/pages/PluginsOverlay.tsx:866 +#: src/pages/Shell.tsx:4526 +#: src/pages/Shell.tsx:4598 +#: src/pages/Shell.tsx:4713 +#: src/pages/Shell.tsx:4789 msgid "Cancel" msgstr "Abbrechen" -#: src/pages/Shell.tsx:5140 +#: src/pages/Shell.tsx:4055 msgid "Cancel new bot" msgstr "Neuen Bot abbrechen" @@ -570,7 +580,7 @@ msgstr "Neuen Bot abbrechen" msgid "Cancel new group" msgstr "Neue Gruppe abbrechen" -#: src/pages/Shell.tsx:4170 +#: src/components/composer/Composer.tsx:310 msgid "Cancel reply" msgstr "Antwort abbrechen" @@ -582,11 +592,11 @@ msgstr "Abgebrochen" msgid "Channels" msgstr "" -#: src/pages/Shell.tsx:6156 +#: src/components/conversation/MessageView.tsx:702 msgid "Chart failed to render: {error}" msgstr "Diagramm konnte nicht angezeigt werden: {error}" -#: src/pages/Shell.tsx:4439 +#: src/components/composer/Composer.tsx:579 msgid "Chat Settings" msgstr "Chat-Einstellungen" @@ -602,11 +612,15 @@ msgstr "" msgid "Check for updates" msgstr "" -#: src/pages/Shell.tsx:3170 -#: src/pages/Shell.tsx:3180 +#: src/pages/Shell.tsx:3164 +#: src/pages/Shell.tsx:3174 msgid "Check in." msgstr "Melde dich." +#: src/pages/ResetPassword.tsx:52 +msgid "Check your email" +msgstr "" + #: src/components/SoftwareUpdateSection.tsx:71 msgid "Checking…" msgstr "" @@ -615,33 +629,33 @@ msgstr "" msgid "Checkout has local changes. Clean it before updating." msgstr "" -#: src/pages/Onboarding.tsx:269 +#: src/pages/Onboarding.tsx:283 msgid "Choose a model to get started." msgstr "Wähle zunächst ein Modell aus." +#: src/pages/ResetPassword.tsx:162 +msgid "Choose a new password" +msgstr "" + #: src/pages/ModelSettingsOverlay.tsx:310 msgid "Choose which connected model Sentra Bot uses." msgstr "Wähle das verbundene Modell aus, das Sentra Bot verwendet." -#: src/pages/AccountSettingsOverlay.tsx:187 -msgid "Clay" -msgstr "" - -#: src/pages/Shell.tsx:5698 +#: src/pages/Shell.tsx:4613 msgid "Clear" msgstr "Leeren" #. placeholder {0}: bot.name -#: src/pages/Shell.tsx:5664 +#: src/pages/Shell.tsx:4579 msgid "Clear {0}’s conversation?" msgstr "Unterhaltung mit {0} leeren?" #: src/pages/BotContextMenu.tsx:103 -#: src/pages/Shell.tsx:5499 +#: src/pages/Shell.tsx:4414 msgid "Clear conversation" msgstr "Unterhaltung leeren" -#: src/pages/Shell.tsx:5698 +#: src/pages/Shell.tsx:4613 msgid "Clearing…" msgstr "Wird geleert…" @@ -655,19 +669,19 @@ msgstr "Schließen" msgid "Close bot messages" msgstr "Bot-Nachrichten schließen" -#: src/pages/Shell.tsx:6341 +#: src/components/conversation/MessageView.tsx:887 msgid "Close chart" msgstr "Diagramm schließen" -#: src/pages/Shell.tsx:3599 +#: src/pages/Shell.tsx:3588 msgid "Close computer" msgstr "Computer schließen" -#: src/pages/Shell.tsx:6441 +#: src/components/conversation/MessageView.tsx:987 msgid "Close image preview" msgstr "Bildvorschau schließen" -#: src/pages/PluginsOverlay.tsx:586 +#: src/pages/PluginsOverlay.tsx:587 msgid "Close integrations" msgstr "Integrationen schließen" @@ -683,11 +697,11 @@ msgstr "Erinnerungseinstellungen schließen" msgid "Close model settings" msgstr "Modelleinstellungen schließen" -#: src/pages/Shell.tsx:2195 +#: src/pages/Shell.tsx:2184 msgid "Close navigation" msgstr "Navigation schließen" -#: src/pages/Shell.tsx:2881 +#: src/pages/Shell.tsx:2875 msgid "Close panel" msgstr "Panel schließen" @@ -700,11 +714,11 @@ msgstr "" msgid "Close preview" msgstr "Vorschau schließen" -#: src/pages/AccountSettingsOverlay.tsx:118 +#: src/pages/AccountSettingsOverlay.tsx:97 msgid "Close user settings" msgstr "Benutzereinstellungen schließen" -#: src/pages/VoiceSettingsOverlay.tsx:139 +#: src/pages/VoiceSettingsOverlay.tsx:144 msgid "Close voice settings" msgstr "Stimmeinstellungen schließen" @@ -718,7 +732,7 @@ msgid "Code" msgstr "" #. placeholder {0}: group.title -#: src/pages/Shell.tsx:2305 +#: src/pages/Shell.tsx:2294 msgid "Collapse {0}" msgstr "" @@ -734,28 +748,28 @@ msgstr "Befehl" msgid "Complete" msgstr "Abschließen" -#: src/pages/Shell.tsx:5050 -#: src/pages/Shell.tsx:5078 +#: src/components/conversation/MessageView.tsx:470 +#: src/pages/Shell.tsx:3993 msgid "Computer" msgstr "Computer" -#: src/pages/Shell.tsx:5938 +#: src/pages/Shell.tsx:4853 msgid "Computer failed to boot" msgstr "Computer konnte nicht gestartet werden" -#: src/pages/Shell.tsx:3647 +#: src/pages/Shell.tsx:3636 msgid "Computer is asleep" msgstr "Computer ist im Ruhezustand" -#: src/pages/Shell.tsx:5937 +#: src/pages/Shell.tsx:4852 msgid "Computer is asleep. Take control to wake it." msgstr "Computer schläft. Übernehmen, um ihn zu wecken." -#: src/pages/Shell.tsx:5939 +#: src/pages/Shell.tsx:4854 msgid "Computer is stopped" msgstr "Computer ist gestoppt" -#: src/pages/AccountSettingsOverlay.tsx:234 +#: src/pages/AccountSettingsOverlay.tsx:167 msgid "Computers" msgstr "Computer" @@ -776,12 +790,12 @@ msgid "Confirm delete" msgstr "Löschen bestätigen" #: src/pages/memory-providers/SupermemorySettingsForm.tsx:80 -#: src/pages/PluginsOverlay.tsx:494 -#: src/pages/VoiceSettingsOverlay.tsx:257 +#: src/pages/PluginsOverlay.tsx:495 +#: src/pages/VoiceSettingsOverlay.tsx:262 msgid "Connect" msgstr "Verbinden" -#: src/pages/Onboarding.tsx:266 +#: src/pages/Onboarding.tsx:280 msgid "Connect a model" msgstr "Modell verbinden" @@ -789,11 +803,11 @@ msgstr "Modell verbinden" msgid "Connect API key" msgstr "API-Schlüssel verbinden" -#: src/pages/VoiceSettingsOverlay.tsx:160 +#: src/pages/VoiceSettingsOverlay.tsx:165 msgid "Connect ElevenLabs, OpenAI, or Cartesia" msgstr "ElevenLabs, OpenAI oder Cartesia verbinden" -#: src/pages/Shell.tsx:6239 +#: src/components/conversation/MessageView.tsx:785 msgid "Connect MCP server “{name}”" msgstr "MCP-Server „{name}“ verbinden" @@ -809,31 +823,31 @@ msgstr "Verbinde Remote- oder lokale Toolserver und wähle aus, welche Agents si msgid "Connect this provider to use it as your personal model." msgstr "Verbinde diesen Anbieter, um ihn als persönliches Modell zu verwenden." -#: src/pages/PluginsOverlay.tsx:778 +#: src/pages/PluginsOverlay.tsx:780 msgid "Connect Treg" msgstr "Treg verbinden" +#: src/components/conversation/MessageView.tsx:636 #: src/pages/McpOAuthCallback.tsx:53 #: src/pages/MemorySettingsOverlay.tsx:163 #: src/pages/ModelSettingsOverlay.tsx:378 -#: src/pages/Shell.tsx:6090 -#: src/pages/VoiceSettingsOverlay.tsx:202 +#: src/pages/VoiceSettingsOverlay.tsx:207 msgid "Connected" msgstr "Verbunden" -#: src/pages/Shell.tsx:6269 +#: src/components/conversation/MessageView.tsx:815 msgid "Connected — its tools are available from your next message." msgstr "Verbunden – die Tools sind ab deiner nächsten Nachricht verfügbar." #. placeholder {0}: credential.label #. placeholder {0}: selected.name #: src/pages/ModelSettingsOverlay.tsx:522 -#: src/pages/VoiceSettingsOverlay.tsx:223 +#: src/pages/VoiceSettingsOverlay.tsx:228 msgid "Connected · {0}" msgstr "Verbunden · {0}" #. placeholder {0}: selected.name -#: src/pages/VoiceSettingsOverlay.tsx:73 +#: src/pages/VoiceSettingsOverlay.tsx:78 msgid "Connected {0}." msgstr "{0} verbunden." @@ -844,29 +858,29 @@ msgstr "{0} verbunden." msgid "Connected and using {0}." msgstr "Verbunden, {0} wird verwendet." +#: src/components/conversation/MessageView.tsx:805 #: src/pages/McpServersOverlay.tsx:16 #: src/pages/memory-providers/SupermemorySettingsForm.tsx:80 -#: src/pages/PluginsOverlay.tsx:494 -#: src/pages/Shell.tsx:6259 -#: src/pages/VoiceSettingsOverlay.tsx:253 +#: src/pages/PluginsOverlay.tsx:495 +#: src/pages/VoiceSettingsOverlay.tsx:258 msgid "Connecting…" msgstr "Verbindung wird hergestellt…" #. placeholder {0}: item.name -#: src/pages/PluginsOverlay.tsx:297 +#: src/pages/PluginsOverlay.tsx:298 msgid "Connection to {0} is still pending. You can close this and check again." msgstr "Die Verbindung zu {0} steht noch aus. Du kannst dieses Fenster schließen und später erneut nachsehen." -#: src/pages/Onboarding.tsx:538 -#: src/pages/Onboarding.tsx:697 +#: src/pages/Onboarding.tsx:552 +#: src/pages/Onboarding.tsx:711 msgid "Continue" msgstr "Weiter" -#: src/pages/Auth.tsx:144 +#: src/pages/Auth.tsx:154 msgid "Continue with email" msgstr "Mit E-Mail fortfahren" -#: src/pages/Shell.tsx:4535 +#: src/pages/Shell.tsx:3921 msgid "Copy" msgstr "Kopieren" @@ -878,11 +892,11 @@ msgstr "Hinzufügen fehlgeschlagen" msgid "Could not add MCP server" msgstr "MCP-Server konnte nicht hinzugefügt werden" -#: src/pages/Shell.tsx:6226 +#: src/components/conversation/MessageView.tsx:772 msgid "Could not approve this server" msgstr "Server konnte nicht genehmigt werden" -#: src/pages/Shell.tsx:6054 +#: src/components/conversation/MessageView.tsx:600 msgid "Could not authorize this app" msgstr "App konnte nicht autorisiert werden" @@ -890,7 +904,7 @@ msgstr "App konnte nicht autorisiert werden" msgid "Could not change the default model" msgstr "Standardmodell konnte nicht geändert werden" -#: src/pages/Shell.tsx:5692 +#: src/pages/Shell.tsx:4607 msgid "Could not clear conversation" msgstr "Unterhaltung konnte nicht geleert werden" @@ -898,7 +912,7 @@ msgstr "Unterhaltung konnte nicht geleert werden" msgid "Could not complete OAuth" msgstr "OAuth konnte nicht abgeschlossen werden" -#: src/pages/PluginsOverlay.tsx:301 +#: src/pages/PluginsOverlay.tsx:302 msgid "Could not connect" msgstr "Verbindung fehlgeschlagen" @@ -911,15 +925,15 @@ msgstr "Verbindung mit {0} fehlgeschlagen" msgid "Could not connect this provider" msgstr "Anbieter konnte nicht verbunden werden" -#: src/pages/VoiceSettingsOverlay.tsx:75 +#: src/pages/VoiceSettingsOverlay.tsx:80 msgid "Could not connect this voice provider" msgstr "Stimmanbieter konnte nicht verbunden werden" -#: src/pages/Auth.tsx:33 +#: src/pages/Auth.tsx:50 msgid "Could not continue" msgstr "Fortfahren fehlgeschlagen" -#: src/pages/Shell.tsx:5128 +#: src/pages/Shell.tsx:4043 msgid "Could not create bot" msgstr "Bot konnte nicht erstellt werden" @@ -927,19 +941,19 @@ msgstr "Bot konnte nicht erstellt werden" msgid "Could not create group" msgstr "Gruppe konnte nicht erstellt werden" -#: src/pages/Shell.tsx:5583 +#: src/pages/Shell.tsx:4498 msgid "Could not create section" msgstr "Abschnitt konnte nicht erstellt werden" -#: src/pages/Onboarding.tsx:251 +#: src/pages/Onboarding.tsx:265 msgid "Could not create your bot" msgstr "Dein Bot konnte nicht erstellt werden" -#: src/pages/Shell.tsx:5807 +#: src/pages/Shell.tsx:4722 msgid "Could not delete bot" msgstr "Bot konnte nicht gelöscht werden" -#: src/pages/Shell.tsx:5887 +#: src/pages/Shell.tsx:4802 msgid "Could not delete group" msgstr "" @@ -947,7 +961,7 @@ msgstr "" msgid "Could not delete MCP server" msgstr "MCP-Server konnte nicht gelöscht werden" -#: src/pages/Shell.tsx:5888 +#: src/pages/Shell.tsx:4803 msgid "Could not delete routine" msgstr "Routine konnte nicht gelöscht werden" @@ -968,15 +982,15 @@ msgstr "{0} konnte nicht heruntergeladen werden. Versuche es erneut." msgid "Could not download {name}. Try again." msgstr "{name} konnte nicht heruntergeladen werden. Versuche es erneut." -#: src/pages/PluginsOverlay.tsx:952 +#: src/pages/PluginsOverlay.tsx:954 msgid "Could not install connector" msgstr "Connector konnte nicht installiert werden" -#: src/pages/PluginsOverlay.tsx:370 +#: src/pages/PluginsOverlay.tsx:371 msgid "Could not install MCP server" msgstr "" -#: src/pages/PluginsOverlay.tsx:409 +#: src/pages/PluginsOverlay.tsx:410 msgid "Could not install skill" msgstr "" @@ -984,7 +998,7 @@ msgstr "" msgid "Could not load approval rules" msgstr "Bestätigungsregeln konnten nicht geladen werden" -#: src/pages/PluginsOverlay.tsx:130 +#: src/pages/PluginsOverlay.tsx:133 msgid "Could not load integrations" msgstr "Integrationen konnten nicht geladen werden" @@ -1004,16 +1018,16 @@ msgstr "Datei konnte nicht geladen werden." msgid "Could not load update status" msgstr "" -#: src/pages/VoiceSettingsOverlay.tsx:47 +#: src/pages/VoiceSettingsOverlay.tsx:52 msgid "Could not load voice settings" msgstr "Stimmeinstellungen konnten nicht geladen werden" -#: src/pages/VoiceSettingsOverlay.tsx:109 +#: src/pages/VoiceSettingsOverlay.tsx:114 msgid "Could not play a test clip" msgstr "Testclip konnte nicht abgespielt werden" #: src/pages/ModelSettingsOverlay.tsx:221 -#: src/pages/Onboarding.tsx:197 +#: src/pages/Onboarding.tsx:211 msgid "Could not reach this model server" msgstr "Modellserver konnte nicht erreicht werden" @@ -1021,7 +1035,7 @@ msgstr "Modellserver konnte nicht erreicht werden" msgid "Could not remove" msgstr "Entfernen fehlgeschlagen" -#: src/pages/PluginsOverlay.tsx:965 +#: src/pages/PluginsOverlay.tsx:967 msgid "Could not remove connector" msgstr "Connector konnte nicht entfernt werden" @@ -1029,7 +1043,7 @@ msgstr "Connector konnte nicht entfernt werden" msgid "Could not remove group" msgstr "Gruppe konnte nicht entfernt werden" -#: src/pages/PluginsOverlay.tsx:396 +#: src/pages/PluginsOverlay.tsx:397 msgid "Could not remove MCP server" msgstr "" @@ -1037,23 +1051,27 @@ msgstr "" msgid "Could not remove rule" msgstr "Regel konnte nicht entfernt werden" -#: src/pages/PluginsOverlay.tsx:423 +#: src/pages/PluginsOverlay.tsx:424 msgid "Could not remove skill" msgstr "" -#: src/pages/Shell.tsx:6146 +#: src/components/conversation/MessageView.tsx:692 msgid "Could not render chart" msgstr "Diagramm konnte nicht angezeigt werden" -#: src/pages/PluginsOverlay.tsx:327 +#: src/pages/ResetPassword.tsx:139 +msgid "Could not reset your password" +msgstr "" + +#: src/pages/PluginsOverlay.tsx:328 msgid "Could not revoke connection" msgstr "Verbindung konnte nicht widerrufen werden" -#: src/pages/Shell.tsx:3232 +#: src/pages/Shell.tsx:3226 msgid "Could not run routine" msgstr "" -#: src/pages/Shell.tsx:5484 +#: src/pages/Shell.tsx:4399 msgid "Could not save" msgstr "Speichern fehlgeschlagen" @@ -1065,11 +1083,11 @@ msgstr "" msgid "Could not save group" msgstr "Gruppe konnte nicht gespeichert werden" -#: src/pages/Onboarding.tsx:224 +#: src/pages/Onboarding.tsx:238 msgid "Could not save model" msgstr "Modell konnte nicht gespeichert werden" -#: src/pages/Shell.tsx:3203 +#: src/pages/Shell.tsx:3197 msgid "Could not save routine" msgstr "Routine konnte nicht gespeichert werden" @@ -1081,11 +1099,11 @@ msgstr "Regel konnte nicht gespeichert werden" msgid "Could not save that choice" msgstr "Auswahl konnte nicht gespeichert werden" -#: src/pages/VoiceSettingsOverlay.tsx:90 +#: src/pages/VoiceSettingsOverlay.tsx:95 msgid "Could not save that voice" msgstr "Stimme konnte nicht gespeichert werden" -#: src/pages/Shell.tsx:5966 +#: src/components/conversation/MessageView.tsx:508 msgid "Could not save this choice" msgstr "Diese Auswahl konnte nicht gespeichert werden" @@ -1093,8 +1111,12 @@ msgstr "Diese Auswahl konnte nicht gespeichert werden" msgid "Could not send that" msgstr "Senden fehlgeschlagen" +#: src/pages/ResetPassword.tsx:44 +msgid "Could not send the link. Try again." +msgstr "" + #: src/pages/McpServersOverlay.tsx:172 -#: src/pages/PluginsOverlay.tsx:384 +#: src/pages/PluginsOverlay.tsx:385 msgid "Could not start OAuth" msgstr "OAuth konnte nicht gestartet werden" @@ -1102,7 +1124,7 @@ msgstr "OAuth konnte nicht gestartet werden" msgid "Could not submit this answer" msgstr "Antwort konnte nicht gesendet werden" -#: src/pages/Shell.tsx:2043 +#: src/pages/Shell.tsx:2032 msgid "Could not take control" msgstr "Kontrolle konnte nicht übernommen werden" @@ -1130,26 +1152,22 @@ msgstr "" msgid "Couldn't start WhatsApp pairing" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:93 -msgid "Couldn't update avatars" -msgstr "" - #: src/pages/PhoneSettingsOverlay.tsx:99 msgid "Couldn't update phone settings" msgstr "" -#: src/pages/Shell.tsx:2233 -#: src/pages/Shell.tsx:5187 -#: src/pages/Shell.tsx:5618 +#: src/pages/Shell.tsx:2222 +#: src/pages/Shell.tsx:4102 +#: src/pages/Shell.tsx:4533 msgid "Create" msgstr "Erstellen" #. placeholder {0}: bot.name -#: src/pages/Shell.tsx:5592 +#: src/pages/Shell.tsx:4507 msgid "Create a section and move {0} into it." msgstr "Erstelle einen Abschnitt und verschiebe {0} dorthin." -#: src/pages/Auth.tsx:146 +#: src/pages/Auth.tsx:156 msgid "Create account" msgstr "Konto erstellen" @@ -1157,29 +1175,29 @@ msgstr "Konto erstellen" msgid "Create group" msgstr "Gruppe erstellen" -#: src/pages/Onboarding.tsx:557 +#: src/pages/Onboarding.tsx:571 msgid "Create your first bot" msgstr "Ersten Bot erstellen" -#: src/pages/Auth.tsx:17 +#: src/pages/Auth.tsx:29 msgid "Create your Sentra Bot" msgstr "Dein Sentra Bot erstellen" #: src/pages/GroupPanel.tsx:134 -#: src/pages/Shell.tsx:5187 -#: src/pages/Shell.tsx:5618 +#: src/pages/Shell.tsx:4102 +#: src/pages/Shell.tsx:4533 msgid "Creating…" msgstr "Wird erstellt…" -#: src/pages/PluginsOverlay.tsx:569 +#: src/pages/PluginsOverlay.tsx:570 msgid "Creativity" msgstr "" -#: src/pages/PluginsOverlay.tsx:834 +#: src/pages/PluginsOverlay.tsx:836 msgid "Credential" msgstr "Zugangsdaten" -#: src/pages/PluginsOverlay.tsx:892 +#: src/pages/PluginsOverlay.tsx:894 msgid "credential saved" msgstr "Zugangsdaten gespeichert" @@ -1204,7 +1222,7 @@ msgstr "Tage" msgid "Decline" msgstr "" -#: src/pages/Shell.tsx:5391 +#: src/pages/Shell.tsx:4306 msgid "Default (medium)" msgstr "Standard (mittel)" @@ -1215,24 +1233,24 @@ msgstr "Standardbereich" #: src/pages/BotContextMenu.tsx:105 #: src/pages/McpServersOverlay.tsx:481 #: src/pages/RoutineEditor.tsx:280 -#: src/pages/Shell.tsx:2522 -#: src/pages/Shell.tsx:2552 -#: src/pages/Shell.tsx:5813 -#: src/pages/Shell.tsx:5895 +#: src/pages/Shell.tsx:2511 +#: src/pages/Shell.tsx:2541 +#: src/pages/Shell.tsx:4728 +#: src/pages/Shell.tsx:4810 msgid "Delete" msgstr "Löschen" #. placeholder {0}: bot.name #. placeholder {0}: group.name -#: src/pages/Shell.tsx:2518 -#: src/pages/Shell.tsx:2548 +#: src/pages/Shell.tsx:2507 +#: src/pages/Shell.tsx:2537 msgid "Delete {0}" msgstr "{0} löschen" #. placeholder {0}: bot.name #. placeholder {0}: item.name -#: src/pages/Shell.tsx:5745 -#: src/pages/Shell.tsx:5861 +#: src/pages/Shell.tsx:4660 +#: src/pages/Shell.tsx:4776 msgid "Delete {0}?" msgstr "{0} löschen?" @@ -1240,17 +1258,17 @@ msgstr "{0} löschen?" msgid "Delete group" msgstr "Gruppe löschen" -#: src/pages/Shell.tsx:5782 +#: src/pages/Shell.tsx:4697 msgid "Delete memories too" msgstr "Erinnerungen ebenfalls löschen" -#: src/pages/Shell.tsx:4894 +#: src/components/conversation/MessageView.tsx:314 msgid "deleted" msgstr "gelöscht" #: src/pages/GroupPanel.tsx:232 -#: src/pages/Shell.tsx:5813 -#: src/pages/Shell.tsx:5895 +#: src/pages/Shell.tsx:4728 +#: src/pages/Shell.tsx:4810 msgid "Deleting…" msgstr "Wird gelöscht…" @@ -1266,26 +1284,30 @@ msgstr "Ablehnen" msgid "Deployment default" msgstr "Bereitstellungsstandard" -#: src/pages/Onboarding.tsx:676 -#: src/pages/Shell.tsx:5165 +#: src/pages/Onboarding.tsx:690 +#: src/pages/Shell.tsx:4080 msgid "Describe what this bot does" msgstr "Beschreibe, was dieser Bot macht" -#: src/pages/Onboarding.tsx:651 +#: src/pages/Onboarding.tsx:665 msgid "Describe your own bot in the panel." msgstr "" -#: src/pages/Onboarding.tsx:681 -#: src/pages/Shell.tsx:5170 -#: src/pages/Shell.tsx:5335 +#: src/pages/Onboarding.tsx:695 +#: src/pages/Shell.tsx:4085 +#: src/pages/Shell.tsx:4250 msgid "Description" msgstr "Beschreibung" -#: src/pages/PluginsOverlay.tsx:565 +#: src/pages/Shell.tsx:2704 +msgid "Desktop Runtime offline" +msgstr "" + +#: src/pages/PluginsOverlay.tsx:566 msgid "Developer" msgstr "" -#: src/pages/Shell.tsx:4306 +#: src/components/composer/Composer.tsx:446 msgid "Dictate" msgstr "Diktieren" @@ -1298,15 +1320,15 @@ msgstr "Trennen" msgid "Disconnecting…" msgstr "Verbindung wird getrennt…" -#: src/pages/Shell.tsx:4153 +#: src/components/composer/Composer.tsx:293 msgid "Dismiss error" msgstr "" -#: src/pages/Shell.tsx:6274 +#: src/components/conversation/MessageView.tsx:820 msgid "Dismissed — reconnect anytime from MCP settings." msgstr "Verworfen – du kannst die Verbindung jederzeit in den MCP-Einstellungen wiederherstellen." -#: src/pages/PluginsOverlay.tsx:788 +#: src/pages/PluginsOverlay.tsx:790 msgid "Display name" msgstr "Anzeigename" @@ -1323,7 +1345,7 @@ msgstr "Docker (empfohlen)" msgid "Docker is the default: bots use a shared Team Computer." msgstr "Docker ist der Standard: Bots verwenden einen gemeinsamen Team-Computer." -#: src/pages/Auth.tsx:152 +#: src/pages/Auth.tsx:162 msgid "Don’t have an account?" msgstr "Du hast noch kein Konto?" @@ -1350,7 +1372,7 @@ msgstr "Skill-Entwurf" msgid "Duplicate" msgstr "Duplizieren" -#: src/pages/Shell.tsx:4697 +#: src/components/conversation/MessageView.tsx:117 msgid "Earlier message" msgstr "Frühere Nachricht" @@ -1362,7 +1384,8 @@ msgstr "Zuerst bearbeiten" msgid "Edit Profile" msgstr "Profil bearbeiten" -#: src/pages/Auth.tsx:62 +#: src/pages/Auth.tsx:73 +#: src/pages/ResetPassword.tsx:82 msgid "Email" msgstr "E-Mail" @@ -1372,7 +1395,7 @@ msgstr "Verschlüsselte statische Anmeldedaten gespeichert" #. placeholder {0}: oauth.verificationUri.replace(/^https:\/\//, "") #: src/pages/ModelSettingsOverlay.tsx:586 -#: src/pages/Onboarding.tsx:459 +#: src/pages/Onboarding.tsx:473 msgid "Enter this code at <0>{0}" msgstr "Gib diesen Code unter <0>{0} ein" @@ -1410,16 +1433,16 @@ msgstr "Jeden Monat" msgid "Every week" msgstr "Jede Woche" -#: src/pages/Shell.tsx:6320 +#: src/components/conversation/MessageView.tsx:866 msgid "Expand" msgstr "Erweitern" #. placeholder {0}: group.title -#: src/pages/Shell.tsx:2305 +#: src/pages/Shell.tsx:2294 msgid "Expand {0}" msgstr "" -#: src/pages/Shell.tsx:5496 +#: src/pages/Shell.tsx:4411 msgid "Export" msgstr "Exportieren" @@ -1427,7 +1450,7 @@ msgstr "Exportieren" msgid "Export this week's list from the CRM and drop it in the shared folder" msgstr "Exportiere die Liste dieser Woche aus dem CRM und lege sie im freigegebenen Ordner ab" -#: src/pages/Shell.tsx:5516 +#: src/pages/Shell.tsx:4431 msgid "Extra high" msgstr "Sehr hoch" @@ -1435,14 +1458,14 @@ msgstr "Sehr hoch" msgid "Failed" msgstr "Fehlgeschlagen" -#: src/pages/Shell.tsx:1878 -#: src/pages/Shell.tsx:1880 -#: src/pages/Shell.tsx:1882 +#: src/pages/Shell.tsx:1867 +#: src/pages/Shell.tsx:1869 +#: src/pages/Shell.tsx:1871 msgid "Failed to send message" msgstr "Nachricht konnte nicht gesendet werden" -#: src/pages/Shell.tsx:1912 -#: src/pages/Shell.tsx:1931 +#: src/pages/Shell.tsx:1901 +#: src/pages/Shell.tsx:1920 msgid "Failed to stop" msgstr "Stoppen fehlgeschlagen" @@ -1456,18 +1479,18 @@ msgid "Failure handling" msgstr "Fehlerbehandlung" #: src/pages/ModelSettingsOverlay.tsx:427 -#: src/pages/Onboarding.tsx:336 +#: src/pages/Onboarding.tsx:350 msgid "Find models" msgstr "Modelle suchen" #: src/pages/ModelSettingsOverlay.tsx:427 -#: src/pages/Onboarding.tsx:336 +#: src/pages/Onboarding.tsx:350 msgid "Finding…" msgstr "Suche läuft…" #. placeholder {0}: new URL(oauth.verificationUri).hostname #: src/pages/ModelSettingsOverlay.tsx:546 -#: src/pages/Onboarding.tsx:420 +#: src/pages/Onboarding.tsx:434 msgid "Finish signing in at <0>{0}. The final page may not load; paste its URL or code here." msgstr "Schließe die Anmeldung unter <0>{0} ab. Die letzte Seite wird möglicherweise nicht geladen; füge ihre URL oder den Code hier ein." @@ -1484,6 +1507,10 @@ msgstr "MCP-Verbindung wird abgeschlossen…" msgid "Flag unexpected actions" msgstr "" +#: src/pages/Auth.tsx:99 +msgid "Forgot password?" +msgstr "" + #: src/pages/ModelSettingsOverlay.tsx:1026 msgid "Free" msgstr "Kostenlos" @@ -1497,8 +1524,8 @@ msgid "Git event" msgstr "" #: src/pages/PhoneSettingsOverlay.tsx:224 -#: src/pages/Shell.tsx:2708 -#: src/pages/Shell.tsx:2863 +#: src/pages/Shell.tsx:2697 +#: src/pages/Shell.tsx:2857 msgid "Group" msgstr "Gruppe" @@ -1524,7 +1551,7 @@ msgid "header" msgstr "" #: src/pages/McpServersOverlay.tsx:342 -#: src/pages/PluginsOverlay.tsx:824 +#: src/pages/PluginsOverlay.tsx:826 msgid "Header name" msgstr "Header-Name" @@ -1532,27 +1559,28 @@ msgstr "Header-Name" msgid "Header value" msgstr "Header-Wert" -#: src/pages/VoiceSettingsOverlay.tsx:284 +#: src/pages/VoiceSettingsOverlay.tsx:289 msgid "Hear a sample" msgstr "Beispiel anhören" -#: src/pages/VoiceSettingsOverlay.tsx:102 +#: src/pages/VoiceSettingsOverlay.tsx:107 msgid "Hi, this is how I'll sound when I read replies out loud." msgstr "Hallo, so klinge ich, wenn ich Antworten vorlese." -#: src/pages/Auth.tsx:95 +#: src/pages/Auth.tsx:122 +#: src/pages/ResetPassword.tsx:186 msgid "Hide password" msgstr "" -#: src/pages/Shell.tsx:5519 +#: src/pages/Shell.tsx:4434 msgid "High" msgstr "Hoch" -#: src/pages/Shell.tsx:4325 +#: src/components/composer/Composer.tsx:465 msgid "Hold to talk" msgstr "Zum Sprechen gedrückt halten" -#: src/pages/Shell.tsx:4325 +#: src/components/composer/Composer.tsx:465 msgid "Hold to talk (on-device dictation)" msgstr "Zum Sprechen gedrückt halten (Diktat auf dem Gerät)" @@ -1572,15 +1600,19 @@ msgstr "Wie oft" msgid "How to check" msgstr "So wird geprüft" -#: src/pages/Shell.tsx:4591 +#: src/pages/Shell.tsx:3977 msgid "I’m done" msgstr "Ich bin fertig" -#: src/pages/VoiceSettingsOverlay.tsx:107 +#: src/pages/ResetPassword.tsx:54 +msgid "If an account exists for {email}, we sent a link to reset your password. It works for one hour." +msgstr "" + +#: src/pages/VoiceSettingsOverlay.tsx:112 msgid "If you heard that, voice is ready." msgstr "Wenn du das gehört hast, ist die Stimme einsatzbereit." -#: src/pages/AccountSettingsOverlay.tsx:140 +#: src/pages/AccountSettingsOverlay.tsx:119 msgid "iMessage channels and agent connections." msgstr "" @@ -1588,15 +1620,15 @@ msgstr "" msgid "iMessage line" msgstr "" -#: src/pages/PluginsOverlay.tsx:782 +#: src/pages/PluginsOverlay.tsx:784 msgid "Import OpenAPI JSON" msgstr "OpenAPI-JSON importieren" -#: src/pages/Onboarding.tsx:701 +#: src/pages/Onboarding.tsx:715 msgid "Includes a full operating playbook for this role." msgstr "" -#: src/pages/Shell.tsx:5406 +#: src/pages/Shell.tsx:4321 msgid "Inherit default" msgstr "Standard übernehmen" @@ -1604,18 +1636,18 @@ msgstr "Standard übernehmen" msgid "Inputs" msgstr "Eingaben" -#: src/pages/PluginsOverlay.tsx:482 -#: src/pages/PluginsOverlay.tsx:533 +#: src/pages/PluginsOverlay.tsx:483 +#: src/pages/PluginsOverlay.tsx:534 msgid "Install" msgstr "" -#: src/pages/PluginsOverlay.tsx:498 -#: src/pages/PluginsOverlay.tsx:537 +#: src/pages/PluginsOverlay.tsx:499 +#: src/pages/PluginsOverlay.tsx:538 msgid "Installed" msgstr "" -#: src/pages/PluginsOverlay.tsx:482 -#: src/pages/PluginsOverlay.tsx:533 +#: src/pages/PluginsOverlay.tsx:483 +#: src/pages/PluginsOverlay.tsx:534 msgid "Installing…" msgstr "" @@ -1627,8 +1659,8 @@ msgstr "Instanz-API-Schlüssel" msgid "Instruction" msgstr "Anweisung" -#: src/pages/PluginsOverlay.tsx:582 -#: src/pages/Shell.tsx:2570 +#: src/pages/PluginsOverlay.tsx:583 +#: src/pages/Shell.tsx:2559 msgid "Integrations" msgstr "Integrationen" @@ -1650,19 +1682,19 @@ msgid "Interval unit" msgstr "Intervalleinheit" #: src/pages/MemorySettingsOverlay.tsx:39 -#: src/pages/Shell.tsx:5407 +#: src/pages/Shell.tsx:4322 msgid "Isolated" msgstr "Isoliert" -#: src/pages/Shell.tsx:5748 +#: src/pages/Shell.tsx:4663 msgid "Its conversation, files, and routines will be permanently deleted. Bots it created stay in your list." msgstr "Seine Unterhaltung, Dateien und Routinen werden dauerhaft gelöscht. Von ihm erstellte Bots bleiben in deiner Liste." -#: src/pages/Shell.tsx:3886 +#: src/pages/Shell.tsx:3875 msgid "Jump to latest" msgstr "Zur neuesten Nachricht springen" -#: src/pages/Shell.tsx:4692 +#: src/components/conversation/MessageView.tsx:112 msgid "Jump to replied message" msgstr "Zur beantworteten Nachricht springen" @@ -1670,7 +1702,7 @@ msgstr "Zur beantworteten Nachricht springen" msgid "just now" msgstr "gerade eben" -#: src/pages/Shell.tsx:5766 +#: src/pages/Shell.tsx:4681 msgid "Keep memories" msgstr "Erinnerungen behalten" @@ -1678,17 +1710,17 @@ msgstr "Erinnerungen behalten" msgid "key" msgstr "" -#: src/pages/VoiceSettingsOverlay.tsx:229 +#: src/pages/VoiceSettingsOverlay.tsx:234 msgid "Keys stay on the server. The app only learns whether a provider is configured." msgstr "Schlüssel bleiben auf dem Server. Die App erfährt nur, ob ein Anbieter konfiguriert ist." -#: src/pages/PluginsOverlay.tsx:571 +#: src/pages/PluginsOverlay.tsx:572 msgid "Knowledge" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:154 -#: src/pages/AccountSettingsOverlay.tsx:363 -#: src/pages/AccountSettingsOverlay.tsx:380 +#: src/pages/AccountSettingsOverlay.tsx:133 +#: src/pages/AccountSettingsOverlay.tsx:296 +#: src/pages/AccountSettingsOverlay.tsx:313 msgid "Language" msgstr "Sprache" @@ -1709,7 +1741,7 @@ msgstr "" msgid "Listening…" msgstr "Hört zu…" -#: src/pages/Shell.tsx:3839 +#: src/pages/Shell.tsx:3828 msgid "Load earlier messages" msgstr "Frühere Nachrichten laden" @@ -1717,7 +1749,7 @@ msgstr "Frühere Nachrichten laden" msgid "Loading activity…" msgstr "Aktivität wird geladen…" -#: src/pages/PluginsOverlay.tsx:608 +#: src/pages/PluginsOverlay.tsx:609 msgid "Loading integrations…" msgstr "Integrationen werden geladen…" @@ -1743,13 +1775,13 @@ msgstr "Vorschau wird geladen…" msgid "Loading rules…" msgstr "Regeln werden geladen…" -#: src/pages/VoiceSettingsOverlay.tsx:128 +#: src/pages/VoiceSettingsOverlay.tsx:133 msgid "Loading voice providers…" msgstr "Stimmanbieter werden geladen…" -#: src/App.tsx:50 -#: src/pages/Onboarding.tsx:260 -#: src/pages/Shell.tsx:3839 +#: src/App.tsx:53 +#: src/pages/Onboarding.tsx:274 +#: src/pages/Shell.tsx:3828 msgid "Loading…" msgstr "Wird geladen…" @@ -1757,15 +1789,15 @@ msgstr "Wird geladen…" msgid "Local" msgstr "Lokal" -#: src/pages/Shell.tsx:2656 +#: src/pages/Shell.tsx:2645 msgid "Log out" msgstr "Abmelden" -#: src/pages/Shell.tsx:5517 +#: src/pages/Shell.tsx:4432 msgid "Low" msgstr "Niedrig" -#: src/pages/AccountSettingsOverlay.tsx:147 +#: src/pages/AccountSettingsOverlay.tsx:126 msgid "Manage phone settings" msgstr "" @@ -1781,17 +1813,17 @@ msgstr "Als gelesen markieren" msgid "Mark as Unread" msgstr "Als ungelesen markieren" -#: src/pages/Shell.tsx:5521 +#: src/pages/Shell.tsx:4436 msgid "Max" msgstr "Max." #: src/pages/McpServersOverlay.tsx:224 #: src/pages/McpServersOverlay.tsx:229 -#: src/pages/PluginsOverlay.tsx:756 +#: src/pages/PluginsOverlay.tsx:758 msgid "MCP servers" msgstr "MCP-Server" -#: src/pages/Shell.tsx:5518 +#: src/pages/Shell.tsx:4433 msgid "Medium" msgstr "Mittel" @@ -1804,11 +1836,11 @@ msgid "Members (pick {GROUP_MEMBER_MIN}–{GROUP_MEMBER_MAX})" msgstr "Mitglieder ({GROUP_MEMBER_MIN}–{GROUP_MEMBER_MAX} auswählen)" #: src/pages/MemorySettingsOverlay.tsx:134 -#: src/pages/Shell.tsx:2614 +#: src/pages/Shell.tsx:2603 msgid "Memory" msgstr "Erinnerungen" -#: src/pages/Shell.tsx:5402 +#: src/pages/Shell.tsx:4317 msgid "Memory scope" msgstr "Erinnerungsbereich" @@ -1817,29 +1849,29 @@ msgstr "Erinnerungsbereich" msgid "Message" msgstr "" -#: src/pages/Shell.tsx:4403 -#: src/pages/Shell.tsx:4500 +#: src/components/composer/Composer.tsx:543 +#: src/components/composer/shared.ts:23 msgid "Message" msgstr "Nachricht" -#: src/pages/Shell.tsx:4399 -#: src/pages/Shell.tsx:4403 +#: src/components/composer/Composer.tsx:539 +#: src/components/composer/Composer.tsx:543 msgid "Message {activeName}" msgstr "Nachricht an {activeName}" -#: src/pages/Shell.tsx:4134 +#: src/components/composer/Composer.tsx:274 msgid "Message composer" msgstr "" -#: src/pages/Shell.tsx:4770 +#: src/components/conversation/MessageView.tsx:190 msgid "Message from {peer}" msgstr "Nachricht von {peer}" -#: src/pages/Shell.tsx:4400 +#: src/components/composer/Composer.tsx:540 msgid "Message…" msgstr "Nachricht…" -#: src/pages/Shell.tsx:4770 +#: src/components/conversation/MessageView.tsx:190 msgid "Messaged {peer}" msgstr "Nachricht an {peer} gesendet" @@ -1847,7 +1879,7 @@ msgstr "Nachricht an {peer} gesendet" msgid "Microphone failed" msgstr "Mikrofonfehler" -#: src/pages/Shell.tsx:5520 +#: src/pages/Shell.tsx:4435 msgid "Minimal" msgstr "Minimal" @@ -1866,15 +1898,15 @@ msgstr "Minuten" #: src/pages/ModelSettingsOverlay.tsx:432 #: src/pages/ModelSettingsOverlay.tsx:493 #: src/pages/ModelSettingsOverlay.tsx:914 -#: src/pages/Onboarding.tsx:341 -#: src/pages/Onboarding.tsx:390 -#: src/pages/Onboarding.tsx:398 -#: src/pages/Shell.tsx:5358 +#: src/pages/Onboarding.tsx:355 +#: src/pages/Onboarding.tsx:404 +#: src/pages/Onboarding.tsx:412 +#: src/pages/Shell.tsx:4273 msgid "Model" msgstr "Modell" #: src/pages/ModelSettingsOverlay.tsx:474 -#: src/pages/Onboarding.tsx:371 +#: src/pages/Onboarding.tsx:385 msgid "Model id" msgstr "Modell-ID" @@ -1882,7 +1914,7 @@ msgstr "Modell-ID" msgid "Model options" msgstr "Modelloptionen" -#: src/pages/AccountSettingsOverlay.tsx:222 +#: src/pages/AccountSettingsOverlay.tsx:155 msgid "Model spend uses your provider keys." msgstr "Modellkosten werden über deine Anbieterschlüssel abgerechnet." @@ -1891,12 +1923,12 @@ msgid "Model updated." msgstr "Modell aktualisiert." #: src/pages/ModelSettingsOverlay.tsx:304 -#: src/pages/Shell.tsx:2601 +#: src/pages/Shell.tsx:2590 msgid "Models" msgstr "Modelle" #: src/pages/ModelSettingsOverlay.tsx:445 -#: src/pages/Onboarding.tsx:348 +#: src/pages/Onboarding.tsx:362 msgid "Models from server" msgstr "Modelle vom Server" @@ -1904,7 +1936,7 @@ msgstr "Modelle vom Server" msgid "Monthly" msgstr "Monatlich" -#: src/pages/PluginsOverlay.tsx:573 +#: src/pages/PluginsOverlay.tsx:574 msgid "More apps" msgstr "" @@ -1913,7 +1945,7 @@ msgstr "" msgid "Move {0} to section" msgstr "{0} in Abschnitt verschieben" -#: src/pages/Shell.tsx:5769 +#: src/pages/Shell.tsx:4684 msgid "Move them to your shared memory." msgstr "Verschiebe sie in deine geteilten Erinnerungen." @@ -1922,19 +1954,19 @@ msgid "Move to" msgstr "Verschieben nach" #: src/components/teach/SkillDraftCard.tsx:82 -#: src/pages/Auth.tsx:49 +#: src/pages/Auth.tsx:60 #: src/pages/GroupPanel.tsx:110 #: src/pages/GroupPanel.tsx:201 -#: src/pages/Onboarding.tsx:663 +#: src/pages/Onboarding.tsx:677 #: src/pages/RoutineEditor.tsx:294 -#: src/pages/Shell.tsx:5150 -#: src/pages/Shell.tsx:5317 -#: src/pages/Shell.tsx:5595 +#: src/pages/Shell.tsx:4065 +#: src/pages/Shell.tsx:4232 +#: src/pages/Shell.tsx:4510 msgid "Name" msgstr "Name" -#: src/pages/Onboarding.tsx:667 -#: src/pages/Shell.tsx:5155 +#: src/pages/Onboarding.tsx:681 +#: src/pages/Shell.tsx:4070 msgid "Name this bot" msgstr "Bot benennen" @@ -1954,13 +1986,13 @@ msgstr "Eingabe erforderlich" msgid "Needs takeover" msgstr "Übernahme erforderlich" -#: src/pages/Shell.tsx:2247 -#: src/pages/Shell.tsx:5138 +#: src/pages/Shell.tsx:2236 +#: src/pages/Shell.tsx:4053 msgid "New bot" msgstr "Neuer Bot" #: src/pages/GroupPanel.tsx:98 -#: src/pages/Shell.tsx:2257 +#: src/pages/Shell.tsx:2246 msgid "New group" msgstr "Neue Gruppe" @@ -1968,12 +2000,16 @@ msgstr "Neue Gruppe" msgid "New open-work item" msgstr "Neuer offener Arbeitspunkt" +#: src/pages/ResetPassword.tsx:165 +msgid "New password" +msgstr "" + #: src/pages/RoutineEditor.tsx:100 msgid "New routine" msgstr "Neue Routine" #: src/pages/BotContextMenu.tsx:130 -#: src/pages/Shell.tsx:5589 +#: src/pages/Shell.tsx:4504 msgid "New section" msgstr "Neuer Abschnitt" @@ -1981,20 +2017,20 @@ msgstr "Neuer Abschnitt" msgid "No agent connections yet." msgstr "" -#: src/pages/PluginsOverlay.tsx:687 +#: src/pages/PluginsOverlay.tsx:689 msgid "No apps match your search." msgstr "Keine Apps entsprechen deiner Suche." -#: src/pages/PluginsOverlay.tsx:894 +#: src/pages/PluginsOverlay.tsx:896 msgid "no auth" msgstr "keine Authentifizierung" -#: src/pages/PluginsOverlay.tsx:810 +#: src/pages/PluginsOverlay.tsx:812 msgid "No authentication" msgstr "Keine Authentifizierung" #. placeholder {0}: item.name -#: src/pages/PluginsOverlay.tsx:323 +#: src/pages/PluginsOverlay.tsx:324 msgid "No connection record found for {0}." msgstr "Kein Verbindungseintrag für {0} gefunden." @@ -2014,7 +2050,7 @@ msgstr "" msgid "No longer active" msgstr "Nicht mehr aktiv" -#: src/pages/PluginsOverlay.tsx:682 +#: src/pages/PluginsOverlay.tsx:684 msgid "No managed app catalog is configured on this deployment." msgstr "Für diese Bereitstellung ist kein verwalteter App-Katalog konfiguriert." @@ -2022,7 +2058,7 @@ msgstr "Für diese Bereitstellung ist kein verwalteter App-Katalog konfiguriert. msgid "No matching models" msgstr "Keine passenden Modelle" -#: src/pages/PluginsOverlay.tsx:876 +#: src/pages/PluginsOverlay.tsx:878 msgid "No MCP or API tool sources installed yet." msgstr "Noch keine MCP- oder API-Toolquellen installiert." @@ -2054,16 +2090,16 @@ msgstr "" msgid "None yet" msgstr "Noch keine" -#: src/pages/VoiceSettingsOverlay.tsx:156 +#: src/pages/VoiceSettingsOverlay.tsx:161 msgid "Not configured" msgstr "Nicht konfiguriert" #: src/pages/ModelSettingsOverlay.tsx:524 -#: src/pages/VoiceSettingsOverlay.tsx:225 +#: src/pages/VoiceSettingsOverlay.tsx:230 msgid "Not connected" msgstr "Nicht verbunden" -#: src/pages/PluginsOverlay.tsx:643 +#: src/pages/PluginsOverlay.tsx:645 msgid "Not in the plugin catalog" msgstr "" @@ -2071,7 +2107,7 @@ msgstr "" msgid "Not linked — text the deployment's number once to link your phone to your agent." msgstr "" -#: src/pages/Shell.tsx:6262 +#: src/components/conversation/MessageView.tsx:808 msgid "Not now" msgstr "Jetzt nicht" @@ -2113,15 +2149,15 @@ msgstr "am 1. um {0}" msgid "Open" msgstr "Öffnen" -#: src/pages/Shell.tsx:2926 +#: src/pages/Shell.tsx:2920 msgid "Open computer" msgstr "Computer öffnen" -#: src/pages/Shell.tsx:2892 +#: src/pages/Shell.tsx:2886 msgid "Open in full window" msgstr "In vollständigem Fenster öffnen" -#: src/pages/Shell.tsx:2680 +#: src/pages/Shell.tsx:2669 msgid "Open navigation" msgstr "Navigation öffnen" @@ -2142,24 +2178,24 @@ msgid "Open work" msgstr "Offene Arbeit" #: src/pages/ModelSettingsOverlay.tsx:405 -#: src/pages/Onboarding.tsx:315 +#: src/pages/Onboarding.tsx:329 msgid "OpenAI-compatible server URL" msgstr "URL eines OpenAI-kompatiblen Servers" -#: src/pages/Shell.tsx:4905 +#: src/components/conversation/MessageView.tsx:325 msgid "Opened its thread." msgstr "Thread geöffnet." -#: src/App.tsx:166 +#: src/App.tsx:170 msgid "Opening your workspace…" msgstr "Dein Arbeitsbereich wird geöffnet…" #: src/pages/ModelSettingsOverlay.tsx:636 -#: src/pages/Onboarding.tsx:502 +#: src/pages/Onboarding.tsx:516 msgid "Optional" msgstr "Optional" -#: src/pages/AccountSettingsOverlay.tsx:250 +#: src/pages/AccountSettingsOverlay.tsx:183 msgid "Optional controls most people never need" msgstr "Optionale Einstellungen, die die meisten nie benötigen" @@ -2171,7 +2207,7 @@ msgstr "Optionaler Header-Wert" msgid "Or connect an API key" msgstr "Oder einen API-Schlüssel verbinden" -#: src/pages/Onboarding.tsx:510 +#: src/pages/Onboarding.tsx:524 msgid "Or paste an API key" msgstr "Oder einen API-Schlüssel einfügen" @@ -2180,16 +2216,12 @@ msgstr "Oder einen API-Schlüssel einfügen" msgid "Or send this code to {0}:" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:191 -msgid "Organic" -msgstr "" - #: src/pages/memory-providers/SupermemorySettingsForm.tsx:60 msgid "Organization API key" msgstr "Organisations-API-Schlüssel" #: src/pages/ModelSettingsOverlay.tsx:454 -#: src/pages/Onboarding.tsx:357 +#: src/pages/Onboarding.tsx:371 msgid "Other model…" msgstr "Anderes Modell…" @@ -2211,21 +2243,26 @@ msgstr "" msgid "Park" msgstr "Zurückstellen" -#: src/pages/Auth.tsx:77 -#: src/pages/Auth.tsx:86 +#: src/pages/Auth.tsx:91 +#: src/pages/Auth.tsx:110 +#: src/pages/ResetPassword.tsx:174 msgid "Password" msgstr "Passwort" -#: src/pages/VoiceSettingsOverlay.tsx:242 +#: src/pages/ResetPassword.tsx:147 +msgid "Password updated" +msgstr "" + +#: src/pages/VoiceSettingsOverlay.tsx:247 msgid "Paste a replacement key" msgstr "Ersatzschlüssel einfügen" #: src/pages/ModelSettingsOverlay.tsx:416 -#: src/pages/Onboarding.tsx:326 +#: src/pages/Onboarding.tsx:340 msgid "Paste the OpenAI-compatible address from your server. Sentra Bot adds /v1 if needed." msgstr "Füge die OpenAI-kompatible Adresse deines Servers ein. Sentra Bot ergänzt /v1 bei Bedarf." -#: src/pages/VoiceSettingsOverlay.tsx:242 +#: src/pages/VoiceSettingsOverlay.tsx:247 msgid "Paste your API key" msgstr "Füge deinen API-Schlüssel ein" @@ -2233,21 +2270,21 @@ msgstr "Füge deinen API-Schlüssel ein" msgid "Paused" msgstr "" -#: src/pages/PluginsOverlay.tsx:567 +#: src/pages/PluginsOverlay.tsx:568 msgid "Payments" msgstr "" #: src/pages/ModelSettingsOverlay.tsx:518 -#: src/pages/VoiceSettingsOverlay.tsx:219 +#: src/pages/VoiceSettingsOverlay.tsx:224 msgid "Personal credential" msgstr "Persönliche Zugangsdaten" -#: src/pages/AccountSettingsOverlay.tsx:137 +#: src/pages/AccountSettingsOverlay.tsx:116 #: src/pages/PhoneSettingsOverlay.tsx:116 msgid "Phone" msgstr "" -#: src/pages/VoiceSettingsOverlay.tsx:155 +#: src/pages/VoiceSettingsOverlay.tsx:160 msgid "Pick a voice" msgstr "Stimme auswählen" @@ -2255,11 +2292,11 @@ msgstr "Stimme auswählen" msgid "Pin" msgstr "Anheften" -#: src/pages/VoiceSettingsOverlay.tsx:284 +#: src/pages/VoiceSettingsOverlay.tsx:289 msgid "Playing…" msgstr "Wiedergabe…" -#: src/pages/PluginsOverlay.tsx:615 +#: src/pages/PluginsOverlay.tsx:616 msgid "Popular" msgstr "" @@ -2272,11 +2309,11 @@ msgstr "" msgid "Preview {0}" msgstr "Vorschau von {0}" -#: src/pages/Shell.tsx:5093 +#: src/pages/Shell.tsx:4008 msgid "Private" msgstr "Privat" -#: src/pages/PluginsOverlay.tsx:563 +#: src/pages/PluginsOverlay.tsx:564 msgid "Productivity" msgstr "" @@ -2285,7 +2322,7 @@ msgid "Provider" msgstr "Anbieter" #: src/pages/ModelSettingsOverlay.tsx:341 -#: src/pages/VoiceSettingsOverlay.tsx:168 +#: src/pages/VoiceSettingsOverlay.tsx:173 msgid "Providers" msgstr "Anbieter" @@ -2293,7 +2330,7 @@ msgstr "Anbieter" msgid "Queued" msgstr "In Warteschlange" -#: src/pages/Shell.tsx:5434 +#: src/pages/Shell.tsx:4349 msgid "Read replies aloud" msgstr "Antworten vorlesen" @@ -2305,7 +2342,7 @@ msgstr "Kürzlich" msgid "Reconnect OAuth" msgstr "OAuth erneut verbinden" -#: src/App.tsx:123 +#: src/App.tsx:127 msgid "Reconnecting" msgstr "Verbindung wird wiederhergestellt" @@ -2327,27 +2364,27 @@ msgstr "" msgid "Recovering…" msgstr "" -#: src/pages/Shell.tsx:4581 +#: src/pages/Shell.tsx:3967 msgid "Release" msgstr "Freigeben" #: src/components/ApprovalRulesSettings.tsx:178 -#: src/pages/PluginsOverlay.tsx:455 -#: src/pages/PluginsOverlay.tsx:508 -#: src/pages/PluginsOverlay.tsx:547 -#: src/pages/PluginsOverlay.tsx:666 -#: src/pages/PluginsOverlay.tsx:905 +#: src/pages/PluginsOverlay.tsx:456 +#: src/pages/PluginsOverlay.tsx:509 +#: src/pages/PluginsOverlay.tsx:548 +#: src/pages/PluginsOverlay.tsx:668 +#: src/pages/PluginsOverlay.tsx:907 #: src/pages/ScratchpadSection.tsx:162 msgid "Remove" msgstr "Entfernen" #. placeholder {0}: attachment.file.name -#: src/pages/Shell.tsx:4204 +#: src/components/composer/Composer.tsx:344 msgid "Remove {0}" msgstr "{0} entfernen" #. placeholder {0}: mention.name -#: src/pages/Shell.tsx:4362 +#: src/components/composer/Composer.tsx:502 msgid "Remove mention {0}" msgstr "Erwähnung von {0} entfernen" @@ -2356,7 +2393,7 @@ msgid "Remove schedule" msgstr "" #. placeholder {0}: selectedSkill.name -#: src/pages/Shell.tsx:4341 +#: src/components/composer/Composer.tsx:481 msgid "Remove skill {0}" msgstr "Skill {0} entfernen" @@ -2368,7 +2405,7 @@ msgstr "Diesen Zeitplan entfernen" msgid "Remove webhook" msgstr "" -#: src/pages/Shell.tsx:4904 +#: src/components/conversation/MessageView.tsx:324 msgid "Removed with chat, computer, and memory." msgstr "Zusammen mit Chat, Computer und Erinnerungen entfernt." @@ -2376,10 +2413,10 @@ msgstr "Zusammen mit Chat, Computer und Erinnerungen entfernt." msgid "Removed, but list refresh failed" msgstr "Entfernt, aber die Liste konnte nicht aktualisiert werden" -#: src/pages/PluginsOverlay.tsx:450 -#: src/pages/PluginsOverlay.tsx:547 -#: src/pages/PluginsOverlay.tsx:661 -#: src/pages/PluginsOverlay.tsx:905 +#: src/pages/PluginsOverlay.tsx:451 +#: src/pages/PluginsOverlay.tsx:548 +#: src/pages/PluginsOverlay.tsx:663 +#: src/pages/PluginsOverlay.tsx:907 msgid "Removing…" msgstr "Wird entfernt…" @@ -2393,15 +2430,15 @@ msgstr "Erneut öffnen" msgid "Replace API key" msgstr "API-Schlüssel ersetzen" -#: src/pages/VoiceSettingsOverlay.tsx:255 +#: src/pages/VoiceSettingsOverlay.tsx:260 msgid "Replace key" msgstr "Schlüssel ersetzen" -#: src/pages/Shell.tsx:4527 +#: src/pages/Shell.tsx:3913 msgid "Reply" msgstr "Antworten" -#: src/pages/Shell.tsx:4167 +#: src/components/composer/Composer.tsx:307 msgid "Replying to {replyName}" msgstr "Antwort an {replyName}" @@ -2417,13 +2454,21 @@ msgstr "" msgid "Reset computer?" msgstr "" +#: src/pages/ResetPassword.tsx:78 +msgid "Reset links work once and for one hour. Enter your email to get a new one." +msgstr "" + +#: src/pages/ResetPassword.tsx:70 +msgid "Reset your password" +msgstr "" + #: src/components/ComputerMaintenanceActions.tsx:68 #: src/components/ComputerMaintenanceActions.tsx:115 msgid "Resetting…" msgstr "" -#: src/pages/Shell.tsx:2514 -#: src/pages/Shell.tsx:2544 +#: src/pages/Shell.tsx:2503 +#: src/pages/Shell.tsx:2533 msgid "Restore" msgstr "Wiederherstellen" @@ -2431,7 +2476,7 @@ msgstr "Wiederherstellen" msgid "Restore the last saved workspace. Unsaved work on the computer is lost." msgstr "" -#: src/App.tsx:135 +#: src/App.tsx:139 msgid "Retry now" msgstr "Jetzt erneut versuchen" @@ -2439,7 +2484,7 @@ msgstr "Jetzt erneut versuchen" msgid "Return to Sentra Bot" msgstr "Zurück zu Sentra Bot" -#: src/pages/PluginsOverlay.tsx:716 +#: src/pages/PluginsOverlay.tsx:718 msgid "Reusable SKILL.md playbooks your agents follow. Install one and invoke it with /Name in the composer." msgstr "" @@ -2447,17 +2492,13 @@ msgstr "" msgid "Revoke" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:189 -msgid "Robot" -msgstr "" - #: src/pages/RoutineEditor.tsx:571 msgid "Rotate key" msgstr "" #: src/pages/RoutineEditor.tsx:247 -#: src/pages/Shell.tsx:3169 -#: src/pages/Shell.tsx:3179 +#: src/pages/Shell.tsx:3163 +#: src/pages/Shell.tsx:3173 msgid "Routine" msgstr "Routine" @@ -2474,7 +2515,7 @@ msgstr "" msgid "Run history" msgstr "" -#: src/pages/Shell.tsx:3162 +#: src/pages/Shell.tsx:3156 msgid "Run time must be in the future." msgstr "" @@ -2495,7 +2536,7 @@ msgstr "Wird ausgeführt…" #: src/pages/GroupPanel.tsx:224 #: src/pages/ModelSettingsOverlay.tsx:675 #: src/pages/RoutineEditor.tsx:479 -#: src/pages/Shell.tsx:5489 +#: src/pages/Shell.tsx:4404 msgid "Save" msgstr "Speichern" @@ -2537,12 +2578,12 @@ msgid "Say yes or no, or answer in a sentence." msgstr "Antworte mit Ja oder Nein oder in einem Satz." #: src/pages/ModelSettingsOverlay.tsx:939 -#: src/pages/Shell.tsx:2268 +#: src/pages/Shell.tsx:2257 msgid "Search" msgstr "Suchen" -#: src/pages/PluginsOverlay.tsx:598 #: src/pages/PluginsOverlay.tsx:599 +#: src/pages/PluginsOverlay.tsx:600 msgid "Search apps" msgstr "Apps suchen" @@ -2555,8 +2596,8 @@ msgstr "Modelle suchen" msgid "Search providers" msgstr "Anbieter suchen" -#: src/pages/Onboarding.tsx:274 -#: src/pages/Onboarding.tsx:275 +#: src/pages/Onboarding.tsx:288 +#: src/pages/Onboarding.tsx:289 msgid "Search providers and models" msgstr "Anbieter und Modelle suchen" @@ -2564,11 +2605,11 @@ msgstr "Anbieter und Modelle suchen" msgid "Searching…" msgstr "Suche…" -#: src/pages/Shell.tsx:2709 +#: src/pages/Shell.tsx:2698 msgid "Select a bot" msgstr "Bot auswählen" -#: src/pages/Shell.tsx:4423 +#: src/components/composer/Composer.tsx:563 msgid "Send" msgstr "Senden" @@ -2580,6 +2621,10 @@ msgstr "Antwort senden" msgid "Send it" msgstr "Senden" +#: src/pages/ResetPassword.tsx:103 +msgid "Send reset link" +msgstr "" + #: src/components/AskCard.tsx:97 #: src/components/AskCard.tsx:126 #: src/components/AskCard.tsx:150 @@ -2587,7 +2632,7 @@ msgstr "Senden" msgid "Sending…" msgstr "Wird gesendet…" -#: src/pages/PluginsOverlay.tsx:839 +#: src/pages/PluginsOverlay.tsx:841 msgid "Sentra Bot verifies the source before saving it. Credentials are encrypted and are never returned to clients or exposed to the model." msgstr "Sentra Bot prüft die Quelle vor dem Speichern. Zugangsdaten werden verschlüsselt und weder an Clients zurückgegeben noch dem Modell zugänglich gemacht." @@ -2601,55 +2646,57 @@ msgstr "Servername" #: src/pages/McpServersOverlay.tsx:317 #: src/pages/ModelSettingsOverlay.tsx:401 -#: src/pages/Onboarding.tsx:311 +#: src/pages/Onboarding.tsx:325 msgid "Server URL" msgstr "Server-URL" -#: src/pages/Shell.tsx:2718 +#: src/pages/Shell.tsx:2712 msgid "Set up voice to call" msgstr "Stimme für Anrufe einrichten" -#: src/pages/AccountSettingsOverlay.tsx:113 -#: src/pages/Shell.tsx:2578 -#: src/pages/Shell.tsx:2588 -#: src/pages/Shell.tsx:2859 +#: src/pages/AccountSettingsOverlay.tsx:92 +#: src/pages/Shell.tsx:2567 +#: src/pages/Shell.tsx:2577 +#: src/pages/Shell.tsx:2853 msgid "Settings" msgstr "Einstellungen" -#: src/pages/Shell.tsx:4441 +#: src/components/composer/Composer.tsx:581 msgid "Settings: General" msgstr "Einstellungen: Allgemein" -#: src/pages/Shell.tsx:4443 +#: src/components/composer/Composer.tsx:583 msgid "Settings: Usage" msgstr "Einstellungen: Nutzung" #: src/pages/ModelSettingsOverlay.tsx:413 -#: src/pages/Onboarding.tsx:323 +#: src/pages/Onboarding.tsx:337 msgid "Setup help" msgstr "Einrichtungshilfe" #: src/pages/MemorySettingsOverlay.tsx:39 -#: src/pages/Shell.tsx:5408 +#: src/pages/Shell.tsx:4323 msgid "Shared" msgstr "Geteilt" -#: src/pages/Shell.tsx:2870 +#: src/pages/Shell.tsx:2864 msgid "Show computer" msgstr "Computer anzeigen" -#: src/pages/Auth.tsx:95 +#: src/pages/Auth.tsx:122 +#: src/pages/ResetPassword.tsx:186 msgid "Show password" msgstr "" -#: src/pages/Shell.tsx:2870 +#: src/pages/Shell.tsx:2864 msgid "Show settings" msgstr "Einstellungen anzeigen" #: src/lib/localized-provider-hint.ts:7 -#: src/pages/Auth.tsx:161 +#: src/pages/Auth.tsx:171 #: src/pages/ModelSettingsOverlay.tsx:618 -#: src/pages/Onboarding.tsx:151 +#: src/pages/Onboarding.tsx:165 +#: src/pages/ResetPassword.tsx:155 msgid "Sign in" msgstr "Anmelden" @@ -2657,28 +2704,32 @@ msgstr "Anmelden" msgid "Sign in  →" msgstr "Anmelden  →" -#: src/pages/Auth.tsx:17 +#: src/pages/Auth.tsx:142 +msgid "Sign in instead" +msgstr "" + +#: src/pages/Auth.tsx:29 msgid "Sign in to Sentra Bot" msgstr "Bei Sentra Bot anmelden" -#: src/pages/Auth.tsx:154 +#: src/pages/Auth.tsx:164 msgid "Sign up" msgstr "Registrieren" #. placeholder {0}: skill.name -#: src/pages/Shell.tsx:4251 +#: src/components/composer/Composer.tsx:391 msgid "Skill {0}" msgstr "Skill {0}" -#: src/pages/PluginsOverlay.tsx:713 +#: src/pages/PluginsOverlay.tsx:715 msgid "Skills" msgstr "" -#: src/pages/Shell.tsx:4588 +#: src/pages/Shell.tsx:3974 msgid "Skip" msgstr "Überspringen" -#: src/pages/Onboarding.tsx:548 +#: src/pages/Onboarding.tsx:562 msgid "Skip for now" msgstr "Vorerst überspringen" @@ -2687,7 +2738,7 @@ msgid "Skip or deploy key" msgstr "Überspringen oder Deploy-Key" #. placeholder {0}: skipped.join(", ") -#: src/pages/Shell.tsx:1763 +#: src/pages/Shell.tsx:1746 msgid "Skipped {0}" msgstr "{0} übersprungen" @@ -2704,21 +2755,21 @@ msgstr "" msgid "Space interrupts · Esc hangs up" msgstr "Leertaste unterbricht · Esc legt auf" -#: src/pages/Shell.tsx:4739 -#: src/pages/Shell.tsx:5002 +#: src/components/conversation/MessageView.tsx:159 +#: src/components/conversation/MessageView.tsx:422 msgid "Speak" msgstr "Vorlesen" -#: src/pages/VoiceSettingsOverlay.tsx:194 +#: src/pages/VoiceSettingsOverlay.tsx:199 msgid "Speak + transcribe" msgstr "Sprechen + transkribieren" -#: src/pages/VoiceSettingsOverlay.tsx:196 +#: src/pages/VoiceSettingsOverlay.tsx:201 msgid "Speak only" msgstr "Nur sprechen" -#: src/pages/Shell.tsx:4735 -#: src/pages/Shell.tsx:4998 +#: src/components/conversation/MessageView.tsx:155 +#: src/components/conversation/MessageView.tsx:418 msgid "Speak this reply" msgstr "Diese Antwort vorlesen" @@ -2726,11 +2777,11 @@ msgstr "Diese Antwort vorlesen" msgid "Speaking…" msgstr "Spricht…" -#: src/pages/Onboarding.tsx:560 +#: src/pages/Onboarding.tsx:574 msgid "Start from a proven Chief of Staff, or build your own from scratch." msgstr "" -#: src/pages/Onboarding.tsx:644 +#: src/pages/Onboarding.tsx:658 msgid "Start from scratch" msgstr "" @@ -2744,7 +2795,7 @@ msgstr "Startet" #: src/components/teach/TeachComputerSection.tsx:115 #: src/pages/ModelSettingsOverlay.tsx:616 -#: src/pages/Onboarding.tsx:487 +#: src/pages/Onboarding.tsx:501 msgid "Starting…" msgstr "Wird gestartet…" @@ -2752,20 +2803,20 @@ msgstr "Wird gestartet…" msgid "Steps" msgstr "Schritte" -#: src/pages/Shell.tsx:3568 -#: src/pages/Shell.tsx:3572 -#: src/pages/Shell.tsx:4414 -#: src/pages/Shell.tsx:4739 -#: src/pages/Shell.tsx:5002 +#: src/components/composer/Composer.tsx:554 +#: src/components/conversation/MessageView.tsx:159 +#: src/components/conversation/MessageView.tsx:422 +#: src/pages/Shell.tsx:3557 +#: src/pages/Shell.tsx:3561 msgid "Stop" msgstr "Stoppen" -#: src/pages/Shell.tsx:4306 +#: src/components/composer/Composer.tsx:446 msgid "Stop dictation" msgstr "Diktat stoppen" -#: src/pages/Shell.tsx:4735 -#: src/pages/Shell.tsx:4998 +#: src/components/conversation/MessageView.tsx:155 +#: src/components/conversation/MessageView.tsx:418 msgid "Stop speaking" msgstr "Vorlesen stoppen" @@ -2774,8 +2825,8 @@ msgstr "Vorlesen stoppen" msgid "Stop teaching" msgstr "Anlernen beenden" -#: src/pages/Shell.tsx:2953 -#: src/pages/Shell.tsx:3588 +#: src/pages/Shell.tsx:2947 +#: src/pages/Shell.tsx:3577 msgid "Stop the bot first" msgstr "Zuerst den Bot stoppen" @@ -2788,13 +2839,13 @@ msgstr "" msgid "Stored encrypted" msgstr "Verschlüsselt gespeichert" -#: src/pages/Shell.tsx:4856 +#: src/components/conversation/MessageView.tsx:276 msgid "subagent" msgstr "Subagent" #: src/components/AskCard.tsx:126 #: src/pages/ModelSettingsOverlay.tsx:576 -#: src/pages/Onboarding.tsx:449 +#: src/pages/Onboarding.tsx:463 msgid "Submit" msgstr "Absenden" @@ -2806,8 +2857,8 @@ msgstr "" msgid "Switching…" msgstr "Wird gewechselt…" -#: src/pages/Shell.tsx:2956 -#: src/pages/Shell.tsx:3593 +#: src/pages/Shell.tsx:2950 +#: src/pages/Shell.tsx:3582 msgid "Take control" msgstr "Kontrolle übernehmen" @@ -2815,7 +2866,7 @@ msgstr "Kontrolle übernehmen" msgid "Teach a task" msgstr "Aufgabe anlernen" -#: src/pages/Shell.tsx:2783 +#: src/pages/Shell.tsx:2777 msgid "Teaching in progress — stop teaching before sending a new message." msgstr "Aufgabe wird angelernt – beende das Anlernen, bevor du eine neue Nachricht sendest." @@ -2823,11 +2874,11 @@ msgstr "Aufgabe wird angelernt – beende das Anlernen, bevor du eine neue Nachr msgid "Teaching needs a graphical sandbox computer. Desktop-host bots can run shell tasks, but not screen recording." msgstr "Zum Anlernen ist ein grafischer Sandbox-Computer erforderlich. Auf dem Desktop gehostete Bots können Shell-Aufgaben ausführen, aber keine Bildschirmaufnahmen erstellen." -#: src/pages/Shell.tsx:5093 +#: src/pages/Shell.tsx:4008 msgid "Team" msgstr "Team" -#: src/pages/Shell.tsx:5943 +#: src/pages/Shell.tsx:4858 msgid "Team Computer" msgstr "Team-Computer" @@ -2852,20 +2903,20 @@ msgstr "" msgid "The selected memory provider is not available in this build." msgstr "Der ausgewählte Erinnerungsanbieter ist in diesem Build nicht verfügbar." -#: src/pages/Shell.tsx:5385 +#: src/pages/Shell.tsx:4300 msgid "Thinking" msgstr "Denkmodus" -#: src/pages/Shell.tsx:2896 +#: src/pages/Shell.tsx:2890 msgid "This bot runs on this computer, not a Linux desktop. Shell and files use your home folder." msgstr "Dieser Bot wird auf diesem Computer und nicht auf einem Linux-Desktop ausgeführt. Shell und Dateien verwenden deinen persönlichen Ordner." -#: src/pages/Shell.tsx:3617 +#: src/pages/Shell.tsx:3606 msgid "This bot runs on this computer. There is no separate Linux desktop. Ask it to use the shell; working directories under your home folder are allowed." msgstr "Dieser Bot wird auf diesem Computer ausgeführt. Es gibt keinen separaten Linux-Desktop. Bitte ihn, die Shell zu verwenden; Arbeitsverzeichnisse in deinem persönlichen Ordner sind zulässig." -#: src/pages/Shell.tsx:5785 -#: src/pages/Shell.tsx:5864 +#: src/pages/Shell.tsx:4700 +#: src/pages/Shell.tsx:4779 msgid "This cannot be undone." msgstr "Dies kann nicht rückgängig gemacht werden." @@ -2881,6 +2932,10 @@ msgstr "Dieser Computer führt Shell-Befehle mit deinem Konto aus und kann auf D msgid "This file is not valid UTF-8 Markdown." msgstr "Diese Datei ist kein gültiges UTF-8-Markdown." +#: src/pages/ResetPassword.tsx:70 +msgid "This link has expired" +msgstr "" + #: src/pages/HostComputerPrompt.tsx:14 msgid "this Mac" msgstr "dieser Mac" @@ -2889,15 +2944,15 @@ msgstr "dieser Mac" msgid "This Mac runs shell commands with your account, including files in your home folder. Do not turn it on for a shared or public server." msgstr "Dieser Mac führt Shell-Befehle mit deinem Konto aus und kann auf Dateien in deinem persönlichen Ordner zugreifen. Aktiviere dies nicht auf einem gemeinsam genutzten oder öffentlichen Server." -#: src/pages/Shell.tsx:5670 +#: src/pages/Shell.tsx:4585 msgid "This permanently removes every message and stops current work. The chat remains available." msgstr "" -#: src/pages/Onboarding.tsx:523 +#: src/pages/Onboarding.tsx:537 msgid "This provider cannot paste a key here. Skip if this deployment already has credentials." msgstr "Bei diesem Anbieter kann hier kein Schlüssel eingefügt werden. Überspringe diesen Schritt, wenn die Bereitstellung bereits Zugangsdaten enthält." -#: src/pages/Shell.tsx:6210 +#: src/components/conversation/MessageView.tsx:756 msgid "This server cannot be assigned without a bot." msgstr "Dieser Server kann ohne Bot nicht zugewiesen werden." @@ -2909,7 +2964,7 @@ msgstr "Dieser Server hat keine Browserautorisierung angefordert." msgid "This server is already connected. Disconnect it first to authorize again." msgstr "Dieser Server ist bereits verbunden. Trenne zuerst die Verbindung, um ihn erneut zu autorisieren." -#: src/pages/Shell.tsx:6249 +#: src/components/conversation/MessageView.tsx:795 msgid "This server uses browser sign-in. Authorize it to let your agents use its tools — a popup will open." msgstr "Dieser Server verwendet die Browseranmeldung. Autorisiere ihn, damit deine Agents seine Tools verwenden können – ein Pop-up wird geöffnet." @@ -2921,17 +2976,17 @@ msgstr "Diese Abonnementanmeldung ist in Sentra Bot noch nicht verfügbar. Verwe msgid "Time of day" msgstr "Uhrzeit" -#: src/pages/Onboarding.tsx:672 -#: src/pages/Shell.tsx:5160 -#: src/pages/Shell.tsx:5326 +#: src/pages/Onboarding.tsx:686 +#: src/pages/Shell.tsx:4075 +#: src/pages/Shell.tsx:4241 msgid "Title" msgstr "Titel" -#: src/pages/PluginsOverlay.tsx:872 +#: src/pages/PluginsOverlay.tsx:874 msgid "Tool sources" msgstr "Toolquellen" -#: src/pages/PluginsOverlay.tsx:834 +#: src/pages/PluginsOverlay.tsx:836 msgid "Treg token" msgstr "Treg-Token" @@ -2952,7 +3007,7 @@ msgid "Unpin" msgstr "Lösen" #. placeholder {0}: pending.file.name -#: src/pages/Shell.tsx:1834 +#: src/pages/Shell.tsx:1821 msgid "Unsupported file type: {0}" msgstr "Nicht unterstützter Dateityp: {0}" @@ -2981,6 +3036,10 @@ msgstr "" msgid "Update finished with errors" msgstr "" +#: src/pages/ResetPassword.tsx:206 +msgid "Update password" +msgstr "" + #: src/components/SoftwareUpdateSection.tsx:172 #: src/components/SoftwareUpdateSection.tsx:189 msgid "Updated" @@ -2991,8 +3050,8 @@ msgstr "" msgid "Updating…" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:212 -#: src/pages/Shell.tsx:2639 +#: src/pages/AccountSettingsOverlay.tsx:145 +#: src/pages/Shell.tsx:2628 msgid "Usage" msgstr "Nutzung" @@ -3001,7 +3060,7 @@ msgid "Use {hostLabel}" msgstr "{hostLabel} verwenden" #: src/pages/ModelSettingsOverlay.tsx:485 -#: src/pages/Onboarding.tsx:382 +#: src/pages/Onboarding.tsx:396 msgid "Use a found model" msgstr "Gefundenes Modell verwenden" @@ -3009,25 +3068,25 @@ msgstr "Gefundenes Modell verwenden" msgid "Use this model" msgstr "Dieses Modell verwenden" -#: src/pages/PluginsOverlay.tsx:855 +#: src/pages/PluginsOverlay.tsx:857 msgid "Verify and add" msgstr "Prüfen und hinzufügen" -#: src/pages/PluginsOverlay.tsx:853 +#: src/pages/PluginsOverlay.tsx:855 msgid "Verifying…" msgstr "Wird geprüft…" -#: src/pages/Shell.tsx:2627 -#: src/pages/Shell.tsx:5438 -#: src/pages/VoiceSettingsOverlay.tsx:124 -#: src/pages/VoiceSettingsOverlay.tsx:264 +#: src/pages/Shell.tsx:2616 +#: src/pages/Shell.tsx:4353 +#: src/pages/VoiceSettingsOverlay.tsx:129 +#: src/pages/VoiceSettingsOverlay.tsx:269 msgid "Voice" msgstr "Stimme" #: src/pages/ModelSettingsOverlay.tsx:580 #: src/pages/ModelSettingsOverlay.tsx:602 -#: src/pages/Onboarding.tsx:453 -#: src/pages/Onboarding.tsx:475 +#: src/pages/Onboarding.tsx:467 +#: src/pages/Onboarding.tsx:489 msgid "Waiting for sign-in…" msgstr "Warten auf Anmeldung…" @@ -3039,7 +3098,7 @@ msgstr "" msgid "Waiting for your message…" msgstr "" -#: src/pages/Shell.tsx:6093 +#: src/components/conversation/MessageView.tsx:639 msgid "Waiting…" msgstr "Warten…" @@ -3053,7 +3112,7 @@ msgstr "" msgid "Weekdays" msgstr "Wochentage" -#: src/pages/Shell.tsx:5755 +#: src/pages/Shell.tsx:4670 msgid "What about its memories?" msgstr "Was soll mit seinen Erinnerungen geschehen?" @@ -3065,8 +3124,8 @@ msgstr "Welches Ergebnis wirst du vorführen?" msgid "What should this routine do each time it runs?" msgstr "" -#: src/pages/Onboarding.tsx:685 -#: src/pages/Shell.tsx:5175 +#: src/pages/Onboarding.tsx:699 +#: src/pages/Shell.tsx:4090 msgid "What this bot is for" msgstr "Wofür dieser Bot gedacht ist" @@ -3099,17 +3158,19 @@ msgstr "Einsatzzeitpunkt" msgid "Where should bots run?" msgstr "Wo sollen Bots ausgeführt werden?" -#: src/pages/Auth.tsx:142 +#: src/pages/Auth.tsx:152 #: src/pages/CallView.tsx:242 +#: src/pages/ResetPassword.tsx:103 +#: src/pages/ResetPassword.tsx:206 msgid "Working…" msgstr "Wird verarbeitet…" -#: src/pages/Shell.tsx:5368 +#: src/pages/Shell.tsx:4283 msgid "Workspace default" msgstr "Arbeitsbereichsstandard" -#: src/pages/Shell.tsx:1558 -#: src/pages/Shell.tsx:2175 +#: src/pages/Shell.tsx:1541 +#: src/pages/Shell.tsx:2164 msgid "You" msgstr "Du" @@ -3121,16 +3182,21 @@ msgstr "Du kannst diesen Tab schließen, wenn du nicht automatisch weitergeleite msgid "You can close this window." msgstr "Du kannst dieses Fenster schließen." -#: src/pages/Shell.tsx:2933 -#: src/pages/Shell.tsx:3558 +#: src/pages/Shell.tsx:2927 +#: src/pages/Shell.tsx:3547 msgid "You have control" msgstr "Du hast die Kontrolle" -#: src/pages/Onboarding.tsx:660 +#: src/pages/ResetPassword.tsx:152 +msgid "You’ve been signed out everywhere. Sign in with your new password." +msgstr "" + +#: src/pages/Onboarding.tsx:674 msgid "Your bot" msgstr "" -#: src/pages/Auth.tsx:69 +#: src/pages/Auth.tsx:80 +#: src/pages/ResetPassword.tsx:89 msgid "Your email address" msgstr "Deine E-Mail-Adresse" @@ -3138,7 +3204,7 @@ msgstr "Deine E-Mail-Adresse" msgid "Your key or subscription token is stored securely and is never shown here." msgstr "Dein Schlüssel oder Abonnementtoken wird sicher gespeichert und hier nie angezeigt." -#: src/pages/Auth.tsx:56 +#: src/pages/Auth.tsx:67 msgid "Your name" msgstr "Dein Name" diff --git a/apps/web/src/locales/en/messages.po b/apps/web/src/locales/en/messages.po index a2e0856a..1053049b 100644 --- a/apps/web/src/locales/en/messages.po +++ b/apps/web/src/locales/en/messages.po @@ -13,7 +13,7 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" -#: src/pages/Shell.tsx:2423 +#: src/pages/Shell.tsx:2412 msgid " (unread)" msgstr " (unread)" @@ -31,12 +31,12 @@ msgid "{0, plural, one {# model} other {# models}}" msgstr "{0, plural, one {# model} other {# models}}" #. placeholder {0}: file.name -#: src/pages/Shell.tsx:1743 +#: src/pages/Shell.tsx:1726 msgid "{0} (max {ATTACHMENT_MAX_COUNT} attachments)" msgstr "{0} (max {ATTACHMENT_MAX_COUNT} attachments)" #. placeholder {0}: file.name -#: src/pages/Shell.tsx:1747 +#: src/pages/Shell.tsx:1730 msgid "{0} (over 10 MiB)" msgstr "{0} (over 10 MiB)" @@ -46,12 +46,12 @@ msgid "{0} {unitLabel}" msgstr "{0} {unitLabel}" #. placeholder {0}: block.name -#: src/pages/Shell.tsx:6066 +#: src/components/conversation/MessageView.tsx:612 msgid "{0} connection" msgstr "{0} connection" #. placeholder {0}: computer.busyBotName -#: src/pages/Shell.tsx:2937 +#: src/pages/Shell.tsx:2931 msgid "{0} is using it" msgstr "{0} is using it" @@ -67,8 +67,8 @@ msgstr "{0} MB" #. placeholder {0}: usage.runs #. placeholder {1}: usage.inputTokens + usage.outputTokens -#: src/pages/AccountSettingsOverlay.tsx:216 -#: src/pages/Shell.tsx:2644 +#: src/pages/AccountSettingsOverlay.tsx:149 +#: src/pages/Shell.tsx:2633 msgid "{0} runs · {1} tokens" msgstr "{0} runs · {1} tokens" @@ -81,7 +81,7 @@ msgstr "{botName} · {0, plural, one {# peer} other {# peers}}" msgid "{botName} has not messaged another bot yet." msgstr "{botName} has not messaged another bot yet." -#: src/pages/Shell.tsx:5943 +#: src/pages/Shell.tsx:4858 msgid "{botName}’s computer" msgstr "{botName}’s computer" @@ -125,12 +125,12 @@ msgstr "{size} B" msgid "{title}, {label}" msgstr "{title}, {label}" -#: src/pages/Shell.tsx:3723 +#: src/pages/Shell.tsx:3712 msgid "{workingBotName} is working" msgstr "{workingBotName} is working" #. placeholder {0}: mention.name -#: src/pages/Shell.tsx:4223 +#: src/components/composer/Composer.tsx:363 msgid "@{0}" msgstr "@{0}" @@ -146,11 +146,11 @@ msgstr "+ Teach a task" msgid "Access token (optional)" msgstr "Access token (optional)" -#: src/pages/AccountSettingsOverlay.tsx:128 +#: src/pages/AccountSettingsOverlay.tsx:107 msgid "Account" msgstr "Account" -#: src/pages/Shell.tsx:5444 +#: src/pages/Shell.tsx:4359 msgid "Account default" msgstr "Account default" @@ -171,17 +171,17 @@ msgstr "Active" msgid "Active model" msgstr "Active model" -#: src/pages/VoiceSettingsOverlay.tsx:149 +#: src/pages/VoiceSettingsOverlay.tsx:154 msgid "Active voice" msgstr "Active voice" -#: src/pages/Shell.tsx:2213 -#: src/pages/Shell.tsx:2215 +#: src/pages/Shell.tsx:2202 +#: src/pages/Shell.tsx:2204 msgid "Activity" msgstr "Activity" -#: src/pages/PluginsOverlay.tsx:457 -#: src/pages/PluginsOverlay.tsx:668 +#: src/pages/PluginsOverlay.tsx:458 +#: src/pages/PluginsOverlay.tsx:670 #: src/pages/ScratchpadSection.tsx:188 msgid "Add" msgstr "Add" @@ -190,7 +190,7 @@ msgstr "Add" msgid "Add a model in Settings to use this." msgstr "Add a model in Settings to use this." -#: src/pages/Shell.tsx:3157 +#: src/pages/Shell.tsx:3151 msgid "Add a run time for this one-shot." msgstr "Add a run time for this one-shot." @@ -198,7 +198,7 @@ msgstr "Add a run time for this one-shot." msgid "Add a schedule or webhook to run this routine." msgstr "Add a schedule or webhook to run this routine." -#: src/pages/Shell.tsx:3129 +#: src/pages/Shell.tsx:3123 msgid "Add a schedule or webhook trigger" msgstr "Add a schedule or webhook trigger" @@ -222,15 +222,15 @@ msgstr "Add an HTTPS server URL." msgid "Add item" msgstr "Add item" -#: src/pages/PluginsOverlay.tsx:762 +#: src/pages/PluginsOverlay.tsx:764 msgid "Add MCP server" msgstr "Add MCP server" -#: src/pages/PluginsOverlay.tsx:765 +#: src/pages/PluginsOverlay.tsx:767 msgid "Add OpenAPI" msgstr "Add OpenAPI" -#: src/pages/PluginsOverlay.tsx:780 +#: src/pages/PluginsOverlay.tsx:782 msgid "Add remote MCP server" msgstr "Add remote MCP server" @@ -243,7 +243,7 @@ msgstr "Add server" msgid "Add to routine" msgstr "Add to routine" -#: src/pages/PluginsOverlay.tsx:768 +#: src/pages/PluginsOverlay.tsx:770 msgid "Add Treg" msgstr "Add Treg" @@ -252,15 +252,15 @@ msgid "Add trigger" msgstr "Add trigger" #: src/pages/McpServersOverlay.tsx:363 -#: src/pages/PluginsOverlay.tsx:452 -#: src/pages/PluginsOverlay.tsx:663 +#: src/pages/PluginsOverlay.tsx:453 +#: src/pages/PluginsOverlay.tsx:665 msgid "Adding…" msgstr "Adding…" -#: src/pages/AccountSettingsOverlay.tsx:247 -#: src/pages/PluginsOverlay.tsx:742 +#: src/pages/AccountSettingsOverlay.tsx:180 +#: src/pages/PluginsOverlay.tsx:744 #: src/pages/RoutineSchedule.tsx:42 -#: src/pages/Shell.tsx:5347 +#: src/pages/Shell.tsx:4262 msgid "Advanced" msgstr "Advanced" @@ -272,7 +272,7 @@ msgstr "Advanced..." msgid "Agent access for new servers" msgstr "Agent access for new servers" -#: src/pages/Shell.tsx:2736 +#: src/pages/Shell.tsx:2730 msgid "Agent computer" msgstr "Agent computer" @@ -319,7 +319,7 @@ msgstr "Allow purchase actions without asking" msgid "Allowed once" msgstr "Allowed once" -#: src/pages/Auth.tsx:159 +#: src/pages/Auth.tsx:169 msgid "Already have an account?" msgstr "Already have an account?" @@ -331,6 +331,10 @@ msgstr "Always allow this tool" msgid "Always allowed" msgstr "Always allowed" +#: src/pages/Auth.tsx:140 +msgid "An account with this email already exists." +msgstr "An account with this email already exists." + #: src/components/AskCard.tsx:138 msgid "Answer" msgstr "Answer" @@ -352,14 +356,14 @@ msgstr "API is back, but the update did not finish. Check the host logs." #: src/pages/ModelSettingsOverlay.tsx:630 #: src/pages/ModelSettingsOverlay.tsx:633 #: src/pages/ModelSettingsOverlay.tsx:649 -#: src/pages/Onboarding.tsx:496 -#: src/pages/Onboarding.tsx:499 #: src/pages/Onboarding.tsx:510 -#: src/pages/VoiceSettingsOverlay.tsx:236 +#: src/pages/Onboarding.tsx:513 +#: src/pages/Onboarding.tsx:524 +#: src/pages/VoiceSettingsOverlay.tsx:241 msgid "API key" msgstr "API key" -#: src/pages/PluginsOverlay.tsx:816 +#: src/pages/PluginsOverlay.tsx:818 msgid "API key header" msgstr "API key header" @@ -371,13 +375,13 @@ msgstr "Applies when you click Add server. Use the agent chips on each server ca msgid "Approval boundaries" msgstr "Approval boundaries" +#: src/components/conversation/MessageView.tsx:805 #: src/pages/PhoneSettingsOverlay.tsx:243 #: src/pages/PhoneSettingsOverlay.tsx:310 -#: src/pages/Shell.tsx:6259 msgid "Approve" msgstr "Approve" -#: src/pages/Shell.tsx:6250 +#: src/components/conversation/MessageView.tsx:796 msgid "Approve this server to let your agent use its tools." msgstr "Approve this server to let your agent use its tools." @@ -385,15 +389,15 @@ msgstr "Approve this server to let your agent use its tools." msgid "Archive" msgstr "Archive" -#: src/pages/Shell.tsx:4892 +#: src/components/conversation/MessageView.tsx:312 msgid "archived" msgstr "archived" -#: src/pages/Shell.tsx:2487 +#: src/pages/Shell.tsx:2476 msgid "Archived" msgstr "Archived" -#: src/pages/Shell.tsx:4903 +#: src/components/conversation/MessageView.tsx:323 msgid "Archived. Chat, memory, and files kept." msgstr "Archived. Chat, memory, and files kept." @@ -432,7 +436,7 @@ msgstr "Ask before purchases" msgid "Ask before sending external email" msgstr "Ask before sending external email" -#: src/pages/Shell.tsx:2939 +#: src/pages/Shell.tsx:2933 msgid "Asleep" msgstr "Asleep" @@ -447,16 +451,21 @@ msgstr "at {0}" msgid "at {timeSelect}" msgstr "at {timeSelect}" -#: src/pages/Shell.tsx:4297 +#: src/pages/Auth.tsx:134 +#: src/pages/ResetPassword.tsx:197 +msgid "At least 8 characters" +msgstr "At least 8 characters" + +#: src/components/composer/Composer.tsx:437 msgid "Attach file" msgstr "Attach file" -#: src/pages/Shell.tsx:4498 +#: src/components/composer/shared.ts:21 msgid "Attachment" msgstr "Attachment" #: src/pages/ModelSettingsOverlay.tsx:563 -#: src/pages/Onboarding.tsx:437 +#: src/pages/Onboarding.tsx:451 msgid "Authorization code or callback URL" msgstr "Authorization code or callback URL" @@ -464,12 +473,12 @@ msgstr "Authorization code or callback URL" msgid "Authorization expired — reconnect required" msgstr "Authorization expired — reconnect required" -#: src/pages/Shell.tsx:6051 +#: src/components/conversation/MessageView.tsx:597 msgid "Authorization timed out. Please try again." msgstr "Authorization timed out. Please try again." -#: src/pages/Shell.tsx:6093 -#: src/pages/Shell.tsx:6259 +#: src/components/conversation/MessageView.tsx:639 +#: src/components/conversation/MessageView.tsx:805 msgid "Authorize" msgstr "Authorize" @@ -477,34 +486,35 @@ msgstr "Authorize" msgid "Available after the routine is saved" msgstr "Available after the routine is saved" -#: src/pages/AccountSettingsOverlay.tsx:161 -msgid "Avatars" -msgstr "Avatars" - #: src/pages/RoutineEditor.tsx:243 msgid "Back" msgstr "Back" +#: src/pages/ResetPassword.tsx:61 +#: src/pages/ResetPassword.tsx:107 +msgid "Back to sign in" +msgstr "Back to sign in" + #: src/pages/memory-providers/SupermemorySettingsForm.tsx:48 msgid "Base URL" msgstr "Base URL" -#: src/pages/PluginsOverlay.tsx:813 +#: src/pages/PluginsOverlay.tsx:815 msgid "Bearer token" msgstr "Bearer token" -#: src/pages/Shell.tsx:5935 +#: src/pages/Shell.tsx:4850 msgid "Booting live desktop…" msgstr "Booting live desktop…" #. placeholder {0}: active?.name -#: src/pages/Shell.tsx:3528 +#: src/pages/Shell.tsx:3517 msgid "Booting up {0}’s computer" msgstr "Booting up {0}’s computer" -#: src/pages/Shell.tsx:4752 -#: src/pages/Shell.tsx:4753 -#: src/pages/Shell.tsx:4896 +#: src/components/conversation/MessageView.tsx:172 +#: src/components/conversation/MessageView.tsx:173 +#: src/components/conversation/MessageView.tsx:316 msgid "bot" msgstr "bot" @@ -513,7 +523,7 @@ msgstr "bot" msgid "Bot" msgstr "Bot" -#: src/pages/Shell.tsx:1559 +#: src/pages/Shell.tsx:1542 msgid "Bot" msgstr "Bot" @@ -521,11 +531,11 @@ msgstr "Bot" msgid "Bot messages" msgstr "Bot messages" -#: src/pages/Shell.tsx:3625 +#: src/pages/Shell.tsx:3614 msgid "Bot screen" msgstr "Bot screen" -#: src/pages/Shell.tsx:2903 +#: src/pages/Shell.tsx:2897 msgid "Bot screen preview" msgstr "Bot screen preview" @@ -533,36 +543,36 @@ msgstr "Bot screen preview" msgid "Bots act without asking by default. Add an exception only when you want to review a type of action first. These preferences apply across all your bots." msgstr "Bots act without asking by default. Add an exception only when you want to review a type of action first. These preferences apply across all your bots." -#: src/pages/Shell.tsx:3724 +#: src/pages/Shell.tsx:3713 msgid "Bots are working" msgstr "Bots are working" -#: src/pages/VoiceSettingsOverlay.tsx:130 +#: src/pages/VoiceSettingsOverlay.tsx:135 msgid "Bring your own key. The provider is swappable; your bots keep the same speak and call buttons." msgstr "Bring your own key. The provider is swappable; your bots keep the same speak and call buttons." #: src/pages/CallView.tsx:233 -#: src/pages/Shell.tsx:2718 -#: src/pages/Shell.tsx:2719 +#: src/pages/Shell.tsx:2712 +#: src/pages/Shell.tsx:2713 msgid "Call" msgstr "Call" -#: src/App.tsx:125 +#: src/App.tsx:129 msgid "Can't reach the server." msgstr "Can't reach the server." #: src/components/AskCard.tsx:161 #: src/components/ComputerMaintenanceActions.tsx:108 #: src/components/teach/TeachComputerSection.tsx:122 -#: src/pages/PluginsOverlay.tsx:864 -#: src/pages/Shell.tsx:5611 -#: src/pages/Shell.tsx:5683 -#: src/pages/Shell.tsx:5798 -#: src/pages/Shell.tsx:5874 +#: src/pages/PluginsOverlay.tsx:866 +#: src/pages/Shell.tsx:4526 +#: src/pages/Shell.tsx:4598 +#: src/pages/Shell.tsx:4713 +#: src/pages/Shell.tsx:4789 msgid "Cancel" msgstr "Cancel" -#: src/pages/Shell.tsx:5140 +#: src/pages/Shell.tsx:4055 msgid "Cancel new bot" msgstr "Cancel new bot" @@ -570,7 +580,7 @@ msgstr "Cancel new bot" msgid "Cancel new group" msgstr "Cancel new group" -#: src/pages/Shell.tsx:4170 +#: src/components/composer/Composer.tsx:310 msgid "Cancel reply" msgstr "Cancel reply" @@ -582,11 +592,11 @@ msgstr "Cancelled" msgid "Channels" msgstr "Channels" -#: src/pages/Shell.tsx:6156 +#: src/components/conversation/MessageView.tsx:702 msgid "Chart failed to render: {error}" msgstr "Chart failed to render: {error}" -#: src/pages/Shell.tsx:4439 +#: src/components/composer/Composer.tsx:579 msgid "Chat Settings" msgstr "Chat Settings" @@ -602,11 +612,15 @@ msgstr "Check failed" msgid "Check for updates" msgstr "Check for updates" -#: src/pages/Shell.tsx:3170 -#: src/pages/Shell.tsx:3180 +#: src/pages/Shell.tsx:3164 +#: src/pages/Shell.tsx:3174 msgid "Check in." msgstr "Check in." +#: src/pages/ResetPassword.tsx:52 +msgid "Check your email" +msgstr "Check your email" + #: src/components/SoftwareUpdateSection.tsx:71 msgid "Checking…" msgstr "Checking…" @@ -615,33 +629,33 @@ msgstr "Checking…" msgid "Checkout has local changes. Clean it before updating." msgstr "Checkout has local changes. Clean it before updating." -#: src/pages/Onboarding.tsx:269 +#: src/pages/Onboarding.tsx:283 msgid "Choose a model to get started." msgstr "Choose a model to get started." +#: src/pages/ResetPassword.tsx:162 +msgid "Choose a new password" +msgstr "Choose a new password" + #: src/pages/ModelSettingsOverlay.tsx:310 msgid "Choose which connected model Sentra Bot uses." msgstr "Choose which connected model Sentra Bot uses." -#: src/pages/AccountSettingsOverlay.tsx:187 -msgid "Clay" -msgstr "Clay" - -#: src/pages/Shell.tsx:5698 +#: src/pages/Shell.tsx:4613 msgid "Clear" msgstr "Clear" #. placeholder {0}: bot.name -#: src/pages/Shell.tsx:5664 +#: src/pages/Shell.tsx:4579 msgid "Clear {0}’s conversation?" msgstr "Clear {0}’s conversation?" #: src/pages/BotContextMenu.tsx:103 -#: src/pages/Shell.tsx:5499 +#: src/pages/Shell.tsx:4414 msgid "Clear conversation" msgstr "Clear conversation" -#: src/pages/Shell.tsx:5698 +#: src/pages/Shell.tsx:4613 msgid "Clearing…" msgstr "Clearing…" @@ -655,19 +669,19 @@ msgstr "Close" msgid "Close bot messages" msgstr "Close bot messages" -#: src/pages/Shell.tsx:6341 +#: src/components/conversation/MessageView.tsx:887 msgid "Close chart" msgstr "Close chart" -#: src/pages/Shell.tsx:3599 +#: src/pages/Shell.tsx:3588 msgid "Close computer" msgstr "Close computer" -#: src/pages/Shell.tsx:6441 +#: src/components/conversation/MessageView.tsx:987 msgid "Close image preview" msgstr "Close image preview" -#: src/pages/PluginsOverlay.tsx:586 +#: src/pages/PluginsOverlay.tsx:587 msgid "Close integrations" msgstr "Close integrations" @@ -683,11 +697,11 @@ msgstr "Close memory settings" msgid "Close model settings" msgstr "Close model settings" -#: src/pages/Shell.tsx:2195 +#: src/pages/Shell.tsx:2184 msgid "Close navigation" msgstr "Close navigation" -#: src/pages/Shell.tsx:2881 +#: src/pages/Shell.tsx:2875 msgid "Close panel" msgstr "Close panel" @@ -700,11 +714,11 @@ msgstr "Close phone settings" msgid "Close preview" msgstr "Close preview" -#: src/pages/AccountSettingsOverlay.tsx:118 +#: src/pages/AccountSettingsOverlay.tsx:97 msgid "Close user settings" msgstr "Close user settings" -#: src/pages/VoiceSettingsOverlay.tsx:139 +#: src/pages/VoiceSettingsOverlay.tsx:144 msgid "Close voice settings" msgstr "Close voice settings" @@ -718,7 +732,7 @@ msgid "Code" msgstr "Code" #. placeholder {0}: group.title -#: src/pages/Shell.tsx:2305 +#: src/pages/Shell.tsx:2294 msgid "Collapse {0}" msgstr "Collapse {0}" @@ -734,28 +748,28 @@ msgstr "Command" msgid "Complete" msgstr "Complete" -#: src/pages/Shell.tsx:5050 -#: src/pages/Shell.tsx:5078 +#: src/components/conversation/MessageView.tsx:470 +#: src/pages/Shell.tsx:3993 msgid "Computer" msgstr "Computer" -#: src/pages/Shell.tsx:5938 +#: src/pages/Shell.tsx:4853 msgid "Computer failed to boot" msgstr "Computer failed to boot" -#: src/pages/Shell.tsx:3647 +#: src/pages/Shell.tsx:3636 msgid "Computer is asleep" msgstr "Computer is asleep" -#: src/pages/Shell.tsx:5937 +#: src/pages/Shell.tsx:4852 msgid "Computer is asleep. Take control to wake it." msgstr "Computer is asleep. Take control to wake it." -#: src/pages/Shell.tsx:5939 +#: src/pages/Shell.tsx:4854 msgid "Computer is stopped" msgstr "Computer is stopped" -#: src/pages/AccountSettingsOverlay.tsx:234 +#: src/pages/AccountSettingsOverlay.tsx:167 msgid "Computers" msgstr "Computers" @@ -776,12 +790,12 @@ msgid "Confirm delete" msgstr "Confirm delete" #: src/pages/memory-providers/SupermemorySettingsForm.tsx:80 -#: src/pages/PluginsOverlay.tsx:494 -#: src/pages/VoiceSettingsOverlay.tsx:257 +#: src/pages/PluginsOverlay.tsx:495 +#: src/pages/VoiceSettingsOverlay.tsx:262 msgid "Connect" msgstr "Connect" -#: src/pages/Onboarding.tsx:266 +#: src/pages/Onboarding.tsx:280 msgid "Connect a model" msgstr "Connect a model" @@ -789,11 +803,11 @@ msgstr "Connect a model" msgid "Connect API key" msgstr "Connect API key" -#: src/pages/VoiceSettingsOverlay.tsx:160 +#: src/pages/VoiceSettingsOverlay.tsx:165 msgid "Connect ElevenLabs, OpenAI, or Cartesia" msgstr "Connect ElevenLabs, OpenAI, or Cartesia" -#: src/pages/Shell.tsx:6239 +#: src/components/conversation/MessageView.tsx:785 msgid "Connect MCP server “{name}”" msgstr "Connect MCP server “{name}”" @@ -809,31 +823,31 @@ msgstr "Connect remote or local tool servers and choose which agents can use the msgid "Connect this provider to use it as your personal model." msgstr "Connect this provider to use it as your personal model." -#: src/pages/PluginsOverlay.tsx:778 +#: src/pages/PluginsOverlay.tsx:780 msgid "Connect Treg" msgstr "Connect Treg" +#: src/components/conversation/MessageView.tsx:636 #: src/pages/McpOAuthCallback.tsx:53 #: src/pages/MemorySettingsOverlay.tsx:163 #: src/pages/ModelSettingsOverlay.tsx:378 -#: src/pages/Shell.tsx:6090 -#: src/pages/VoiceSettingsOverlay.tsx:202 +#: src/pages/VoiceSettingsOverlay.tsx:207 msgid "Connected" msgstr "Connected" -#: src/pages/Shell.tsx:6269 +#: src/components/conversation/MessageView.tsx:815 msgid "Connected — its tools are available from your next message." msgstr "Connected — its tools are available from your next message." #. placeholder {0}: credential.label #. placeholder {0}: selected.name #: src/pages/ModelSettingsOverlay.tsx:522 -#: src/pages/VoiceSettingsOverlay.tsx:223 +#: src/pages/VoiceSettingsOverlay.tsx:228 msgid "Connected · {0}" msgstr "Connected · {0}" #. placeholder {0}: selected.name -#: src/pages/VoiceSettingsOverlay.tsx:73 +#: src/pages/VoiceSettingsOverlay.tsx:78 msgid "Connected {0}." msgstr "Connected {0}." @@ -844,29 +858,29 @@ msgstr "Connected {0}." msgid "Connected and using {0}." msgstr "Connected and using {0}." +#: src/components/conversation/MessageView.tsx:805 #: src/pages/McpServersOverlay.tsx:16 #: src/pages/memory-providers/SupermemorySettingsForm.tsx:80 -#: src/pages/PluginsOverlay.tsx:494 -#: src/pages/Shell.tsx:6259 -#: src/pages/VoiceSettingsOverlay.tsx:253 +#: src/pages/PluginsOverlay.tsx:495 +#: src/pages/VoiceSettingsOverlay.tsx:258 msgid "Connecting…" msgstr "Connecting…" #. placeholder {0}: item.name -#: src/pages/PluginsOverlay.tsx:297 +#: src/pages/PluginsOverlay.tsx:298 msgid "Connection to {0} is still pending. You can close this and check again." msgstr "Connection to {0} is still pending. You can close this and check again." -#: src/pages/Onboarding.tsx:538 -#: src/pages/Onboarding.tsx:697 +#: src/pages/Onboarding.tsx:552 +#: src/pages/Onboarding.tsx:711 msgid "Continue" msgstr "Continue" -#: src/pages/Auth.tsx:144 +#: src/pages/Auth.tsx:154 msgid "Continue with email" msgstr "Continue with email" -#: src/pages/Shell.tsx:4535 +#: src/pages/Shell.tsx:3921 msgid "Copy" msgstr "Copy" @@ -878,11 +892,11 @@ msgstr "Could not add" msgid "Could not add MCP server" msgstr "Could not add MCP server" -#: src/pages/Shell.tsx:6226 +#: src/components/conversation/MessageView.tsx:772 msgid "Could not approve this server" msgstr "Could not approve this server" -#: src/pages/Shell.tsx:6054 +#: src/components/conversation/MessageView.tsx:600 msgid "Could not authorize this app" msgstr "Could not authorize this app" @@ -890,7 +904,7 @@ msgstr "Could not authorize this app" msgid "Could not change the default model" msgstr "Could not change the default model" -#: src/pages/Shell.tsx:5692 +#: src/pages/Shell.tsx:4607 msgid "Could not clear conversation" msgstr "Could not clear conversation" @@ -898,7 +912,7 @@ msgstr "Could not clear conversation" msgid "Could not complete OAuth" msgstr "Could not complete OAuth" -#: src/pages/PluginsOverlay.tsx:301 +#: src/pages/PluginsOverlay.tsx:302 msgid "Could not connect" msgstr "Could not connect" @@ -911,15 +925,15 @@ msgstr "Could not connect {0}" msgid "Could not connect this provider" msgstr "Could not connect this provider" -#: src/pages/VoiceSettingsOverlay.tsx:75 +#: src/pages/VoiceSettingsOverlay.tsx:80 msgid "Could not connect this voice provider" msgstr "Could not connect this voice provider" -#: src/pages/Auth.tsx:33 +#: src/pages/Auth.tsx:50 msgid "Could not continue" msgstr "Could not continue" -#: src/pages/Shell.tsx:5128 +#: src/pages/Shell.tsx:4043 msgid "Could not create bot" msgstr "Could not create bot" @@ -927,19 +941,19 @@ msgstr "Could not create bot" msgid "Could not create group" msgstr "Could not create group" -#: src/pages/Shell.tsx:5583 +#: src/pages/Shell.tsx:4498 msgid "Could not create section" msgstr "Could not create section" -#: src/pages/Onboarding.tsx:251 +#: src/pages/Onboarding.tsx:265 msgid "Could not create your bot" msgstr "Could not create your bot" -#: src/pages/Shell.tsx:5807 +#: src/pages/Shell.tsx:4722 msgid "Could not delete bot" msgstr "Could not delete bot" -#: src/pages/Shell.tsx:5887 +#: src/pages/Shell.tsx:4802 msgid "Could not delete group" msgstr "Could not delete group" @@ -947,7 +961,7 @@ msgstr "Could not delete group" msgid "Could not delete MCP server" msgstr "Could not delete MCP server" -#: src/pages/Shell.tsx:5888 +#: src/pages/Shell.tsx:4803 msgid "Could not delete routine" msgstr "Could not delete routine" @@ -968,15 +982,15 @@ msgstr "Could not download {0}. Try again." msgid "Could not download {name}. Try again." msgstr "Could not download {name}. Try again." -#: src/pages/PluginsOverlay.tsx:952 +#: src/pages/PluginsOverlay.tsx:954 msgid "Could not install connector" msgstr "Could not install connector" -#: src/pages/PluginsOverlay.tsx:370 +#: src/pages/PluginsOverlay.tsx:371 msgid "Could not install MCP server" msgstr "Could not install MCP server" -#: src/pages/PluginsOverlay.tsx:409 +#: src/pages/PluginsOverlay.tsx:410 msgid "Could not install skill" msgstr "Could not install skill" @@ -984,7 +998,7 @@ msgstr "Could not install skill" msgid "Could not load approval rules" msgstr "Could not load approval rules" -#: src/pages/PluginsOverlay.tsx:130 +#: src/pages/PluginsOverlay.tsx:133 msgid "Could not load integrations" msgstr "Could not load integrations" @@ -1004,16 +1018,16 @@ msgstr "Could not load this file." msgid "Could not load update status" msgstr "Could not load update status" -#: src/pages/VoiceSettingsOverlay.tsx:47 +#: src/pages/VoiceSettingsOverlay.tsx:52 msgid "Could not load voice settings" msgstr "Could not load voice settings" -#: src/pages/VoiceSettingsOverlay.tsx:109 +#: src/pages/VoiceSettingsOverlay.tsx:114 msgid "Could not play a test clip" msgstr "Could not play a test clip" #: src/pages/ModelSettingsOverlay.tsx:221 -#: src/pages/Onboarding.tsx:197 +#: src/pages/Onboarding.tsx:211 msgid "Could not reach this model server" msgstr "Could not reach this model server" @@ -1021,7 +1035,7 @@ msgstr "Could not reach this model server" msgid "Could not remove" msgstr "Could not remove" -#: src/pages/PluginsOverlay.tsx:965 +#: src/pages/PluginsOverlay.tsx:967 msgid "Could not remove connector" msgstr "Could not remove connector" @@ -1029,7 +1043,7 @@ msgstr "Could not remove connector" msgid "Could not remove group" msgstr "Could not remove group" -#: src/pages/PluginsOverlay.tsx:396 +#: src/pages/PluginsOverlay.tsx:397 msgid "Could not remove MCP server" msgstr "Could not remove MCP server" @@ -1037,23 +1051,27 @@ msgstr "Could not remove MCP server" msgid "Could not remove rule" msgstr "Could not remove rule" -#: src/pages/PluginsOverlay.tsx:423 +#: src/pages/PluginsOverlay.tsx:424 msgid "Could not remove skill" msgstr "Could not remove skill" -#: src/pages/Shell.tsx:6146 +#: src/components/conversation/MessageView.tsx:692 msgid "Could not render chart" msgstr "Could not render chart" -#: src/pages/PluginsOverlay.tsx:327 +#: src/pages/ResetPassword.tsx:139 +msgid "Could not reset your password" +msgstr "Could not reset your password" + +#: src/pages/PluginsOverlay.tsx:328 msgid "Could not revoke connection" msgstr "Could not revoke connection" -#: src/pages/Shell.tsx:3232 +#: src/pages/Shell.tsx:3226 msgid "Could not run routine" msgstr "Could not run routine" -#: src/pages/Shell.tsx:5484 +#: src/pages/Shell.tsx:4399 msgid "Could not save" msgstr "Could not save" @@ -1065,11 +1083,11 @@ msgstr "Could not save Auto Review" msgid "Could not save group" msgstr "Could not save group" -#: src/pages/Onboarding.tsx:224 +#: src/pages/Onboarding.tsx:238 msgid "Could not save model" msgstr "Could not save model" -#: src/pages/Shell.tsx:3203 +#: src/pages/Shell.tsx:3197 msgid "Could not save routine" msgstr "Could not save routine" @@ -1081,11 +1099,11 @@ msgstr "Could not save rule" msgid "Could not save that choice" msgstr "Could not save that choice" -#: src/pages/VoiceSettingsOverlay.tsx:90 +#: src/pages/VoiceSettingsOverlay.tsx:95 msgid "Could not save that voice" msgstr "Could not save that voice" -#: src/pages/Shell.tsx:5966 +#: src/components/conversation/MessageView.tsx:508 msgid "Could not save this choice" msgstr "Could not save this choice" @@ -1093,8 +1111,12 @@ msgstr "Could not save this choice" msgid "Could not send that" msgstr "Could not send that" +#: src/pages/ResetPassword.tsx:44 +msgid "Could not send the link. Try again." +msgstr "Could not send the link. Try again." + #: src/pages/McpServersOverlay.tsx:172 -#: src/pages/PluginsOverlay.tsx:384 +#: src/pages/PluginsOverlay.tsx:385 msgid "Could not start OAuth" msgstr "Could not start OAuth" @@ -1102,7 +1124,7 @@ msgstr "Could not start OAuth" msgid "Could not submit this answer" msgstr "Could not submit this answer" -#: src/pages/Shell.tsx:2043 +#: src/pages/Shell.tsx:2032 msgid "Could not take control" msgstr "Could not take control" @@ -1130,26 +1152,22 @@ msgstr "Couldn't load phone settings" msgid "Couldn't start WhatsApp pairing" msgstr "Couldn't start WhatsApp pairing" -#: src/pages/AccountSettingsOverlay.tsx:93 -msgid "Couldn't update avatars" -msgstr "Couldn't update avatars" - #: src/pages/PhoneSettingsOverlay.tsx:99 msgid "Couldn't update phone settings" msgstr "Couldn't update phone settings" -#: src/pages/Shell.tsx:2233 -#: src/pages/Shell.tsx:5187 -#: src/pages/Shell.tsx:5618 +#: src/pages/Shell.tsx:2222 +#: src/pages/Shell.tsx:4102 +#: src/pages/Shell.tsx:4533 msgid "Create" msgstr "Create" #. placeholder {0}: bot.name -#: src/pages/Shell.tsx:5592 +#: src/pages/Shell.tsx:4507 msgid "Create a section and move {0} into it." msgstr "Create a section and move {0} into it." -#: src/pages/Auth.tsx:146 +#: src/pages/Auth.tsx:156 msgid "Create account" msgstr "Create account" @@ -1157,29 +1175,29 @@ msgstr "Create account" msgid "Create group" msgstr "Create group" -#: src/pages/Onboarding.tsx:557 +#: src/pages/Onboarding.tsx:571 msgid "Create your first bot" msgstr "Create your first bot" -#: src/pages/Auth.tsx:17 +#: src/pages/Auth.tsx:29 msgid "Create your Sentra Bot" msgstr "Create your Sentra Bot" #: src/pages/GroupPanel.tsx:134 -#: src/pages/Shell.tsx:5187 -#: src/pages/Shell.tsx:5618 +#: src/pages/Shell.tsx:4102 +#: src/pages/Shell.tsx:4533 msgid "Creating…" msgstr "Creating…" -#: src/pages/PluginsOverlay.tsx:569 +#: src/pages/PluginsOverlay.tsx:570 msgid "Creativity" msgstr "Creativity" -#: src/pages/PluginsOverlay.tsx:834 +#: src/pages/PluginsOverlay.tsx:836 msgid "Credential" msgstr "Credential" -#: src/pages/PluginsOverlay.tsx:892 +#: src/pages/PluginsOverlay.tsx:894 msgid "credential saved" msgstr "credential saved" @@ -1204,7 +1222,7 @@ msgstr "days" msgid "Decline" msgstr "Decline" -#: src/pages/Shell.tsx:5391 +#: src/pages/Shell.tsx:4306 msgid "Default (medium)" msgstr "Default (medium)" @@ -1215,24 +1233,24 @@ msgstr "Default scope" #: src/pages/BotContextMenu.tsx:105 #: src/pages/McpServersOverlay.tsx:481 #: src/pages/RoutineEditor.tsx:280 -#: src/pages/Shell.tsx:2522 -#: src/pages/Shell.tsx:2552 -#: src/pages/Shell.tsx:5813 -#: src/pages/Shell.tsx:5895 +#: src/pages/Shell.tsx:2511 +#: src/pages/Shell.tsx:2541 +#: src/pages/Shell.tsx:4728 +#: src/pages/Shell.tsx:4810 msgid "Delete" msgstr "Delete" #. placeholder {0}: bot.name #. placeholder {0}: group.name -#: src/pages/Shell.tsx:2518 -#: src/pages/Shell.tsx:2548 +#: src/pages/Shell.tsx:2507 +#: src/pages/Shell.tsx:2537 msgid "Delete {0}" msgstr "Delete {0}" #. placeholder {0}: bot.name #. placeholder {0}: item.name -#: src/pages/Shell.tsx:5745 -#: src/pages/Shell.tsx:5861 +#: src/pages/Shell.tsx:4660 +#: src/pages/Shell.tsx:4776 msgid "Delete {0}?" msgstr "Delete {0}?" @@ -1240,17 +1258,17 @@ msgstr "Delete {0}?" msgid "Delete group" msgstr "Delete group" -#: src/pages/Shell.tsx:5782 +#: src/pages/Shell.tsx:4697 msgid "Delete memories too" msgstr "Delete memories too" -#: src/pages/Shell.tsx:4894 +#: src/components/conversation/MessageView.tsx:314 msgid "deleted" msgstr "deleted" #: src/pages/GroupPanel.tsx:232 -#: src/pages/Shell.tsx:5813 -#: src/pages/Shell.tsx:5895 +#: src/pages/Shell.tsx:4728 +#: src/pages/Shell.tsx:4810 msgid "Deleting…" msgstr "Deleting…" @@ -1266,26 +1284,30 @@ msgstr "Deny" msgid "Deployment default" msgstr "Deployment default" -#: src/pages/Onboarding.tsx:676 -#: src/pages/Shell.tsx:5165 +#: src/pages/Onboarding.tsx:690 +#: src/pages/Shell.tsx:4080 msgid "Describe what this bot does" msgstr "Describe what this bot does" -#: src/pages/Onboarding.tsx:651 +#: src/pages/Onboarding.tsx:665 msgid "Describe your own bot in the panel." msgstr "Describe your own bot in the panel." -#: src/pages/Onboarding.tsx:681 -#: src/pages/Shell.tsx:5170 -#: src/pages/Shell.tsx:5335 +#: src/pages/Onboarding.tsx:695 +#: src/pages/Shell.tsx:4085 +#: src/pages/Shell.tsx:4250 msgid "Description" msgstr "Description" -#: src/pages/PluginsOverlay.tsx:565 +#: src/pages/Shell.tsx:2704 +msgid "Desktop Runtime offline" +msgstr "Desktop Runtime offline" + +#: src/pages/PluginsOverlay.tsx:566 msgid "Developer" msgstr "Developer" -#: src/pages/Shell.tsx:4306 +#: src/components/composer/Composer.tsx:446 msgid "Dictate" msgstr "Dictate" @@ -1298,15 +1320,15 @@ msgstr "Disconnect" msgid "Disconnecting…" msgstr "Disconnecting…" -#: src/pages/Shell.tsx:4153 +#: src/components/composer/Composer.tsx:293 msgid "Dismiss error" msgstr "Dismiss error" -#: src/pages/Shell.tsx:6274 +#: src/components/conversation/MessageView.tsx:820 msgid "Dismissed — reconnect anytime from MCP settings." msgstr "Dismissed — reconnect anytime from MCP settings." -#: src/pages/PluginsOverlay.tsx:788 +#: src/pages/PluginsOverlay.tsx:790 msgid "Display name" msgstr "Display name" @@ -1323,7 +1345,7 @@ msgstr "Docker (recommended)" msgid "Docker is the default: bots use a shared Team Computer." msgstr "Docker is the default: bots use a shared Team Computer." -#: src/pages/Auth.tsx:152 +#: src/pages/Auth.tsx:162 msgid "Don’t have an account?" msgstr "Don’t have an account?" @@ -1350,7 +1372,7 @@ msgstr "Draft skill" msgid "Duplicate" msgstr "Duplicate" -#: src/pages/Shell.tsx:4697 +#: src/components/conversation/MessageView.tsx:117 msgid "Earlier message" msgstr "Earlier message" @@ -1362,7 +1384,8 @@ msgstr "Edit first" msgid "Edit Profile" msgstr "Edit Profile" -#: src/pages/Auth.tsx:62 +#: src/pages/Auth.tsx:73 +#: src/pages/ResetPassword.tsx:82 msgid "Email" msgstr "Email" @@ -1372,7 +1395,7 @@ msgstr "Encrypted static credential saved" #. placeholder {0}: oauth.verificationUri.replace(/^https:\/\//, "") #: src/pages/ModelSettingsOverlay.tsx:586 -#: src/pages/Onboarding.tsx:459 +#: src/pages/Onboarding.tsx:473 msgid "Enter this code at <0>{0}" msgstr "Enter this code at <0>{0}" @@ -1410,16 +1433,16 @@ msgstr "Every month" msgid "Every week" msgstr "Every week" -#: src/pages/Shell.tsx:6320 +#: src/components/conversation/MessageView.tsx:866 msgid "Expand" msgstr "Expand" #. placeholder {0}: group.title -#: src/pages/Shell.tsx:2305 +#: src/pages/Shell.tsx:2294 msgid "Expand {0}" msgstr "Expand {0}" -#: src/pages/Shell.tsx:5496 +#: src/pages/Shell.tsx:4411 msgid "Export" msgstr "Export" @@ -1427,7 +1450,7 @@ msgstr "Export" msgid "Export this week's list from the CRM and drop it in the shared folder" msgstr "Export this week's list from the CRM and drop it in the shared folder" -#: src/pages/Shell.tsx:5516 +#: src/pages/Shell.tsx:4431 msgid "Extra high" msgstr "Extra high" @@ -1435,14 +1458,14 @@ msgstr "Extra high" msgid "Failed" msgstr "Failed" -#: src/pages/Shell.tsx:1878 -#: src/pages/Shell.tsx:1880 -#: src/pages/Shell.tsx:1882 +#: src/pages/Shell.tsx:1867 +#: src/pages/Shell.tsx:1869 +#: src/pages/Shell.tsx:1871 msgid "Failed to send message" msgstr "Failed to send message" -#: src/pages/Shell.tsx:1912 -#: src/pages/Shell.tsx:1931 +#: src/pages/Shell.tsx:1901 +#: src/pages/Shell.tsx:1920 msgid "Failed to stop" msgstr "Failed to stop" @@ -1456,18 +1479,18 @@ msgid "Failure handling" msgstr "Failure handling" #: src/pages/ModelSettingsOverlay.tsx:427 -#: src/pages/Onboarding.tsx:336 +#: src/pages/Onboarding.tsx:350 msgid "Find models" msgstr "Find models" #: src/pages/ModelSettingsOverlay.tsx:427 -#: src/pages/Onboarding.tsx:336 +#: src/pages/Onboarding.tsx:350 msgid "Finding…" msgstr "Finding…" #. placeholder {0}: new URL(oauth.verificationUri).hostname #: src/pages/ModelSettingsOverlay.tsx:546 -#: src/pages/Onboarding.tsx:420 +#: src/pages/Onboarding.tsx:434 msgid "Finish signing in at <0>{0}. The final page may not load; paste its URL or code here." msgstr "Finish signing in at <0>{0}. The final page may not load; paste its URL or code here." @@ -1484,6 +1507,10 @@ msgstr "Finishing MCP connection…" msgid "Flag unexpected actions" msgstr "Flag unexpected actions" +#: src/pages/Auth.tsx:99 +msgid "Forgot password?" +msgstr "Forgot password?" + #: src/pages/ModelSettingsOverlay.tsx:1026 msgid "Free" msgstr "Free" @@ -1497,8 +1524,8 @@ msgid "Git event" msgstr "Git event" #: src/pages/PhoneSettingsOverlay.tsx:224 -#: src/pages/Shell.tsx:2708 -#: src/pages/Shell.tsx:2863 +#: src/pages/Shell.tsx:2697 +#: src/pages/Shell.tsx:2857 msgid "Group" msgstr "Group" @@ -1524,7 +1551,7 @@ msgid "header" msgstr "header" #: src/pages/McpServersOverlay.tsx:342 -#: src/pages/PluginsOverlay.tsx:824 +#: src/pages/PluginsOverlay.tsx:826 msgid "Header name" msgstr "Header name" @@ -1532,27 +1559,28 @@ msgstr "Header name" msgid "Header value" msgstr "Header value" -#: src/pages/VoiceSettingsOverlay.tsx:284 +#: src/pages/VoiceSettingsOverlay.tsx:289 msgid "Hear a sample" msgstr "Hear a sample" -#: src/pages/VoiceSettingsOverlay.tsx:102 +#: src/pages/VoiceSettingsOverlay.tsx:107 msgid "Hi, this is how I'll sound when I read replies out loud." msgstr "Hi, this is how I'll sound when I read replies out loud." -#: src/pages/Auth.tsx:95 +#: src/pages/Auth.tsx:122 +#: src/pages/ResetPassword.tsx:186 msgid "Hide password" msgstr "Hide password" -#: src/pages/Shell.tsx:5519 +#: src/pages/Shell.tsx:4434 msgid "High" msgstr "High" -#: src/pages/Shell.tsx:4325 +#: src/components/composer/Composer.tsx:465 msgid "Hold to talk" msgstr "Hold to talk" -#: src/pages/Shell.tsx:4325 +#: src/components/composer/Composer.tsx:465 msgid "Hold to talk (on-device dictation)" msgstr "Hold to talk (on-device dictation)" @@ -1572,15 +1600,19 @@ msgstr "How often" msgid "How to check" msgstr "How to check" -#: src/pages/Shell.tsx:4591 +#: src/pages/Shell.tsx:3977 msgid "I’m done" msgstr "I’m done" -#: src/pages/VoiceSettingsOverlay.tsx:107 +#: src/pages/ResetPassword.tsx:54 +msgid "If an account exists for {email}, we sent a link to reset your password. It works for one hour." +msgstr "If an account exists for {email}, we sent a link to reset your password. It works for one hour." + +#: src/pages/VoiceSettingsOverlay.tsx:112 msgid "If you heard that, voice is ready." msgstr "If you heard that, voice is ready." -#: src/pages/AccountSettingsOverlay.tsx:140 +#: src/pages/AccountSettingsOverlay.tsx:119 msgid "iMessage channels and agent connections." msgstr "iMessage channels and agent connections." @@ -1588,15 +1620,15 @@ msgstr "iMessage channels and agent connections." msgid "iMessage line" msgstr "iMessage line" -#: src/pages/PluginsOverlay.tsx:782 +#: src/pages/PluginsOverlay.tsx:784 msgid "Import OpenAPI JSON" msgstr "Import OpenAPI JSON" -#: src/pages/Onboarding.tsx:701 +#: src/pages/Onboarding.tsx:715 msgid "Includes a full operating playbook for this role." msgstr "Includes a full operating playbook for this role." -#: src/pages/Shell.tsx:5406 +#: src/pages/Shell.tsx:4321 msgid "Inherit default" msgstr "Inherit default" @@ -1604,18 +1636,18 @@ msgstr "Inherit default" msgid "Inputs" msgstr "Inputs" -#: src/pages/PluginsOverlay.tsx:482 -#: src/pages/PluginsOverlay.tsx:533 +#: src/pages/PluginsOverlay.tsx:483 +#: src/pages/PluginsOverlay.tsx:534 msgid "Install" msgstr "Install" -#: src/pages/PluginsOverlay.tsx:498 -#: src/pages/PluginsOverlay.tsx:537 +#: src/pages/PluginsOverlay.tsx:499 +#: src/pages/PluginsOverlay.tsx:538 msgid "Installed" msgstr "Installed" -#: src/pages/PluginsOverlay.tsx:482 -#: src/pages/PluginsOverlay.tsx:533 +#: src/pages/PluginsOverlay.tsx:483 +#: src/pages/PluginsOverlay.tsx:534 msgid "Installing…" msgstr "Installing…" @@ -1627,8 +1659,8 @@ msgstr "Instance API key" msgid "Instruction" msgstr "Instruction" -#: src/pages/PluginsOverlay.tsx:582 -#: src/pages/Shell.tsx:2570 +#: src/pages/PluginsOverlay.tsx:583 +#: src/pages/Shell.tsx:2559 msgid "Integrations" msgstr "Integrations" @@ -1650,19 +1682,19 @@ msgid "Interval unit" msgstr "Interval unit" #: src/pages/MemorySettingsOverlay.tsx:39 -#: src/pages/Shell.tsx:5407 +#: src/pages/Shell.tsx:4322 msgid "Isolated" msgstr "Isolated" -#: src/pages/Shell.tsx:5748 +#: src/pages/Shell.tsx:4663 msgid "Its conversation, files, and routines will be permanently deleted. Bots it created stay in your list." msgstr "Its conversation, files, and routines will be permanently deleted. Bots it created stay in your list." -#: src/pages/Shell.tsx:3886 +#: src/pages/Shell.tsx:3875 msgid "Jump to latest" msgstr "Jump to latest" -#: src/pages/Shell.tsx:4692 +#: src/components/conversation/MessageView.tsx:112 msgid "Jump to replied message" msgstr "Jump to replied message" @@ -1670,7 +1702,7 @@ msgstr "Jump to replied message" msgid "just now" msgstr "just now" -#: src/pages/Shell.tsx:5766 +#: src/pages/Shell.tsx:4681 msgid "Keep memories" msgstr "Keep memories" @@ -1678,17 +1710,17 @@ msgstr "Keep memories" msgid "key" msgstr "key" -#: src/pages/VoiceSettingsOverlay.tsx:229 +#: src/pages/VoiceSettingsOverlay.tsx:234 msgid "Keys stay on the server. The app only learns whether a provider is configured." msgstr "Keys stay on the server. The app only learns whether a provider is configured." -#: src/pages/PluginsOverlay.tsx:571 +#: src/pages/PluginsOverlay.tsx:572 msgid "Knowledge" msgstr "Knowledge" -#: src/pages/AccountSettingsOverlay.tsx:154 -#: src/pages/AccountSettingsOverlay.tsx:363 -#: src/pages/AccountSettingsOverlay.tsx:380 +#: src/pages/AccountSettingsOverlay.tsx:133 +#: src/pages/AccountSettingsOverlay.tsx:296 +#: src/pages/AccountSettingsOverlay.tsx:313 msgid "Language" msgstr "Language" @@ -1709,7 +1741,7 @@ msgstr "Linked as {0}" msgid "Listening…" msgstr "Listening…" -#: src/pages/Shell.tsx:3839 +#: src/pages/Shell.tsx:3828 msgid "Load earlier messages" msgstr "Load earlier messages" @@ -1717,7 +1749,7 @@ msgstr "Load earlier messages" msgid "Loading activity…" msgstr "Loading activity…" -#: src/pages/PluginsOverlay.tsx:608 +#: src/pages/PluginsOverlay.tsx:609 msgid "Loading integrations…" msgstr "Loading integrations…" @@ -1743,13 +1775,13 @@ msgstr "Loading preview…" msgid "Loading rules…" msgstr "Loading rules…" -#: src/pages/VoiceSettingsOverlay.tsx:128 +#: src/pages/VoiceSettingsOverlay.tsx:133 msgid "Loading voice providers…" msgstr "Loading voice providers…" -#: src/App.tsx:50 -#: src/pages/Onboarding.tsx:260 -#: src/pages/Shell.tsx:3839 +#: src/App.tsx:53 +#: src/pages/Onboarding.tsx:274 +#: src/pages/Shell.tsx:3828 msgid "Loading…" msgstr "Loading…" @@ -1757,15 +1789,15 @@ msgstr "Loading…" msgid "Local" msgstr "Local" -#: src/pages/Shell.tsx:2656 +#: src/pages/Shell.tsx:2645 msgid "Log out" msgstr "Log out" -#: src/pages/Shell.tsx:5517 +#: src/pages/Shell.tsx:4432 msgid "Low" msgstr "Low" -#: src/pages/AccountSettingsOverlay.tsx:147 +#: src/pages/AccountSettingsOverlay.tsx:126 msgid "Manage phone settings" msgstr "Manage phone settings" @@ -1781,17 +1813,17 @@ msgstr "Mark as Read" msgid "Mark as Unread" msgstr "Mark as Unread" -#: src/pages/Shell.tsx:5521 +#: src/pages/Shell.tsx:4436 msgid "Max" msgstr "Max" #: src/pages/McpServersOverlay.tsx:224 #: src/pages/McpServersOverlay.tsx:229 -#: src/pages/PluginsOverlay.tsx:756 +#: src/pages/PluginsOverlay.tsx:758 msgid "MCP servers" msgstr "MCP servers" -#: src/pages/Shell.tsx:5518 +#: src/pages/Shell.tsx:4433 msgid "Medium" msgstr "Medium" @@ -1804,11 +1836,11 @@ msgid "Members (pick {GROUP_MEMBER_MIN}–{GROUP_MEMBER_MAX})" msgstr "Members (pick {GROUP_MEMBER_MIN}–{GROUP_MEMBER_MAX})" #: src/pages/MemorySettingsOverlay.tsx:134 -#: src/pages/Shell.tsx:2614 +#: src/pages/Shell.tsx:2603 msgid "Memory" msgstr "Memory" -#: src/pages/Shell.tsx:5402 +#: src/pages/Shell.tsx:4317 msgid "Memory scope" msgstr "Memory scope" @@ -1817,29 +1849,29 @@ msgstr "Memory scope" msgid "Message" msgstr "Message" -#: src/pages/Shell.tsx:4403 -#: src/pages/Shell.tsx:4500 +#: src/components/composer/Composer.tsx:543 +#: src/components/composer/shared.ts:23 msgid "Message" msgstr "Message" -#: src/pages/Shell.tsx:4399 -#: src/pages/Shell.tsx:4403 +#: src/components/composer/Composer.tsx:539 +#: src/components/composer/Composer.tsx:543 msgid "Message {activeName}" msgstr "Message {activeName}" -#: src/pages/Shell.tsx:4134 +#: src/components/composer/Composer.tsx:274 msgid "Message composer" msgstr "Message composer" -#: src/pages/Shell.tsx:4770 +#: src/components/conversation/MessageView.tsx:190 msgid "Message from {peer}" msgstr "Message from {peer}" -#: src/pages/Shell.tsx:4400 +#: src/components/composer/Composer.tsx:540 msgid "Message…" msgstr "Message…" -#: src/pages/Shell.tsx:4770 +#: src/components/conversation/MessageView.tsx:190 msgid "Messaged {peer}" msgstr "Messaged {peer}" @@ -1847,7 +1879,7 @@ msgstr "Messaged {peer}" msgid "Microphone failed" msgstr "Microphone failed" -#: src/pages/Shell.tsx:5520 +#: src/pages/Shell.tsx:4435 msgid "Minimal" msgstr "Minimal" @@ -1866,15 +1898,15 @@ msgstr "minutes" #: src/pages/ModelSettingsOverlay.tsx:432 #: src/pages/ModelSettingsOverlay.tsx:493 #: src/pages/ModelSettingsOverlay.tsx:914 -#: src/pages/Onboarding.tsx:341 -#: src/pages/Onboarding.tsx:390 -#: src/pages/Onboarding.tsx:398 -#: src/pages/Shell.tsx:5358 +#: src/pages/Onboarding.tsx:355 +#: src/pages/Onboarding.tsx:404 +#: src/pages/Onboarding.tsx:412 +#: src/pages/Shell.tsx:4273 msgid "Model" msgstr "Model" #: src/pages/ModelSettingsOverlay.tsx:474 -#: src/pages/Onboarding.tsx:371 +#: src/pages/Onboarding.tsx:385 msgid "Model id" msgstr "Model id" @@ -1882,7 +1914,7 @@ msgstr "Model id" msgid "Model options" msgstr "Model options" -#: src/pages/AccountSettingsOverlay.tsx:222 +#: src/pages/AccountSettingsOverlay.tsx:155 msgid "Model spend uses your provider keys." msgstr "Model spend uses your provider keys." @@ -1891,12 +1923,12 @@ msgid "Model updated." msgstr "Model updated." #: src/pages/ModelSettingsOverlay.tsx:304 -#: src/pages/Shell.tsx:2601 +#: src/pages/Shell.tsx:2590 msgid "Models" msgstr "Models" #: src/pages/ModelSettingsOverlay.tsx:445 -#: src/pages/Onboarding.tsx:348 +#: src/pages/Onboarding.tsx:362 msgid "Models from server" msgstr "Models from server" @@ -1904,7 +1936,7 @@ msgstr "Models from server" msgid "Monthly" msgstr "Monthly" -#: src/pages/PluginsOverlay.tsx:573 +#: src/pages/PluginsOverlay.tsx:574 msgid "More apps" msgstr "More apps" @@ -1913,7 +1945,7 @@ msgstr "More apps" msgid "Move {0} to section" msgstr "Move {0} to section" -#: src/pages/Shell.tsx:5769 +#: src/pages/Shell.tsx:4684 msgid "Move them to your shared memory." msgstr "Move them to your shared memory." @@ -1922,19 +1954,19 @@ msgid "Move to" msgstr "Move to" #: src/components/teach/SkillDraftCard.tsx:82 -#: src/pages/Auth.tsx:49 +#: src/pages/Auth.tsx:60 #: src/pages/GroupPanel.tsx:110 #: src/pages/GroupPanel.tsx:201 -#: src/pages/Onboarding.tsx:663 +#: src/pages/Onboarding.tsx:677 #: src/pages/RoutineEditor.tsx:294 -#: src/pages/Shell.tsx:5150 -#: src/pages/Shell.tsx:5317 -#: src/pages/Shell.tsx:5595 +#: src/pages/Shell.tsx:4065 +#: src/pages/Shell.tsx:4232 +#: src/pages/Shell.tsx:4510 msgid "Name" msgstr "Name" -#: src/pages/Onboarding.tsx:667 -#: src/pages/Shell.tsx:5155 +#: src/pages/Onboarding.tsx:681 +#: src/pages/Shell.tsx:4070 msgid "Name this bot" msgstr "Name this bot" @@ -1954,13 +1986,13 @@ msgstr "Needs input" msgid "Needs takeover" msgstr "Needs takeover" -#: src/pages/Shell.tsx:2247 -#: src/pages/Shell.tsx:5138 +#: src/pages/Shell.tsx:2236 +#: src/pages/Shell.tsx:4053 msgid "New bot" msgstr "New bot" #: src/pages/GroupPanel.tsx:98 -#: src/pages/Shell.tsx:2257 +#: src/pages/Shell.tsx:2246 msgid "New group" msgstr "New group" @@ -1968,12 +2000,16 @@ msgstr "New group" msgid "New open-work item" msgstr "New open-work item" +#: src/pages/ResetPassword.tsx:165 +msgid "New password" +msgstr "New password" + #: src/pages/RoutineEditor.tsx:100 msgid "New routine" msgstr "New routine" #: src/pages/BotContextMenu.tsx:130 -#: src/pages/Shell.tsx:5589 +#: src/pages/Shell.tsx:4504 msgid "New section" msgstr "New section" @@ -1981,20 +2017,20 @@ msgstr "New section" msgid "No agent connections yet." msgstr "No agent connections yet." -#: src/pages/PluginsOverlay.tsx:687 +#: src/pages/PluginsOverlay.tsx:689 msgid "No apps match your search." msgstr "No apps match your search." -#: src/pages/PluginsOverlay.tsx:894 +#: src/pages/PluginsOverlay.tsx:896 msgid "no auth" msgstr "no auth" -#: src/pages/PluginsOverlay.tsx:810 +#: src/pages/PluginsOverlay.tsx:812 msgid "No authentication" msgstr "No authentication" #. placeholder {0}: item.name -#: src/pages/PluginsOverlay.tsx:323 +#: src/pages/PluginsOverlay.tsx:324 msgid "No connection record found for {0}." msgstr "No connection record found for {0}." @@ -2014,7 +2050,7 @@ msgstr "No iMessage groups yet." msgid "No longer active" msgstr "No longer active" -#: src/pages/PluginsOverlay.tsx:682 +#: src/pages/PluginsOverlay.tsx:684 msgid "No managed app catalog is configured on this deployment." msgstr "No managed app catalog is configured on this deployment." @@ -2022,7 +2058,7 @@ msgstr "No managed app catalog is configured on this deployment." msgid "No matching models" msgstr "No matching models" -#: src/pages/PluginsOverlay.tsx:876 +#: src/pages/PluginsOverlay.tsx:878 msgid "No MCP or API tool sources installed yet." msgstr "No MCP or API tool sources installed yet." @@ -2054,16 +2090,16 @@ msgstr "No trigger" msgid "None yet" msgstr "None yet" -#: src/pages/VoiceSettingsOverlay.tsx:156 +#: src/pages/VoiceSettingsOverlay.tsx:161 msgid "Not configured" msgstr "Not configured" #: src/pages/ModelSettingsOverlay.tsx:524 -#: src/pages/VoiceSettingsOverlay.tsx:225 +#: src/pages/VoiceSettingsOverlay.tsx:230 msgid "Not connected" msgstr "Not connected" -#: src/pages/PluginsOverlay.tsx:643 +#: src/pages/PluginsOverlay.tsx:645 msgid "Not in the plugin catalog" msgstr "Not in the plugin catalog" @@ -2071,7 +2107,7 @@ msgstr "Not in the plugin catalog" msgid "Not linked — text the deployment's number once to link your phone to your agent." msgstr "Not linked — text the deployment's number once to link your phone to your agent." -#: src/pages/Shell.tsx:6262 +#: src/components/conversation/MessageView.tsx:808 msgid "Not now" msgstr "Not now" @@ -2113,15 +2149,15 @@ msgstr "on the 1st at {0}" msgid "Open" msgstr "Open" -#: src/pages/Shell.tsx:2926 +#: src/pages/Shell.tsx:2920 msgid "Open computer" msgstr "Open computer" -#: src/pages/Shell.tsx:2892 +#: src/pages/Shell.tsx:2886 msgid "Open in full window" msgstr "Open in full window" -#: src/pages/Shell.tsx:2680 +#: src/pages/Shell.tsx:2669 msgid "Open navigation" msgstr "Open navigation" @@ -2142,24 +2178,24 @@ msgid "Open work" msgstr "Open work" #: src/pages/ModelSettingsOverlay.tsx:405 -#: src/pages/Onboarding.tsx:315 +#: src/pages/Onboarding.tsx:329 msgid "OpenAI-compatible server URL" msgstr "OpenAI-compatible server URL" -#: src/pages/Shell.tsx:4905 +#: src/components/conversation/MessageView.tsx:325 msgid "Opened its thread." msgstr "Opened its thread." -#: src/App.tsx:166 +#: src/App.tsx:170 msgid "Opening your workspace…" msgstr "Opening your workspace…" #: src/pages/ModelSettingsOverlay.tsx:636 -#: src/pages/Onboarding.tsx:502 +#: src/pages/Onboarding.tsx:516 msgid "Optional" msgstr "Optional" -#: src/pages/AccountSettingsOverlay.tsx:250 +#: src/pages/AccountSettingsOverlay.tsx:183 msgid "Optional controls most people never need" msgstr "Optional controls most people never need" @@ -2171,7 +2207,7 @@ msgstr "Optional header value" msgid "Or connect an API key" msgstr "Or connect an API key" -#: src/pages/Onboarding.tsx:510 +#: src/pages/Onboarding.tsx:524 msgid "Or paste an API key" msgstr "Or paste an API key" @@ -2180,16 +2216,12 @@ msgstr "Or paste an API key" msgid "Or send this code to {0}:" msgstr "Or send this code to {0}:" -#: src/pages/AccountSettingsOverlay.tsx:191 -msgid "Organic" -msgstr "Organic" - #: src/pages/memory-providers/SupermemorySettingsForm.tsx:60 msgid "Organization API key" msgstr "Organization API key" #: src/pages/ModelSettingsOverlay.tsx:454 -#: src/pages/Onboarding.tsx:357 +#: src/pages/Onboarding.tsx:371 msgid "Other model…" msgstr "Other model…" @@ -2211,21 +2243,26 @@ msgstr "Paired as {0}" msgid "Park" msgstr "Park" -#: src/pages/Auth.tsx:77 -#: src/pages/Auth.tsx:86 +#: src/pages/Auth.tsx:91 +#: src/pages/Auth.tsx:110 +#: src/pages/ResetPassword.tsx:174 msgid "Password" msgstr "Password" -#: src/pages/VoiceSettingsOverlay.tsx:242 +#: src/pages/ResetPassword.tsx:147 +msgid "Password updated" +msgstr "Password updated" + +#: src/pages/VoiceSettingsOverlay.tsx:247 msgid "Paste a replacement key" msgstr "Paste a replacement key" #: src/pages/ModelSettingsOverlay.tsx:416 -#: src/pages/Onboarding.tsx:326 +#: src/pages/Onboarding.tsx:340 msgid "Paste the OpenAI-compatible address from your server. Sentra Bot adds /v1 if needed." msgstr "Paste the OpenAI-compatible address from your server. Sentra Bot adds /v1 if needed." -#: src/pages/VoiceSettingsOverlay.tsx:242 +#: src/pages/VoiceSettingsOverlay.tsx:247 msgid "Paste your API key" msgstr "Paste your API key" @@ -2233,21 +2270,21 @@ msgstr "Paste your API key" msgid "Paused" msgstr "Paused" -#: src/pages/PluginsOverlay.tsx:567 +#: src/pages/PluginsOverlay.tsx:568 msgid "Payments" msgstr "Payments" #: src/pages/ModelSettingsOverlay.tsx:518 -#: src/pages/VoiceSettingsOverlay.tsx:219 +#: src/pages/VoiceSettingsOverlay.tsx:224 msgid "Personal credential" msgstr "Personal credential" -#: src/pages/AccountSettingsOverlay.tsx:137 +#: src/pages/AccountSettingsOverlay.tsx:116 #: src/pages/PhoneSettingsOverlay.tsx:116 msgid "Phone" msgstr "Phone" -#: src/pages/VoiceSettingsOverlay.tsx:155 +#: src/pages/VoiceSettingsOverlay.tsx:160 msgid "Pick a voice" msgstr "Pick a voice" @@ -2255,11 +2292,11 @@ msgstr "Pick a voice" msgid "Pin" msgstr "Pin" -#: src/pages/VoiceSettingsOverlay.tsx:284 +#: src/pages/VoiceSettingsOverlay.tsx:289 msgid "Playing…" msgstr "Playing…" -#: src/pages/PluginsOverlay.tsx:615 +#: src/pages/PluginsOverlay.tsx:616 msgid "Popular" msgstr "Popular" @@ -2272,11 +2309,11 @@ msgstr "POST to" msgid "Preview {0}" msgstr "Preview {0}" -#: src/pages/Shell.tsx:5093 +#: src/pages/Shell.tsx:4008 msgid "Private" msgstr "Private" -#: src/pages/PluginsOverlay.tsx:563 +#: src/pages/PluginsOverlay.tsx:564 msgid "Productivity" msgstr "Productivity" @@ -2285,7 +2322,7 @@ msgid "Provider" msgstr "Provider" #: src/pages/ModelSettingsOverlay.tsx:341 -#: src/pages/VoiceSettingsOverlay.tsx:168 +#: src/pages/VoiceSettingsOverlay.tsx:173 msgid "Providers" msgstr "Providers" @@ -2293,7 +2330,7 @@ msgstr "Providers" msgid "Queued" msgstr "Queued" -#: src/pages/Shell.tsx:5434 +#: src/pages/Shell.tsx:4349 msgid "Read replies aloud" msgstr "Read replies aloud" @@ -2305,7 +2342,7 @@ msgstr "Recent" msgid "Reconnect OAuth" msgstr "Reconnect OAuth" -#: src/App.tsx:123 +#: src/App.tsx:127 msgid "Reconnecting" msgstr "Reconnecting" @@ -2327,27 +2364,27 @@ msgstr "Recover replaces an unreachable computer and keeps files in the saved wo msgid "Recovering…" msgstr "Recovering…" -#: src/pages/Shell.tsx:4581 +#: src/pages/Shell.tsx:3967 msgid "Release" msgstr "Release" #: src/components/ApprovalRulesSettings.tsx:178 -#: src/pages/PluginsOverlay.tsx:455 -#: src/pages/PluginsOverlay.tsx:508 -#: src/pages/PluginsOverlay.tsx:547 -#: src/pages/PluginsOverlay.tsx:666 -#: src/pages/PluginsOverlay.tsx:905 +#: src/pages/PluginsOverlay.tsx:456 +#: src/pages/PluginsOverlay.tsx:509 +#: src/pages/PluginsOverlay.tsx:548 +#: src/pages/PluginsOverlay.tsx:668 +#: src/pages/PluginsOverlay.tsx:907 #: src/pages/ScratchpadSection.tsx:162 msgid "Remove" msgstr "Remove" #. placeholder {0}: attachment.file.name -#: src/pages/Shell.tsx:4204 +#: src/components/composer/Composer.tsx:344 msgid "Remove {0}" msgstr "Remove {0}" #. placeholder {0}: mention.name -#: src/pages/Shell.tsx:4362 +#: src/components/composer/Composer.tsx:502 msgid "Remove mention {0}" msgstr "Remove mention {0}" @@ -2356,7 +2393,7 @@ msgid "Remove schedule" msgstr "Remove schedule" #. placeholder {0}: selectedSkill.name -#: src/pages/Shell.tsx:4341 +#: src/components/composer/Composer.tsx:481 msgid "Remove skill {0}" msgstr "Remove skill {0}" @@ -2368,7 +2405,7 @@ msgstr "Remove this schedule" msgid "Remove webhook" msgstr "Remove webhook" -#: src/pages/Shell.tsx:4904 +#: src/components/conversation/MessageView.tsx:324 msgid "Removed with chat, computer, and memory." msgstr "Removed with chat, computer, and memory." @@ -2376,10 +2413,10 @@ msgstr "Removed with chat, computer, and memory." msgid "Removed, but list refresh failed" msgstr "Removed, but list refresh failed" -#: src/pages/PluginsOverlay.tsx:450 -#: src/pages/PluginsOverlay.tsx:547 -#: src/pages/PluginsOverlay.tsx:661 -#: src/pages/PluginsOverlay.tsx:905 +#: src/pages/PluginsOverlay.tsx:451 +#: src/pages/PluginsOverlay.tsx:548 +#: src/pages/PluginsOverlay.tsx:663 +#: src/pages/PluginsOverlay.tsx:907 msgid "Removing…" msgstr "Removing…" @@ -2393,15 +2430,15 @@ msgstr "Reopen" msgid "Replace API key" msgstr "Replace API key" -#: src/pages/VoiceSettingsOverlay.tsx:255 +#: src/pages/VoiceSettingsOverlay.tsx:260 msgid "Replace key" msgstr "Replace key" -#: src/pages/Shell.tsx:4527 +#: src/pages/Shell.tsx:3913 msgid "Reply" msgstr "Reply" -#: src/pages/Shell.tsx:4167 +#: src/components/composer/Composer.tsx:307 msgid "Replying to {replyName}" msgstr "Replying to {replyName}" @@ -2417,13 +2454,21 @@ msgstr "Reset computer" msgid "Reset computer?" msgstr "Reset computer?" +#: src/pages/ResetPassword.tsx:78 +msgid "Reset links work once and for one hour. Enter your email to get a new one." +msgstr "Reset links work once and for one hour. Enter your email to get a new one." + +#: src/pages/ResetPassword.tsx:70 +msgid "Reset your password" +msgstr "Reset your password" + #: src/components/ComputerMaintenanceActions.tsx:68 #: src/components/ComputerMaintenanceActions.tsx:115 msgid "Resetting…" msgstr "Resetting…" -#: src/pages/Shell.tsx:2514 -#: src/pages/Shell.tsx:2544 +#: src/pages/Shell.tsx:2503 +#: src/pages/Shell.tsx:2533 msgid "Restore" msgstr "Restore" @@ -2431,7 +2476,7 @@ msgstr "Restore" msgid "Restore the last saved workspace. Unsaved work on the computer is lost." msgstr "Restore the last saved workspace. Unsaved work on the computer is lost." -#: src/App.tsx:135 +#: src/App.tsx:139 msgid "Retry now" msgstr "Retry now" @@ -2439,7 +2484,7 @@ msgstr "Retry now" msgid "Return to Sentra Bot" msgstr "Return to Sentra Bot" -#: src/pages/PluginsOverlay.tsx:716 +#: src/pages/PluginsOverlay.tsx:718 msgid "Reusable SKILL.md playbooks your agents follow. Install one and invoke it with /Name in the composer." msgstr "Reusable SKILL.md playbooks your agents follow. Install one and invoke it with /Name in the composer." @@ -2447,17 +2492,13 @@ msgstr "Reusable SKILL.md playbooks your agents follow. Install one and invoke i msgid "Revoke" msgstr "Revoke" -#: src/pages/AccountSettingsOverlay.tsx:189 -msgid "Robot" -msgstr "Robot" - #: src/pages/RoutineEditor.tsx:571 msgid "Rotate key" msgstr "Rotate key" #: src/pages/RoutineEditor.tsx:247 -#: src/pages/Shell.tsx:3169 -#: src/pages/Shell.tsx:3179 +#: src/pages/Shell.tsx:3163 +#: src/pages/Shell.tsx:3173 msgid "Routine" msgstr "Routine" @@ -2474,7 +2515,7 @@ msgstr "Run at" msgid "Run history" msgstr "Run history" -#: src/pages/Shell.tsx:3162 +#: src/pages/Shell.tsx:3156 msgid "Run time must be in the future." msgstr "Run time must be in the future." @@ -2495,7 +2536,7 @@ msgstr "Running…" #: src/pages/GroupPanel.tsx:224 #: src/pages/ModelSettingsOverlay.tsx:675 #: src/pages/RoutineEditor.tsx:479 -#: src/pages/Shell.tsx:5489 +#: src/pages/Shell.tsx:4404 msgid "Save" msgstr "Save" @@ -2537,12 +2578,12 @@ msgid "Say yes or no, or answer in a sentence." msgstr "Say yes or no, or answer in a sentence." #: src/pages/ModelSettingsOverlay.tsx:939 -#: src/pages/Shell.tsx:2268 +#: src/pages/Shell.tsx:2257 msgid "Search" msgstr "Search" -#: src/pages/PluginsOverlay.tsx:598 #: src/pages/PluginsOverlay.tsx:599 +#: src/pages/PluginsOverlay.tsx:600 msgid "Search apps" msgstr "Search apps" @@ -2555,8 +2596,8 @@ msgstr "Search models" msgid "Search providers" msgstr "Search providers" -#: src/pages/Onboarding.tsx:274 -#: src/pages/Onboarding.tsx:275 +#: src/pages/Onboarding.tsx:288 +#: src/pages/Onboarding.tsx:289 msgid "Search providers and models" msgstr "Search providers and models" @@ -2564,11 +2605,11 @@ msgstr "Search providers and models" msgid "Searching…" msgstr "Searching…" -#: src/pages/Shell.tsx:2709 +#: src/pages/Shell.tsx:2698 msgid "Select a bot" msgstr "Select a bot" -#: src/pages/Shell.tsx:4423 +#: src/components/composer/Composer.tsx:563 msgid "Send" msgstr "Send" @@ -2580,6 +2621,10 @@ msgstr "Send answer" msgid "Send it" msgstr "Send it" +#: src/pages/ResetPassword.tsx:103 +msgid "Send reset link" +msgstr "Send reset link" + #: src/components/AskCard.tsx:97 #: src/components/AskCard.tsx:126 #: src/components/AskCard.tsx:150 @@ -2587,7 +2632,7 @@ msgstr "Send it" msgid "Sending…" msgstr "Sending…" -#: src/pages/PluginsOverlay.tsx:839 +#: src/pages/PluginsOverlay.tsx:841 msgid "Sentra Bot verifies the source before saving it. Credentials are encrypted and are never returned to clients or exposed to the model." msgstr "Sentra Bot verifies the source before saving it. Credentials are encrypted and are never returned to clients or exposed to the model." @@ -2601,55 +2646,57 @@ msgstr "Server name" #: src/pages/McpServersOverlay.tsx:317 #: src/pages/ModelSettingsOverlay.tsx:401 -#: src/pages/Onboarding.tsx:311 +#: src/pages/Onboarding.tsx:325 msgid "Server URL" msgstr "Server URL" -#: src/pages/Shell.tsx:2718 +#: src/pages/Shell.tsx:2712 msgid "Set up voice to call" msgstr "Set up voice to call" -#: src/pages/AccountSettingsOverlay.tsx:113 -#: src/pages/Shell.tsx:2578 -#: src/pages/Shell.tsx:2588 -#: src/pages/Shell.tsx:2859 +#: src/pages/AccountSettingsOverlay.tsx:92 +#: src/pages/Shell.tsx:2567 +#: src/pages/Shell.tsx:2577 +#: src/pages/Shell.tsx:2853 msgid "Settings" msgstr "Settings" -#: src/pages/Shell.tsx:4441 +#: src/components/composer/Composer.tsx:581 msgid "Settings: General" msgstr "Settings: General" -#: src/pages/Shell.tsx:4443 +#: src/components/composer/Composer.tsx:583 msgid "Settings: Usage" msgstr "Settings: Usage" #: src/pages/ModelSettingsOverlay.tsx:413 -#: src/pages/Onboarding.tsx:323 +#: src/pages/Onboarding.tsx:337 msgid "Setup help" msgstr "Setup help" #: src/pages/MemorySettingsOverlay.tsx:39 -#: src/pages/Shell.tsx:5408 +#: src/pages/Shell.tsx:4323 msgid "Shared" msgstr "Shared" -#: src/pages/Shell.tsx:2870 +#: src/pages/Shell.tsx:2864 msgid "Show computer" msgstr "Show computer" -#: src/pages/Auth.tsx:95 +#: src/pages/Auth.tsx:122 +#: src/pages/ResetPassword.tsx:186 msgid "Show password" msgstr "Show password" -#: src/pages/Shell.tsx:2870 +#: src/pages/Shell.tsx:2864 msgid "Show settings" msgstr "Show settings" #: src/lib/localized-provider-hint.ts:7 -#: src/pages/Auth.tsx:161 +#: src/pages/Auth.tsx:171 #: src/pages/ModelSettingsOverlay.tsx:618 -#: src/pages/Onboarding.tsx:151 +#: src/pages/Onboarding.tsx:165 +#: src/pages/ResetPassword.tsx:155 msgid "Sign in" msgstr "Sign in" @@ -2657,28 +2704,32 @@ msgstr "Sign in" msgid "Sign in  →" msgstr "Sign in  →" -#: src/pages/Auth.tsx:17 +#: src/pages/Auth.tsx:142 +msgid "Sign in instead" +msgstr "Sign in instead" + +#: src/pages/Auth.tsx:29 msgid "Sign in to Sentra Bot" msgstr "Sign in to Sentra Bot" -#: src/pages/Auth.tsx:154 +#: src/pages/Auth.tsx:164 msgid "Sign up" msgstr "Sign up" #. placeholder {0}: skill.name -#: src/pages/Shell.tsx:4251 +#: src/components/composer/Composer.tsx:391 msgid "Skill {0}" msgstr "Skill {0}" -#: src/pages/PluginsOverlay.tsx:713 +#: src/pages/PluginsOverlay.tsx:715 msgid "Skills" msgstr "Skills" -#: src/pages/Shell.tsx:4588 +#: src/pages/Shell.tsx:3974 msgid "Skip" msgstr "Skip" -#: src/pages/Onboarding.tsx:548 +#: src/pages/Onboarding.tsx:562 msgid "Skip for now" msgstr "Skip for now" @@ -2687,7 +2738,7 @@ msgid "Skip or deploy key" msgstr "Skip or deploy key" #. placeholder {0}: skipped.join(", ") -#: src/pages/Shell.tsx:1763 +#: src/pages/Shell.tsx:1746 msgid "Skipped {0}" msgstr "Skipped {0}" @@ -2704,21 +2755,21 @@ msgstr "Software update" msgid "Space interrupts · Esc hangs up" msgstr "Space interrupts · Esc hangs up" -#: src/pages/Shell.tsx:4739 -#: src/pages/Shell.tsx:5002 +#: src/components/conversation/MessageView.tsx:159 +#: src/components/conversation/MessageView.tsx:422 msgid "Speak" msgstr "Speak" -#: src/pages/VoiceSettingsOverlay.tsx:194 +#: src/pages/VoiceSettingsOverlay.tsx:199 msgid "Speak + transcribe" msgstr "Speak + transcribe" -#: src/pages/VoiceSettingsOverlay.tsx:196 +#: src/pages/VoiceSettingsOverlay.tsx:201 msgid "Speak only" msgstr "Speak only" -#: src/pages/Shell.tsx:4735 -#: src/pages/Shell.tsx:4998 +#: src/components/conversation/MessageView.tsx:155 +#: src/components/conversation/MessageView.tsx:418 msgid "Speak this reply" msgstr "Speak this reply" @@ -2726,11 +2777,11 @@ msgstr "Speak this reply" msgid "Speaking…" msgstr "Speaking…" -#: src/pages/Onboarding.tsx:560 +#: src/pages/Onboarding.tsx:574 msgid "Start from a proven Chief of Staff, or build your own from scratch." msgstr "Start from a proven Chief of Staff, or build your own from scratch." -#: src/pages/Onboarding.tsx:644 +#: src/pages/Onboarding.tsx:658 msgid "Start from scratch" msgstr "Start from scratch" @@ -2744,7 +2795,7 @@ msgstr "Starting" #: src/components/teach/TeachComputerSection.tsx:115 #: src/pages/ModelSettingsOverlay.tsx:616 -#: src/pages/Onboarding.tsx:487 +#: src/pages/Onboarding.tsx:501 msgid "Starting…" msgstr "Starting…" @@ -2752,20 +2803,20 @@ msgstr "Starting…" msgid "Steps" msgstr "Steps" -#: src/pages/Shell.tsx:3568 -#: src/pages/Shell.tsx:3572 -#: src/pages/Shell.tsx:4414 -#: src/pages/Shell.tsx:4739 -#: src/pages/Shell.tsx:5002 +#: src/components/composer/Composer.tsx:554 +#: src/components/conversation/MessageView.tsx:159 +#: src/components/conversation/MessageView.tsx:422 +#: src/pages/Shell.tsx:3557 +#: src/pages/Shell.tsx:3561 msgid "Stop" msgstr "Stop" -#: src/pages/Shell.tsx:4306 +#: src/components/composer/Composer.tsx:446 msgid "Stop dictation" msgstr "Stop dictation" -#: src/pages/Shell.tsx:4735 -#: src/pages/Shell.tsx:4998 +#: src/components/conversation/MessageView.tsx:155 +#: src/components/conversation/MessageView.tsx:418 msgid "Stop speaking" msgstr "Stop speaking" @@ -2774,8 +2825,8 @@ msgstr "Stop speaking" msgid "Stop teaching" msgstr "Stop teaching" -#: src/pages/Shell.tsx:2953 -#: src/pages/Shell.tsx:3588 +#: src/pages/Shell.tsx:2947 +#: src/pages/Shell.tsx:3577 msgid "Stop the bot first" msgstr "Stop the bot first" @@ -2788,13 +2839,13 @@ msgstr "Stopped." msgid "Stored encrypted" msgstr "Stored encrypted" -#: src/pages/Shell.tsx:4856 +#: src/components/conversation/MessageView.tsx:276 msgid "subagent" msgstr "subagent" #: src/components/AskCard.tsx:126 #: src/pages/ModelSettingsOverlay.tsx:576 -#: src/pages/Onboarding.tsx:449 +#: src/pages/Onboarding.tsx:463 msgid "Submit" msgstr "Submit" @@ -2806,8 +2857,8 @@ msgstr "Submitted" msgid "Switching…" msgstr "Switching…" -#: src/pages/Shell.tsx:2956 -#: src/pages/Shell.tsx:3593 +#: src/pages/Shell.tsx:2950 +#: src/pages/Shell.tsx:3582 msgid "Take control" msgstr "Take control" @@ -2815,7 +2866,7 @@ msgstr "Take control" msgid "Teach a task" msgstr "Teach a task" -#: src/pages/Shell.tsx:2783 +#: src/pages/Shell.tsx:2777 msgid "Teaching in progress — stop teaching before sending a new message." msgstr "Teaching in progress — stop teaching before sending a new message." @@ -2823,11 +2874,11 @@ msgstr "Teaching in progress — stop teaching before sending a new message." msgid "Teaching needs a graphical sandbox computer. Desktop-host bots can run shell tasks, but not screen recording." msgstr "Teaching needs a graphical sandbox computer. Desktop-host bots can run shell tasks, but not screen recording." -#: src/pages/Shell.tsx:5093 +#: src/pages/Shell.tsx:4008 msgid "Team" msgstr "Team" -#: src/pages/Shell.tsx:5943 +#: src/pages/Shell.tsx:4858 msgid "Team Computer" msgstr "Team Computer" @@ -2852,20 +2903,20 @@ msgstr "The API did not come back. Refresh this page." msgid "The selected memory provider is not available in this build." msgstr "The selected memory provider is not available in this build." -#: src/pages/Shell.tsx:5385 +#: src/pages/Shell.tsx:4300 msgid "Thinking" msgstr "Thinking" -#: src/pages/Shell.tsx:2896 +#: src/pages/Shell.tsx:2890 msgid "This bot runs on this computer, not a Linux desktop. Shell and files use your home folder." msgstr "This bot runs on this computer, not a Linux desktop. Shell and files use your home folder." -#: src/pages/Shell.tsx:3617 +#: src/pages/Shell.tsx:3606 msgid "This bot runs on this computer. There is no separate Linux desktop. Ask it to use the shell; working directories under your home folder are allowed." msgstr "This bot runs on this computer. There is no separate Linux desktop. Ask it to use the shell; working directories under your home folder are allowed." -#: src/pages/Shell.tsx:5785 -#: src/pages/Shell.tsx:5864 +#: src/pages/Shell.tsx:4700 +#: src/pages/Shell.tsx:4779 msgid "This cannot be undone." msgstr "This cannot be undone." @@ -2881,6 +2932,10 @@ msgstr "This computer runs shell commands with your account, including files in msgid "This file is not valid UTF-8 Markdown." msgstr "This file is not valid UTF-8 Markdown." +#: src/pages/ResetPassword.tsx:70 +msgid "This link has expired" +msgstr "This link has expired" + #: src/pages/HostComputerPrompt.tsx:14 msgid "this Mac" msgstr "this Mac" @@ -2889,15 +2944,15 @@ msgstr "this Mac" msgid "This Mac runs shell commands with your account, including files in your home folder. Do not turn it on for a shared or public server." msgstr "This Mac runs shell commands with your account, including files in your home folder. Do not turn it on for a shared or public server." -#: src/pages/Shell.tsx:5670 +#: src/pages/Shell.tsx:4585 msgid "This permanently removes every message and stops current work. The chat remains available." msgstr "This permanently removes every message and stops current work. The chat remains available." -#: src/pages/Onboarding.tsx:523 +#: src/pages/Onboarding.tsx:537 msgid "This provider cannot paste a key here. Skip if this deployment already has credentials." msgstr "This provider cannot paste a key here. Skip if this deployment already has credentials." -#: src/pages/Shell.tsx:6210 +#: src/components/conversation/MessageView.tsx:756 msgid "This server cannot be assigned without a bot." msgstr "This server cannot be assigned without a bot." @@ -2909,7 +2964,7 @@ msgstr "This server did not request browser authorization." msgid "This server is already connected. Disconnect it first to authorize again." msgstr "This server is already connected. Disconnect it first to authorize again." -#: src/pages/Shell.tsx:6249 +#: src/components/conversation/MessageView.tsx:795 msgid "This server uses browser sign-in. Authorize it to let your agents use its tools — a popup will open." msgstr "This server uses browser sign-in. Authorize it to let your agents use its tools — a popup will open." @@ -2921,17 +2976,17 @@ msgstr "This subscription sign-in is not available in Sentra Bot yet. Use a depl msgid "Time of day" msgstr "Time of day" -#: src/pages/Onboarding.tsx:672 -#: src/pages/Shell.tsx:5160 -#: src/pages/Shell.tsx:5326 +#: src/pages/Onboarding.tsx:686 +#: src/pages/Shell.tsx:4075 +#: src/pages/Shell.tsx:4241 msgid "Title" msgstr "Title" -#: src/pages/PluginsOverlay.tsx:872 +#: src/pages/PluginsOverlay.tsx:874 msgid "Tool sources" msgstr "Tool sources" -#: src/pages/PluginsOverlay.tsx:834 +#: src/pages/PluginsOverlay.tsx:836 msgid "Treg token" msgstr "Treg token" @@ -2952,7 +3007,7 @@ msgid "Unpin" msgstr "Unpin" #. placeholder {0}: pending.file.name -#: src/pages/Shell.tsx:1834 +#: src/pages/Shell.tsx:1821 msgid "Unsupported file type: {0}" msgstr "Unsupported file type: {0}" @@ -2981,6 +3036,10 @@ msgstr "Update failed" msgid "Update finished with errors" msgstr "Update finished with errors" +#: src/pages/ResetPassword.tsx:206 +msgid "Update password" +msgstr "Update password" + #: src/components/SoftwareUpdateSection.tsx:172 #: src/components/SoftwareUpdateSection.tsx:189 msgid "Updated" @@ -2991,8 +3050,8 @@ msgstr "Updated" msgid "Updating…" msgstr "Updating…" -#: src/pages/AccountSettingsOverlay.tsx:212 -#: src/pages/Shell.tsx:2639 +#: src/pages/AccountSettingsOverlay.tsx:145 +#: src/pages/Shell.tsx:2628 msgid "Usage" msgstr "Usage" @@ -3001,7 +3060,7 @@ msgid "Use {hostLabel}" msgstr "Use {hostLabel}" #: src/pages/ModelSettingsOverlay.tsx:485 -#: src/pages/Onboarding.tsx:382 +#: src/pages/Onboarding.tsx:396 msgid "Use a found model" msgstr "Use a found model" @@ -3009,25 +3068,25 @@ msgstr "Use a found model" msgid "Use this model" msgstr "Use this model" -#: src/pages/PluginsOverlay.tsx:855 +#: src/pages/PluginsOverlay.tsx:857 msgid "Verify and add" msgstr "Verify and add" -#: src/pages/PluginsOverlay.tsx:853 +#: src/pages/PluginsOverlay.tsx:855 msgid "Verifying…" msgstr "Verifying…" -#: src/pages/Shell.tsx:2627 -#: src/pages/Shell.tsx:5438 -#: src/pages/VoiceSettingsOverlay.tsx:124 -#: src/pages/VoiceSettingsOverlay.tsx:264 +#: src/pages/Shell.tsx:2616 +#: src/pages/Shell.tsx:4353 +#: src/pages/VoiceSettingsOverlay.tsx:129 +#: src/pages/VoiceSettingsOverlay.tsx:269 msgid "Voice" msgstr "Voice" #: src/pages/ModelSettingsOverlay.tsx:580 #: src/pages/ModelSettingsOverlay.tsx:602 -#: src/pages/Onboarding.tsx:453 -#: src/pages/Onboarding.tsx:475 +#: src/pages/Onboarding.tsx:467 +#: src/pages/Onboarding.tsx:489 msgid "Waiting for sign-in…" msgstr "Waiting for sign-in…" @@ -3039,7 +3098,7 @@ msgstr "Waiting for the API to come back…" msgid "Waiting for your message…" msgstr "Waiting for your message…" -#: src/pages/Shell.tsx:6093 +#: src/components/conversation/MessageView.tsx:639 msgid "Waiting…" msgstr "Waiting…" @@ -3053,7 +3112,7 @@ msgstr "Webhook" msgid "Weekdays" msgstr "Weekdays" -#: src/pages/Shell.tsx:5755 +#: src/pages/Shell.tsx:4670 msgid "What about its memories?" msgstr "What about its memories?" @@ -3065,8 +3124,8 @@ msgstr "What result will you demonstrate?" msgid "What should this routine do each time it runs?" msgstr "What should this routine do each time it runs?" -#: src/pages/Onboarding.tsx:685 -#: src/pages/Shell.tsx:5175 +#: src/pages/Onboarding.tsx:699 +#: src/pages/Shell.tsx:4090 msgid "What this bot is for" msgstr "What this bot is for" @@ -3099,17 +3158,19 @@ msgstr "When to use" msgid "Where should bots run?" msgstr "Where should bots run?" -#: src/pages/Auth.tsx:142 +#: src/pages/Auth.tsx:152 #: src/pages/CallView.tsx:242 +#: src/pages/ResetPassword.tsx:103 +#: src/pages/ResetPassword.tsx:206 msgid "Working…" msgstr "Working…" -#: src/pages/Shell.tsx:5368 +#: src/pages/Shell.tsx:4283 msgid "Workspace default" msgstr "Workspace default" -#: src/pages/Shell.tsx:1558 -#: src/pages/Shell.tsx:2175 +#: src/pages/Shell.tsx:1541 +#: src/pages/Shell.tsx:2164 msgid "You" msgstr "You" @@ -3121,16 +3182,21 @@ msgstr "You can close this tab if it does not redirect automatically." msgid "You can close this window." msgstr "You can close this window." -#: src/pages/Shell.tsx:2933 -#: src/pages/Shell.tsx:3558 +#: src/pages/Shell.tsx:2927 +#: src/pages/Shell.tsx:3547 msgid "You have control" msgstr "You have control" -#: src/pages/Onboarding.tsx:660 +#: src/pages/ResetPassword.tsx:152 +msgid "You’ve been signed out everywhere. Sign in with your new password." +msgstr "You’ve been signed out everywhere. Sign in with your new password." + +#: src/pages/Onboarding.tsx:674 msgid "Your bot" msgstr "Your bot" -#: src/pages/Auth.tsx:69 +#: src/pages/Auth.tsx:80 +#: src/pages/ResetPassword.tsx:89 msgid "Your email address" msgstr "Your email address" @@ -3138,7 +3204,7 @@ msgstr "Your email address" msgid "Your key or subscription token is stored securely and is never shown here." msgstr "Your key or subscription token is stored securely and is never shown here." -#: src/pages/Auth.tsx:56 +#: src/pages/Auth.tsx:67 msgid "Your name" msgstr "Your name" diff --git a/apps/web/src/locales/hi/messages.po b/apps/web/src/locales/hi/messages.po index 66d5f581..99905e94 100644 --- a/apps/web/src/locales/hi/messages.po +++ b/apps/web/src/locales/hi/messages.po @@ -13,7 +13,7 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" -#: src/pages/Shell.tsx:2423 +#: src/pages/Shell.tsx:2412 msgid " (unread)" msgstr " (अपठित)" @@ -31,12 +31,12 @@ msgid "{0, plural, one {# model} other {# models}}" msgstr "{0, plural, one {# मॉडल} other {# मॉडल}}" #. placeholder {0}: file.name -#: src/pages/Shell.tsx:1743 +#: src/pages/Shell.tsx:1726 msgid "{0} (max {ATTACHMENT_MAX_COUNT} attachments)" msgstr "{0} (अधिकतम {ATTACHMENT_MAX_COUNT} अटैचमेंट)" #. placeholder {0}: file.name -#: src/pages/Shell.tsx:1747 +#: src/pages/Shell.tsx:1730 msgid "{0} (over 10 MiB)" msgstr "{0} (10 MiB से अधिक)" @@ -46,12 +46,12 @@ msgid "{0} {unitLabel}" msgstr "{0} {unitLabel}" #. placeholder {0}: block.name -#: src/pages/Shell.tsx:6066 +#: src/components/conversation/MessageView.tsx:612 msgid "{0} connection" msgstr "{0} कनेक्शन" #. placeholder {0}: computer.busyBotName -#: src/pages/Shell.tsx:2937 +#: src/pages/Shell.tsx:2931 msgid "{0} is using it" msgstr "{0} इसका उपयोग कर रहा है" @@ -67,8 +67,8 @@ msgstr "{0} MB" #. placeholder {0}: usage.runs #. placeholder {1}: usage.inputTokens + usage.outputTokens -#: src/pages/AccountSettingsOverlay.tsx:216 -#: src/pages/Shell.tsx:2644 +#: src/pages/AccountSettingsOverlay.tsx:149 +#: src/pages/Shell.tsx:2633 msgid "{0} runs · {1} tokens" msgstr "{0} रन · {1} टोकन" @@ -81,7 +81,7 @@ msgstr "{botName} · {0, plural, one {# सहयोगी बॉट} other {# msgid "{botName} has not messaged another bot yet." msgstr "{botName} ने अभी तक किसी दूसरे बॉट को संदेश नहीं भेजा है।" -#: src/pages/Shell.tsx:5943 +#: src/pages/Shell.tsx:4858 msgid "{botName}’s computer" msgstr "{botName} का कंप्यूटर" @@ -125,12 +125,12 @@ msgstr "{size} B" msgid "{title}, {label}" msgstr "{title}, {label}" -#: src/pages/Shell.tsx:3723 +#: src/pages/Shell.tsx:3712 msgid "{workingBotName} is working" msgstr "{workingBotName} काम कर रहा है" #. placeholder {0}: mention.name -#: src/pages/Shell.tsx:4223 +#: src/components/composer/Composer.tsx:363 msgid "@{0}" msgstr "@{0}" @@ -146,11 +146,11 @@ msgstr "+ कोई कार्य सिखाएं" msgid "Access token (optional)" msgstr "एक्सेस टोकन (वैकल्पिक)" -#: src/pages/AccountSettingsOverlay.tsx:128 +#: src/pages/AccountSettingsOverlay.tsx:107 msgid "Account" msgstr "खाता" -#: src/pages/Shell.tsx:5444 +#: src/pages/Shell.tsx:4359 msgid "Account default" msgstr "खाता डिफ़ॉल्ट" @@ -171,17 +171,17 @@ msgstr "" msgid "Active model" msgstr "सक्रिय मॉडल" -#: src/pages/VoiceSettingsOverlay.tsx:149 +#: src/pages/VoiceSettingsOverlay.tsx:154 msgid "Active voice" msgstr "सक्रिय आवाज़" -#: src/pages/Shell.tsx:2213 -#: src/pages/Shell.tsx:2215 +#: src/pages/Shell.tsx:2202 +#: src/pages/Shell.tsx:2204 msgid "Activity" msgstr "गतिविधि" -#: src/pages/PluginsOverlay.tsx:457 -#: src/pages/PluginsOverlay.tsx:668 +#: src/pages/PluginsOverlay.tsx:458 +#: src/pages/PluginsOverlay.tsx:670 #: src/pages/ScratchpadSection.tsx:188 msgid "Add" msgstr "जोड़ें" @@ -190,7 +190,7 @@ msgstr "जोड़ें" msgid "Add a model in Settings to use this." msgstr "" -#: src/pages/Shell.tsx:3157 +#: src/pages/Shell.tsx:3151 msgid "Add a run time for this one-shot." msgstr "" @@ -198,7 +198,7 @@ msgstr "" msgid "Add a schedule or webhook to run this routine." msgstr "" -#: src/pages/Shell.tsx:3129 +#: src/pages/Shell.tsx:3123 msgid "Add a schedule or webhook trigger" msgstr "" @@ -222,15 +222,15 @@ msgstr "एक HTTPS सर्वर URL दर्ज करें।" msgid "Add item" msgstr "आइटम जोड़ें" -#: src/pages/PluginsOverlay.tsx:762 +#: src/pages/PluginsOverlay.tsx:764 msgid "Add MCP server" msgstr "MCP सर्वर जोड़ें" -#: src/pages/PluginsOverlay.tsx:765 +#: src/pages/PluginsOverlay.tsx:767 msgid "Add OpenAPI" msgstr "OpenAPI जोड़ें" -#: src/pages/PluginsOverlay.tsx:780 +#: src/pages/PluginsOverlay.tsx:782 msgid "Add remote MCP server" msgstr "रिमोट MCP सर्वर जोड़ें" @@ -243,7 +243,7 @@ msgstr "सर्वर जोड़ें" msgid "Add to routine" msgstr "रूटीन में जोड़ें" -#: src/pages/PluginsOverlay.tsx:768 +#: src/pages/PluginsOverlay.tsx:770 msgid "Add Treg" msgstr "Treg जोड़ें" @@ -252,15 +252,15 @@ msgid "Add trigger" msgstr "" #: src/pages/McpServersOverlay.tsx:363 -#: src/pages/PluginsOverlay.tsx:452 -#: src/pages/PluginsOverlay.tsx:663 +#: src/pages/PluginsOverlay.tsx:453 +#: src/pages/PluginsOverlay.tsx:665 msgid "Adding…" msgstr "जोड़ा जा रहा है…" -#: src/pages/AccountSettingsOverlay.tsx:247 -#: src/pages/PluginsOverlay.tsx:742 +#: src/pages/AccountSettingsOverlay.tsx:180 +#: src/pages/PluginsOverlay.tsx:744 #: src/pages/RoutineSchedule.tsx:42 -#: src/pages/Shell.tsx:5347 +#: src/pages/Shell.tsx:4262 msgid "Advanced" msgstr "उन्नत" @@ -272,7 +272,7 @@ msgstr "" msgid "Agent access for new servers" msgstr "नए सर्वरों के लिए एजेंट एक्सेस" -#: src/pages/Shell.tsx:2736 +#: src/pages/Shell.tsx:2730 msgid "Agent computer" msgstr "एजेंट कंप्यूटर" @@ -319,7 +319,7 @@ msgstr "खरीद कार्रवाइयों को बिना प msgid "Allowed once" msgstr "एक बार अनुमति दी गई" -#: src/pages/Auth.tsx:159 +#: src/pages/Auth.tsx:169 msgid "Already have an account?" msgstr "पहले से खाता है?" @@ -331,6 +331,10 @@ msgstr "इस टूल को हमेशा अनुमति दें" msgid "Always allowed" msgstr "हमेशा अनुमत" +#: src/pages/Auth.tsx:140 +msgid "An account with this email already exists." +msgstr "" + #: src/components/AskCard.tsx:138 msgid "Answer" msgstr "उत्तर" @@ -352,14 +356,14 @@ msgstr "" #: src/pages/ModelSettingsOverlay.tsx:630 #: src/pages/ModelSettingsOverlay.tsx:633 #: src/pages/ModelSettingsOverlay.tsx:649 -#: src/pages/Onboarding.tsx:496 -#: src/pages/Onboarding.tsx:499 #: src/pages/Onboarding.tsx:510 -#: src/pages/VoiceSettingsOverlay.tsx:236 +#: src/pages/Onboarding.tsx:513 +#: src/pages/Onboarding.tsx:524 +#: src/pages/VoiceSettingsOverlay.tsx:241 msgid "API key" msgstr "API कुंजी" -#: src/pages/PluginsOverlay.tsx:816 +#: src/pages/PluginsOverlay.tsx:818 msgid "API key header" msgstr "API कुंजी हेडर" @@ -371,13 +375,13 @@ msgstr "यह तब लागू होता है जब आप 'सर् msgid "Approval boundaries" msgstr "अनुमोदन सीमाएं" +#: src/components/conversation/MessageView.tsx:805 #: src/pages/PhoneSettingsOverlay.tsx:243 #: src/pages/PhoneSettingsOverlay.tsx:310 -#: src/pages/Shell.tsx:6259 msgid "Approve" msgstr "अनुमोदित करें" -#: src/pages/Shell.tsx:6250 +#: src/components/conversation/MessageView.tsx:796 msgid "Approve this server to let your agent use its tools." msgstr "अपने एजेंट को इसके टूल उपयोग करने देने के लिए इस सर्वर को अनुमोदित करें।" @@ -385,15 +389,15 @@ msgstr "अपने एजेंट को इसके टूल उपयो msgid "Archive" msgstr "आर्काइव करें" -#: src/pages/Shell.tsx:4892 +#: src/components/conversation/MessageView.tsx:312 msgid "archived" msgstr "आर्काइव किया गया" -#: src/pages/Shell.tsx:2487 +#: src/pages/Shell.tsx:2476 msgid "Archived" msgstr "आर्काइव किया गया" -#: src/pages/Shell.tsx:4903 +#: src/components/conversation/MessageView.tsx:323 msgid "Archived. Chat, memory, and files kept." msgstr "आर्काइव किया गया। चैट, मेमोरी और फ़ाइलें सुरक्षित रखी गईं।" @@ -432,7 +436,7 @@ msgstr "खरीद से पहले पूछें" msgid "Ask before sending external email" msgstr "बाहरी ईमेल भेजने से पहले पूछें" -#: src/pages/Shell.tsx:2939 +#: src/pages/Shell.tsx:2933 msgid "Asleep" msgstr "निष्क्रिय" @@ -447,16 +451,21 @@ msgstr "{0} बजे" msgid "at {timeSelect}" msgstr "{timeSelect} बजे" -#: src/pages/Shell.tsx:4297 +#: src/pages/Auth.tsx:134 +#: src/pages/ResetPassword.tsx:197 +msgid "At least 8 characters" +msgstr "" + +#: src/components/composer/Composer.tsx:437 msgid "Attach file" msgstr "फ़ाइल संलग्न करें" -#: src/pages/Shell.tsx:4498 +#: src/components/composer/shared.ts:21 msgid "Attachment" msgstr "अटैचमेंट" #: src/pages/ModelSettingsOverlay.tsx:563 -#: src/pages/Onboarding.tsx:437 +#: src/pages/Onboarding.tsx:451 msgid "Authorization code or callback URL" msgstr "ऑथराइज़ेशन कोड या कॉलबैक URL" @@ -464,12 +473,12 @@ msgstr "ऑथराइज़ेशन कोड या कॉलबैक URL" msgid "Authorization expired — reconnect required" msgstr "ऑथराइज़ेशन समाप्त — पुनः कनेक्ट करना आवश्यक" -#: src/pages/Shell.tsx:6051 +#: src/components/conversation/MessageView.tsx:597 msgid "Authorization timed out. Please try again." msgstr "ऑथराइज़ेशन का समय समाप्त हो गया। कृपया पुनः प्रयास करें।" -#: src/pages/Shell.tsx:6093 -#: src/pages/Shell.tsx:6259 +#: src/components/conversation/MessageView.tsx:639 +#: src/components/conversation/MessageView.tsx:805 msgid "Authorize" msgstr "ऑथराइज़ करें" @@ -477,34 +486,35 @@ msgstr "ऑथराइज़ करें" msgid "Available after the routine is saved" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:161 -msgid "Avatars" -msgstr "" - #: src/pages/RoutineEditor.tsx:243 msgid "Back" msgstr "" +#: src/pages/ResetPassword.tsx:61 +#: src/pages/ResetPassword.tsx:107 +msgid "Back to sign in" +msgstr "" + #: src/pages/memory-providers/SupermemorySettingsForm.tsx:48 msgid "Base URL" msgstr "बेस URL" -#: src/pages/PluginsOverlay.tsx:813 +#: src/pages/PluginsOverlay.tsx:815 msgid "Bearer token" msgstr "बियरर टोकन" -#: src/pages/Shell.tsx:5935 +#: src/pages/Shell.tsx:4850 msgid "Booting live desktop…" msgstr "लाइव डेस्कटॉप शुरू हो रहा है…" #. placeholder {0}: active?.name -#: src/pages/Shell.tsx:3528 +#: src/pages/Shell.tsx:3517 msgid "Booting up {0}’s computer" msgstr "{0} का कंप्यूटर शुरू हो रहा है" -#: src/pages/Shell.tsx:4752 -#: src/pages/Shell.tsx:4753 -#: src/pages/Shell.tsx:4896 +#: src/components/conversation/MessageView.tsx:172 +#: src/components/conversation/MessageView.tsx:173 +#: src/components/conversation/MessageView.tsx:316 msgid "bot" msgstr "बॉट" @@ -513,7 +523,7 @@ msgstr "बॉट" msgid "Bot" msgstr "" -#: src/pages/Shell.tsx:1559 +#: src/pages/Shell.tsx:1542 msgid "Bot" msgstr "बॉट" @@ -521,11 +531,11 @@ msgstr "बॉट" msgid "Bot messages" msgstr "बॉट संदेश" -#: src/pages/Shell.tsx:3625 +#: src/pages/Shell.tsx:3614 msgid "Bot screen" msgstr "बॉट स्क्रीन" -#: src/pages/Shell.tsx:2903 +#: src/pages/Shell.tsx:2897 msgid "Bot screen preview" msgstr "बॉट स्क्रीन प्रीव्यू" @@ -533,36 +543,36 @@ msgstr "बॉट स्क्रीन प्रीव्यू" msgid "Bots act without asking by default. Add an exception only when you want to review a type of action first. These preferences apply across all your bots." msgstr "बॉट डिफ़ॉल्ट रूप से बिना पूछे कार्रवाई करते हैं। अपवाद तभी जोड़ें जब आप किसी प्रकार की कार्रवाई की पहले समीक्षा करना चाहते हों। ये प्राथमिकताएं आपके सभी बॉट्स पर लागू होती हैं।" -#: src/pages/Shell.tsx:3724 +#: src/pages/Shell.tsx:3713 msgid "Bots are working" msgstr "बॉट काम कर रहे हैं" -#: src/pages/VoiceSettingsOverlay.tsx:130 +#: src/pages/VoiceSettingsOverlay.tsx:135 msgid "Bring your own key. The provider is swappable; your bots keep the same speak and call buttons." msgstr "अपनी कुंजी स्वयं लाएं। प्रोवाइडर बदला जा सकता है; आपके बॉट्स के बोलने और कॉल करने वाले बटन वही रहते हैं।" #: src/pages/CallView.tsx:233 -#: src/pages/Shell.tsx:2718 -#: src/pages/Shell.tsx:2719 +#: src/pages/Shell.tsx:2712 +#: src/pages/Shell.tsx:2713 msgid "Call" msgstr "कॉल" -#: src/App.tsx:125 +#: src/App.tsx:129 msgid "Can't reach the server." msgstr "सर्वर तक नहीं पहुंचा जा सका।" #: src/components/AskCard.tsx:161 #: src/components/ComputerMaintenanceActions.tsx:108 #: src/components/teach/TeachComputerSection.tsx:122 -#: src/pages/PluginsOverlay.tsx:864 -#: src/pages/Shell.tsx:5611 -#: src/pages/Shell.tsx:5683 -#: src/pages/Shell.tsx:5798 -#: src/pages/Shell.tsx:5874 +#: src/pages/PluginsOverlay.tsx:866 +#: src/pages/Shell.tsx:4526 +#: src/pages/Shell.tsx:4598 +#: src/pages/Shell.tsx:4713 +#: src/pages/Shell.tsx:4789 msgid "Cancel" msgstr "रद्द करें" -#: src/pages/Shell.tsx:5140 +#: src/pages/Shell.tsx:4055 msgid "Cancel new bot" msgstr "नया बॉट रद्द करें" @@ -570,7 +580,7 @@ msgstr "नया बॉट रद्द करें" msgid "Cancel new group" msgstr "नया समूह रद्द करें" -#: src/pages/Shell.tsx:4170 +#: src/components/composer/Composer.tsx:310 msgid "Cancel reply" msgstr "उत्तर रद्द करें" @@ -582,11 +592,11 @@ msgstr "रद्द किया गया" msgid "Channels" msgstr "" -#: src/pages/Shell.tsx:6156 +#: src/components/conversation/MessageView.tsx:702 msgid "Chart failed to render: {error}" msgstr "चार्ट रेंडर नहीं हो सका: {error}" -#: src/pages/Shell.tsx:4439 +#: src/components/composer/Composer.tsx:579 msgid "Chat Settings" msgstr "चैट सेटिंग्स" @@ -602,11 +612,15 @@ msgstr "" msgid "Check for updates" msgstr "" -#: src/pages/Shell.tsx:3170 -#: src/pages/Shell.tsx:3180 +#: src/pages/Shell.tsx:3164 +#: src/pages/Shell.tsx:3174 msgid "Check in." msgstr "जांच करें।" +#: src/pages/ResetPassword.tsx:52 +msgid "Check your email" +msgstr "" + #: src/components/SoftwareUpdateSection.tsx:71 msgid "Checking…" msgstr "" @@ -615,33 +629,33 @@ msgstr "" msgid "Checkout has local changes. Clean it before updating." msgstr "" -#: src/pages/Onboarding.tsx:269 +#: src/pages/Onboarding.tsx:283 msgid "Choose a model to get started." msgstr "शुरू करने के लिए एक मॉडल चुनें।" +#: src/pages/ResetPassword.tsx:162 +msgid "Choose a new password" +msgstr "" + #: src/pages/ModelSettingsOverlay.tsx:310 msgid "Choose which connected model Sentra Bot uses." msgstr "चुनें कि Sentra Bot किस कनेक्टेड मॉडल का उपयोग करे।" -#: src/pages/AccountSettingsOverlay.tsx:187 -msgid "Clay" -msgstr "" - -#: src/pages/Shell.tsx:5698 +#: src/pages/Shell.tsx:4613 msgid "Clear" msgstr "साफ़ करें" #. placeholder {0}: bot.name -#: src/pages/Shell.tsx:5664 +#: src/pages/Shell.tsx:4579 msgid "Clear {0}’s conversation?" msgstr "{0} की बातचीत साफ़ करें?" #: src/pages/BotContextMenu.tsx:103 -#: src/pages/Shell.tsx:5499 +#: src/pages/Shell.tsx:4414 msgid "Clear conversation" msgstr "बातचीत साफ़ करें" -#: src/pages/Shell.tsx:5698 +#: src/pages/Shell.tsx:4613 msgid "Clearing…" msgstr "साफ़ किया जा रहा है…" @@ -655,19 +669,19 @@ msgstr "बंद करें" msgid "Close bot messages" msgstr "बॉट संदेश बंद करें" -#: src/pages/Shell.tsx:6341 +#: src/components/conversation/MessageView.tsx:887 msgid "Close chart" msgstr "चार्ट बंद करें" -#: src/pages/Shell.tsx:3599 +#: src/pages/Shell.tsx:3588 msgid "Close computer" msgstr "कंप्यूटर बंद करें" -#: src/pages/Shell.tsx:6441 +#: src/components/conversation/MessageView.tsx:987 msgid "Close image preview" msgstr "छवि प्रीव्यू बंद करें" -#: src/pages/PluginsOverlay.tsx:586 +#: src/pages/PluginsOverlay.tsx:587 msgid "Close integrations" msgstr "इंटीग्रेशन बंद करें" @@ -683,11 +697,11 @@ msgstr "मेमोरी सेटिंग्स बंद करें" msgid "Close model settings" msgstr "मॉडल सेटिंग्स बंद करें" -#: src/pages/Shell.tsx:2195 +#: src/pages/Shell.tsx:2184 msgid "Close navigation" msgstr "नेविगेशन बंद करें" -#: src/pages/Shell.tsx:2881 +#: src/pages/Shell.tsx:2875 msgid "Close panel" msgstr "पैनल बंद करें" @@ -700,11 +714,11 @@ msgstr "" msgid "Close preview" msgstr "प्रीव्यू बंद करें" -#: src/pages/AccountSettingsOverlay.tsx:118 +#: src/pages/AccountSettingsOverlay.tsx:97 msgid "Close user settings" msgstr "उपयोगकर्ता सेटिंग्स बंद करें" -#: src/pages/VoiceSettingsOverlay.tsx:139 +#: src/pages/VoiceSettingsOverlay.tsx:144 msgid "Close voice settings" msgstr "आवाज़ सेटिंग्स बंद करें" @@ -718,7 +732,7 @@ msgid "Code" msgstr "" #. placeholder {0}: group.title -#: src/pages/Shell.tsx:2305 +#: src/pages/Shell.tsx:2294 msgid "Collapse {0}" msgstr "" @@ -734,28 +748,28 @@ msgstr "कमांड" msgid "Complete" msgstr "पूर्ण" -#: src/pages/Shell.tsx:5050 -#: src/pages/Shell.tsx:5078 +#: src/components/conversation/MessageView.tsx:470 +#: src/pages/Shell.tsx:3993 msgid "Computer" msgstr "कंप्यूटर" -#: src/pages/Shell.tsx:5938 +#: src/pages/Shell.tsx:4853 msgid "Computer failed to boot" msgstr "कंप्यूटर शुरू नहीं हो सका" -#: src/pages/Shell.tsx:3647 +#: src/pages/Shell.tsx:3636 msgid "Computer is asleep" msgstr "कंप्यूटर निष्क्रिय है" -#: src/pages/Shell.tsx:5937 +#: src/pages/Shell.tsx:4852 msgid "Computer is asleep. Take control to wake it." msgstr "कंप्यूटर सो रहा है। जगाने के लिए नियंत्रण लें।" -#: src/pages/Shell.tsx:5939 +#: src/pages/Shell.tsx:4854 msgid "Computer is stopped" msgstr "कंप्यूटर रुका हुआ है" -#: src/pages/AccountSettingsOverlay.tsx:234 +#: src/pages/AccountSettingsOverlay.tsx:167 msgid "Computers" msgstr "कंप्यूटर" @@ -776,12 +790,12 @@ msgid "Confirm delete" msgstr "डिलीट की पुष्टि करें" #: src/pages/memory-providers/SupermemorySettingsForm.tsx:80 -#: src/pages/PluginsOverlay.tsx:494 -#: src/pages/VoiceSettingsOverlay.tsx:257 +#: src/pages/PluginsOverlay.tsx:495 +#: src/pages/VoiceSettingsOverlay.tsx:262 msgid "Connect" msgstr "कनेक्ट करें" -#: src/pages/Onboarding.tsx:266 +#: src/pages/Onboarding.tsx:280 msgid "Connect a model" msgstr "एक मॉडल कनेक्ट करें" @@ -789,11 +803,11 @@ msgstr "एक मॉडल कनेक्ट करें" msgid "Connect API key" msgstr "API कुंजी कनेक्ट करें" -#: src/pages/VoiceSettingsOverlay.tsx:160 +#: src/pages/VoiceSettingsOverlay.tsx:165 msgid "Connect ElevenLabs, OpenAI, or Cartesia" msgstr "ElevenLabs, OpenAI या Cartesia कनेक्ट करें" -#: src/pages/Shell.tsx:6239 +#: src/components/conversation/MessageView.tsx:785 msgid "Connect MCP server “{name}”" msgstr "MCP सर्वर “{name}” कनेक्ट करें" @@ -809,31 +823,31 @@ msgstr "रिमोट या लोकल टूल सर्वर कने msgid "Connect this provider to use it as your personal model." msgstr "इस प्रोवाइडर को अपने व्यक्तिगत मॉडल के रूप में उपयोग करने के लिए कनेक्ट करें।" -#: src/pages/PluginsOverlay.tsx:778 +#: src/pages/PluginsOverlay.tsx:780 msgid "Connect Treg" msgstr "Treg कनेक्ट करें" +#: src/components/conversation/MessageView.tsx:636 #: src/pages/McpOAuthCallback.tsx:53 #: src/pages/MemorySettingsOverlay.tsx:163 #: src/pages/ModelSettingsOverlay.tsx:378 -#: src/pages/Shell.tsx:6090 -#: src/pages/VoiceSettingsOverlay.tsx:202 +#: src/pages/VoiceSettingsOverlay.tsx:207 msgid "Connected" msgstr "कनेक्टेड" -#: src/pages/Shell.tsx:6269 +#: src/components/conversation/MessageView.tsx:815 msgid "Connected — its tools are available from your next message." msgstr "कनेक्टेड — इसके टूल आपके अगले संदेश से उपलब्ध हैं।" #. placeholder {0}: credential.label #. placeholder {0}: selected.name #: src/pages/ModelSettingsOverlay.tsx:522 -#: src/pages/VoiceSettingsOverlay.tsx:223 +#: src/pages/VoiceSettingsOverlay.tsx:228 msgid "Connected · {0}" msgstr "कनेक्टेड · {0}" #. placeholder {0}: selected.name -#: src/pages/VoiceSettingsOverlay.tsx:73 +#: src/pages/VoiceSettingsOverlay.tsx:78 msgid "Connected {0}." msgstr "{0} कनेक्ट किया गया।" @@ -844,29 +858,29 @@ msgstr "{0} कनेक्ट किया गया।" msgid "Connected and using {0}." msgstr "{0} कनेक्ट किया गया और उपयोग में है।" +#: src/components/conversation/MessageView.tsx:805 #: src/pages/McpServersOverlay.tsx:16 #: src/pages/memory-providers/SupermemorySettingsForm.tsx:80 -#: src/pages/PluginsOverlay.tsx:494 -#: src/pages/Shell.tsx:6259 -#: src/pages/VoiceSettingsOverlay.tsx:253 +#: src/pages/PluginsOverlay.tsx:495 +#: src/pages/VoiceSettingsOverlay.tsx:258 msgid "Connecting…" msgstr "कनेक्ट हो रहा है…" #. placeholder {0}: item.name -#: src/pages/PluginsOverlay.tsx:297 +#: src/pages/PluginsOverlay.tsx:298 msgid "Connection to {0} is still pending. You can close this and check again." msgstr "{0} से कनेक्शन अभी लंबित है। आप इसे बंद करके बाद में जांच सकते हैं।" -#: src/pages/Onboarding.tsx:538 -#: src/pages/Onboarding.tsx:697 +#: src/pages/Onboarding.tsx:552 +#: src/pages/Onboarding.tsx:711 msgid "Continue" msgstr "जारी रखें" -#: src/pages/Auth.tsx:144 +#: src/pages/Auth.tsx:154 msgid "Continue with email" msgstr "ईमेल से जारी रखें" -#: src/pages/Shell.tsx:4535 +#: src/pages/Shell.tsx:3921 msgid "Copy" msgstr "कॉपी करें" @@ -878,11 +892,11 @@ msgstr "जोड़ा नहीं जा सका" msgid "Could not add MCP server" msgstr "MCP सर्वर जोड़ा नहीं जा सका" -#: src/pages/Shell.tsx:6226 +#: src/components/conversation/MessageView.tsx:772 msgid "Could not approve this server" msgstr "इस सर्वर को अनुमोदित नहीं किया जा सका" -#: src/pages/Shell.tsx:6054 +#: src/components/conversation/MessageView.tsx:600 msgid "Could not authorize this app" msgstr "इस ऐप को ऑथराइज़ नहीं किया जा सका" @@ -890,7 +904,7 @@ msgstr "इस ऐप को ऑथराइज़ नहीं किया ज msgid "Could not change the default model" msgstr "डिफ़ॉल्ट मॉडल बदला नहीं जा सका" -#: src/pages/Shell.tsx:5692 +#: src/pages/Shell.tsx:4607 msgid "Could not clear conversation" msgstr "बातचीत साफ़ नहीं की जा सकी" @@ -898,7 +912,7 @@ msgstr "बातचीत साफ़ नहीं की जा सकी" msgid "Could not complete OAuth" msgstr "OAuth पूरा नहीं हो सका" -#: src/pages/PluginsOverlay.tsx:301 +#: src/pages/PluginsOverlay.tsx:302 msgid "Could not connect" msgstr "कनेक्ट नहीं हो सका" @@ -911,15 +925,15 @@ msgstr "{0} कनेक्ट नहीं हो सका" msgid "Could not connect this provider" msgstr "यह प्रोवाइडर कनेक्ट नहीं हो सका" -#: src/pages/VoiceSettingsOverlay.tsx:75 +#: src/pages/VoiceSettingsOverlay.tsx:80 msgid "Could not connect this voice provider" msgstr "यह आवाज़ प्रोवाइडर कनेक्ट नहीं हो सका" -#: src/pages/Auth.tsx:33 +#: src/pages/Auth.tsx:50 msgid "Could not continue" msgstr "जारी नहीं रखा जा सका" -#: src/pages/Shell.tsx:5128 +#: src/pages/Shell.tsx:4043 msgid "Could not create bot" msgstr "बॉट नहीं बनाया जा सका" @@ -927,19 +941,19 @@ msgstr "बॉट नहीं बनाया जा सका" msgid "Could not create group" msgstr "समूह नहीं बनाया जा सका" -#: src/pages/Shell.tsx:5583 +#: src/pages/Shell.tsx:4498 msgid "Could not create section" msgstr "सेक्शन नहीं बनाया जा सका" -#: src/pages/Onboarding.tsx:251 +#: src/pages/Onboarding.tsx:265 msgid "Could not create your bot" msgstr "आपका बॉट नहीं बनाया जा सका" -#: src/pages/Shell.tsx:5807 +#: src/pages/Shell.tsx:4722 msgid "Could not delete bot" msgstr "बॉट डिलीट नहीं किया जा सका" -#: src/pages/Shell.tsx:5887 +#: src/pages/Shell.tsx:4802 msgid "Could not delete group" msgstr "" @@ -947,7 +961,7 @@ msgstr "" msgid "Could not delete MCP server" msgstr "MCP सर्वर डिलीट नहीं किया जा सका" -#: src/pages/Shell.tsx:5888 +#: src/pages/Shell.tsx:4803 msgid "Could not delete routine" msgstr "रूटीन डिलीट नहीं किया जा सका" @@ -968,15 +982,15 @@ msgstr "{0} डाउनलोड नहीं हो सका। पुनः msgid "Could not download {name}. Try again." msgstr "{name} डाउनलोड नहीं हो सका। पुनः प्रयास करें।" -#: src/pages/PluginsOverlay.tsx:952 +#: src/pages/PluginsOverlay.tsx:954 msgid "Could not install connector" msgstr "कनेक्टर इंस्टॉल नहीं हो सका" -#: src/pages/PluginsOverlay.tsx:370 +#: src/pages/PluginsOverlay.tsx:371 msgid "Could not install MCP server" msgstr "" -#: src/pages/PluginsOverlay.tsx:409 +#: src/pages/PluginsOverlay.tsx:410 msgid "Could not install skill" msgstr "" @@ -984,7 +998,7 @@ msgstr "" msgid "Could not load approval rules" msgstr "अनुमोदन नियम लोड नहीं हो सके" -#: src/pages/PluginsOverlay.tsx:130 +#: src/pages/PluginsOverlay.tsx:133 msgid "Could not load integrations" msgstr "इंटीग्रेशन लोड नहीं हो सके" @@ -1004,16 +1018,16 @@ msgstr "यह फ़ाइल लोड नहीं हो सकी।" msgid "Could not load update status" msgstr "" -#: src/pages/VoiceSettingsOverlay.tsx:47 +#: src/pages/VoiceSettingsOverlay.tsx:52 msgid "Could not load voice settings" msgstr "आवाज़ सेटिंग्स लोड नहीं हो सकीं" -#: src/pages/VoiceSettingsOverlay.tsx:109 +#: src/pages/VoiceSettingsOverlay.tsx:114 msgid "Could not play a test clip" msgstr "टेस्ट क्लिप नहीं चलाई जा सकी" #: src/pages/ModelSettingsOverlay.tsx:221 -#: src/pages/Onboarding.tsx:197 +#: src/pages/Onboarding.tsx:211 msgid "Could not reach this model server" msgstr "इस मॉडल सर्वर तक नहीं पहुंचा जा सका" @@ -1021,7 +1035,7 @@ msgstr "इस मॉडल सर्वर तक नहीं पहुंच msgid "Could not remove" msgstr "हटाया नहीं जा सका" -#: src/pages/PluginsOverlay.tsx:965 +#: src/pages/PluginsOverlay.tsx:967 msgid "Could not remove connector" msgstr "कनेक्टर हटाया नहीं जा सका" @@ -1029,7 +1043,7 @@ msgstr "कनेक्टर हटाया नहीं जा सका" msgid "Could not remove group" msgstr "समूह हटाया नहीं जा सका" -#: src/pages/PluginsOverlay.tsx:396 +#: src/pages/PluginsOverlay.tsx:397 msgid "Could not remove MCP server" msgstr "" @@ -1037,23 +1051,27 @@ msgstr "" msgid "Could not remove rule" msgstr "नियम हटाया नहीं जा सका" -#: src/pages/PluginsOverlay.tsx:423 +#: src/pages/PluginsOverlay.tsx:424 msgid "Could not remove skill" msgstr "" -#: src/pages/Shell.tsx:6146 +#: src/components/conversation/MessageView.tsx:692 msgid "Could not render chart" msgstr "चार्ट रेंडर नहीं हो सका" -#: src/pages/PluginsOverlay.tsx:327 +#: src/pages/ResetPassword.tsx:139 +msgid "Could not reset your password" +msgstr "" + +#: src/pages/PluginsOverlay.tsx:328 msgid "Could not revoke connection" msgstr "कनेक्शन रद्द नहीं किया जा सका" -#: src/pages/Shell.tsx:3232 +#: src/pages/Shell.tsx:3226 msgid "Could not run routine" msgstr "" -#: src/pages/Shell.tsx:5484 +#: src/pages/Shell.tsx:4399 msgid "Could not save" msgstr "सहेजा नहीं जा सका" @@ -1065,11 +1083,11 @@ msgstr "" msgid "Could not save group" msgstr "समूह सहेजा नहीं जा सका" -#: src/pages/Onboarding.tsx:224 +#: src/pages/Onboarding.tsx:238 msgid "Could not save model" msgstr "मॉडल सहेजा नहीं जा सका" -#: src/pages/Shell.tsx:3203 +#: src/pages/Shell.tsx:3197 msgid "Could not save routine" msgstr "रूटीन सहेजा नहीं जा सका" @@ -1081,11 +1099,11 @@ msgstr "नियम सहेजा नहीं जा सका" msgid "Could not save that choice" msgstr "वह विकल्प सहेजा नहीं जा सका" -#: src/pages/VoiceSettingsOverlay.tsx:90 +#: src/pages/VoiceSettingsOverlay.tsx:95 msgid "Could not save that voice" msgstr "वह आवाज़ सहेजी नहीं जा सकी" -#: src/pages/Shell.tsx:5966 +#: src/components/conversation/MessageView.tsx:508 msgid "Could not save this choice" msgstr "यह विकल्प सहेजा नहीं जा सका" @@ -1093,8 +1111,12 @@ msgstr "यह विकल्प सहेजा नहीं जा सका" msgid "Could not send that" msgstr "वह भेजा नहीं जा सका" +#: src/pages/ResetPassword.tsx:44 +msgid "Could not send the link. Try again." +msgstr "" + #: src/pages/McpServersOverlay.tsx:172 -#: src/pages/PluginsOverlay.tsx:384 +#: src/pages/PluginsOverlay.tsx:385 msgid "Could not start OAuth" msgstr "OAuth शुरू नहीं हो सका" @@ -1102,7 +1124,7 @@ msgstr "OAuth शुरू नहीं हो सका" msgid "Could not submit this answer" msgstr "यह उत्तर सबमिट नहीं किया जा सका" -#: src/pages/Shell.tsx:2043 +#: src/pages/Shell.tsx:2032 msgid "Could not take control" msgstr "नियंत्रण नहीं लिया जा सका" @@ -1130,26 +1152,22 @@ msgstr "" msgid "Couldn't start WhatsApp pairing" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:93 -msgid "Couldn't update avatars" -msgstr "" - #: src/pages/PhoneSettingsOverlay.tsx:99 msgid "Couldn't update phone settings" msgstr "" -#: src/pages/Shell.tsx:2233 -#: src/pages/Shell.tsx:5187 -#: src/pages/Shell.tsx:5618 +#: src/pages/Shell.tsx:2222 +#: src/pages/Shell.tsx:4102 +#: src/pages/Shell.tsx:4533 msgid "Create" msgstr "बनाएं" #. placeholder {0}: bot.name -#: src/pages/Shell.tsx:5592 +#: src/pages/Shell.tsx:4507 msgid "Create a section and move {0} into it." msgstr "एक सेक्शन बनाएं और {0} को उसमें ले जाएं।" -#: src/pages/Auth.tsx:146 +#: src/pages/Auth.tsx:156 msgid "Create account" msgstr "खाता बनाएं" @@ -1157,29 +1175,29 @@ msgstr "खाता बनाएं" msgid "Create group" msgstr "समूह बनाएं" -#: src/pages/Onboarding.tsx:557 +#: src/pages/Onboarding.tsx:571 msgid "Create your first bot" msgstr "अपना पहला बॉट बनाएं" -#: src/pages/Auth.tsx:17 +#: src/pages/Auth.tsx:29 msgid "Create your Sentra Bot" msgstr "अपना Sentra Bot बनाएं" #: src/pages/GroupPanel.tsx:134 -#: src/pages/Shell.tsx:5187 -#: src/pages/Shell.tsx:5618 +#: src/pages/Shell.tsx:4102 +#: src/pages/Shell.tsx:4533 msgid "Creating…" msgstr "बनाया जा रहा है…" -#: src/pages/PluginsOverlay.tsx:569 +#: src/pages/PluginsOverlay.tsx:570 msgid "Creativity" msgstr "" -#: src/pages/PluginsOverlay.tsx:834 +#: src/pages/PluginsOverlay.tsx:836 msgid "Credential" msgstr "क्रेडेंशियल" -#: src/pages/PluginsOverlay.tsx:892 +#: src/pages/PluginsOverlay.tsx:894 msgid "credential saved" msgstr "क्रेडेंशियल सहेजा गया" @@ -1204,7 +1222,7 @@ msgstr "दिन" msgid "Decline" msgstr "" -#: src/pages/Shell.tsx:5391 +#: src/pages/Shell.tsx:4306 msgid "Default (medium)" msgstr "डिफ़ॉल्ट (मध्यम)" @@ -1215,24 +1233,24 @@ msgstr "डिफ़ॉल्ट स्कोप" #: src/pages/BotContextMenu.tsx:105 #: src/pages/McpServersOverlay.tsx:481 #: src/pages/RoutineEditor.tsx:280 -#: src/pages/Shell.tsx:2522 -#: src/pages/Shell.tsx:2552 -#: src/pages/Shell.tsx:5813 -#: src/pages/Shell.tsx:5895 +#: src/pages/Shell.tsx:2511 +#: src/pages/Shell.tsx:2541 +#: src/pages/Shell.tsx:4728 +#: src/pages/Shell.tsx:4810 msgid "Delete" msgstr "डिलीट करें" #. placeholder {0}: bot.name #. placeholder {0}: group.name -#: src/pages/Shell.tsx:2518 -#: src/pages/Shell.tsx:2548 +#: src/pages/Shell.tsx:2507 +#: src/pages/Shell.tsx:2537 msgid "Delete {0}" msgstr "{0} डिलीट करें" #. placeholder {0}: bot.name #. placeholder {0}: item.name -#: src/pages/Shell.tsx:5745 -#: src/pages/Shell.tsx:5861 +#: src/pages/Shell.tsx:4660 +#: src/pages/Shell.tsx:4776 msgid "Delete {0}?" msgstr "{0} डिलीट करें?" @@ -1240,17 +1258,17 @@ msgstr "{0} डिलीट करें?" msgid "Delete group" msgstr "समूह डिलीट करें" -#: src/pages/Shell.tsx:5782 +#: src/pages/Shell.tsx:4697 msgid "Delete memories too" msgstr "मेमोरी भी डिलीट करें" -#: src/pages/Shell.tsx:4894 +#: src/components/conversation/MessageView.tsx:314 msgid "deleted" msgstr "डिलीट किया गया" #: src/pages/GroupPanel.tsx:232 -#: src/pages/Shell.tsx:5813 -#: src/pages/Shell.tsx:5895 +#: src/pages/Shell.tsx:4728 +#: src/pages/Shell.tsx:4810 msgid "Deleting…" msgstr "डिलीट किया जा रहा है…" @@ -1266,26 +1284,30 @@ msgstr "अस्वीकार करें" msgid "Deployment default" msgstr "डिप्लॉयमेंट डिफ़ॉल्ट" -#: src/pages/Onboarding.tsx:676 -#: src/pages/Shell.tsx:5165 +#: src/pages/Onboarding.tsx:690 +#: src/pages/Shell.tsx:4080 msgid "Describe what this bot does" msgstr "बताएं कि यह बॉट क्या करता है" -#: src/pages/Onboarding.tsx:651 +#: src/pages/Onboarding.tsx:665 msgid "Describe your own bot in the panel." msgstr "" -#: src/pages/Onboarding.tsx:681 -#: src/pages/Shell.tsx:5170 -#: src/pages/Shell.tsx:5335 +#: src/pages/Onboarding.tsx:695 +#: src/pages/Shell.tsx:4085 +#: src/pages/Shell.tsx:4250 msgid "Description" msgstr "विवरण" -#: src/pages/PluginsOverlay.tsx:565 +#: src/pages/Shell.tsx:2704 +msgid "Desktop Runtime offline" +msgstr "" + +#: src/pages/PluginsOverlay.tsx:566 msgid "Developer" msgstr "" -#: src/pages/Shell.tsx:4306 +#: src/components/composer/Composer.tsx:446 msgid "Dictate" msgstr "बोलकर लिखें" @@ -1298,15 +1320,15 @@ msgstr "डिस्कनेक्ट करें" msgid "Disconnecting…" msgstr "डिस्कनेक्ट हो रहा है…" -#: src/pages/Shell.tsx:4153 +#: src/components/composer/Composer.tsx:293 msgid "Dismiss error" msgstr "" -#: src/pages/Shell.tsx:6274 +#: src/components/conversation/MessageView.tsx:820 msgid "Dismissed — reconnect anytime from MCP settings." msgstr "खारिज किया गया — MCP सेटिंग्स से कभी भी पुनः कनेक्ट करें।" -#: src/pages/PluginsOverlay.tsx:788 +#: src/pages/PluginsOverlay.tsx:790 msgid "Display name" msgstr "प्रदर्शित नाम" @@ -1323,7 +1345,7 @@ msgstr "Docker (अनुशंसित)" msgid "Docker is the default: bots use a shared Team Computer." msgstr "Docker डिफ़ॉल्ट है: बॉट एक साझा टीम कंप्यूटर का उपयोग करते हैं।" -#: src/pages/Auth.tsx:152 +#: src/pages/Auth.tsx:162 msgid "Don’t have an account?" msgstr "खाता नहीं है?" @@ -1350,7 +1372,7 @@ msgstr "ड्राफ़्ट स्किल" msgid "Duplicate" msgstr "डुप्लिकेट" -#: src/pages/Shell.tsx:4697 +#: src/components/conversation/MessageView.tsx:117 msgid "Earlier message" msgstr "पुराना संदेश" @@ -1362,7 +1384,8 @@ msgstr "पहले संपादित करें" msgid "Edit Profile" msgstr "प्रोफ़ाइल संपादित करें" -#: src/pages/Auth.tsx:62 +#: src/pages/Auth.tsx:73 +#: src/pages/ResetPassword.tsx:82 msgid "Email" msgstr "ईमेल" @@ -1372,7 +1395,7 @@ msgstr "एन्क्रिप्टेड स्टैटिक क्रे #. placeholder {0}: oauth.verificationUri.replace(/^https:\/\//, "") #: src/pages/ModelSettingsOverlay.tsx:586 -#: src/pages/Onboarding.tsx:459 +#: src/pages/Onboarding.tsx:473 msgid "Enter this code at <0>{0}" msgstr "यह कोड <0>{0} पर दर्ज करें" @@ -1410,16 +1433,16 @@ msgstr "हर महीने" msgid "Every week" msgstr "हर सप्ताह" -#: src/pages/Shell.tsx:6320 +#: src/components/conversation/MessageView.tsx:866 msgid "Expand" msgstr "विस्तृत करें" #. placeholder {0}: group.title -#: src/pages/Shell.tsx:2305 +#: src/pages/Shell.tsx:2294 msgid "Expand {0}" msgstr "" -#: src/pages/Shell.tsx:5496 +#: src/pages/Shell.tsx:4411 msgid "Export" msgstr "एक्सपोर्ट करें" @@ -1427,7 +1450,7 @@ msgstr "एक्सपोर्ट करें" msgid "Export this week's list from the CRM and drop it in the shared folder" msgstr "CRM से इस सप्ताह की सूची एक्सपोर्ट करें और उसे साझा फ़ोल्डर में डालें" -#: src/pages/Shell.tsx:5516 +#: src/pages/Shell.tsx:4431 msgid "Extra high" msgstr "अतिरिक्त उच्च" @@ -1435,14 +1458,14 @@ msgstr "अतिरिक्त उच्च" msgid "Failed" msgstr "विफल" -#: src/pages/Shell.tsx:1878 -#: src/pages/Shell.tsx:1880 -#: src/pages/Shell.tsx:1882 +#: src/pages/Shell.tsx:1867 +#: src/pages/Shell.tsx:1869 +#: src/pages/Shell.tsx:1871 msgid "Failed to send message" msgstr "संदेश भेजने में विफल" -#: src/pages/Shell.tsx:1912 -#: src/pages/Shell.tsx:1931 +#: src/pages/Shell.tsx:1901 +#: src/pages/Shell.tsx:1920 msgid "Failed to stop" msgstr "रोकने में विफल" @@ -1456,18 +1479,18 @@ msgid "Failure handling" msgstr "विफलता प्रबंधन" #: src/pages/ModelSettingsOverlay.tsx:427 -#: src/pages/Onboarding.tsx:336 +#: src/pages/Onboarding.tsx:350 msgid "Find models" msgstr "मॉडल खोजें" #: src/pages/ModelSettingsOverlay.tsx:427 -#: src/pages/Onboarding.tsx:336 +#: src/pages/Onboarding.tsx:350 msgid "Finding…" msgstr "खोजा जा रहा है…" #. placeholder {0}: new URL(oauth.verificationUri).hostname #: src/pages/ModelSettingsOverlay.tsx:546 -#: src/pages/Onboarding.tsx:420 +#: src/pages/Onboarding.tsx:434 msgid "Finish signing in at <0>{0}. The final page may not load; paste its URL or code here." msgstr "<0>{0} पर साइन इन पूरा करें। अंतिम पेज शायद लोड न हो; उसका URL या कोड यहां पेस्ट करें।" @@ -1484,6 +1507,10 @@ msgstr "MCP कनेक्शन पूरा हो रहा है…" msgid "Flag unexpected actions" msgstr "" +#: src/pages/Auth.tsx:99 +msgid "Forgot password?" +msgstr "" + #: src/pages/ModelSettingsOverlay.tsx:1026 msgid "Free" msgstr "" @@ -1497,8 +1524,8 @@ msgid "Git event" msgstr "" #: src/pages/PhoneSettingsOverlay.tsx:224 -#: src/pages/Shell.tsx:2708 -#: src/pages/Shell.tsx:2863 +#: src/pages/Shell.tsx:2697 +#: src/pages/Shell.tsx:2857 msgid "Group" msgstr "समूह" @@ -1524,7 +1551,7 @@ msgid "header" msgstr "" #: src/pages/McpServersOverlay.tsx:342 -#: src/pages/PluginsOverlay.tsx:824 +#: src/pages/PluginsOverlay.tsx:826 msgid "Header name" msgstr "हेडर नाम" @@ -1532,27 +1559,28 @@ msgstr "हेडर नाम" msgid "Header value" msgstr "हेडर मान" -#: src/pages/VoiceSettingsOverlay.tsx:284 +#: src/pages/VoiceSettingsOverlay.tsx:289 msgid "Hear a sample" msgstr "एक नमूना सुनें" -#: src/pages/VoiceSettingsOverlay.tsx:102 +#: src/pages/VoiceSettingsOverlay.tsx:107 msgid "Hi, this is how I'll sound when I read replies out loud." msgstr "नमस्ते, उत्तर पढ़कर सुनाते समय मेरी आवाज़ ऐसी होगी।" -#: src/pages/Auth.tsx:95 +#: src/pages/Auth.tsx:122 +#: src/pages/ResetPassword.tsx:186 msgid "Hide password" msgstr "" -#: src/pages/Shell.tsx:5519 +#: src/pages/Shell.tsx:4434 msgid "High" msgstr "उच्च" -#: src/pages/Shell.tsx:4325 +#: src/components/composer/Composer.tsx:465 msgid "Hold to talk" msgstr "बोलने के लिए दबाए रखें" -#: src/pages/Shell.tsx:4325 +#: src/components/composer/Composer.tsx:465 msgid "Hold to talk (on-device dictation)" msgstr "बोलने के लिए दबाए रखें (डिवाइस पर ही श्रुतलेखन)" @@ -1572,15 +1600,19 @@ msgstr "कितनी बार" msgid "How to check" msgstr "जांच कैसे करें" -#: src/pages/Shell.tsx:4591 +#: src/pages/Shell.tsx:3977 msgid "I’m done" msgstr "मेरा काम हो गया" -#: src/pages/VoiceSettingsOverlay.tsx:107 +#: src/pages/ResetPassword.tsx:54 +msgid "If an account exists for {email}, we sent a link to reset your password. It works for one hour." +msgstr "" + +#: src/pages/VoiceSettingsOverlay.tsx:112 msgid "If you heard that, voice is ready." msgstr "अगर आपने वह सुना, तो आवाज़ तैयार है।" -#: src/pages/AccountSettingsOverlay.tsx:140 +#: src/pages/AccountSettingsOverlay.tsx:119 msgid "iMessage channels and agent connections." msgstr "" @@ -1588,15 +1620,15 @@ msgstr "" msgid "iMessage line" msgstr "" -#: src/pages/PluginsOverlay.tsx:782 +#: src/pages/PluginsOverlay.tsx:784 msgid "Import OpenAPI JSON" msgstr "OpenAPI JSON इम्पोर्ट करें" -#: src/pages/Onboarding.tsx:701 +#: src/pages/Onboarding.tsx:715 msgid "Includes a full operating playbook for this role." msgstr "" -#: src/pages/Shell.tsx:5406 +#: src/pages/Shell.tsx:4321 msgid "Inherit default" msgstr "डिफ़ॉल्ट का पालन करें" @@ -1604,18 +1636,18 @@ msgstr "डिफ़ॉल्ट का पालन करें" msgid "Inputs" msgstr "इनपुट" -#: src/pages/PluginsOverlay.tsx:482 -#: src/pages/PluginsOverlay.tsx:533 +#: src/pages/PluginsOverlay.tsx:483 +#: src/pages/PluginsOverlay.tsx:534 msgid "Install" msgstr "" -#: src/pages/PluginsOverlay.tsx:498 -#: src/pages/PluginsOverlay.tsx:537 +#: src/pages/PluginsOverlay.tsx:499 +#: src/pages/PluginsOverlay.tsx:538 msgid "Installed" msgstr "" -#: src/pages/PluginsOverlay.tsx:482 -#: src/pages/PluginsOverlay.tsx:533 +#: src/pages/PluginsOverlay.tsx:483 +#: src/pages/PluginsOverlay.tsx:534 msgid "Installing…" msgstr "" @@ -1627,8 +1659,8 @@ msgstr "इंस्टेंस API कुंजी" msgid "Instruction" msgstr "निर्देश" -#: src/pages/PluginsOverlay.tsx:582 -#: src/pages/Shell.tsx:2570 +#: src/pages/PluginsOverlay.tsx:583 +#: src/pages/Shell.tsx:2559 msgid "Integrations" msgstr "इंटीग्रेशन" @@ -1650,19 +1682,19 @@ msgid "Interval unit" msgstr "अंतराल इकाई" #: src/pages/MemorySettingsOverlay.tsx:39 -#: src/pages/Shell.tsx:5407 +#: src/pages/Shell.tsx:4322 msgid "Isolated" msgstr "पृथक" -#: src/pages/Shell.tsx:5748 +#: src/pages/Shell.tsx:4663 msgid "Its conversation, files, and routines will be permanently deleted. Bots it created stay in your list." msgstr "इसकी बातचीत, फ़ाइलें और रूटीन स्थायी रूप से डिलीट कर दिए जाएंगे। इसके बनाए बॉट आपकी सूची में बने रहेंगे।" -#: src/pages/Shell.tsx:3886 +#: src/pages/Shell.tsx:3875 msgid "Jump to latest" msgstr "नवीनतम संदेश पर जाएँ" -#: src/pages/Shell.tsx:4692 +#: src/components/conversation/MessageView.tsx:112 msgid "Jump to replied message" msgstr "जिस संदेश का उत्तर दिया गया उस पर जाएं" @@ -1670,7 +1702,7 @@ msgstr "जिस संदेश का उत्तर दिया गया msgid "just now" msgstr "अभी-अभी" -#: src/pages/Shell.tsx:5766 +#: src/pages/Shell.tsx:4681 msgid "Keep memories" msgstr "मेमोरी रखें" @@ -1678,17 +1710,17 @@ msgstr "मेमोरी रखें" msgid "key" msgstr "" -#: src/pages/VoiceSettingsOverlay.tsx:229 +#: src/pages/VoiceSettingsOverlay.tsx:234 msgid "Keys stay on the server. The app only learns whether a provider is configured." msgstr "कुंजियां सर्वर पर ही रहती हैं। ऐप को केवल यह पता चलता है कि कोई प्रोवाइडर कॉन्फ़िगर है या नहीं।" -#: src/pages/PluginsOverlay.tsx:571 +#: src/pages/PluginsOverlay.tsx:572 msgid "Knowledge" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:154 -#: src/pages/AccountSettingsOverlay.tsx:363 -#: src/pages/AccountSettingsOverlay.tsx:380 +#: src/pages/AccountSettingsOverlay.tsx:133 +#: src/pages/AccountSettingsOverlay.tsx:296 +#: src/pages/AccountSettingsOverlay.tsx:313 msgid "Language" msgstr "भाषा" @@ -1709,7 +1741,7 @@ msgstr "" msgid "Listening…" msgstr "सुना जा रहा है…" -#: src/pages/Shell.tsx:3839 +#: src/pages/Shell.tsx:3828 msgid "Load earlier messages" msgstr "पुराने संदेश लोड करें" @@ -1717,7 +1749,7 @@ msgstr "पुराने संदेश लोड करें" msgid "Loading activity…" msgstr "गतिविधि लोड हो रही है…" -#: src/pages/PluginsOverlay.tsx:608 +#: src/pages/PluginsOverlay.tsx:609 msgid "Loading integrations…" msgstr "इंटीग्रेशन लोड हो रहे हैं…" @@ -1743,13 +1775,13 @@ msgstr "प्रीव्यू लोड हो रहा है…" msgid "Loading rules…" msgstr "नियम लोड हो रहे हैं…" -#: src/pages/VoiceSettingsOverlay.tsx:128 +#: src/pages/VoiceSettingsOverlay.tsx:133 msgid "Loading voice providers…" msgstr "आवाज़ प्रोवाइडर्स लोड हो रहे हैं…" -#: src/App.tsx:50 -#: src/pages/Onboarding.tsx:260 -#: src/pages/Shell.tsx:3839 +#: src/App.tsx:53 +#: src/pages/Onboarding.tsx:274 +#: src/pages/Shell.tsx:3828 msgid "Loading…" msgstr "लोड हो रहा है…" @@ -1757,15 +1789,15 @@ msgstr "लोड हो रहा है…" msgid "Local" msgstr "लोकल" -#: src/pages/Shell.tsx:2656 +#: src/pages/Shell.tsx:2645 msgid "Log out" msgstr "लॉग आउट" -#: src/pages/Shell.tsx:5517 +#: src/pages/Shell.tsx:4432 msgid "Low" msgstr "निम्न" -#: src/pages/AccountSettingsOverlay.tsx:147 +#: src/pages/AccountSettingsOverlay.tsx:126 msgid "Manage phone settings" msgstr "" @@ -1781,17 +1813,17 @@ msgstr "पढ़ा हुआ चिह्नित करें" msgid "Mark as Unread" msgstr "अपठित चिह्नित करें" -#: src/pages/Shell.tsx:5521 +#: src/pages/Shell.tsx:4436 msgid "Max" msgstr "अधिकतम" #: src/pages/McpServersOverlay.tsx:224 #: src/pages/McpServersOverlay.tsx:229 -#: src/pages/PluginsOverlay.tsx:756 +#: src/pages/PluginsOverlay.tsx:758 msgid "MCP servers" msgstr "MCP सर्वर" -#: src/pages/Shell.tsx:5518 +#: src/pages/Shell.tsx:4433 msgid "Medium" msgstr "मध्यम" @@ -1804,11 +1836,11 @@ msgid "Members (pick {GROUP_MEMBER_MIN}–{GROUP_MEMBER_MAX})" msgstr "सदस्य ({GROUP_MEMBER_MIN}–{GROUP_MEMBER_MAX} चुनें)" #: src/pages/MemorySettingsOverlay.tsx:134 -#: src/pages/Shell.tsx:2614 +#: src/pages/Shell.tsx:2603 msgid "Memory" msgstr "मेमोरी" -#: src/pages/Shell.tsx:5402 +#: src/pages/Shell.tsx:4317 msgid "Memory scope" msgstr "मेमोरी स्कोप" @@ -1817,29 +1849,29 @@ msgstr "मेमोरी स्कोप" msgid "Message" msgstr "" -#: src/pages/Shell.tsx:4403 -#: src/pages/Shell.tsx:4500 +#: src/components/composer/Composer.tsx:543 +#: src/components/composer/shared.ts:23 msgid "Message" msgstr "संदेश" -#: src/pages/Shell.tsx:4399 -#: src/pages/Shell.tsx:4403 +#: src/components/composer/Composer.tsx:539 +#: src/components/composer/Composer.tsx:543 msgid "Message {activeName}" msgstr "{activeName} को संदेश भेजें" -#: src/pages/Shell.tsx:4134 +#: src/components/composer/Composer.tsx:274 msgid "Message composer" msgstr "" -#: src/pages/Shell.tsx:4770 +#: src/components/conversation/MessageView.tsx:190 msgid "Message from {peer}" msgstr "{peer} का संदेश" -#: src/pages/Shell.tsx:4400 +#: src/components/composer/Composer.tsx:540 msgid "Message…" msgstr "संदेश…" -#: src/pages/Shell.tsx:4770 +#: src/components/conversation/MessageView.tsx:190 msgid "Messaged {peer}" msgstr "{peer} को संदेश भेजा" @@ -1847,7 +1879,7 @@ msgstr "{peer} को संदेश भेजा" msgid "Microphone failed" msgstr "माइक्रोफ़ोन विफल" -#: src/pages/Shell.tsx:5520 +#: src/pages/Shell.tsx:4435 msgid "Minimal" msgstr "न्यूनतम" @@ -1866,15 +1898,15 @@ msgstr "मिनट" #: src/pages/ModelSettingsOverlay.tsx:432 #: src/pages/ModelSettingsOverlay.tsx:493 #: src/pages/ModelSettingsOverlay.tsx:914 -#: src/pages/Onboarding.tsx:341 -#: src/pages/Onboarding.tsx:390 -#: src/pages/Onboarding.tsx:398 -#: src/pages/Shell.tsx:5358 +#: src/pages/Onboarding.tsx:355 +#: src/pages/Onboarding.tsx:404 +#: src/pages/Onboarding.tsx:412 +#: src/pages/Shell.tsx:4273 msgid "Model" msgstr "मॉडल" #: src/pages/ModelSettingsOverlay.tsx:474 -#: src/pages/Onboarding.tsx:371 +#: src/pages/Onboarding.tsx:385 msgid "Model id" msgstr "मॉडल आईडी" @@ -1882,7 +1914,7 @@ msgstr "मॉडल आईडी" msgid "Model options" msgstr "मॉडल विकल्प" -#: src/pages/AccountSettingsOverlay.tsx:222 +#: src/pages/AccountSettingsOverlay.tsx:155 msgid "Model spend uses your provider keys." msgstr "मॉडल का खर्च आपकी प्रोवाइडर कुंजियों से होता है।" @@ -1891,12 +1923,12 @@ msgid "Model updated." msgstr "मॉडल अपडेट किया गया।" #: src/pages/ModelSettingsOverlay.tsx:304 -#: src/pages/Shell.tsx:2601 +#: src/pages/Shell.tsx:2590 msgid "Models" msgstr "मॉडल्स" #: src/pages/ModelSettingsOverlay.tsx:445 -#: src/pages/Onboarding.tsx:348 +#: src/pages/Onboarding.tsx:362 msgid "Models from server" msgstr "सर्वर से मॉडल" @@ -1904,7 +1936,7 @@ msgstr "सर्वर से मॉडल" msgid "Monthly" msgstr "मासिक" -#: src/pages/PluginsOverlay.tsx:573 +#: src/pages/PluginsOverlay.tsx:574 msgid "More apps" msgstr "" @@ -1913,7 +1945,7 @@ msgstr "" msgid "Move {0} to section" msgstr "{0} को सेक्शन में ले जाएं" -#: src/pages/Shell.tsx:5769 +#: src/pages/Shell.tsx:4684 msgid "Move them to your shared memory." msgstr "उन्हें अपनी साझा मेमोरी में ले जाएं।" @@ -1922,19 +1954,19 @@ msgid "Move to" msgstr "यहां ले जाएं" #: src/components/teach/SkillDraftCard.tsx:82 -#: src/pages/Auth.tsx:49 +#: src/pages/Auth.tsx:60 #: src/pages/GroupPanel.tsx:110 #: src/pages/GroupPanel.tsx:201 -#: src/pages/Onboarding.tsx:663 +#: src/pages/Onboarding.tsx:677 #: src/pages/RoutineEditor.tsx:294 -#: src/pages/Shell.tsx:5150 -#: src/pages/Shell.tsx:5317 -#: src/pages/Shell.tsx:5595 +#: src/pages/Shell.tsx:4065 +#: src/pages/Shell.tsx:4232 +#: src/pages/Shell.tsx:4510 msgid "Name" msgstr "नाम" -#: src/pages/Onboarding.tsx:667 -#: src/pages/Shell.tsx:5155 +#: src/pages/Onboarding.tsx:681 +#: src/pages/Shell.tsx:4070 msgid "Name this bot" msgstr "इस बॉट को नाम दें" @@ -1954,13 +1986,13 @@ msgstr "इनपुट चाहिए" msgid "Needs takeover" msgstr "नियंत्रण लेना ज़रूरी" -#: src/pages/Shell.tsx:2247 -#: src/pages/Shell.tsx:5138 +#: src/pages/Shell.tsx:2236 +#: src/pages/Shell.tsx:4053 msgid "New bot" msgstr "नया बॉट" #: src/pages/GroupPanel.tsx:98 -#: src/pages/Shell.tsx:2257 +#: src/pages/Shell.tsx:2246 msgid "New group" msgstr "नया समूह" @@ -1968,12 +2000,16 @@ msgstr "नया समूह" msgid "New open-work item" msgstr "नया खुला-कार्य आइटम" +#: src/pages/ResetPassword.tsx:165 +msgid "New password" +msgstr "" + #: src/pages/RoutineEditor.tsx:100 msgid "New routine" msgstr "नया रूटीन" #: src/pages/BotContextMenu.tsx:130 -#: src/pages/Shell.tsx:5589 +#: src/pages/Shell.tsx:4504 msgid "New section" msgstr "नया सेक्शन" @@ -1981,20 +2017,20 @@ msgstr "नया सेक्शन" msgid "No agent connections yet." msgstr "" -#: src/pages/PluginsOverlay.tsx:687 +#: src/pages/PluginsOverlay.tsx:689 msgid "No apps match your search." msgstr "आपकी खोज से कोई ऐप मेल नहीं खाता।" -#: src/pages/PluginsOverlay.tsx:894 +#: src/pages/PluginsOverlay.tsx:896 msgid "no auth" msgstr "कोई प्रमाणीकरण नहीं" -#: src/pages/PluginsOverlay.tsx:810 +#: src/pages/PluginsOverlay.tsx:812 msgid "No authentication" msgstr "कोई प्रमाणीकरण नहीं" #. placeholder {0}: item.name -#: src/pages/PluginsOverlay.tsx:323 +#: src/pages/PluginsOverlay.tsx:324 msgid "No connection record found for {0}." msgstr "{0} के लिए कोई कनेक्शन रिकॉर्ड नहीं मिला।" @@ -2014,7 +2050,7 @@ msgstr "" msgid "No longer active" msgstr "अब सक्रिय नहीं" -#: src/pages/PluginsOverlay.tsx:682 +#: src/pages/PluginsOverlay.tsx:684 msgid "No managed app catalog is configured on this deployment." msgstr "इस डिप्लॉयमेंट पर कोई प्रबंधित ऐप कैटलॉग कॉन्फ़िगर नहीं है।" @@ -2022,7 +2058,7 @@ msgstr "इस डिप्लॉयमेंट पर कोई प्रब msgid "No matching models" msgstr "" -#: src/pages/PluginsOverlay.tsx:876 +#: src/pages/PluginsOverlay.tsx:878 msgid "No MCP or API tool sources installed yet." msgstr "अभी तक कोई MCP या API टूल स्रोत इंस्टॉल नहीं है।" @@ -2054,16 +2090,16 @@ msgstr "" msgid "None yet" msgstr "अभी तक कोई नहीं" -#: src/pages/VoiceSettingsOverlay.tsx:156 +#: src/pages/VoiceSettingsOverlay.tsx:161 msgid "Not configured" msgstr "कॉन्फ़िगर नहीं" #: src/pages/ModelSettingsOverlay.tsx:524 -#: src/pages/VoiceSettingsOverlay.tsx:225 +#: src/pages/VoiceSettingsOverlay.tsx:230 msgid "Not connected" msgstr "कनेक्टेड नहीं" -#: src/pages/PluginsOverlay.tsx:643 +#: src/pages/PluginsOverlay.tsx:645 msgid "Not in the plugin catalog" msgstr "" @@ -2071,7 +2107,7 @@ msgstr "" msgid "Not linked — text the deployment's number once to link your phone to your agent." msgstr "" -#: src/pages/Shell.tsx:6262 +#: src/components/conversation/MessageView.tsx:808 msgid "Not now" msgstr "अभी नहीं" @@ -2113,15 +2149,15 @@ msgstr "1 तारीख को {0} बजे" msgid "Open" msgstr "खोलें" -#: src/pages/Shell.tsx:2926 +#: src/pages/Shell.tsx:2920 msgid "Open computer" msgstr "कंप्यूटर खोलें" -#: src/pages/Shell.tsx:2892 +#: src/pages/Shell.tsx:2886 msgid "Open in full window" msgstr "पूरी विंडो में खोलें" -#: src/pages/Shell.tsx:2680 +#: src/pages/Shell.tsx:2669 msgid "Open navigation" msgstr "नेविगेशन खोलें" @@ -2142,24 +2178,24 @@ msgid "Open work" msgstr "खुला कार्य" #: src/pages/ModelSettingsOverlay.tsx:405 -#: src/pages/Onboarding.tsx:315 +#: src/pages/Onboarding.tsx:329 msgid "OpenAI-compatible server URL" msgstr "OpenAI-संगत सर्वर URL" -#: src/pages/Shell.tsx:4905 +#: src/components/conversation/MessageView.tsx:325 msgid "Opened its thread." msgstr "इसका थ्रेड खोला।" -#: src/App.tsx:166 +#: src/App.tsx:170 msgid "Opening your workspace…" msgstr "आपका वर्कस्पेस खुल रहा है…" #: src/pages/ModelSettingsOverlay.tsx:636 -#: src/pages/Onboarding.tsx:502 +#: src/pages/Onboarding.tsx:516 msgid "Optional" msgstr "वैकल्पिक" -#: src/pages/AccountSettingsOverlay.tsx:250 +#: src/pages/AccountSettingsOverlay.tsx:183 msgid "Optional controls most people never need" msgstr "वैकल्पिक नियंत्रण जिनकी अधिकांश लोगों को कभी ज़रूरत नहीं होती" @@ -2171,7 +2207,7 @@ msgstr "वैकल्पिक हेडर मान" msgid "Or connect an API key" msgstr "या एक API कुंजी कनेक्ट करें" -#: src/pages/Onboarding.tsx:510 +#: src/pages/Onboarding.tsx:524 msgid "Or paste an API key" msgstr "या एक API कुंजी पेस्ट करें" @@ -2180,16 +2216,12 @@ msgstr "या एक API कुंजी पेस्ट करें" msgid "Or send this code to {0}:" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:191 -msgid "Organic" -msgstr "" - #: src/pages/memory-providers/SupermemorySettingsForm.tsx:60 msgid "Organization API key" msgstr "संगठन API कुंजी" #: src/pages/ModelSettingsOverlay.tsx:454 -#: src/pages/Onboarding.tsx:357 +#: src/pages/Onboarding.tsx:371 msgid "Other model…" msgstr "अन्य मॉडल…" @@ -2211,21 +2243,26 @@ msgstr "" msgid "Park" msgstr "पार्क करें" -#: src/pages/Auth.tsx:77 -#: src/pages/Auth.tsx:86 +#: src/pages/Auth.tsx:91 +#: src/pages/Auth.tsx:110 +#: src/pages/ResetPassword.tsx:174 msgid "Password" msgstr "पासवर्ड" -#: src/pages/VoiceSettingsOverlay.tsx:242 +#: src/pages/ResetPassword.tsx:147 +msgid "Password updated" +msgstr "" + +#: src/pages/VoiceSettingsOverlay.tsx:247 msgid "Paste a replacement key" msgstr "बदलने के लिए नई कुंजी पेस्ट करें" #: src/pages/ModelSettingsOverlay.tsx:416 -#: src/pages/Onboarding.tsx:326 +#: src/pages/Onboarding.tsx:340 msgid "Paste the OpenAI-compatible address from your server. Sentra Bot adds /v1 if needed." msgstr "अपने सर्वर से OpenAI-संगत पता पेस्ट करें। ज़रूरत होने पर Sentra Bot /v1 जोड़ देता है।" -#: src/pages/VoiceSettingsOverlay.tsx:242 +#: src/pages/VoiceSettingsOverlay.tsx:247 msgid "Paste your API key" msgstr "अपनी API कुंजी पेस्ट करें" @@ -2233,21 +2270,21 @@ msgstr "अपनी API कुंजी पेस्ट करें" msgid "Paused" msgstr "" -#: src/pages/PluginsOverlay.tsx:567 +#: src/pages/PluginsOverlay.tsx:568 msgid "Payments" msgstr "" #: src/pages/ModelSettingsOverlay.tsx:518 -#: src/pages/VoiceSettingsOverlay.tsx:219 +#: src/pages/VoiceSettingsOverlay.tsx:224 msgid "Personal credential" msgstr "व्यक्तिगत क्रेडेंशियल" -#: src/pages/AccountSettingsOverlay.tsx:137 +#: src/pages/AccountSettingsOverlay.tsx:116 #: src/pages/PhoneSettingsOverlay.tsx:116 msgid "Phone" msgstr "" -#: src/pages/VoiceSettingsOverlay.tsx:155 +#: src/pages/VoiceSettingsOverlay.tsx:160 msgid "Pick a voice" msgstr "एक आवाज़ चुनें" @@ -2255,11 +2292,11 @@ msgstr "एक आवाज़ चुनें" msgid "Pin" msgstr "पिन करें" -#: src/pages/VoiceSettingsOverlay.tsx:284 +#: src/pages/VoiceSettingsOverlay.tsx:289 msgid "Playing…" msgstr "प्ले हो रहा है…" -#: src/pages/PluginsOverlay.tsx:615 +#: src/pages/PluginsOverlay.tsx:616 msgid "Popular" msgstr "" @@ -2272,11 +2309,11 @@ msgstr "" msgid "Preview {0}" msgstr "{0} का प्रीव्यू" -#: src/pages/Shell.tsx:5093 +#: src/pages/Shell.tsx:4008 msgid "Private" msgstr "निजी" -#: src/pages/PluginsOverlay.tsx:563 +#: src/pages/PluginsOverlay.tsx:564 msgid "Productivity" msgstr "" @@ -2285,7 +2322,7 @@ msgid "Provider" msgstr "प्रोवाइडर" #: src/pages/ModelSettingsOverlay.tsx:341 -#: src/pages/VoiceSettingsOverlay.tsx:168 +#: src/pages/VoiceSettingsOverlay.tsx:173 msgid "Providers" msgstr "प्रोवाइडर्स" @@ -2293,7 +2330,7 @@ msgstr "प्रोवाइडर्स" msgid "Queued" msgstr "कतार में" -#: src/pages/Shell.tsx:5434 +#: src/pages/Shell.tsx:4349 msgid "Read replies aloud" msgstr "उत्तर पढ़कर सुनाएं" @@ -2305,7 +2342,7 @@ msgstr "हाल के" msgid "Reconnect OAuth" msgstr "OAuth पुनः कनेक्ट करें" -#: src/App.tsx:123 +#: src/App.tsx:127 msgid "Reconnecting" msgstr "पुनः कनेक्ट हो रहा है" @@ -2327,27 +2364,27 @@ msgstr "रिकवर एक ऐसे कंप्यूटर को बद msgid "Recovering…" msgstr "रिकवर हो रहा है…" -#: src/pages/Shell.tsx:4581 +#: src/pages/Shell.tsx:3967 msgid "Release" msgstr "नियंत्रण छोड़ें" #: src/components/ApprovalRulesSettings.tsx:178 -#: src/pages/PluginsOverlay.tsx:455 -#: src/pages/PluginsOverlay.tsx:508 -#: src/pages/PluginsOverlay.tsx:547 -#: src/pages/PluginsOverlay.tsx:666 -#: src/pages/PluginsOverlay.tsx:905 +#: src/pages/PluginsOverlay.tsx:456 +#: src/pages/PluginsOverlay.tsx:509 +#: src/pages/PluginsOverlay.tsx:548 +#: src/pages/PluginsOverlay.tsx:668 +#: src/pages/PluginsOverlay.tsx:907 #: src/pages/ScratchpadSection.tsx:162 msgid "Remove" msgstr "हटाएं" #. placeholder {0}: attachment.file.name -#: src/pages/Shell.tsx:4204 +#: src/components/composer/Composer.tsx:344 msgid "Remove {0}" msgstr "{0} हटाएं" #. placeholder {0}: mention.name -#: src/pages/Shell.tsx:4362 +#: src/components/composer/Composer.tsx:502 msgid "Remove mention {0}" msgstr "उल्लेख {0} हटाएं" @@ -2356,7 +2393,7 @@ msgid "Remove schedule" msgstr "" #. placeholder {0}: selectedSkill.name -#: src/pages/Shell.tsx:4341 +#: src/components/composer/Composer.tsx:481 msgid "Remove skill {0}" msgstr "स्किल {0} हटाएं" @@ -2368,7 +2405,7 @@ msgstr "यह शेड्यूल हटाएं" msgid "Remove webhook" msgstr "" -#: src/pages/Shell.tsx:4904 +#: src/components/conversation/MessageView.tsx:324 msgid "Removed with chat, computer, and memory." msgstr "चैट, कंप्यूटर और मेमोरी सहित हटाया गया।" @@ -2376,10 +2413,10 @@ msgstr "चैट, कंप्यूटर और मेमोरी सहि msgid "Removed, but list refresh failed" msgstr "हटाया गया, लेकिन सूची रिफ़्रेश विफल रही" -#: src/pages/PluginsOverlay.tsx:450 -#: src/pages/PluginsOverlay.tsx:547 -#: src/pages/PluginsOverlay.tsx:661 -#: src/pages/PluginsOverlay.tsx:905 +#: src/pages/PluginsOverlay.tsx:451 +#: src/pages/PluginsOverlay.tsx:548 +#: src/pages/PluginsOverlay.tsx:663 +#: src/pages/PluginsOverlay.tsx:907 msgid "Removing…" msgstr "हटाया जा रहा है…" @@ -2393,15 +2430,15 @@ msgstr "पुनः खोलें" msgid "Replace API key" msgstr "API कुंजी बदलें" -#: src/pages/VoiceSettingsOverlay.tsx:255 +#: src/pages/VoiceSettingsOverlay.tsx:260 msgid "Replace key" msgstr "कुंजी बदलें" -#: src/pages/Shell.tsx:4527 +#: src/pages/Shell.tsx:3913 msgid "Reply" msgstr "उत्तर दें" -#: src/pages/Shell.tsx:4167 +#: src/components/composer/Composer.tsx:307 msgid "Replying to {replyName}" msgstr "{replyName} को उत्तर दे रहे हैं" @@ -2417,13 +2454,21 @@ msgstr "कंप्यूटर रीसेट करें" msgid "Reset computer?" msgstr "कंप्यूटर रीसेट करें?" +#: src/pages/ResetPassword.tsx:78 +msgid "Reset links work once and for one hour. Enter your email to get a new one." +msgstr "" + +#: src/pages/ResetPassword.tsx:70 +msgid "Reset your password" +msgstr "" + #: src/components/ComputerMaintenanceActions.tsx:68 #: src/components/ComputerMaintenanceActions.tsx:115 msgid "Resetting…" msgstr "रीसेट हो रहा है…" -#: src/pages/Shell.tsx:2514 -#: src/pages/Shell.tsx:2544 +#: src/pages/Shell.tsx:2503 +#: src/pages/Shell.tsx:2533 msgid "Restore" msgstr "बहाल करें" @@ -2431,7 +2476,7 @@ msgstr "बहाल करें" msgid "Restore the last saved workspace. Unsaved work on the computer is lost." msgstr "अंतिम सहेजे गए वर्कस्पेस को बहाल करें। कंप्यूटर पर बिना सहेजा काम खो जाएगा।" -#: src/App.tsx:135 +#: src/App.tsx:139 msgid "Retry now" msgstr "अभी पुनः प्रयास करें" @@ -2439,7 +2484,7 @@ msgstr "अभी पुनः प्रयास करें" msgid "Return to Sentra Bot" msgstr "Sentra Bot पर लौटें" -#: src/pages/PluginsOverlay.tsx:716 +#: src/pages/PluginsOverlay.tsx:718 msgid "Reusable SKILL.md playbooks your agents follow. Install one and invoke it with /Name in the composer." msgstr "" @@ -2447,17 +2492,13 @@ msgstr "" msgid "Revoke" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:189 -msgid "Robot" -msgstr "" - #: src/pages/RoutineEditor.tsx:571 msgid "Rotate key" msgstr "" #: src/pages/RoutineEditor.tsx:247 -#: src/pages/Shell.tsx:3169 -#: src/pages/Shell.tsx:3179 +#: src/pages/Shell.tsx:3163 +#: src/pages/Shell.tsx:3173 msgid "Routine" msgstr "रूटीन" @@ -2474,7 +2515,7 @@ msgstr "" msgid "Run history" msgstr "" -#: src/pages/Shell.tsx:3162 +#: src/pages/Shell.tsx:3156 msgid "Run time must be in the future." msgstr "" @@ -2495,7 +2536,7 @@ msgstr "चल रहा है…" #: src/pages/GroupPanel.tsx:224 #: src/pages/ModelSettingsOverlay.tsx:675 #: src/pages/RoutineEditor.tsx:479 -#: src/pages/Shell.tsx:5489 +#: src/pages/Shell.tsx:4404 msgid "Save" msgstr "सहेजें" @@ -2537,12 +2578,12 @@ msgid "Say yes or no, or answer in a sentence." msgstr "हां या ना कहें, या एक वाक्य में उत्तर दें।" #: src/pages/ModelSettingsOverlay.tsx:939 -#: src/pages/Shell.tsx:2268 +#: src/pages/Shell.tsx:2257 msgid "Search" msgstr "खोजें" -#: src/pages/PluginsOverlay.tsx:598 #: src/pages/PluginsOverlay.tsx:599 +#: src/pages/PluginsOverlay.tsx:600 msgid "Search apps" msgstr "ऐप खोजें" @@ -2555,8 +2596,8 @@ msgstr "" msgid "Search providers" msgstr "प्रोवाइडर्स खोजें" -#: src/pages/Onboarding.tsx:274 -#: src/pages/Onboarding.tsx:275 +#: src/pages/Onboarding.tsx:288 +#: src/pages/Onboarding.tsx:289 msgid "Search providers and models" msgstr "प्रोवाइडर्स और मॉडल खोजें" @@ -2564,11 +2605,11 @@ msgstr "प्रोवाइडर्स और मॉडल खोजें" msgid "Searching…" msgstr "खोजा जा रहा है…" -#: src/pages/Shell.tsx:2709 +#: src/pages/Shell.tsx:2698 msgid "Select a bot" msgstr "एक बॉट चुनें" -#: src/pages/Shell.tsx:4423 +#: src/components/composer/Composer.tsx:563 msgid "Send" msgstr "भेजें" @@ -2580,6 +2621,10 @@ msgstr "उत्तर भेजें" msgid "Send it" msgstr "इसे भेजें" +#: src/pages/ResetPassword.tsx:103 +msgid "Send reset link" +msgstr "" + #: src/components/AskCard.tsx:97 #: src/components/AskCard.tsx:126 #: src/components/AskCard.tsx:150 @@ -2587,7 +2632,7 @@ msgstr "इसे भेजें" msgid "Sending…" msgstr "भेजा जा रहा है…" -#: src/pages/PluginsOverlay.tsx:839 +#: src/pages/PluginsOverlay.tsx:841 msgid "Sentra Bot verifies the source before saving it. Credentials are encrypted and are never returned to clients or exposed to the model." msgstr "Sentra Bot सहेजने से पहले स्रोत की पुष्टि करता है। क्रेडेंशियल एन्क्रिप्टेड होते हैं और कभी क्लाइंट को नहीं लौटाए जाते, न ही मॉडल को दिखाए जाते हैं।" @@ -2601,55 +2646,57 @@ msgstr "सर्वर का नाम" #: src/pages/McpServersOverlay.tsx:317 #: src/pages/ModelSettingsOverlay.tsx:401 -#: src/pages/Onboarding.tsx:311 +#: src/pages/Onboarding.tsx:325 msgid "Server URL" msgstr "सर्वर URL" -#: src/pages/Shell.tsx:2718 +#: src/pages/Shell.tsx:2712 msgid "Set up voice to call" msgstr "कॉल के लिए आवाज़ सेट करें" -#: src/pages/AccountSettingsOverlay.tsx:113 -#: src/pages/Shell.tsx:2578 -#: src/pages/Shell.tsx:2588 -#: src/pages/Shell.tsx:2859 +#: src/pages/AccountSettingsOverlay.tsx:92 +#: src/pages/Shell.tsx:2567 +#: src/pages/Shell.tsx:2577 +#: src/pages/Shell.tsx:2853 msgid "Settings" msgstr "सेटिंग्स" -#: src/pages/Shell.tsx:4441 +#: src/components/composer/Composer.tsx:581 msgid "Settings: General" msgstr "सेटिंग्स: सामान्य" -#: src/pages/Shell.tsx:4443 +#: src/components/composer/Composer.tsx:583 msgid "Settings: Usage" msgstr "सेटिंग्स: उपयोग" #: src/pages/ModelSettingsOverlay.tsx:413 -#: src/pages/Onboarding.tsx:323 +#: src/pages/Onboarding.tsx:337 msgid "Setup help" msgstr "सेटअप सहायता" #: src/pages/MemorySettingsOverlay.tsx:39 -#: src/pages/Shell.tsx:5408 +#: src/pages/Shell.tsx:4323 msgid "Shared" msgstr "साझा" -#: src/pages/Shell.tsx:2870 +#: src/pages/Shell.tsx:2864 msgid "Show computer" msgstr "कंप्यूटर दिखाएं" -#: src/pages/Auth.tsx:95 +#: src/pages/Auth.tsx:122 +#: src/pages/ResetPassword.tsx:186 msgid "Show password" msgstr "" -#: src/pages/Shell.tsx:2870 +#: src/pages/Shell.tsx:2864 msgid "Show settings" msgstr "सेटिंग्स दिखाएं" #: src/lib/localized-provider-hint.ts:7 -#: src/pages/Auth.tsx:161 +#: src/pages/Auth.tsx:171 #: src/pages/ModelSettingsOverlay.tsx:618 -#: src/pages/Onboarding.tsx:151 +#: src/pages/Onboarding.tsx:165 +#: src/pages/ResetPassword.tsx:155 msgid "Sign in" msgstr "साइन इन करें" @@ -2657,28 +2704,32 @@ msgstr "साइन इन करें" msgid "Sign in  →" msgstr "साइन इन करें →" -#: src/pages/Auth.tsx:17 +#: src/pages/Auth.tsx:142 +msgid "Sign in instead" +msgstr "" + +#: src/pages/Auth.tsx:29 msgid "Sign in to Sentra Bot" msgstr "Sentra Bot में साइन इन करें" -#: src/pages/Auth.tsx:154 +#: src/pages/Auth.tsx:164 msgid "Sign up" msgstr "साइन अप करें" #. placeholder {0}: skill.name -#: src/pages/Shell.tsx:4251 +#: src/components/composer/Composer.tsx:391 msgid "Skill {0}" msgstr "स्किल {0}" -#: src/pages/PluginsOverlay.tsx:713 +#: src/pages/PluginsOverlay.tsx:715 msgid "Skills" msgstr "" -#: src/pages/Shell.tsx:4588 +#: src/pages/Shell.tsx:3974 msgid "Skip" msgstr "छोड़ें" -#: src/pages/Onboarding.tsx:548 +#: src/pages/Onboarding.tsx:562 msgid "Skip for now" msgstr "अभी के लिए छोड़ें" @@ -2687,7 +2738,7 @@ msgid "Skip or deploy key" msgstr "छोड़ें या डिप्लॉय कुंजी दें" #. placeholder {0}: skipped.join(", ") -#: src/pages/Shell.tsx:1763 +#: src/pages/Shell.tsx:1746 msgid "Skipped {0}" msgstr "{0} को छोड़ा गया" @@ -2704,21 +2755,21 @@ msgstr "" msgid "Space interrupts · Esc hangs up" msgstr "स्पेस से बीच में रोकें · Esc से कॉल समाप्त करें" -#: src/pages/Shell.tsx:4739 -#: src/pages/Shell.tsx:5002 +#: src/components/conversation/MessageView.tsx:159 +#: src/components/conversation/MessageView.tsx:422 msgid "Speak" msgstr "बोलें" -#: src/pages/VoiceSettingsOverlay.tsx:194 +#: src/pages/VoiceSettingsOverlay.tsx:199 msgid "Speak + transcribe" msgstr "बोलें + लिप्यंतरण करें" -#: src/pages/VoiceSettingsOverlay.tsx:196 +#: src/pages/VoiceSettingsOverlay.tsx:201 msgid "Speak only" msgstr "केवल बोलें" -#: src/pages/Shell.tsx:4735 -#: src/pages/Shell.tsx:4998 +#: src/components/conversation/MessageView.tsx:155 +#: src/components/conversation/MessageView.tsx:418 msgid "Speak this reply" msgstr "यह उत्तर बोलकर सुनाएं" @@ -2726,11 +2777,11 @@ msgstr "यह उत्तर बोलकर सुनाएं" msgid "Speaking…" msgstr "बोल रहा है…" -#: src/pages/Onboarding.tsx:560 +#: src/pages/Onboarding.tsx:574 msgid "Start from a proven Chief of Staff, or build your own from scratch." msgstr "" -#: src/pages/Onboarding.tsx:644 +#: src/pages/Onboarding.tsx:658 msgid "Start from scratch" msgstr "" @@ -2744,7 +2795,7 @@ msgstr "शुरू हो रहा है" #: src/components/teach/TeachComputerSection.tsx:115 #: src/pages/ModelSettingsOverlay.tsx:616 -#: src/pages/Onboarding.tsx:487 +#: src/pages/Onboarding.tsx:501 msgid "Starting…" msgstr "शुरू हो रहा है…" @@ -2752,20 +2803,20 @@ msgstr "शुरू हो रहा है…" msgid "Steps" msgstr "चरण" -#: src/pages/Shell.tsx:3568 -#: src/pages/Shell.tsx:3572 -#: src/pages/Shell.tsx:4414 -#: src/pages/Shell.tsx:4739 -#: src/pages/Shell.tsx:5002 +#: src/components/composer/Composer.tsx:554 +#: src/components/conversation/MessageView.tsx:159 +#: src/components/conversation/MessageView.tsx:422 +#: src/pages/Shell.tsx:3557 +#: src/pages/Shell.tsx:3561 msgid "Stop" msgstr "रोकें" -#: src/pages/Shell.tsx:4306 +#: src/components/composer/Composer.tsx:446 msgid "Stop dictation" msgstr "श्रुतलेखन रोकें" -#: src/pages/Shell.tsx:4735 -#: src/pages/Shell.tsx:4998 +#: src/components/conversation/MessageView.tsx:155 +#: src/components/conversation/MessageView.tsx:418 msgid "Stop speaking" msgstr "बोलना रोकें" @@ -2774,8 +2825,8 @@ msgstr "बोलना रोकें" msgid "Stop teaching" msgstr "सिखाना रोकें" -#: src/pages/Shell.tsx:2953 -#: src/pages/Shell.tsx:3588 +#: src/pages/Shell.tsx:2947 +#: src/pages/Shell.tsx:3577 msgid "Stop the bot first" msgstr "पहले बॉट रोकें" @@ -2788,13 +2839,13 @@ msgstr "" msgid "Stored encrypted" msgstr "एन्क्रिप्टेड रूप में संग्रहीत" -#: src/pages/Shell.tsx:4856 +#: src/components/conversation/MessageView.tsx:276 msgid "subagent" msgstr "सबएजेंट" #: src/components/AskCard.tsx:126 #: src/pages/ModelSettingsOverlay.tsx:576 -#: src/pages/Onboarding.tsx:449 +#: src/pages/Onboarding.tsx:463 msgid "Submit" msgstr "सबमिट करें" @@ -2806,8 +2857,8 @@ msgstr "" msgid "Switching…" msgstr "बदला जा रहा है…" -#: src/pages/Shell.tsx:2956 -#: src/pages/Shell.tsx:3593 +#: src/pages/Shell.tsx:2950 +#: src/pages/Shell.tsx:3582 msgid "Take control" msgstr "नियंत्रण लें" @@ -2815,7 +2866,7 @@ msgstr "नियंत्रण लें" msgid "Teach a task" msgstr "कोई कार्य सिखाएं" -#: src/pages/Shell.tsx:2783 +#: src/pages/Shell.tsx:2777 msgid "Teaching in progress — stop teaching before sending a new message." msgstr "सिखाना जारी है — नया संदेश भेजने से पहले सिखाना रोकें।" @@ -2823,11 +2874,11 @@ msgstr "सिखाना जारी है — नया संदेश भ msgid "Teaching needs a graphical sandbox computer. Desktop-host bots can run shell tasks, but not screen recording." msgstr "सिखाने के लिए ग्राफ़िकल सैंडबॉक्स कंप्यूटर चाहिए। डेस्कटॉप-होस्ट बॉट शेल कार्य चला सकते हैं, लेकिन स्क्रीन रिकॉर्डिंग नहीं।" -#: src/pages/Shell.tsx:5093 +#: src/pages/Shell.tsx:4008 msgid "Team" msgstr "टीम" -#: src/pages/Shell.tsx:5943 +#: src/pages/Shell.tsx:4858 msgid "Team Computer" msgstr "टीम कंप्यूटर" @@ -2852,20 +2903,20 @@ msgstr "" msgid "The selected memory provider is not available in this build." msgstr "चयनित मेमोरी प्रोवाइडर इस बिल्ड में उपलब्ध नहीं है।" -#: src/pages/Shell.tsx:5385 +#: src/pages/Shell.tsx:4300 msgid "Thinking" msgstr "सोच रहा है" -#: src/pages/Shell.tsx:2896 +#: src/pages/Shell.tsx:2890 msgid "This bot runs on this computer, not a Linux desktop. Shell and files use your home folder." msgstr "यह बॉट इसी कंप्यूटर पर चलता है, किसी Linux डेस्कटॉप पर नहीं। शेल और फ़ाइलें आपके होम फ़ोल्डर का उपयोग करती हैं।" -#: src/pages/Shell.tsx:3617 +#: src/pages/Shell.tsx:3606 msgid "This bot runs on this computer. There is no separate Linux desktop. Ask it to use the shell; working directories under your home folder are allowed." msgstr "यह बॉट इसी कंप्यूटर पर चलता है। कोई अलग Linux डेस्कटॉप नहीं है। इससे शेल का उपयोग करने को कहें; आपके होम फ़ोल्डर के अंदर की वर्किंग डायरेक्ट्री की अनुमति है।" -#: src/pages/Shell.tsx:5785 -#: src/pages/Shell.tsx:5864 +#: src/pages/Shell.tsx:4700 +#: src/pages/Shell.tsx:4779 msgid "This cannot be undone." msgstr "इसे पूर्ववत नहीं किया जा सकता।" @@ -2881,6 +2932,10 @@ msgstr "यह कंप्यूटर आपके खाते से शे msgid "This file is not valid UTF-8 Markdown." msgstr "यह फ़ाइल मान्य UTF-8 Markdown नहीं है।" +#: src/pages/ResetPassword.tsx:70 +msgid "This link has expired" +msgstr "" + #: src/pages/HostComputerPrompt.tsx:14 msgid "this Mac" msgstr "यह Mac" @@ -2889,15 +2944,15 @@ msgstr "यह Mac" msgid "This Mac runs shell commands with your account, including files in your home folder. Do not turn it on for a shared or public server." msgstr "यह Mac आपके खाते से शेल कमांड चलाता है, जिसमें आपके होम फ़ोल्डर की फ़ाइलें भी शामिल हैं। इसे किसी साझा या सार्वजनिक सर्वर पर चालू न करें।" -#: src/pages/Shell.tsx:5670 +#: src/pages/Shell.tsx:4585 msgid "This permanently removes every message and stops current work. The chat remains available." msgstr "" -#: src/pages/Onboarding.tsx:523 +#: src/pages/Onboarding.tsx:537 msgid "This provider cannot paste a key here. Skip if this deployment already has credentials." msgstr "यह प्रोवाइडर यहां कुंजी पेस्ट नहीं कर सकता। यदि इस डिप्लॉयमेंट में पहले से क्रेडेंशियल हैं तो छोड़ दें।" -#: src/pages/Shell.tsx:6210 +#: src/components/conversation/MessageView.tsx:756 msgid "This server cannot be assigned without a bot." msgstr "बॉट के बिना यह सर्वर असाइन नहीं किया जा सकता।" @@ -2909,7 +2964,7 @@ msgstr "इस सर्वर ने ब्राउज़र ऑथराइ msgid "This server is already connected. Disconnect it first to authorize again." msgstr "यह सर्वर पहले से कनेक्टेड है। पुनः ऑथराइज़ करने के लिए पहले इसे डिस्कनेक्ट करें।" -#: src/pages/Shell.tsx:6249 +#: src/components/conversation/MessageView.tsx:795 msgid "This server uses browser sign-in. Authorize it to let your agents use its tools — a popup will open." msgstr "यह सर्वर ब्राउज़र साइन-इन का उपयोग करता है। अपने एजेंट को इसके टूल उपयोग करने देने के लिए इसे ऑथराइज़ करें — एक पॉपअप खुलेगा।" @@ -2921,17 +2976,17 @@ msgstr "यह सब्सक्रिप्शन साइन-इन अभ msgid "Time of day" msgstr "दिन का समय" -#: src/pages/Onboarding.tsx:672 -#: src/pages/Shell.tsx:5160 -#: src/pages/Shell.tsx:5326 +#: src/pages/Onboarding.tsx:686 +#: src/pages/Shell.tsx:4075 +#: src/pages/Shell.tsx:4241 msgid "Title" msgstr "शीर्षक" -#: src/pages/PluginsOverlay.tsx:872 +#: src/pages/PluginsOverlay.tsx:874 msgid "Tool sources" msgstr "टूल स्रोत" -#: src/pages/PluginsOverlay.tsx:834 +#: src/pages/PluginsOverlay.tsx:836 msgid "Treg token" msgstr "Treg टोकन" @@ -2952,7 +3007,7 @@ msgid "Unpin" msgstr "पिन हटाएं" #. placeholder {0}: pending.file.name -#: src/pages/Shell.tsx:1834 +#: src/pages/Shell.tsx:1821 msgid "Unsupported file type: {0}" msgstr "असमर्थित फ़ाइल प्रकार: {0}" @@ -2981,6 +3036,10 @@ msgstr "" msgid "Update finished with errors" msgstr "" +#: src/pages/ResetPassword.tsx:206 +msgid "Update password" +msgstr "" + #: src/components/SoftwareUpdateSection.tsx:172 #: src/components/SoftwareUpdateSection.tsx:189 msgid "Updated" @@ -2991,8 +3050,8 @@ msgstr "" msgid "Updating…" msgstr "अपडेट हो रहा है…" -#: src/pages/AccountSettingsOverlay.tsx:212 -#: src/pages/Shell.tsx:2639 +#: src/pages/AccountSettingsOverlay.tsx:145 +#: src/pages/Shell.tsx:2628 msgid "Usage" msgstr "उपयोग" @@ -3001,7 +3060,7 @@ msgid "Use {hostLabel}" msgstr "{hostLabel} का उपयोग करें" #: src/pages/ModelSettingsOverlay.tsx:485 -#: src/pages/Onboarding.tsx:382 +#: src/pages/Onboarding.tsx:396 msgid "Use a found model" msgstr "मिला हुआ मॉडल उपयोग करें" @@ -3009,25 +3068,25 @@ msgstr "मिला हुआ मॉडल उपयोग करें" msgid "Use this model" msgstr "यह मॉडल उपयोग करें" -#: src/pages/PluginsOverlay.tsx:855 +#: src/pages/PluginsOverlay.tsx:857 msgid "Verify and add" msgstr "पुष्टि करके जोड़ें" -#: src/pages/PluginsOverlay.tsx:853 +#: src/pages/PluginsOverlay.tsx:855 msgid "Verifying…" msgstr "पुष्टि की जा रही है…" -#: src/pages/Shell.tsx:2627 -#: src/pages/Shell.tsx:5438 -#: src/pages/VoiceSettingsOverlay.tsx:124 -#: src/pages/VoiceSettingsOverlay.tsx:264 +#: src/pages/Shell.tsx:2616 +#: src/pages/Shell.tsx:4353 +#: src/pages/VoiceSettingsOverlay.tsx:129 +#: src/pages/VoiceSettingsOverlay.tsx:269 msgid "Voice" msgstr "आवाज़" #: src/pages/ModelSettingsOverlay.tsx:580 #: src/pages/ModelSettingsOverlay.tsx:602 -#: src/pages/Onboarding.tsx:453 -#: src/pages/Onboarding.tsx:475 +#: src/pages/Onboarding.tsx:467 +#: src/pages/Onboarding.tsx:489 msgid "Waiting for sign-in…" msgstr "साइन-इन की प्रतीक्षा…" @@ -3039,7 +3098,7 @@ msgstr "" msgid "Waiting for your message…" msgstr "" -#: src/pages/Shell.tsx:6093 +#: src/components/conversation/MessageView.tsx:639 msgid "Waiting…" msgstr "प्रतीक्षा…" @@ -3053,7 +3112,7 @@ msgstr "" msgid "Weekdays" msgstr "कार्यदिवस" -#: src/pages/Shell.tsx:5755 +#: src/pages/Shell.tsx:4670 msgid "What about its memories?" msgstr "इसकी मेमोरी का क्या करें?" @@ -3065,8 +3124,8 @@ msgstr "आप कौन-सा परिणाम दिखाकर बता msgid "What should this routine do each time it runs?" msgstr "" -#: src/pages/Onboarding.tsx:685 -#: src/pages/Shell.tsx:5175 +#: src/pages/Onboarding.tsx:699 +#: src/pages/Shell.tsx:4090 msgid "What this bot is for" msgstr "यह बॉट किस लिए है" @@ -3099,17 +3158,19 @@ msgstr "कब उपयोग करें" msgid "Where should bots run?" msgstr "बॉट कहां चलने चाहिए?" -#: src/pages/Auth.tsx:142 +#: src/pages/Auth.tsx:152 #: src/pages/CallView.tsx:242 +#: src/pages/ResetPassword.tsx:103 +#: src/pages/ResetPassword.tsx:206 msgid "Working…" msgstr "काम चल रहा है…" -#: src/pages/Shell.tsx:5368 +#: src/pages/Shell.tsx:4283 msgid "Workspace default" msgstr "वर्कस्पेस डिफ़ॉल्ट" -#: src/pages/Shell.tsx:1558 -#: src/pages/Shell.tsx:2175 +#: src/pages/Shell.tsx:1541 +#: src/pages/Shell.tsx:2164 msgid "You" msgstr "आप" @@ -3121,16 +3182,21 @@ msgstr "अगर यह अपने आप रीडायरेक्ट न msgid "You can close this window." msgstr "आप यह विंडो बंद कर सकते हैं।" -#: src/pages/Shell.tsx:2933 -#: src/pages/Shell.tsx:3558 +#: src/pages/Shell.tsx:2927 +#: src/pages/Shell.tsx:3547 msgid "You have control" msgstr "नियंत्रण आपके पास है" -#: src/pages/Onboarding.tsx:660 +#: src/pages/ResetPassword.tsx:152 +msgid "You’ve been signed out everywhere. Sign in with your new password." +msgstr "" + +#: src/pages/Onboarding.tsx:674 msgid "Your bot" msgstr "" -#: src/pages/Auth.tsx:69 +#: src/pages/Auth.tsx:80 +#: src/pages/ResetPassword.tsx:89 msgid "Your email address" msgstr "आपका ईमेल पता" @@ -3138,7 +3204,7 @@ msgstr "आपका ईमेल पता" msgid "Your key or subscription token is stored securely and is never shown here." msgstr "आपकी कुंजी या सब्सक्रिप्शन टोकन सुरक्षित रूप से संग्रहीत है और यहां कभी नहीं दिखाया जाता।" -#: src/pages/Auth.tsx:56 +#: src/pages/Auth.tsx:67 msgid "Your name" msgstr "आपका नाम" diff --git a/apps/web/src/locales/id/messages.po b/apps/web/src/locales/id/messages.po index 97b8ba98..97846717 100644 --- a/apps/web/src/locales/id/messages.po +++ b/apps/web/src/locales/id/messages.po @@ -13,7 +13,7 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" -#: src/pages/Shell.tsx:2423 +#: src/pages/Shell.tsx:2412 msgid " (unread)" msgstr " (belum dibaca)" @@ -31,12 +31,12 @@ msgid "{0, plural, one {# model} other {# models}}" msgstr "{0, plural, one {# model} other {# model}}" #. placeholder {0}: file.name -#: src/pages/Shell.tsx:1743 +#: src/pages/Shell.tsx:1726 msgid "{0} (max {ATTACHMENT_MAX_COUNT} attachments)" msgstr "{0} (maksimal {ATTACHMENT_MAX_COUNT} lampiran)" #. placeholder {0}: file.name -#: src/pages/Shell.tsx:1747 +#: src/pages/Shell.tsx:1730 msgid "{0} (over 10 MiB)" msgstr "{0} (lebih dari 10 MiB)" @@ -46,12 +46,12 @@ msgid "{0} {unitLabel}" msgstr "{0} {unitLabel}" #. placeholder {0}: block.name -#: src/pages/Shell.tsx:6066 +#: src/components/conversation/MessageView.tsx:612 msgid "{0} connection" msgstr "Koneksi {0}" #. placeholder {0}: computer.busyBotName -#: src/pages/Shell.tsx:2937 +#: src/pages/Shell.tsx:2931 msgid "{0} is using it" msgstr "{0} sedang memakainya" @@ -67,8 +67,8 @@ msgstr "{0} MB" #. placeholder {0}: usage.runs #. placeholder {1}: usage.inputTokens + usage.outputTokens -#: src/pages/AccountSettingsOverlay.tsx:216 -#: src/pages/Shell.tsx:2644 +#: src/pages/AccountSettingsOverlay.tsx:149 +#: src/pages/Shell.tsx:2633 msgid "{0} runs · {1} tokens" msgstr "{0} run · {1} token" @@ -81,7 +81,7 @@ msgstr "{botName} · {0, plural, one {# peer} other {# peer}}" msgid "{botName} has not messaged another bot yet." msgstr "{botName} belum mengirim pesan ke bot lain." -#: src/pages/Shell.tsx:5943 +#: src/pages/Shell.tsx:4858 msgid "{botName}’s computer" msgstr "Komputer {botName}" @@ -125,12 +125,12 @@ msgstr "{size} B" msgid "{title}, {label}" msgstr "{title}, {label}" -#: src/pages/Shell.tsx:3723 +#: src/pages/Shell.tsx:3712 msgid "{workingBotName} is working" msgstr "{workingBotName} sedang bekerja" #. placeholder {0}: mention.name -#: src/pages/Shell.tsx:4223 +#: src/components/composer/Composer.tsx:363 msgid "@{0}" msgstr "@{0}" @@ -146,11 +146,11 @@ msgstr "+ Ajarkan sebuah tugas" msgid "Access token (optional)" msgstr "Access token (opsional)" -#: src/pages/AccountSettingsOverlay.tsx:128 +#: src/pages/AccountSettingsOverlay.tsx:107 msgid "Account" msgstr "Akun" -#: src/pages/Shell.tsx:5444 +#: src/pages/Shell.tsx:4359 msgid "Account default" msgstr "Default akun" @@ -171,17 +171,17 @@ msgstr "Aktif" msgid "Active model" msgstr "Model aktif" -#: src/pages/VoiceSettingsOverlay.tsx:149 +#: src/pages/VoiceSettingsOverlay.tsx:154 msgid "Active voice" msgstr "Suara aktif" -#: src/pages/Shell.tsx:2213 -#: src/pages/Shell.tsx:2215 +#: src/pages/Shell.tsx:2202 +#: src/pages/Shell.tsx:2204 msgid "Activity" msgstr "Aktivitas" -#: src/pages/PluginsOverlay.tsx:457 -#: src/pages/PluginsOverlay.tsx:668 +#: src/pages/PluginsOverlay.tsx:458 +#: src/pages/PluginsOverlay.tsx:670 #: src/pages/ScratchpadSection.tsx:188 msgid "Add" msgstr "Tambah" @@ -190,7 +190,7 @@ msgstr "Tambah" msgid "Add a model in Settings to use this." msgstr "Tambahkan model di Pengaturan untuk memakai ini." -#: src/pages/Shell.tsx:3157 +#: src/pages/Shell.tsx:3151 msgid "Add a run time for this one-shot." msgstr "Tentukan waktu jalan untuk sekali-jalan ini." @@ -198,7 +198,7 @@ msgstr "Tentukan waktu jalan untuk sekali-jalan ini." msgid "Add a schedule or webhook to run this routine." msgstr "Tambahkan jadwal atau webhook untuk menjalankan rutinitas ini." -#: src/pages/Shell.tsx:3129 +#: src/pages/Shell.tsx:3123 msgid "Add a schedule or webhook trigger" msgstr "Tambahkan pemicu jadwal atau webhook" @@ -222,15 +222,15 @@ msgstr "Isi URL server HTTPS." msgid "Add item" msgstr "Tambah item" -#: src/pages/PluginsOverlay.tsx:762 +#: src/pages/PluginsOverlay.tsx:764 msgid "Add MCP server" msgstr "Tambah server MCP" -#: src/pages/PluginsOverlay.tsx:765 +#: src/pages/PluginsOverlay.tsx:767 msgid "Add OpenAPI" msgstr "Tambah OpenAPI" -#: src/pages/PluginsOverlay.tsx:780 +#: src/pages/PluginsOverlay.tsx:782 msgid "Add remote MCP server" msgstr "Tambah server MCP remote" @@ -243,7 +243,7 @@ msgstr "Tambah server" msgid "Add to routine" msgstr "Tambahkan ke rutinitas" -#: src/pages/PluginsOverlay.tsx:768 +#: src/pages/PluginsOverlay.tsx:770 msgid "Add Treg" msgstr "Tambah Treg" @@ -252,15 +252,15 @@ msgid "Add trigger" msgstr "Tambah pemicu" #: src/pages/McpServersOverlay.tsx:363 -#: src/pages/PluginsOverlay.tsx:452 -#: src/pages/PluginsOverlay.tsx:663 +#: src/pages/PluginsOverlay.tsx:453 +#: src/pages/PluginsOverlay.tsx:665 msgid "Adding…" msgstr "Menambahkan…" -#: src/pages/AccountSettingsOverlay.tsx:247 -#: src/pages/PluginsOverlay.tsx:742 +#: src/pages/AccountSettingsOverlay.tsx:180 +#: src/pages/PluginsOverlay.tsx:744 #: src/pages/RoutineSchedule.tsx:42 -#: src/pages/Shell.tsx:5347 +#: src/pages/Shell.tsx:4262 msgid "Advanced" msgstr "Lanjutan" @@ -272,7 +272,7 @@ msgstr "Lanjutan..." msgid "Agent access for new servers" msgstr "Akses agent untuk server baru" -#: src/pages/Shell.tsx:2736 +#: src/pages/Shell.tsx:2730 msgid "Agent computer" msgstr "Komputer agent" @@ -319,7 +319,7 @@ msgstr "Izinkan tindakan pembelian tanpa bertanya" msgid "Allowed once" msgstr "Diizinkan sekali" -#: src/pages/Auth.tsx:159 +#: src/pages/Auth.tsx:169 msgid "Already have an account?" msgstr "Sudah punya akun?" @@ -331,6 +331,10 @@ msgstr "Selalu izinkan tool ini" msgid "Always allowed" msgstr "Selalu diizinkan" +#: src/pages/Auth.tsx:140 +msgid "An account with this email already exists." +msgstr "Email ini sudah terdaftar." + #: src/components/AskCard.tsx:138 msgid "Answer" msgstr "Jawab" @@ -352,14 +356,14 @@ msgstr "API sudah kembali, tetapi pembaruan belum selesai. Periksa log host." #: src/pages/ModelSettingsOverlay.tsx:630 #: src/pages/ModelSettingsOverlay.tsx:633 #: src/pages/ModelSettingsOverlay.tsx:649 -#: src/pages/Onboarding.tsx:496 -#: src/pages/Onboarding.tsx:499 #: src/pages/Onboarding.tsx:510 -#: src/pages/VoiceSettingsOverlay.tsx:236 +#: src/pages/Onboarding.tsx:513 +#: src/pages/Onboarding.tsx:524 +#: src/pages/VoiceSettingsOverlay.tsx:241 msgid "API key" msgstr "API key" -#: src/pages/PluginsOverlay.tsx:816 +#: src/pages/PluginsOverlay.tsx:818 msgid "API key header" msgstr "Header API key" @@ -371,13 +375,13 @@ msgstr "Berlaku saat Anda menekan Tambah server. Gunakan chip agent di tiap kart msgid "Approval boundaries" msgstr "Batas persetujuan" +#: src/components/conversation/MessageView.tsx:805 #: src/pages/PhoneSettingsOverlay.tsx:243 #: src/pages/PhoneSettingsOverlay.tsx:310 -#: src/pages/Shell.tsx:6259 msgid "Approve" msgstr "Setujui" -#: src/pages/Shell.tsx:6250 +#: src/components/conversation/MessageView.tsx:796 msgid "Approve this server to let your agent use its tools." msgstr "Setujui server ini agar agent Anda bisa memakai tool-nya." @@ -385,15 +389,15 @@ msgstr "Setujui server ini agar agent Anda bisa memakai tool-nya." msgid "Archive" msgstr "Arsipkan" -#: src/pages/Shell.tsx:4892 +#: src/components/conversation/MessageView.tsx:312 msgid "archived" msgstr "diarsipkan" -#: src/pages/Shell.tsx:2487 +#: src/pages/Shell.tsx:2476 msgid "Archived" msgstr "Diarsipkan" -#: src/pages/Shell.tsx:4903 +#: src/components/conversation/MessageView.tsx:323 msgid "Archived. Chat, memory, and files kept." msgstr "Diarsipkan. Chat, memori, dan file tetap disimpan." @@ -432,7 +436,7 @@ msgstr "Tanya dulu sebelum pembelian" msgid "Ask before sending external email" msgstr "Tanya dulu sebelum mengirim email keluar" -#: src/pages/Shell.tsx:2939 +#: src/pages/Shell.tsx:2933 msgid "Asleep" msgstr "Tidur" @@ -447,16 +451,21 @@ msgstr "pukul {0}" msgid "at {timeSelect}" msgstr "pukul {timeSelect}" -#: src/pages/Shell.tsx:4297 +#: src/pages/Auth.tsx:134 +#: src/pages/ResetPassword.tsx:197 +msgid "At least 8 characters" +msgstr "Minimal 8 karakter" + +#: src/components/composer/Composer.tsx:437 msgid "Attach file" msgstr "Lampirkan file" -#: src/pages/Shell.tsx:4498 +#: src/components/composer/shared.ts:21 msgid "Attachment" msgstr "Lampiran" #: src/pages/ModelSettingsOverlay.tsx:563 -#: src/pages/Onboarding.tsx:437 +#: src/pages/Onboarding.tsx:451 msgid "Authorization code or callback URL" msgstr "Kode otorisasi atau URL callback" @@ -464,12 +473,12 @@ msgstr "Kode otorisasi atau URL callback" msgid "Authorization expired — reconnect required" msgstr "Otorisasi kedaluwarsa — perlu sambung ulang" -#: src/pages/Shell.tsx:6051 +#: src/components/conversation/MessageView.tsx:597 msgid "Authorization timed out. Please try again." msgstr "Otorisasi kehabisan waktu. Silakan coba lagi." -#: src/pages/Shell.tsx:6093 -#: src/pages/Shell.tsx:6259 +#: src/components/conversation/MessageView.tsx:639 +#: src/components/conversation/MessageView.tsx:805 msgid "Authorize" msgstr "Otorisasi" @@ -477,34 +486,35 @@ msgstr "Otorisasi" msgid "Available after the routine is saved" msgstr "Tersedia setelah rutinitas disimpan" -#: src/pages/AccountSettingsOverlay.tsx:161 -msgid "Avatars" -msgstr "Avatar" - #: src/pages/RoutineEditor.tsx:243 msgid "Back" msgstr "Kembali" +#: src/pages/ResetPassword.tsx:61 +#: src/pages/ResetPassword.tsx:107 +msgid "Back to sign in" +msgstr "Kembali ke halaman masuk" + #: src/pages/memory-providers/SupermemorySettingsForm.tsx:48 msgid "Base URL" -msgstr "Base URL" +msgstr "URL dasar" -#: src/pages/PluginsOverlay.tsx:813 +#: src/pages/PluginsOverlay.tsx:815 msgid "Bearer token" -msgstr "Bearer token" +msgstr "Token bearer" -#: src/pages/Shell.tsx:5935 +#: src/pages/Shell.tsx:4850 msgid "Booting live desktop…" msgstr "Menyalakan desktop live…" #. placeholder {0}: active?.name -#: src/pages/Shell.tsx:3528 +#: src/pages/Shell.tsx:3517 msgid "Booting up {0}’s computer" msgstr "Menyalakan komputer {0}" -#: src/pages/Shell.tsx:4752 -#: src/pages/Shell.tsx:4753 -#: src/pages/Shell.tsx:4896 +#: src/components/conversation/MessageView.tsx:172 +#: src/components/conversation/MessageView.tsx:173 +#: src/components/conversation/MessageView.tsx:316 msgid "bot" msgstr "bot" @@ -513,7 +523,7 @@ msgstr "bot" msgid "Bot" msgstr "Bot" -#: src/pages/Shell.tsx:1559 +#: src/pages/Shell.tsx:1542 msgid "Bot" msgstr "Bot" @@ -521,11 +531,11 @@ msgstr "Bot" msgid "Bot messages" msgstr "Pesan antar-bot" -#: src/pages/Shell.tsx:3625 +#: src/pages/Shell.tsx:3614 msgid "Bot screen" msgstr "Layar bot" -#: src/pages/Shell.tsx:2903 +#: src/pages/Shell.tsx:2897 msgid "Bot screen preview" msgstr "Pratinjau layar bot" @@ -533,36 +543,36 @@ msgstr "Pratinjau layar bot" msgid "Bots act without asking by default. Add an exception only when you want to review a type of action first. These preferences apply across all your bots." msgstr "Secara default bot bertindak tanpa bertanya. Tambahkan pengecualian hanya bila Anda ingin meninjau jenis tindakan tertentu lebih dulu. Preferensi ini berlaku untuk semua bot Anda." -#: src/pages/Shell.tsx:3724 +#: src/pages/Shell.tsx:3713 msgid "Bots are working" msgstr "Bot sedang bekerja" -#: src/pages/VoiceSettingsOverlay.tsx:130 +#: src/pages/VoiceSettingsOverlay.tsx:135 msgid "Bring your own key. The provider is swappable; your bots keep the same speak and call buttons." msgstr "Pakai key Anda sendiri. Provider bisa diganti; tombol bicara dan telepon di bot Anda tetap sama." #: src/pages/CallView.tsx:233 -#: src/pages/Shell.tsx:2718 -#: src/pages/Shell.tsx:2719 +#: src/pages/Shell.tsx:2712 +#: src/pages/Shell.tsx:2713 msgid "Call" msgstr "Telepon" -#: src/App.tsx:125 +#: src/App.tsx:129 msgid "Can't reach the server." msgstr "Server tidak bisa dijangkau." #: src/components/AskCard.tsx:161 #: src/components/ComputerMaintenanceActions.tsx:108 #: src/components/teach/TeachComputerSection.tsx:122 -#: src/pages/PluginsOverlay.tsx:864 -#: src/pages/Shell.tsx:5611 -#: src/pages/Shell.tsx:5683 -#: src/pages/Shell.tsx:5798 -#: src/pages/Shell.tsx:5874 +#: src/pages/PluginsOverlay.tsx:866 +#: src/pages/Shell.tsx:4526 +#: src/pages/Shell.tsx:4598 +#: src/pages/Shell.tsx:4713 +#: src/pages/Shell.tsx:4789 msgid "Cancel" msgstr "Batal" -#: src/pages/Shell.tsx:5140 +#: src/pages/Shell.tsx:4055 msgid "Cancel new bot" msgstr "Batalkan bot baru" @@ -570,7 +580,7 @@ msgstr "Batalkan bot baru" msgid "Cancel new group" msgstr "Batalkan grup baru" -#: src/pages/Shell.tsx:4170 +#: src/components/composer/Composer.tsx:310 msgid "Cancel reply" msgstr "Batalkan balasan" @@ -582,11 +592,11 @@ msgstr "Dibatalkan" msgid "Channels" msgstr "Kanal" -#: src/pages/Shell.tsx:6156 +#: src/components/conversation/MessageView.tsx:702 msgid "Chart failed to render: {error}" msgstr "Grafik gagal ditampilkan: {error}" -#: src/pages/Shell.tsx:4439 +#: src/components/composer/Composer.tsx:579 msgid "Chat Settings" msgstr "Pengaturan Chat" @@ -602,11 +612,15 @@ msgstr "Pengecekan gagal" msgid "Check for updates" msgstr "Periksa pembaruan" -#: src/pages/Shell.tsx:3170 -#: src/pages/Shell.tsx:3180 +#: src/pages/Shell.tsx:3164 +#: src/pages/Shell.tsx:3174 msgid "Check in." msgstr "Lapor perkembangan." +#: src/pages/ResetPassword.tsx:52 +msgid "Check your email" +msgstr "Periksa email Anda" + #: src/components/SoftwareUpdateSection.tsx:71 msgid "Checking…" msgstr "Memeriksa…" @@ -615,33 +629,33 @@ msgstr "Memeriksa…" msgid "Checkout has local changes. Clean it before updating." msgstr "Checkout punya perubahan lokal. Bersihkan dulu sebelum memperbarui." -#: src/pages/Onboarding.tsx:269 +#: src/pages/Onboarding.tsx:283 msgid "Choose a model to get started." msgstr "Pilih model untuk mulai." +#: src/pages/ResetPassword.tsx:162 +msgid "Choose a new password" +msgstr "Pilih kata sandi baru" + #: src/pages/ModelSettingsOverlay.tsx:310 msgid "Choose which connected model Sentra Bot uses." msgstr "Pilih model tersambung mana yang dipakai Sentra Bot." -#: src/pages/AccountSettingsOverlay.tsx:187 -msgid "Clay" -msgstr "Clay" - -#: src/pages/Shell.tsx:5698 +#: src/pages/Shell.tsx:4613 msgid "Clear" msgstr "Bersihkan" #. placeholder {0}: bot.name -#: src/pages/Shell.tsx:5664 +#: src/pages/Shell.tsx:4579 msgid "Clear {0}’s conversation?" msgstr "Bersihkan percakapan {0}?" #: src/pages/BotContextMenu.tsx:103 -#: src/pages/Shell.tsx:5499 +#: src/pages/Shell.tsx:4414 msgid "Clear conversation" msgstr "Bersihkan percakapan" -#: src/pages/Shell.tsx:5698 +#: src/pages/Shell.tsx:4613 msgid "Clearing…" msgstr "Membersihkan…" @@ -655,19 +669,19 @@ msgstr "Tutup" msgid "Close bot messages" msgstr "Tutup pesan antar-bot" -#: src/pages/Shell.tsx:6341 +#: src/components/conversation/MessageView.tsx:887 msgid "Close chart" msgstr "Tutup grafik" -#: src/pages/Shell.tsx:3599 +#: src/pages/Shell.tsx:3588 msgid "Close computer" msgstr "Tutup komputer" -#: src/pages/Shell.tsx:6441 +#: src/components/conversation/MessageView.tsx:987 msgid "Close image preview" msgstr "Tutup pratinjau gambar" -#: src/pages/PluginsOverlay.tsx:586 +#: src/pages/PluginsOverlay.tsx:587 msgid "Close integrations" msgstr "Tutup integrasi" @@ -683,11 +697,11 @@ msgstr "Tutup pengaturan memori" msgid "Close model settings" msgstr "Tutup pengaturan model" -#: src/pages/Shell.tsx:2195 +#: src/pages/Shell.tsx:2184 msgid "Close navigation" msgstr "Tutup navigasi" -#: src/pages/Shell.tsx:2881 +#: src/pages/Shell.tsx:2875 msgid "Close panel" msgstr "Tutup panel" @@ -700,11 +714,11 @@ msgstr "Tutup pengaturan telepon" msgid "Close preview" msgstr "Tutup pratinjau" -#: src/pages/AccountSettingsOverlay.tsx:118 +#: src/pages/AccountSettingsOverlay.tsx:97 msgid "Close user settings" msgstr "Tutup pengaturan pengguna" -#: src/pages/VoiceSettingsOverlay.tsx:139 +#: src/pages/VoiceSettingsOverlay.tsx:144 msgid "Close voice settings" msgstr "Tutup pengaturan suara" @@ -718,7 +732,7 @@ msgid "Code" msgstr "Kode" #. placeholder {0}: group.title -#: src/pages/Shell.tsx:2305 +#: src/pages/Shell.tsx:2294 msgid "Collapse {0}" msgstr "Ciutkan {0}" @@ -734,28 +748,28 @@ msgstr "Perintah" msgid "Complete" msgstr "Selesaikan" -#: src/pages/Shell.tsx:5050 -#: src/pages/Shell.tsx:5078 +#: src/components/conversation/MessageView.tsx:470 +#: src/pages/Shell.tsx:3993 msgid "Computer" msgstr "Komputer" -#: src/pages/Shell.tsx:5938 +#: src/pages/Shell.tsx:4853 msgid "Computer failed to boot" msgstr "Komputer gagal dinyalakan" -#: src/pages/Shell.tsx:3647 +#: src/pages/Shell.tsx:3636 msgid "Computer is asleep" msgstr "Komputer sedang tidur" -#: src/pages/Shell.tsx:5937 +#: src/pages/Shell.tsx:4852 msgid "Computer is asleep. Take control to wake it." msgstr "Komputer sedang tidur. Ambil alih untuk membangunkannya." -#: src/pages/Shell.tsx:5939 +#: src/pages/Shell.tsx:4854 msgid "Computer is stopped" msgstr "Komputer berhenti" -#: src/pages/AccountSettingsOverlay.tsx:234 +#: src/pages/AccountSettingsOverlay.tsx:167 msgid "Computers" msgstr "Komputer" @@ -776,12 +790,12 @@ msgid "Confirm delete" msgstr "Konfirmasi penghapusan" #: src/pages/memory-providers/SupermemorySettingsForm.tsx:80 -#: src/pages/PluginsOverlay.tsx:494 -#: src/pages/VoiceSettingsOverlay.tsx:257 +#: src/pages/PluginsOverlay.tsx:495 +#: src/pages/VoiceSettingsOverlay.tsx:262 msgid "Connect" msgstr "Sambungkan" -#: src/pages/Onboarding.tsx:266 +#: src/pages/Onboarding.tsx:280 msgid "Connect a model" msgstr "Sambungkan sebuah model" @@ -789,11 +803,11 @@ msgstr "Sambungkan sebuah model" msgid "Connect API key" msgstr "Sambungkan API key" -#: src/pages/VoiceSettingsOverlay.tsx:160 +#: src/pages/VoiceSettingsOverlay.tsx:165 msgid "Connect ElevenLabs, OpenAI, or Cartesia" msgstr "Sambungkan ElevenLabs, OpenAI, atau Cartesia" -#: src/pages/Shell.tsx:6239 +#: src/components/conversation/MessageView.tsx:785 msgid "Connect MCP server “{name}”" msgstr "Sambungkan server MCP “{name}”" @@ -809,31 +823,31 @@ msgstr "Sambungkan server tool remote atau lokal dan pilih agent mana yang boleh msgid "Connect this provider to use it as your personal model." msgstr "Sambungkan provider ini untuk memakainya sebagai model pribadi Anda." -#: src/pages/PluginsOverlay.tsx:778 +#: src/pages/PluginsOverlay.tsx:780 msgid "Connect Treg" msgstr "Sambungkan Treg" +#: src/components/conversation/MessageView.tsx:636 #: src/pages/McpOAuthCallback.tsx:53 #: src/pages/MemorySettingsOverlay.tsx:163 #: src/pages/ModelSettingsOverlay.tsx:378 -#: src/pages/Shell.tsx:6090 -#: src/pages/VoiceSettingsOverlay.tsx:202 +#: src/pages/VoiceSettingsOverlay.tsx:207 msgid "Connected" msgstr "Tersambung" -#: src/pages/Shell.tsx:6269 +#: src/components/conversation/MessageView.tsx:815 msgid "Connected — its tools are available from your next message." msgstr "Tersambung — tool-nya tersedia mulai pesan Anda berikutnya." #. placeholder {0}: credential.label #. placeholder {0}: selected.name #: src/pages/ModelSettingsOverlay.tsx:522 -#: src/pages/VoiceSettingsOverlay.tsx:223 +#: src/pages/VoiceSettingsOverlay.tsx:228 msgid "Connected · {0}" msgstr "Tersambung · {0}" #. placeholder {0}: selected.name -#: src/pages/VoiceSettingsOverlay.tsx:73 +#: src/pages/VoiceSettingsOverlay.tsx:78 msgid "Connected {0}." msgstr "{0} tersambung." @@ -844,29 +858,29 @@ msgstr "{0} tersambung." msgid "Connected and using {0}." msgstr "Tersambung dan memakai {0}." +#: src/components/conversation/MessageView.tsx:805 #: src/pages/McpServersOverlay.tsx:16 #: src/pages/memory-providers/SupermemorySettingsForm.tsx:80 -#: src/pages/PluginsOverlay.tsx:494 -#: src/pages/Shell.tsx:6259 -#: src/pages/VoiceSettingsOverlay.tsx:253 +#: src/pages/PluginsOverlay.tsx:495 +#: src/pages/VoiceSettingsOverlay.tsx:258 msgid "Connecting…" msgstr "Menyambungkan…" #. placeholder {0}: item.name -#: src/pages/PluginsOverlay.tsx:297 +#: src/pages/PluginsOverlay.tsx:298 msgid "Connection to {0} is still pending. You can close this and check again." msgstr "Koneksi ke {0} masih tertunda. Anda bisa menutup ini dan memeriksanya lagi." -#: src/pages/Onboarding.tsx:538 -#: src/pages/Onboarding.tsx:697 +#: src/pages/Onboarding.tsx:552 +#: src/pages/Onboarding.tsx:711 msgid "Continue" msgstr "Lanjutkan" -#: src/pages/Auth.tsx:144 +#: src/pages/Auth.tsx:154 msgid "Continue with email" msgstr "Lanjutkan dengan email" -#: src/pages/Shell.tsx:4535 +#: src/pages/Shell.tsx:3921 msgid "Copy" msgstr "Salin" @@ -878,11 +892,11 @@ msgstr "Gagal menambahkan" msgid "Could not add MCP server" msgstr "Gagal menambahkan server MCP" -#: src/pages/Shell.tsx:6226 +#: src/components/conversation/MessageView.tsx:772 msgid "Could not approve this server" msgstr "Gagal menyetujui server ini" -#: src/pages/Shell.tsx:6054 +#: src/components/conversation/MessageView.tsx:600 msgid "Could not authorize this app" msgstr "Gagal mengotorisasi aplikasi ini" @@ -890,7 +904,7 @@ msgstr "Gagal mengotorisasi aplikasi ini" msgid "Could not change the default model" msgstr "Gagal mengubah model default" -#: src/pages/Shell.tsx:5692 +#: src/pages/Shell.tsx:4607 msgid "Could not clear conversation" msgstr "Gagal membersihkan percakapan" @@ -898,7 +912,7 @@ msgstr "Gagal membersihkan percakapan" msgid "Could not complete OAuth" msgstr "Gagal menyelesaikan OAuth" -#: src/pages/PluginsOverlay.tsx:301 +#: src/pages/PluginsOverlay.tsx:302 msgid "Could not connect" msgstr "Gagal menyambungkan" @@ -911,15 +925,15 @@ msgstr "Gagal menyambungkan {0}" msgid "Could not connect this provider" msgstr "Gagal menyambungkan provider ini" -#: src/pages/VoiceSettingsOverlay.tsx:75 +#: src/pages/VoiceSettingsOverlay.tsx:80 msgid "Could not connect this voice provider" msgstr "Gagal menyambungkan provider suara ini" -#: src/pages/Auth.tsx:33 +#: src/pages/Auth.tsx:50 msgid "Could not continue" msgstr "Gagal melanjutkan" -#: src/pages/Shell.tsx:5128 +#: src/pages/Shell.tsx:4043 msgid "Could not create bot" msgstr "Gagal membuat bot" @@ -927,19 +941,19 @@ msgstr "Gagal membuat bot" msgid "Could not create group" msgstr "Gagal membuat grup" -#: src/pages/Shell.tsx:5583 +#: src/pages/Shell.tsx:4498 msgid "Could not create section" msgstr "Gagal membuat seksi" -#: src/pages/Onboarding.tsx:251 +#: src/pages/Onboarding.tsx:265 msgid "Could not create your bot" msgstr "Gagal membuat bot Anda" -#: src/pages/Shell.tsx:5807 +#: src/pages/Shell.tsx:4722 msgid "Could not delete bot" msgstr "Gagal menghapus bot" -#: src/pages/Shell.tsx:5887 +#: src/pages/Shell.tsx:4802 msgid "Could not delete group" msgstr "Gagal menghapus grup" @@ -947,7 +961,7 @@ msgstr "Gagal menghapus grup" msgid "Could not delete MCP server" msgstr "Gagal menghapus server MCP" -#: src/pages/Shell.tsx:5888 +#: src/pages/Shell.tsx:4803 msgid "Could not delete routine" msgstr "Gagal menghapus rutinitas" @@ -968,15 +982,15 @@ msgstr "Gagal mengunduh {0}. Coba lagi." msgid "Could not download {name}. Try again." msgstr "Gagal mengunduh {name}. Coba lagi." -#: src/pages/PluginsOverlay.tsx:952 +#: src/pages/PluginsOverlay.tsx:954 msgid "Could not install connector" msgstr "Gagal memasang konektor" -#: src/pages/PluginsOverlay.tsx:370 +#: src/pages/PluginsOverlay.tsx:371 msgid "Could not install MCP server" msgstr "Gagal memasang server MCP" -#: src/pages/PluginsOverlay.tsx:409 +#: src/pages/PluginsOverlay.tsx:410 msgid "Could not install skill" msgstr "Gagal memasang skill" @@ -984,7 +998,7 @@ msgstr "Gagal memasang skill" msgid "Could not load approval rules" msgstr "Gagal memuat aturan persetujuan" -#: src/pages/PluginsOverlay.tsx:130 +#: src/pages/PluginsOverlay.tsx:133 msgid "Could not load integrations" msgstr "Gagal memuat integrasi" @@ -1004,16 +1018,16 @@ msgstr "Gagal memuat file ini." msgid "Could not load update status" msgstr "Gagal memuat status pembaruan" -#: src/pages/VoiceSettingsOverlay.tsx:47 +#: src/pages/VoiceSettingsOverlay.tsx:52 msgid "Could not load voice settings" msgstr "Gagal memuat pengaturan suara" -#: src/pages/VoiceSettingsOverlay.tsx:109 +#: src/pages/VoiceSettingsOverlay.tsx:114 msgid "Could not play a test clip" msgstr "Gagal memutar klip uji" #: src/pages/ModelSettingsOverlay.tsx:221 -#: src/pages/Onboarding.tsx:197 +#: src/pages/Onboarding.tsx:211 msgid "Could not reach this model server" msgstr "Server model ini tidak bisa dijangkau" @@ -1021,7 +1035,7 @@ msgstr "Server model ini tidak bisa dijangkau" msgid "Could not remove" msgstr "Gagal menghapus" -#: src/pages/PluginsOverlay.tsx:965 +#: src/pages/PluginsOverlay.tsx:967 msgid "Could not remove connector" msgstr "Gagal menghapus konektor" @@ -1029,7 +1043,7 @@ msgstr "Gagal menghapus konektor" msgid "Could not remove group" msgstr "Gagal menghapus grup" -#: src/pages/PluginsOverlay.tsx:396 +#: src/pages/PluginsOverlay.tsx:397 msgid "Could not remove MCP server" msgstr "Gagal menghapus server MCP" @@ -1037,23 +1051,27 @@ msgstr "Gagal menghapus server MCP" msgid "Could not remove rule" msgstr "Gagal menghapus aturan" -#: src/pages/PluginsOverlay.tsx:423 +#: src/pages/PluginsOverlay.tsx:424 msgid "Could not remove skill" msgstr "Gagal menghapus skill" -#: src/pages/Shell.tsx:6146 +#: src/components/conversation/MessageView.tsx:692 msgid "Could not render chart" msgstr "Gagal menampilkan grafik" -#: src/pages/PluginsOverlay.tsx:327 +#: src/pages/ResetPassword.tsx:139 +msgid "Could not reset your password" +msgstr "Kata sandi gagal disetel ulang" + +#: src/pages/PluginsOverlay.tsx:328 msgid "Could not revoke connection" msgstr "Gagal mencabut koneksi" -#: src/pages/Shell.tsx:3232 +#: src/pages/Shell.tsx:3226 msgid "Could not run routine" msgstr "Gagal menjalankan rutinitas" -#: src/pages/Shell.tsx:5484 +#: src/pages/Shell.tsx:4399 msgid "Could not save" msgstr "Gagal menyimpan" @@ -1065,11 +1083,11 @@ msgstr "Gagal menyimpan Auto Review" msgid "Could not save group" msgstr "Gagal menyimpan grup" -#: src/pages/Onboarding.tsx:224 +#: src/pages/Onboarding.tsx:238 msgid "Could not save model" msgstr "Gagal menyimpan model" -#: src/pages/Shell.tsx:3203 +#: src/pages/Shell.tsx:3197 msgid "Could not save routine" msgstr "Gagal menyimpan rutinitas" @@ -1081,11 +1099,11 @@ msgstr "Gagal menyimpan aturan" msgid "Could not save that choice" msgstr "Gagal menyimpan pilihan itu" -#: src/pages/VoiceSettingsOverlay.tsx:90 +#: src/pages/VoiceSettingsOverlay.tsx:95 msgid "Could not save that voice" msgstr "Gagal menyimpan suara itu" -#: src/pages/Shell.tsx:5966 +#: src/components/conversation/MessageView.tsx:508 msgid "Could not save this choice" msgstr "Gagal menyimpan pilihan ini" @@ -1093,8 +1111,12 @@ msgstr "Gagal menyimpan pilihan ini" msgid "Could not send that" msgstr "Gagal mengirim itu" +#: src/pages/ResetPassword.tsx:44 +msgid "Could not send the link. Try again." +msgstr "Tautan gagal dikirim. Coba lagi." + #: src/pages/McpServersOverlay.tsx:172 -#: src/pages/PluginsOverlay.tsx:384 +#: src/pages/PluginsOverlay.tsx:385 msgid "Could not start OAuth" msgstr "Gagal memulai OAuth" @@ -1102,7 +1124,7 @@ msgstr "Gagal memulai OAuth" msgid "Could not submit this answer" msgstr "Gagal mengirim jawaban ini" -#: src/pages/Shell.tsx:2043 +#: src/pages/Shell.tsx:2032 msgid "Could not take control" msgstr "Gagal mengambil alih" @@ -1130,26 +1152,22 @@ msgstr "Gagal memuat pengaturan telepon" msgid "Couldn't start WhatsApp pairing" msgstr "Gagal memulai pemasangan WhatsApp" -#: src/pages/AccountSettingsOverlay.tsx:93 -msgid "Couldn't update avatars" -msgstr "Gagal memperbarui avatar" - #: src/pages/PhoneSettingsOverlay.tsx:99 msgid "Couldn't update phone settings" msgstr "Gagal memperbarui pengaturan telepon" -#: src/pages/Shell.tsx:2233 -#: src/pages/Shell.tsx:5187 -#: src/pages/Shell.tsx:5618 +#: src/pages/Shell.tsx:2222 +#: src/pages/Shell.tsx:4102 +#: src/pages/Shell.tsx:4533 msgid "Create" msgstr "Buat" #. placeholder {0}: bot.name -#: src/pages/Shell.tsx:5592 +#: src/pages/Shell.tsx:4507 msgid "Create a section and move {0} into it." msgstr "Buat seksi lalu pindahkan {0} ke dalamnya." -#: src/pages/Auth.tsx:146 +#: src/pages/Auth.tsx:156 msgid "Create account" msgstr "Buat akun" @@ -1157,29 +1175,29 @@ msgstr "Buat akun" msgid "Create group" msgstr "Buat grup" -#: src/pages/Onboarding.tsx:557 +#: src/pages/Onboarding.tsx:571 msgid "Create your first bot" msgstr "Buat bot pertama Anda" -#: src/pages/Auth.tsx:17 +#: src/pages/Auth.tsx:29 msgid "Create your Sentra Bot" msgstr "Buat Sentra Bot Anda" #: src/pages/GroupPanel.tsx:134 -#: src/pages/Shell.tsx:5187 -#: src/pages/Shell.tsx:5618 +#: src/pages/Shell.tsx:4102 +#: src/pages/Shell.tsx:4533 msgid "Creating…" msgstr "Membuat…" -#: src/pages/PluginsOverlay.tsx:569 +#: src/pages/PluginsOverlay.tsx:570 msgid "Creativity" msgstr "Kreativitas" -#: src/pages/PluginsOverlay.tsx:834 +#: src/pages/PluginsOverlay.tsx:836 msgid "Credential" msgstr "Kredensial" -#: src/pages/PluginsOverlay.tsx:892 +#: src/pages/PluginsOverlay.tsx:894 msgid "credential saved" msgstr "kredensial tersimpan" @@ -1204,7 +1222,7 @@ msgstr "hari" msgid "Decline" msgstr "Tolak" -#: src/pages/Shell.tsx:5391 +#: src/pages/Shell.tsx:4306 msgid "Default (medium)" msgstr "Default (sedang)" @@ -1215,24 +1233,24 @@ msgstr "Cakupan default" #: src/pages/BotContextMenu.tsx:105 #: src/pages/McpServersOverlay.tsx:481 #: src/pages/RoutineEditor.tsx:280 -#: src/pages/Shell.tsx:2522 -#: src/pages/Shell.tsx:2552 -#: src/pages/Shell.tsx:5813 -#: src/pages/Shell.tsx:5895 +#: src/pages/Shell.tsx:2511 +#: src/pages/Shell.tsx:2541 +#: src/pages/Shell.tsx:4728 +#: src/pages/Shell.tsx:4810 msgid "Delete" msgstr "Hapus" #. placeholder {0}: bot.name #. placeholder {0}: group.name -#: src/pages/Shell.tsx:2518 -#: src/pages/Shell.tsx:2548 +#: src/pages/Shell.tsx:2507 +#: src/pages/Shell.tsx:2537 msgid "Delete {0}" msgstr "Hapus {0}" #. placeholder {0}: bot.name #. placeholder {0}: item.name -#: src/pages/Shell.tsx:5745 -#: src/pages/Shell.tsx:5861 +#: src/pages/Shell.tsx:4660 +#: src/pages/Shell.tsx:4776 msgid "Delete {0}?" msgstr "Hapus {0}?" @@ -1240,17 +1258,17 @@ msgstr "Hapus {0}?" msgid "Delete group" msgstr "Hapus grup" -#: src/pages/Shell.tsx:5782 +#: src/pages/Shell.tsx:4697 msgid "Delete memories too" msgstr "Hapus memorinya juga" -#: src/pages/Shell.tsx:4894 +#: src/components/conversation/MessageView.tsx:314 msgid "deleted" msgstr "dihapus" #: src/pages/GroupPanel.tsx:232 -#: src/pages/Shell.tsx:5813 -#: src/pages/Shell.tsx:5895 +#: src/pages/Shell.tsx:4728 +#: src/pages/Shell.tsx:4810 msgid "Deleting…" msgstr "Menghapus…" @@ -1266,26 +1284,30 @@ msgstr "Jangan" msgid "Deployment default" msgstr "Default deployment" -#: src/pages/Onboarding.tsx:676 -#: src/pages/Shell.tsx:5165 +#: src/pages/Onboarding.tsx:690 +#: src/pages/Shell.tsx:4080 msgid "Describe what this bot does" msgstr "Jelaskan apa yang dikerjakan bot ini" -#: src/pages/Onboarding.tsx:651 +#: src/pages/Onboarding.tsx:665 msgid "Describe your own bot in the panel." msgstr "Jelaskan bot Anda sendiri di panel ini." -#: src/pages/Onboarding.tsx:681 -#: src/pages/Shell.tsx:5170 -#: src/pages/Shell.tsx:5335 +#: src/pages/Onboarding.tsx:695 +#: src/pages/Shell.tsx:4085 +#: src/pages/Shell.tsx:4250 msgid "Description" msgstr "Deskripsi" -#: src/pages/PluginsOverlay.tsx:565 +#: src/pages/Shell.tsx:2704 +msgid "Desktop Runtime offline" +msgstr "Desktop Runtime luring" + +#: src/pages/PluginsOverlay.tsx:566 msgid "Developer" -msgstr "Developer" +msgstr "Pengembang" -#: src/pages/Shell.tsx:4306 +#: src/components/composer/Composer.tsx:446 msgid "Dictate" msgstr "Dikte" @@ -1298,15 +1320,15 @@ msgstr "Putuskan" msgid "Disconnecting…" msgstr "Memutuskan…" -#: src/pages/Shell.tsx:4153 +#: src/components/composer/Composer.tsx:293 msgid "Dismiss error" msgstr "Tutup pesan kesalahan" -#: src/pages/Shell.tsx:6274 +#: src/components/conversation/MessageView.tsx:820 msgid "Dismissed — reconnect anytime from MCP settings." msgstr "Ditutup — sambungkan lagi kapan saja dari pengaturan MCP." -#: src/pages/PluginsOverlay.tsx:788 +#: src/pages/PluginsOverlay.tsx:790 msgid "Display name" msgstr "Nama tampilan" @@ -1323,7 +1345,7 @@ msgstr "Docker (disarankan)" msgid "Docker is the default: bots use a shared Team Computer." msgstr "Docker adalah default: bot memakai Team Computer bersama." -#: src/pages/Auth.tsx:152 +#: src/pages/Auth.tsx:162 msgid "Don’t have an account?" msgstr "Belum punya akun?" @@ -1350,7 +1372,7 @@ msgstr "Draf skill" msgid "Duplicate" msgstr "Duplikat" -#: src/pages/Shell.tsx:4697 +#: src/components/conversation/MessageView.tsx:117 msgid "Earlier message" msgstr "Pesan sebelumnya" @@ -1362,7 +1384,8 @@ msgstr "Edit dulu" msgid "Edit Profile" msgstr "Edit Profil" -#: src/pages/Auth.tsx:62 +#: src/pages/Auth.tsx:73 +#: src/pages/ResetPassword.tsx:82 msgid "Email" msgstr "Email" @@ -1372,7 +1395,7 @@ msgstr "Kredensial statis terenkripsi tersimpan" #. placeholder {0}: oauth.verificationUri.replace(/^https:\/\//, "") #: src/pages/ModelSettingsOverlay.tsx:586 -#: src/pages/Onboarding.tsx:459 +#: src/pages/Onboarding.tsx:473 msgid "Enter this code at <0>{0}" msgstr "Masukkan kode ini di <0>{0}" @@ -1410,16 +1433,16 @@ msgstr "Setiap bulan" msgid "Every week" msgstr "Setiap minggu" -#: src/pages/Shell.tsx:6320 +#: src/components/conversation/MessageView.tsx:866 msgid "Expand" msgstr "Perluas" #. placeholder {0}: group.title -#: src/pages/Shell.tsx:2305 +#: src/pages/Shell.tsx:2294 msgid "Expand {0}" msgstr "Perluas {0}" -#: src/pages/Shell.tsx:5496 +#: src/pages/Shell.tsx:4411 msgid "Export" msgstr "Ekspor" @@ -1427,7 +1450,7 @@ msgstr "Ekspor" msgid "Export this week's list from the CRM and drop it in the shared folder" msgstr "Ekspor daftar minggu ini dari CRM dan taruh di folder bersama" -#: src/pages/Shell.tsx:5516 +#: src/pages/Shell.tsx:4431 msgid "Extra high" msgstr "Sangat tinggi" @@ -1435,14 +1458,14 @@ msgstr "Sangat tinggi" msgid "Failed" msgstr "Gagal" -#: src/pages/Shell.tsx:1878 -#: src/pages/Shell.tsx:1880 -#: src/pages/Shell.tsx:1882 +#: src/pages/Shell.tsx:1867 +#: src/pages/Shell.tsx:1869 +#: src/pages/Shell.tsx:1871 msgid "Failed to send message" msgstr "Gagal mengirim pesan" -#: src/pages/Shell.tsx:1912 -#: src/pages/Shell.tsx:1931 +#: src/pages/Shell.tsx:1901 +#: src/pages/Shell.tsx:1920 msgid "Failed to stop" msgstr "Gagal menghentikan" @@ -1456,18 +1479,18 @@ msgid "Failure handling" msgstr "Penanganan kegagalan" #: src/pages/ModelSettingsOverlay.tsx:427 -#: src/pages/Onboarding.tsx:336 +#: src/pages/Onboarding.tsx:350 msgid "Find models" msgstr "Cari model" #: src/pages/ModelSettingsOverlay.tsx:427 -#: src/pages/Onboarding.tsx:336 +#: src/pages/Onboarding.tsx:350 msgid "Finding…" msgstr "Mencari…" #. placeholder {0}: new URL(oauth.verificationUri).hostname #: src/pages/ModelSettingsOverlay.tsx:546 -#: src/pages/Onboarding.tsx:420 +#: src/pages/Onboarding.tsx:434 msgid "Finish signing in at <0>{0}. The final page may not load; paste its URL or code here." msgstr "Selesaikan proses masuk di <0>{0}. Halaman terakhir mungkin tidak termuat; tempel URL atau kodenya di sini." @@ -1484,6 +1507,10 @@ msgstr "Menyelesaikan koneksi MCP…" msgid "Flag unexpected actions" msgstr "Tandai tindakan yang tidak terduga" +#: src/pages/Auth.tsx:99 +msgid "Forgot password?" +msgstr "Lupa kata sandi?" + #: src/pages/ModelSettingsOverlay.tsx:1026 msgid "Free" msgstr "Gratis" @@ -1497,8 +1524,8 @@ msgid "Git event" msgstr "Event Git" #: src/pages/PhoneSettingsOverlay.tsx:224 -#: src/pages/Shell.tsx:2708 -#: src/pages/Shell.tsx:2863 +#: src/pages/Shell.tsx:2697 +#: src/pages/Shell.tsx:2857 msgid "Group" msgstr "Grup" @@ -1524,7 +1551,7 @@ msgid "header" msgstr "header" #: src/pages/McpServersOverlay.tsx:342 -#: src/pages/PluginsOverlay.tsx:824 +#: src/pages/PluginsOverlay.tsx:826 msgid "Header name" msgstr "Nama header" @@ -1532,27 +1559,28 @@ msgstr "Nama header" msgid "Header value" msgstr "Nilai header" -#: src/pages/VoiceSettingsOverlay.tsx:284 +#: src/pages/VoiceSettingsOverlay.tsx:289 msgid "Hear a sample" msgstr "Dengar contoh" -#: src/pages/VoiceSettingsOverlay.tsx:102 +#: src/pages/VoiceSettingsOverlay.tsx:107 msgid "Hi, this is how I'll sound when I read replies out loud." msgstr "Halo, beginilah suara saya saat membacakan balasan." -#: src/pages/Auth.tsx:95 +#: src/pages/Auth.tsx:122 +#: src/pages/ResetPassword.tsx:186 msgid "Hide password" msgstr "Sembunyikan kata sandi" -#: src/pages/Shell.tsx:5519 +#: src/pages/Shell.tsx:4434 msgid "High" msgstr "Tinggi" -#: src/pages/Shell.tsx:4325 +#: src/components/composer/Composer.tsx:465 msgid "Hold to talk" msgstr "Tahan untuk bicara" -#: src/pages/Shell.tsx:4325 +#: src/components/composer/Composer.tsx:465 msgid "Hold to talk (on-device dictation)" msgstr "Tahan untuk bicara (dikte di perangkat)" @@ -1572,15 +1600,19 @@ msgstr "Seberapa sering" msgid "How to check" msgstr "Cara memeriksa" -#: src/pages/Shell.tsx:4591 +#: src/pages/Shell.tsx:3977 msgid "I’m done" msgstr "Saya sudah selesai" -#: src/pages/VoiceSettingsOverlay.tsx:107 +#: src/pages/ResetPassword.tsx:54 +msgid "If an account exists for {email}, we sent a link to reset your password. It works for one hour." +msgstr "Kalau {email} terdaftar, kami sudah mengirim tautan untuk menyetel ulang kata sandi. Tautan itu berlaku satu jam." + +#: src/pages/VoiceSettingsOverlay.tsx:112 msgid "If you heard that, voice is ready." msgstr "Kalau tadi terdengar, suara sudah siap." -#: src/pages/AccountSettingsOverlay.tsx:140 +#: src/pages/AccountSettingsOverlay.tsx:119 msgid "iMessage channels and agent connections." msgstr "Kanal iMessage dan koneksi antar-agent." @@ -1588,15 +1620,15 @@ msgstr "Kanal iMessage dan koneksi antar-agent." msgid "iMessage line" msgstr "Nomor iMessage" -#: src/pages/PluginsOverlay.tsx:782 +#: src/pages/PluginsOverlay.tsx:784 msgid "Import OpenAPI JSON" msgstr "Impor JSON OpenAPI" -#: src/pages/Onboarding.tsx:701 +#: src/pages/Onboarding.tsx:715 msgid "Includes a full operating playbook for this role." msgstr "Termasuk playbook kerja lengkap untuk peran ini." -#: src/pages/Shell.tsx:5406 +#: src/pages/Shell.tsx:4321 msgid "Inherit default" msgstr "Ikuti default" @@ -1604,18 +1636,18 @@ msgstr "Ikuti default" msgid "Inputs" msgstr "Input" -#: src/pages/PluginsOverlay.tsx:482 -#: src/pages/PluginsOverlay.tsx:533 +#: src/pages/PluginsOverlay.tsx:483 +#: src/pages/PluginsOverlay.tsx:534 msgid "Install" msgstr "Pasang" -#: src/pages/PluginsOverlay.tsx:498 -#: src/pages/PluginsOverlay.tsx:537 +#: src/pages/PluginsOverlay.tsx:499 +#: src/pages/PluginsOverlay.tsx:538 msgid "Installed" msgstr "Terpasang" -#: src/pages/PluginsOverlay.tsx:482 -#: src/pages/PluginsOverlay.tsx:533 +#: src/pages/PluginsOverlay.tsx:483 +#: src/pages/PluginsOverlay.tsx:534 msgid "Installing…" msgstr "Memasang…" @@ -1627,8 +1659,8 @@ msgstr "API key instance" msgid "Instruction" msgstr "Instruksi" -#: src/pages/PluginsOverlay.tsx:582 -#: src/pages/Shell.tsx:2570 +#: src/pages/PluginsOverlay.tsx:583 +#: src/pages/Shell.tsx:2559 msgid "Integrations" msgstr "Integrasi" @@ -1650,19 +1682,19 @@ msgid "Interval unit" msgstr "Satuan interval" #: src/pages/MemorySettingsOverlay.tsx:39 -#: src/pages/Shell.tsx:5407 +#: src/pages/Shell.tsx:4322 msgid "Isolated" msgstr "Terpisah" -#: src/pages/Shell.tsx:5748 +#: src/pages/Shell.tsx:4663 msgid "Its conversation, files, and routines will be permanently deleted. Bots it created stay in your list." msgstr "Percakapan, file, dan rutinitasnya akan dihapus permanen. Bot yang dibuatnya tetap ada di daftar Anda." -#: src/pages/Shell.tsx:3886 +#: src/pages/Shell.tsx:3875 msgid "Jump to latest" msgstr "Lompat ke terbaru" -#: src/pages/Shell.tsx:4692 +#: src/components/conversation/MessageView.tsx:112 msgid "Jump to replied message" msgstr "Lompat ke pesan yang dibalas" @@ -1670,7 +1702,7 @@ msgstr "Lompat ke pesan yang dibalas" msgid "just now" msgstr "baru saja" -#: src/pages/Shell.tsx:5766 +#: src/pages/Shell.tsx:4681 msgid "Keep memories" msgstr "Simpan memorinya" @@ -1678,17 +1710,17 @@ msgstr "Simpan memorinya" msgid "key" msgstr "key" -#: src/pages/VoiceSettingsOverlay.tsx:229 +#: src/pages/VoiceSettingsOverlay.tsx:234 msgid "Keys stay on the server. The app only learns whether a provider is configured." msgstr "Key tetap di server. Aplikasi hanya tahu apakah sebuah provider sudah dikonfigurasi." -#: src/pages/PluginsOverlay.tsx:571 +#: src/pages/PluginsOverlay.tsx:572 msgid "Knowledge" msgstr "Pengetahuan" -#: src/pages/AccountSettingsOverlay.tsx:154 -#: src/pages/AccountSettingsOverlay.tsx:363 -#: src/pages/AccountSettingsOverlay.tsx:380 +#: src/pages/AccountSettingsOverlay.tsx:133 +#: src/pages/AccountSettingsOverlay.tsx:296 +#: src/pages/AccountSettingsOverlay.tsx:313 msgid "Language" msgstr "Bahasa" @@ -1709,7 +1741,7 @@ msgstr "Tertaut sebagai {0}" msgid "Listening…" msgstr "Mendengarkan…" -#: src/pages/Shell.tsx:3839 +#: src/pages/Shell.tsx:3828 msgid "Load earlier messages" msgstr "Muat pesan sebelumnya" @@ -1717,7 +1749,7 @@ msgstr "Muat pesan sebelumnya" msgid "Loading activity…" msgstr "Memuat aktivitas…" -#: src/pages/PluginsOverlay.tsx:608 +#: src/pages/PluginsOverlay.tsx:609 msgid "Loading integrations…" msgstr "Memuat integrasi…" @@ -1743,13 +1775,13 @@ msgstr "Memuat pratinjau…" msgid "Loading rules…" msgstr "Memuat aturan…" -#: src/pages/VoiceSettingsOverlay.tsx:128 +#: src/pages/VoiceSettingsOverlay.tsx:133 msgid "Loading voice providers…" msgstr "Memuat provider suara…" -#: src/App.tsx:50 -#: src/pages/Onboarding.tsx:260 -#: src/pages/Shell.tsx:3839 +#: src/App.tsx:53 +#: src/pages/Onboarding.tsx:274 +#: src/pages/Shell.tsx:3828 msgid "Loading…" msgstr "Memuat…" @@ -1757,15 +1789,15 @@ msgstr "Memuat…" msgid "Local" msgstr "Lokal" -#: src/pages/Shell.tsx:2656 +#: src/pages/Shell.tsx:2645 msgid "Log out" msgstr "Keluar" -#: src/pages/Shell.tsx:5517 +#: src/pages/Shell.tsx:4432 msgid "Low" msgstr "Rendah" -#: src/pages/AccountSettingsOverlay.tsx:147 +#: src/pages/AccountSettingsOverlay.tsx:126 msgid "Manage phone settings" msgstr "Kelola pengaturan telepon" @@ -1781,17 +1813,17 @@ msgstr "Tandai sudah dibaca" msgid "Mark as Unread" msgstr "Tandai belum dibaca" -#: src/pages/Shell.tsx:5521 +#: src/pages/Shell.tsx:4436 msgid "Max" msgstr "Maks" #: src/pages/McpServersOverlay.tsx:224 #: src/pages/McpServersOverlay.tsx:229 -#: src/pages/PluginsOverlay.tsx:756 +#: src/pages/PluginsOverlay.tsx:758 msgid "MCP servers" msgstr "Server MCP" -#: src/pages/Shell.tsx:5518 +#: src/pages/Shell.tsx:4433 msgid "Medium" msgstr "Sedang" @@ -1804,11 +1836,11 @@ msgid "Members (pick {GROUP_MEMBER_MIN}–{GROUP_MEMBER_MAX})" msgstr "Anggota (pilih {GROUP_MEMBER_MIN}–{GROUP_MEMBER_MAX})" #: src/pages/MemorySettingsOverlay.tsx:134 -#: src/pages/Shell.tsx:2614 +#: src/pages/Shell.tsx:2603 msgid "Memory" msgstr "Memori" -#: src/pages/Shell.tsx:5402 +#: src/pages/Shell.tsx:4317 msgid "Memory scope" msgstr "Cakupan memori" @@ -1817,29 +1849,29 @@ msgstr "Cakupan memori" msgid "Message" msgstr "Pesan" -#: src/pages/Shell.tsx:4403 -#: src/pages/Shell.tsx:4500 +#: src/components/composer/Composer.tsx:543 +#: src/components/composer/shared.ts:23 msgid "Message" msgstr "Pesan" -#: src/pages/Shell.tsx:4399 -#: src/pages/Shell.tsx:4403 +#: src/components/composer/Composer.tsx:539 +#: src/components/composer/Composer.tsx:543 msgid "Message {activeName}" msgstr "Kirim pesan ke {activeName}" -#: src/pages/Shell.tsx:4134 +#: src/components/composer/Composer.tsx:274 msgid "Message composer" msgstr "Kolom tulis pesan" -#: src/pages/Shell.tsx:4770 +#: src/components/conversation/MessageView.tsx:190 msgid "Message from {peer}" msgstr "Pesan dari {peer}" -#: src/pages/Shell.tsx:4400 +#: src/components/composer/Composer.tsx:540 msgid "Message…" msgstr "Pesan…" -#: src/pages/Shell.tsx:4770 +#: src/components/conversation/MessageView.tsx:190 msgid "Messaged {peer}" msgstr "Mengirim pesan ke {peer}" @@ -1847,7 +1879,7 @@ msgstr "Mengirim pesan ke {peer}" msgid "Microphone failed" msgstr "Mikrofon gagal" -#: src/pages/Shell.tsx:5520 +#: src/pages/Shell.tsx:4435 msgid "Minimal" msgstr "Minimal" @@ -1866,15 +1898,15 @@ msgstr "menit" #: src/pages/ModelSettingsOverlay.tsx:432 #: src/pages/ModelSettingsOverlay.tsx:493 #: src/pages/ModelSettingsOverlay.tsx:914 -#: src/pages/Onboarding.tsx:341 -#: src/pages/Onboarding.tsx:390 -#: src/pages/Onboarding.tsx:398 -#: src/pages/Shell.tsx:5358 +#: src/pages/Onboarding.tsx:355 +#: src/pages/Onboarding.tsx:404 +#: src/pages/Onboarding.tsx:412 +#: src/pages/Shell.tsx:4273 msgid "Model" msgstr "Model" #: src/pages/ModelSettingsOverlay.tsx:474 -#: src/pages/Onboarding.tsx:371 +#: src/pages/Onboarding.tsx:385 msgid "Model id" msgstr "ID model" @@ -1882,7 +1914,7 @@ msgstr "ID model" msgid "Model options" msgstr "Opsi model" -#: src/pages/AccountSettingsOverlay.tsx:222 +#: src/pages/AccountSettingsOverlay.tsx:155 msgid "Model spend uses your provider keys." msgstr "Biaya model memakai key provider Anda." @@ -1891,12 +1923,12 @@ msgid "Model updated." msgstr "Model diperbarui." #: src/pages/ModelSettingsOverlay.tsx:304 -#: src/pages/Shell.tsx:2601 +#: src/pages/Shell.tsx:2590 msgid "Models" msgstr "Model" #: src/pages/ModelSettingsOverlay.tsx:445 -#: src/pages/Onboarding.tsx:348 +#: src/pages/Onboarding.tsx:362 msgid "Models from server" msgstr "Model dari server" @@ -1904,7 +1936,7 @@ msgstr "Model dari server" msgid "Monthly" msgstr "Bulanan" -#: src/pages/PluginsOverlay.tsx:573 +#: src/pages/PluginsOverlay.tsx:574 msgid "More apps" msgstr "Aplikasi lain" @@ -1913,7 +1945,7 @@ msgstr "Aplikasi lain" msgid "Move {0} to section" msgstr "Pindahkan {0} ke seksi" -#: src/pages/Shell.tsx:5769 +#: src/pages/Shell.tsx:4684 msgid "Move them to your shared memory." msgstr "Pindahkan ke memori bersama Anda." @@ -1922,19 +1954,19 @@ msgid "Move to" msgstr "Pindahkan ke" #: src/components/teach/SkillDraftCard.tsx:82 -#: src/pages/Auth.tsx:49 +#: src/pages/Auth.tsx:60 #: src/pages/GroupPanel.tsx:110 #: src/pages/GroupPanel.tsx:201 -#: src/pages/Onboarding.tsx:663 +#: src/pages/Onboarding.tsx:677 #: src/pages/RoutineEditor.tsx:294 -#: src/pages/Shell.tsx:5150 -#: src/pages/Shell.tsx:5317 -#: src/pages/Shell.tsx:5595 +#: src/pages/Shell.tsx:4065 +#: src/pages/Shell.tsx:4232 +#: src/pages/Shell.tsx:4510 msgid "Name" msgstr "Nama" -#: src/pages/Onboarding.tsx:667 -#: src/pages/Shell.tsx:5155 +#: src/pages/Onboarding.tsx:681 +#: src/pages/Shell.tsx:4070 msgid "Name this bot" msgstr "Beri nama bot ini" @@ -1954,13 +1986,13 @@ msgstr "Butuh masukan" msgid "Needs takeover" msgstr "Butuh diambil alih" -#: src/pages/Shell.tsx:2247 -#: src/pages/Shell.tsx:5138 +#: src/pages/Shell.tsx:2236 +#: src/pages/Shell.tsx:4053 msgid "New bot" msgstr "Bot baru" #: src/pages/GroupPanel.tsx:98 -#: src/pages/Shell.tsx:2257 +#: src/pages/Shell.tsx:2246 msgid "New group" msgstr "Grup baru" @@ -1968,12 +2000,16 @@ msgstr "Grup baru" msgid "New open-work item" msgstr "Item pekerjaan terbuka baru" +#: src/pages/ResetPassword.tsx:165 +msgid "New password" +msgstr "Kata sandi baru" + #: src/pages/RoutineEditor.tsx:100 msgid "New routine" msgstr "Rutinitas baru" #: src/pages/BotContextMenu.tsx:130 -#: src/pages/Shell.tsx:5589 +#: src/pages/Shell.tsx:4504 msgid "New section" msgstr "Seksi baru" @@ -1981,20 +2017,20 @@ msgstr "Seksi baru" msgid "No agent connections yet." msgstr "Belum ada koneksi antar-agent." -#: src/pages/PluginsOverlay.tsx:687 +#: src/pages/PluginsOverlay.tsx:689 msgid "No apps match your search." msgstr "Tidak ada aplikasi yang cocok dengan pencarian Anda." -#: src/pages/PluginsOverlay.tsx:894 +#: src/pages/PluginsOverlay.tsx:896 msgid "no auth" msgstr "tanpa auth" -#: src/pages/PluginsOverlay.tsx:810 +#: src/pages/PluginsOverlay.tsx:812 msgid "No authentication" msgstr "Tanpa autentikasi" #. placeholder {0}: item.name -#: src/pages/PluginsOverlay.tsx:323 +#: src/pages/PluginsOverlay.tsx:324 msgid "No connection record found for {0}." msgstr "Tidak ada catatan koneksi untuk {0}." @@ -2014,7 +2050,7 @@ msgstr "Belum ada grup iMessage." msgid "No longer active" msgstr "Sudah tidak aktif" -#: src/pages/PluginsOverlay.tsx:682 +#: src/pages/PluginsOverlay.tsx:684 msgid "No managed app catalog is configured on this deployment." msgstr "Deployment ini belum punya katalog aplikasi terkelola." @@ -2022,7 +2058,7 @@ msgstr "Deployment ini belum punya katalog aplikasi terkelola." msgid "No matching models" msgstr "Tidak ada model yang cocok" -#: src/pages/PluginsOverlay.tsx:876 +#: src/pages/PluginsOverlay.tsx:878 msgid "No MCP or API tool sources installed yet." msgstr "Belum ada sumber tool MCP atau API yang terpasang." @@ -2054,16 +2090,16 @@ msgstr "Tanpa pemicu" msgid "None yet" msgstr "Belum ada" -#: src/pages/VoiceSettingsOverlay.tsx:156 +#: src/pages/VoiceSettingsOverlay.tsx:161 msgid "Not configured" msgstr "Belum dikonfigurasi" #: src/pages/ModelSettingsOverlay.tsx:524 -#: src/pages/VoiceSettingsOverlay.tsx:225 +#: src/pages/VoiceSettingsOverlay.tsx:230 msgid "Not connected" msgstr "Belum tersambung" -#: src/pages/PluginsOverlay.tsx:643 +#: src/pages/PluginsOverlay.tsx:645 msgid "Not in the plugin catalog" msgstr "Tidak ada di katalog plugin" @@ -2071,7 +2107,7 @@ msgstr "Tidak ada di katalog plugin" msgid "Not linked — text the deployment's number once to link your phone to your agent." msgstr "Belum tertaut — kirim satu pesan ke nomor deployment untuk menautkan ponsel Anda dengan agent." -#: src/pages/Shell.tsx:6262 +#: src/components/conversation/MessageView.tsx:808 msgid "Not now" msgstr "Nanti saja" @@ -2113,15 +2149,15 @@ msgstr "pada tanggal 1 pukul {0}" msgid "Open" msgstr "Buka" -#: src/pages/Shell.tsx:2926 +#: src/pages/Shell.tsx:2920 msgid "Open computer" msgstr "Buka komputer" -#: src/pages/Shell.tsx:2892 +#: src/pages/Shell.tsx:2886 msgid "Open in full window" msgstr "Buka di jendela penuh" -#: src/pages/Shell.tsx:2680 +#: src/pages/Shell.tsx:2669 msgid "Open navigation" msgstr "Buka navigasi" @@ -2142,24 +2178,24 @@ msgid "Open work" msgstr "Pekerjaan terbuka" #: src/pages/ModelSettingsOverlay.tsx:405 -#: src/pages/Onboarding.tsx:315 +#: src/pages/Onboarding.tsx:329 msgid "OpenAI-compatible server URL" msgstr "URL server yang kompatibel dengan OpenAI" -#: src/pages/Shell.tsx:4905 +#: src/components/conversation/MessageView.tsx:325 msgid "Opened its thread." msgstr "Membuka percakapannya." -#: src/App.tsx:166 +#: src/App.tsx:170 msgid "Opening your workspace…" msgstr "Membuka workspace Anda…" #: src/pages/ModelSettingsOverlay.tsx:636 -#: src/pages/Onboarding.tsx:502 +#: src/pages/Onboarding.tsx:516 msgid "Optional" msgstr "Opsional" -#: src/pages/AccountSettingsOverlay.tsx:250 +#: src/pages/AccountSettingsOverlay.tsx:183 msgid "Optional controls most people never need" msgstr "Kontrol opsional yang jarang dibutuhkan" @@ -2171,7 +2207,7 @@ msgstr "Nilai header opsional" msgid "Or connect an API key" msgstr "Atau sambungkan sebuah API key" -#: src/pages/Onboarding.tsx:510 +#: src/pages/Onboarding.tsx:524 msgid "Or paste an API key" msgstr "Atau tempel sebuah API key" @@ -2180,16 +2216,12 @@ msgstr "Atau tempel sebuah API key" msgid "Or send this code to {0}:" msgstr "Atau kirim kode ini ke {0}:" -#: src/pages/AccountSettingsOverlay.tsx:191 -msgid "Organic" -msgstr "Organic" - #: src/pages/memory-providers/SupermemorySettingsForm.tsx:60 msgid "Organization API key" msgstr "API key organisasi" #: src/pages/ModelSettingsOverlay.tsx:454 -#: src/pages/Onboarding.tsx:357 +#: src/pages/Onboarding.tsx:371 msgid "Other model…" msgstr "Model lain…" @@ -2211,21 +2243,26 @@ msgstr "Terpasang sebagai {0}" msgid "Park" msgstr "Tunda" -#: src/pages/Auth.tsx:77 -#: src/pages/Auth.tsx:86 +#: src/pages/Auth.tsx:91 +#: src/pages/Auth.tsx:110 +#: src/pages/ResetPassword.tsx:174 msgid "Password" msgstr "Kata sandi" -#: src/pages/VoiceSettingsOverlay.tsx:242 +#: src/pages/ResetPassword.tsx:147 +msgid "Password updated" +msgstr "Kata sandi diperbarui" + +#: src/pages/VoiceSettingsOverlay.tsx:247 msgid "Paste a replacement key" msgstr "Tempel key pengganti" #: src/pages/ModelSettingsOverlay.tsx:416 -#: src/pages/Onboarding.tsx:326 +#: src/pages/Onboarding.tsx:340 msgid "Paste the OpenAI-compatible address from your server. Sentra Bot adds /v1 if needed." msgstr "Tempel alamat kompatibel-OpenAI dari server Anda. Sentra Bot menambahkan /v1 bila perlu." -#: src/pages/VoiceSettingsOverlay.tsx:242 +#: src/pages/VoiceSettingsOverlay.tsx:247 msgid "Paste your API key" msgstr "Tempel API key Anda" @@ -2233,21 +2270,21 @@ msgstr "Tempel API key Anda" msgid "Paused" msgstr "Dijeda" -#: src/pages/PluginsOverlay.tsx:567 +#: src/pages/PluginsOverlay.tsx:568 msgid "Payments" msgstr "Pembayaran" #: src/pages/ModelSettingsOverlay.tsx:518 -#: src/pages/VoiceSettingsOverlay.tsx:219 +#: src/pages/VoiceSettingsOverlay.tsx:224 msgid "Personal credential" msgstr "Kredensial pribadi" -#: src/pages/AccountSettingsOverlay.tsx:137 +#: src/pages/AccountSettingsOverlay.tsx:116 #: src/pages/PhoneSettingsOverlay.tsx:116 msgid "Phone" msgstr "Telepon" -#: src/pages/VoiceSettingsOverlay.tsx:155 +#: src/pages/VoiceSettingsOverlay.tsx:160 msgid "Pick a voice" msgstr "Pilih suara" @@ -2255,11 +2292,11 @@ msgstr "Pilih suara" msgid "Pin" msgstr "Sematkan" -#: src/pages/VoiceSettingsOverlay.tsx:284 +#: src/pages/VoiceSettingsOverlay.tsx:289 msgid "Playing…" msgstr "Memutar…" -#: src/pages/PluginsOverlay.tsx:615 +#: src/pages/PluginsOverlay.tsx:616 msgid "Popular" msgstr "Populer" @@ -2272,20 +2309,20 @@ msgstr "POST ke" msgid "Preview {0}" msgstr "Pratinjau {0}" -#: src/pages/Shell.tsx:5093 +#: src/pages/Shell.tsx:4008 msgid "Private" msgstr "Privat" -#: src/pages/PluginsOverlay.tsx:563 +#: src/pages/PluginsOverlay.tsx:564 msgid "Productivity" msgstr "Produktivitas" #: src/pages/MemorySettingsOverlay.tsx:194 msgid "Provider" -msgstr "Provider" +msgstr "Penyedia" #: src/pages/ModelSettingsOverlay.tsx:341 -#: src/pages/VoiceSettingsOverlay.tsx:168 +#: src/pages/VoiceSettingsOverlay.tsx:173 msgid "Providers" msgstr "Provider" @@ -2293,7 +2330,7 @@ msgstr "Provider" msgid "Queued" msgstr "Antre" -#: src/pages/Shell.tsx:5434 +#: src/pages/Shell.tsx:4349 msgid "Read replies aloud" msgstr "Bacakan balasan dengan suara" @@ -2305,7 +2342,7 @@ msgstr "Terbaru" msgid "Reconnect OAuth" msgstr "Sambungkan ulang OAuth" -#: src/App.tsx:123 +#: src/App.tsx:127 msgid "Reconnecting" msgstr "Menyambungkan ulang" @@ -2327,27 +2364,27 @@ msgstr "Pulihkan mengganti komputer yang tidak terjangkau dan mempertahankan fil msgid "Recovering…" msgstr "Memulihkan…" -#: src/pages/Shell.tsx:4581 +#: src/pages/Shell.tsx:3967 msgid "Release" msgstr "Lepaskan" #: src/components/ApprovalRulesSettings.tsx:178 -#: src/pages/PluginsOverlay.tsx:455 -#: src/pages/PluginsOverlay.tsx:508 -#: src/pages/PluginsOverlay.tsx:547 -#: src/pages/PluginsOverlay.tsx:666 -#: src/pages/PluginsOverlay.tsx:905 +#: src/pages/PluginsOverlay.tsx:456 +#: src/pages/PluginsOverlay.tsx:509 +#: src/pages/PluginsOverlay.tsx:548 +#: src/pages/PluginsOverlay.tsx:668 +#: src/pages/PluginsOverlay.tsx:907 #: src/pages/ScratchpadSection.tsx:162 msgid "Remove" msgstr "Hapus" #. placeholder {0}: attachment.file.name -#: src/pages/Shell.tsx:4204 +#: src/components/composer/Composer.tsx:344 msgid "Remove {0}" msgstr "Hapus {0}" #. placeholder {0}: mention.name -#: src/pages/Shell.tsx:4362 +#: src/components/composer/Composer.tsx:502 msgid "Remove mention {0}" msgstr "Hapus sebutan {0}" @@ -2356,7 +2393,7 @@ msgid "Remove schedule" msgstr "Hapus jadwal" #. placeholder {0}: selectedSkill.name -#: src/pages/Shell.tsx:4341 +#: src/components/composer/Composer.tsx:481 msgid "Remove skill {0}" msgstr "Hapus skill {0}" @@ -2368,7 +2405,7 @@ msgstr "Hapus jadwal ini" msgid "Remove webhook" msgstr "Hapus webhook" -#: src/pages/Shell.tsx:4904 +#: src/components/conversation/MessageView.tsx:324 msgid "Removed with chat, computer, and memory." msgstr "Dihapus beserta chat, komputer, dan memorinya." @@ -2376,10 +2413,10 @@ msgstr "Dihapus beserta chat, komputer, dan memorinya." msgid "Removed, but list refresh failed" msgstr "Terhapus, tetapi daftar gagal disegarkan" -#: src/pages/PluginsOverlay.tsx:450 -#: src/pages/PluginsOverlay.tsx:547 -#: src/pages/PluginsOverlay.tsx:661 -#: src/pages/PluginsOverlay.tsx:905 +#: src/pages/PluginsOverlay.tsx:451 +#: src/pages/PluginsOverlay.tsx:548 +#: src/pages/PluginsOverlay.tsx:663 +#: src/pages/PluginsOverlay.tsx:907 msgid "Removing…" msgstr "Menghapus…" @@ -2393,15 +2430,15 @@ msgstr "Buka kembali" msgid "Replace API key" msgstr "Ganti API key" -#: src/pages/VoiceSettingsOverlay.tsx:255 +#: src/pages/VoiceSettingsOverlay.tsx:260 msgid "Replace key" msgstr "Ganti key" -#: src/pages/Shell.tsx:4527 +#: src/pages/Shell.tsx:3913 msgid "Reply" msgstr "Balas" -#: src/pages/Shell.tsx:4167 +#: src/components/composer/Composer.tsx:307 msgid "Replying to {replyName}" msgstr "Membalas {replyName}" @@ -2417,13 +2454,21 @@ msgstr "Reset komputer" msgid "Reset computer?" msgstr "Reset komputer?" +#: src/pages/ResetPassword.tsx:78 +msgid "Reset links work once and for one hour. Enter your email to get a new one." +msgstr "Tautan setel ulang hanya berlaku sekali dan selama satu jam. Masukkan email Anda untuk meminta yang baru." + +#: src/pages/ResetPassword.tsx:70 +msgid "Reset your password" +msgstr "Setel ulang kata sandi" + #: src/components/ComputerMaintenanceActions.tsx:68 #: src/components/ComputerMaintenanceActions.tsx:115 msgid "Resetting…" msgstr "Mereset…" -#: src/pages/Shell.tsx:2514 -#: src/pages/Shell.tsx:2544 +#: src/pages/Shell.tsx:2503 +#: src/pages/Shell.tsx:2533 msgid "Restore" msgstr "Pulihkan" @@ -2431,7 +2476,7 @@ msgstr "Pulihkan" msgid "Restore the last saved workspace. Unsaved work on the computer is lost." msgstr "Pulihkan workspace tersimpan terakhir. Pekerjaan di komputer yang belum disimpan akan hilang." -#: src/App.tsx:135 +#: src/App.tsx:139 msgid "Retry now" msgstr "Coba lagi sekarang" @@ -2439,7 +2484,7 @@ msgstr "Coba lagi sekarang" msgid "Return to Sentra Bot" msgstr "Kembali ke Sentra Bot" -#: src/pages/PluginsOverlay.tsx:716 +#: src/pages/PluginsOverlay.tsx:718 msgid "Reusable SKILL.md playbooks your agents follow. Install one and invoke it with /Name in the composer." msgstr "Playbook SKILL.md yang bisa dipakai ulang oleh agent Anda. Pasang satu lalu panggil dengan /Nama di kolom tulis pesan." @@ -2447,17 +2492,13 @@ msgstr "Playbook SKILL.md yang bisa dipakai ulang oleh agent Anda. Pasang satu l msgid "Revoke" msgstr "Cabut" -#: src/pages/AccountSettingsOverlay.tsx:189 -msgid "Robot" -msgstr "Robot" - #: src/pages/RoutineEditor.tsx:571 msgid "Rotate key" msgstr "Rotasi key" #: src/pages/RoutineEditor.tsx:247 -#: src/pages/Shell.tsx:3169 -#: src/pages/Shell.tsx:3179 +#: src/pages/Shell.tsx:3163 +#: src/pages/Shell.tsx:3173 msgid "Routine" msgstr "Rutinitas" @@ -2474,7 +2515,7 @@ msgstr "Jalankan pada" msgid "Run history" msgstr "Riwayat jalan" -#: src/pages/Shell.tsx:3162 +#: src/pages/Shell.tsx:3156 msgid "Run time must be in the future." msgstr "Waktu jalan harus di masa depan." @@ -2495,7 +2536,7 @@ msgstr "Menjalankan…" #: src/pages/GroupPanel.tsx:224 #: src/pages/ModelSettingsOverlay.tsx:675 #: src/pages/RoutineEditor.tsx:479 -#: src/pages/Shell.tsx:5489 +#: src/pages/Shell.tsx:4404 msgid "Save" msgstr "Simpan" @@ -2537,12 +2578,12 @@ msgid "Say yes or no, or answer in a sentence." msgstr "Jawab ya atau tidak, atau jawab dengan satu kalimat." #: src/pages/ModelSettingsOverlay.tsx:939 -#: src/pages/Shell.tsx:2268 +#: src/pages/Shell.tsx:2257 msgid "Search" msgstr "Cari" -#: src/pages/PluginsOverlay.tsx:598 #: src/pages/PluginsOverlay.tsx:599 +#: src/pages/PluginsOverlay.tsx:600 msgid "Search apps" msgstr "Cari aplikasi" @@ -2555,8 +2596,8 @@ msgstr "Cari model" msgid "Search providers" msgstr "Cari provider" -#: src/pages/Onboarding.tsx:274 -#: src/pages/Onboarding.tsx:275 +#: src/pages/Onboarding.tsx:288 +#: src/pages/Onboarding.tsx:289 msgid "Search providers and models" msgstr "Cari provider dan model" @@ -2564,11 +2605,11 @@ msgstr "Cari provider dan model" msgid "Searching…" msgstr "Mencari…" -#: src/pages/Shell.tsx:2709 +#: src/pages/Shell.tsx:2698 msgid "Select a bot" msgstr "Pilih bot" -#: src/pages/Shell.tsx:4423 +#: src/components/composer/Composer.tsx:563 msgid "Send" msgstr "Kirim" @@ -2580,6 +2621,10 @@ msgstr "Kirim jawaban" msgid "Send it" msgstr "Kirim" +#: src/pages/ResetPassword.tsx:103 +msgid "Send reset link" +msgstr "Kirim tautan setel ulang" + #: src/components/AskCard.tsx:97 #: src/components/AskCard.tsx:126 #: src/components/AskCard.tsx:150 @@ -2587,7 +2632,7 @@ msgstr "Kirim" msgid "Sending…" msgstr "Mengirim…" -#: src/pages/PluginsOverlay.tsx:839 +#: src/pages/PluginsOverlay.tsx:841 msgid "Sentra Bot verifies the source before saving it. Credentials are encrypted and are never returned to clients or exposed to the model." msgstr "Sentra Bot memverifikasi sumbernya sebelum menyimpan. Kredensial dienkripsi, tidak pernah dikembalikan ke klien maupun dibuka ke model." @@ -2601,55 +2646,57 @@ msgstr "Nama server" #: src/pages/McpServersOverlay.tsx:317 #: src/pages/ModelSettingsOverlay.tsx:401 -#: src/pages/Onboarding.tsx:311 +#: src/pages/Onboarding.tsx:325 msgid "Server URL" msgstr "URL server" -#: src/pages/Shell.tsx:2718 +#: src/pages/Shell.tsx:2712 msgid "Set up voice to call" msgstr "Siapkan suara untuk menelepon" -#: src/pages/AccountSettingsOverlay.tsx:113 -#: src/pages/Shell.tsx:2578 -#: src/pages/Shell.tsx:2588 -#: src/pages/Shell.tsx:2859 +#: src/pages/AccountSettingsOverlay.tsx:92 +#: src/pages/Shell.tsx:2567 +#: src/pages/Shell.tsx:2577 +#: src/pages/Shell.tsx:2853 msgid "Settings" msgstr "Pengaturan" -#: src/pages/Shell.tsx:4441 +#: src/components/composer/Composer.tsx:581 msgid "Settings: General" msgstr "Pengaturan: Umum" -#: src/pages/Shell.tsx:4443 +#: src/components/composer/Composer.tsx:583 msgid "Settings: Usage" msgstr "Pengaturan: Pemakaian" #: src/pages/ModelSettingsOverlay.tsx:413 -#: src/pages/Onboarding.tsx:323 +#: src/pages/Onboarding.tsx:337 msgid "Setup help" msgstr "Bantuan penyiapan" #: src/pages/MemorySettingsOverlay.tsx:39 -#: src/pages/Shell.tsx:5408 +#: src/pages/Shell.tsx:4323 msgid "Shared" msgstr "Bersama" -#: src/pages/Shell.tsx:2870 +#: src/pages/Shell.tsx:2864 msgid "Show computer" msgstr "Tampilkan komputer" -#: src/pages/Auth.tsx:95 +#: src/pages/Auth.tsx:122 +#: src/pages/ResetPassword.tsx:186 msgid "Show password" msgstr "Tampilkan kata sandi" -#: src/pages/Shell.tsx:2870 +#: src/pages/Shell.tsx:2864 msgid "Show settings" msgstr "Tampilkan pengaturan" #: src/lib/localized-provider-hint.ts:7 -#: src/pages/Auth.tsx:161 +#: src/pages/Auth.tsx:171 #: src/pages/ModelSettingsOverlay.tsx:618 -#: src/pages/Onboarding.tsx:151 +#: src/pages/Onboarding.tsx:165 +#: src/pages/ResetPassword.tsx:155 msgid "Sign in" msgstr "Masuk" @@ -2657,28 +2704,32 @@ msgstr "Masuk" msgid "Sign in  →" msgstr "Masuk  →" -#: src/pages/Auth.tsx:17 +#: src/pages/Auth.tsx:142 +msgid "Sign in instead" +msgstr "Masuk saja" + +#: src/pages/Auth.tsx:29 msgid "Sign in to Sentra Bot" msgstr "Masuk ke Sentra Bot" -#: src/pages/Auth.tsx:154 +#: src/pages/Auth.tsx:164 msgid "Sign up" msgstr "Daftar" #. placeholder {0}: skill.name -#: src/pages/Shell.tsx:4251 +#: src/components/composer/Composer.tsx:391 msgid "Skill {0}" msgstr "Skill {0}" -#: src/pages/PluginsOverlay.tsx:713 +#: src/pages/PluginsOverlay.tsx:715 msgid "Skills" msgstr "Skill" -#: src/pages/Shell.tsx:4588 +#: src/pages/Shell.tsx:3974 msgid "Skip" msgstr "Lewati" -#: src/pages/Onboarding.tsx:548 +#: src/pages/Onboarding.tsx:562 msgid "Skip for now" msgstr "Lewati dulu" @@ -2687,7 +2738,7 @@ msgid "Skip or deploy key" msgstr "Lewati atau pakai deploy key" #. placeholder {0}: skipped.join(", ") -#: src/pages/Shell.tsx:1763 +#: src/pages/Shell.tsx:1746 msgid "Skipped {0}" msgstr "Melewati {0}" @@ -2704,21 +2755,21 @@ msgstr "Pembaruan perangkat lunak" msgid "Space interrupts · Esc hangs up" msgstr "Spasi untuk menyela · Esc untuk menutup telepon" -#: src/pages/Shell.tsx:4739 -#: src/pages/Shell.tsx:5002 +#: src/components/conversation/MessageView.tsx:159 +#: src/components/conversation/MessageView.tsx:422 msgid "Speak" msgstr "Bicara" -#: src/pages/VoiceSettingsOverlay.tsx:194 +#: src/pages/VoiceSettingsOverlay.tsx:199 msgid "Speak + transcribe" msgstr "Bicara + transkripsi" -#: src/pages/VoiceSettingsOverlay.tsx:196 +#: src/pages/VoiceSettingsOverlay.tsx:201 msgid "Speak only" msgstr "Bicara saja" -#: src/pages/Shell.tsx:4735 -#: src/pages/Shell.tsx:4998 +#: src/components/conversation/MessageView.tsx:155 +#: src/components/conversation/MessageView.tsx:418 msgid "Speak this reply" msgstr "Bacakan balasan ini" @@ -2726,11 +2777,11 @@ msgstr "Bacakan balasan ini" msgid "Speaking…" msgstr "Berbicara…" -#: src/pages/Onboarding.tsx:560 +#: src/pages/Onboarding.tsx:574 msgid "Start from a proven Chief of Staff, or build your own from scratch." msgstr "Mulai dari Chief of Staff yang sudah teruji, atau bangun sendiri dari nol." -#: src/pages/Onboarding.tsx:644 +#: src/pages/Onboarding.tsx:658 msgid "Start from scratch" msgstr "Mulai dari nol" @@ -2744,7 +2795,7 @@ msgstr "Memulai" #: src/components/teach/TeachComputerSection.tsx:115 #: src/pages/ModelSettingsOverlay.tsx:616 -#: src/pages/Onboarding.tsx:487 +#: src/pages/Onboarding.tsx:501 msgid "Starting…" msgstr "Memulai…" @@ -2752,20 +2803,20 @@ msgstr "Memulai…" msgid "Steps" msgstr "Langkah" -#: src/pages/Shell.tsx:3568 -#: src/pages/Shell.tsx:3572 -#: src/pages/Shell.tsx:4414 -#: src/pages/Shell.tsx:4739 -#: src/pages/Shell.tsx:5002 +#: src/components/composer/Composer.tsx:554 +#: src/components/conversation/MessageView.tsx:159 +#: src/components/conversation/MessageView.tsx:422 +#: src/pages/Shell.tsx:3557 +#: src/pages/Shell.tsx:3561 msgid "Stop" msgstr "Hentikan" -#: src/pages/Shell.tsx:4306 +#: src/components/composer/Composer.tsx:446 msgid "Stop dictation" msgstr "Hentikan dikte" -#: src/pages/Shell.tsx:4735 -#: src/pages/Shell.tsx:4998 +#: src/components/conversation/MessageView.tsx:155 +#: src/components/conversation/MessageView.tsx:418 msgid "Stop speaking" msgstr "Hentikan suara" @@ -2774,8 +2825,8 @@ msgstr "Hentikan suara" msgid "Stop teaching" msgstr "Hentikan pengajaran" -#: src/pages/Shell.tsx:2953 -#: src/pages/Shell.tsx:3588 +#: src/pages/Shell.tsx:2947 +#: src/pages/Shell.tsx:3577 msgid "Stop the bot first" msgstr "Hentikan botnya dulu" @@ -2788,13 +2839,13 @@ msgstr "Dihentikan." msgid "Stored encrypted" msgstr "Disimpan terenkripsi" -#: src/pages/Shell.tsx:4856 +#: src/components/conversation/MessageView.tsx:276 msgid "subagent" -msgstr "subagent" +msgstr "subagen" #: src/components/AskCard.tsx:126 #: src/pages/ModelSettingsOverlay.tsx:576 -#: src/pages/Onboarding.tsx:449 +#: src/pages/Onboarding.tsx:463 msgid "Submit" msgstr "Kirim" @@ -2806,8 +2857,8 @@ msgstr "Terkirim" msgid "Switching…" msgstr "Mengganti…" -#: src/pages/Shell.tsx:2956 -#: src/pages/Shell.tsx:3593 +#: src/pages/Shell.tsx:2950 +#: src/pages/Shell.tsx:3582 msgid "Take control" msgstr "Ambil alih" @@ -2815,7 +2866,7 @@ msgstr "Ambil alih" msgid "Teach a task" msgstr "Ajarkan sebuah tugas" -#: src/pages/Shell.tsx:2783 +#: src/pages/Shell.tsx:2777 msgid "Teaching in progress — stop teaching before sending a new message." msgstr "Sedang mengajarkan — hentikan pengajaran sebelum mengirim pesan baru." @@ -2823,13 +2874,13 @@ msgstr "Sedang mengajarkan — hentikan pengajaran sebelum mengirim pesan baru." msgid "Teaching needs a graphical sandbox computer. Desktop-host bots can run shell tasks, but not screen recording." msgstr "Pengajaran butuh komputer sandbox grafis. Bot desktop-host bisa menjalankan tugas shell, tetapi tidak bisa merekam layar." -#: src/pages/Shell.tsx:5093 +#: src/pages/Shell.tsx:4008 msgid "Team" msgstr "Tim" -#: src/pages/Shell.tsx:5943 +#: src/pages/Shell.tsx:4858 msgid "Team Computer" -msgstr "Team Computer" +msgstr "Komputer Tim" #: src/pages/RoutineEditor.tsx:46 msgid "Teams message" @@ -2852,20 +2903,20 @@ msgstr "API tidak kembali. Segarkan halaman ini." msgid "The selected memory provider is not available in this build." msgstr "Provider memori yang dipilih tidak tersedia di build ini." -#: src/pages/Shell.tsx:5385 +#: src/pages/Shell.tsx:4300 msgid "Thinking" msgstr "Berpikir" -#: src/pages/Shell.tsx:2896 +#: src/pages/Shell.tsx:2890 msgid "This bot runs on this computer, not a Linux desktop. Shell and files use your home folder." msgstr "Bot ini berjalan di komputer ini, bukan di desktop Linux. Shell dan file memakai folder home Anda." -#: src/pages/Shell.tsx:3617 +#: src/pages/Shell.tsx:3606 msgid "This bot runs on this computer. There is no separate Linux desktop. Ask it to use the shell; working directories under your home folder are allowed." msgstr "Bot ini berjalan di komputer ini. Tidak ada desktop Linux terpisah. Minta bot memakai shell; direktori kerja di bawah folder home Anda diizinkan." -#: src/pages/Shell.tsx:5785 -#: src/pages/Shell.tsx:5864 +#: src/pages/Shell.tsx:4700 +#: src/pages/Shell.tsx:4779 msgid "This cannot be undone." msgstr "Tindakan ini tidak bisa dibatalkan." @@ -2881,6 +2932,10 @@ msgstr "Komputer ini menjalankan perintah shell dengan akun Anda, termasuk file msgid "This file is not valid UTF-8 Markdown." msgstr "File ini bukan Markdown UTF-8 yang valid." +#: src/pages/ResetPassword.tsx:70 +msgid "This link has expired" +msgstr "Tautan ini sudah kedaluwarsa" + #: src/pages/HostComputerPrompt.tsx:14 msgid "this Mac" msgstr "Mac ini" @@ -2889,15 +2944,15 @@ msgstr "Mac ini" msgid "This Mac runs shell commands with your account, including files in your home folder. Do not turn it on for a shared or public server." msgstr "Mac ini menjalankan perintah shell dengan akun Anda, termasuk file di folder home Anda. Jangan aktifkan pada server bersama atau server publik." -#: src/pages/Shell.tsx:5670 +#: src/pages/Shell.tsx:4585 msgid "This permanently removes every message and stops current work. The chat remains available." msgstr "Ini menghapus permanen seluruh pesan dan menghentikan pekerjaan yang berjalan. Chat-nya tetap ada." -#: src/pages/Onboarding.tsx:523 +#: src/pages/Onboarding.tsx:537 msgid "This provider cannot paste a key here. Skip if this deployment already has credentials." msgstr "Provider ini tidak bisa menempel key di sini. Lewati jika deployment ini sudah punya kredensial." -#: src/pages/Shell.tsx:6210 +#: src/components/conversation/MessageView.tsx:756 msgid "This server cannot be assigned without a bot." msgstr "Server ini tidak bisa ditugaskan tanpa bot." @@ -2909,7 +2964,7 @@ msgstr "Server ini tidak meminta otorisasi lewat browser." msgid "This server is already connected. Disconnect it first to authorize again." msgstr "Server ini sudah tersambung. Putuskan dulu untuk mengotorisasi ulang." -#: src/pages/Shell.tsx:6249 +#: src/components/conversation/MessageView.tsx:795 msgid "This server uses browser sign-in. Authorize it to let your agents use its tools — a popup will open." msgstr "Server ini memakai proses masuk lewat browser. Otorisasi agar agent Anda bisa memakai tool-nya — sebuah popup akan terbuka." @@ -2921,17 +2976,17 @@ msgstr "Proses masuk berbasis langganan ini belum tersedia di Sentra Bot. Pakai msgid "Time of day" msgstr "Waktu dalam sehari" -#: src/pages/Onboarding.tsx:672 -#: src/pages/Shell.tsx:5160 -#: src/pages/Shell.tsx:5326 +#: src/pages/Onboarding.tsx:686 +#: src/pages/Shell.tsx:4075 +#: src/pages/Shell.tsx:4241 msgid "Title" msgstr "Judul" -#: src/pages/PluginsOverlay.tsx:872 +#: src/pages/PluginsOverlay.tsx:874 msgid "Tool sources" msgstr "Sumber tool" -#: src/pages/PluginsOverlay.tsx:834 +#: src/pages/PluginsOverlay.tsx:836 msgid "Treg token" msgstr "Token Treg" @@ -2952,7 +3007,7 @@ msgid "Unpin" msgstr "Lepas sematan" #. placeholder {0}: pending.file.name -#: src/pages/Shell.tsx:1834 +#: src/pages/Shell.tsx:1821 msgid "Unsupported file type: {0}" msgstr "Jenis file tidak didukung: {0}" @@ -2981,6 +3036,10 @@ msgstr "Pembaruan gagal" msgid "Update finished with errors" msgstr "Pembaruan selesai dengan kesalahan" +#: src/pages/ResetPassword.tsx:206 +msgid "Update password" +msgstr "Perbarui kata sandi" + #: src/components/SoftwareUpdateSection.tsx:172 #: src/components/SoftwareUpdateSection.tsx:189 msgid "Updated" @@ -2991,8 +3050,8 @@ msgstr "Diperbarui" msgid "Updating…" msgstr "Memperbarui…" -#: src/pages/AccountSettingsOverlay.tsx:212 -#: src/pages/Shell.tsx:2639 +#: src/pages/AccountSettingsOverlay.tsx:145 +#: src/pages/Shell.tsx:2628 msgid "Usage" msgstr "Pemakaian" @@ -3001,7 +3060,7 @@ msgid "Use {hostLabel}" msgstr "Pakai {hostLabel}" #: src/pages/ModelSettingsOverlay.tsx:485 -#: src/pages/Onboarding.tsx:382 +#: src/pages/Onboarding.tsx:396 msgid "Use a found model" msgstr "Pakai model yang ditemukan" @@ -3009,25 +3068,25 @@ msgstr "Pakai model yang ditemukan" msgid "Use this model" msgstr "Pakai model ini" -#: src/pages/PluginsOverlay.tsx:855 +#: src/pages/PluginsOverlay.tsx:857 msgid "Verify and add" msgstr "Verifikasi dan tambahkan" -#: src/pages/PluginsOverlay.tsx:853 +#: src/pages/PluginsOverlay.tsx:855 msgid "Verifying…" msgstr "Memverifikasi…" -#: src/pages/Shell.tsx:2627 -#: src/pages/Shell.tsx:5438 -#: src/pages/VoiceSettingsOverlay.tsx:124 -#: src/pages/VoiceSettingsOverlay.tsx:264 +#: src/pages/Shell.tsx:2616 +#: src/pages/Shell.tsx:4353 +#: src/pages/VoiceSettingsOverlay.tsx:129 +#: src/pages/VoiceSettingsOverlay.tsx:269 msgid "Voice" msgstr "Suara" #: src/pages/ModelSettingsOverlay.tsx:580 #: src/pages/ModelSettingsOverlay.tsx:602 -#: src/pages/Onboarding.tsx:453 -#: src/pages/Onboarding.tsx:475 +#: src/pages/Onboarding.tsx:467 +#: src/pages/Onboarding.tsx:489 msgid "Waiting for sign-in…" msgstr "Menunggu proses masuk…" @@ -3039,7 +3098,7 @@ msgstr "Menunggu API kembali…" msgid "Waiting for your message…" msgstr "Menunggu pesan Anda…" -#: src/pages/Shell.tsx:6093 +#: src/components/conversation/MessageView.tsx:639 msgid "Waiting…" msgstr "Menunggu…" @@ -3053,7 +3112,7 @@ msgstr "Webhook" msgid "Weekdays" msgstr "Hari kerja" -#: src/pages/Shell.tsx:5755 +#: src/pages/Shell.tsx:4670 msgid "What about its memories?" msgstr "Bagaimana dengan memorinya?" @@ -3065,8 +3124,8 @@ msgstr "Hasil apa yang akan Anda peragakan?" msgid "What should this routine do each time it runs?" msgstr "Apa yang harus dikerjakan rutinitas ini setiap kali berjalan?" -#: src/pages/Onboarding.tsx:685 -#: src/pages/Shell.tsx:5175 +#: src/pages/Onboarding.tsx:699 +#: src/pages/Shell.tsx:4090 msgid "What this bot is for" msgstr "Bot ini untuk apa" @@ -3099,17 +3158,19 @@ msgstr "Kapan dipakai" msgid "Where should bots run?" msgstr "Di mana bot dijalankan?" -#: src/pages/Auth.tsx:142 +#: src/pages/Auth.tsx:152 #: src/pages/CallView.tsx:242 +#: src/pages/ResetPassword.tsx:103 +#: src/pages/ResetPassword.tsx:206 msgid "Working…" msgstr "Bekerja…" -#: src/pages/Shell.tsx:5368 +#: src/pages/Shell.tsx:4283 msgid "Workspace default" msgstr "Default workspace" -#: src/pages/Shell.tsx:1558 -#: src/pages/Shell.tsx:2175 +#: src/pages/Shell.tsx:1541 +#: src/pages/Shell.tsx:2164 msgid "You" msgstr "Anda" @@ -3121,16 +3182,21 @@ msgstr "Anda bisa menutup tab ini jika tidak dialihkan otomatis." msgid "You can close this window." msgstr "Anda bisa menutup jendela ini." -#: src/pages/Shell.tsx:2933 -#: src/pages/Shell.tsx:3558 +#: src/pages/Shell.tsx:2927 +#: src/pages/Shell.tsx:3547 msgid "You have control" msgstr "Anda yang memegang kendali" -#: src/pages/Onboarding.tsx:660 +#: src/pages/ResetPassword.tsx:152 +msgid "You’ve been signed out everywhere. Sign in with your new password." +msgstr "Anda telah dikeluarkan dari semua perangkat. Masuk dengan kata sandi baru Anda." + +#: src/pages/Onboarding.tsx:674 msgid "Your bot" msgstr "Bot Anda" -#: src/pages/Auth.tsx:69 +#: src/pages/Auth.tsx:80 +#: src/pages/ResetPassword.tsx:89 msgid "Your email address" msgstr "Alamat email Anda" @@ -3138,7 +3204,7 @@ msgstr "Alamat email Anda" msgid "Your key or subscription token is stored securely and is never shown here." msgstr "Key atau token langganan Anda disimpan dengan aman dan tidak pernah ditampilkan di sini." -#: src/pages/Auth.tsx:56 +#: src/pages/Auth.tsx:67 msgid "Your name" msgstr "Nama Anda" diff --git a/apps/web/src/locales/ko/messages.po b/apps/web/src/locales/ko/messages.po index 03a662ba..03259fb2 100644 --- a/apps/web/src/locales/ko/messages.po +++ b/apps/web/src/locales/ko/messages.po @@ -13,7 +13,7 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" -#: src/pages/Shell.tsx:2423 +#: src/pages/Shell.tsx:2412 msgid " (unread)" msgstr " (읽지 않음)" @@ -31,12 +31,12 @@ msgid "{0, plural, one {# model} other {# models}}" msgstr "{0, plural, one {모델 #개} other {모델 #개}}" #. placeholder {0}: file.name -#: src/pages/Shell.tsx:1743 +#: src/pages/Shell.tsx:1726 msgid "{0} (max {ATTACHMENT_MAX_COUNT} attachments)" msgstr "{0} (첨부 파일 최대 {ATTACHMENT_MAX_COUNT}개)" #. placeholder {0}: file.name -#: src/pages/Shell.tsx:1747 +#: src/pages/Shell.tsx:1730 msgid "{0} (over 10 MiB)" msgstr "{0} (10 MiB 초과)" @@ -46,12 +46,12 @@ msgid "{0} {unitLabel}" msgstr "{0} {unitLabel}" #. placeholder {0}: block.name -#: src/pages/Shell.tsx:6066 +#: src/components/conversation/MessageView.tsx:612 msgid "{0} connection" msgstr "{0} 연결" #. placeholder {0}: computer.busyBotName -#: src/pages/Shell.tsx:2937 +#: src/pages/Shell.tsx:2931 msgid "{0} is using it" msgstr "{0}가 사용 중" @@ -67,8 +67,8 @@ msgstr "{0} MB" #. placeholder {0}: usage.runs #. placeholder {1}: usage.inputTokens + usage.outputTokens -#: src/pages/AccountSettingsOverlay.tsx:216 -#: src/pages/Shell.tsx:2644 +#: src/pages/AccountSettingsOverlay.tsx:149 +#: src/pages/Shell.tsx:2633 msgid "{0} runs · {1} tokens" msgstr "{0}회 실행 · 토큰 {1}개" @@ -81,7 +81,7 @@ msgstr "{botName} · {0, plural, one {동료 Bot #개} other {동료 Bot #개}}" msgid "{botName} has not messaged another bot yet." msgstr "{botName}은 아직 다른 Bot에게 메시지를 보내지 않았습니다." -#: src/pages/Shell.tsx:5943 +#: src/pages/Shell.tsx:4858 msgid "{botName}’s computer" msgstr "{botName}의 컴퓨터" @@ -125,12 +125,12 @@ msgstr "{size} B" msgid "{title}, {label}" msgstr "{title}, {label}" -#: src/pages/Shell.tsx:3723 +#: src/pages/Shell.tsx:3712 msgid "{workingBotName} is working" msgstr "{workingBotName} 작업 중" #. placeholder {0}: mention.name -#: src/pages/Shell.tsx:4223 +#: src/components/composer/Composer.tsx:363 msgid "@{0}" msgstr "@{0}" @@ -146,11 +146,11 @@ msgstr "+ 작업 가르치기" msgid "Access token (optional)" msgstr "액세스 토큰(선택 사항)" -#: src/pages/AccountSettingsOverlay.tsx:128 +#: src/pages/AccountSettingsOverlay.tsx:107 msgid "Account" msgstr "계정" -#: src/pages/Shell.tsx:5444 +#: src/pages/Shell.tsx:4359 msgid "Account default" msgstr "계정 기본값" @@ -171,17 +171,17 @@ msgstr "" msgid "Active model" msgstr "현재 모델" -#: src/pages/VoiceSettingsOverlay.tsx:149 +#: src/pages/VoiceSettingsOverlay.tsx:154 msgid "Active voice" msgstr "현재 목소리" -#: src/pages/Shell.tsx:2213 -#: src/pages/Shell.tsx:2215 +#: src/pages/Shell.tsx:2202 +#: src/pages/Shell.tsx:2204 msgid "Activity" msgstr "활동" -#: src/pages/PluginsOverlay.tsx:457 -#: src/pages/PluginsOverlay.tsx:668 +#: src/pages/PluginsOverlay.tsx:458 +#: src/pages/PluginsOverlay.tsx:670 #: src/pages/ScratchpadSection.tsx:188 msgid "Add" msgstr "추가" @@ -190,7 +190,7 @@ msgstr "추가" msgid "Add a model in Settings to use this." msgstr "" -#: src/pages/Shell.tsx:3157 +#: src/pages/Shell.tsx:3151 msgid "Add a run time for this one-shot." msgstr "" @@ -198,7 +198,7 @@ msgstr "" msgid "Add a schedule or webhook to run this routine." msgstr "" -#: src/pages/Shell.tsx:3129 +#: src/pages/Shell.tsx:3123 msgid "Add a schedule or webhook trigger" msgstr "" @@ -222,15 +222,15 @@ msgstr "HTTPS 서버 URL을 입력하세요." msgid "Add item" msgstr "항목 추가" -#: src/pages/PluginsOverlay.tsx:762 +#: src/pages/PluginsOverlay.tsx:764 msgid "Add MCP server" msgstr "MCP 서버 추가" -#: src/pages/PluginsOverlay.tsx:765 +#: src/pages/PluginsOverlay.tsx:767 msgid "Add OpenAPI" msgstr "OpenAPI 추가" -#: src/pages/PluginsOverlay.tsx:780 +#: src/pages/PluginsOverlay.tsx:782 msgid "Add remote MCP server" msgstr "원격 MCP 서버 추가" @@ -243,7 +243,7 @@ msgstr "서버 추가" msgid "Add to routine" msgstr "자동 실행에 추가" -#: src/pages/PluginsOverlay.tsx:768 +#: src/pages/PluginsOverlay.tsx:770 msgid "Add Treg" msgstr "Treg 추가" @@ -252,15 +252,15 @@ msgid "Add trigger" msgstr "" #: src/pages/McpServersOverlay.tsx:363 -#: src/pages/PluginsOverlay.tsx:452 -#: src/pages/PluginsOverlay.tsx:663 +#: src/pages/PluginsOverlay.tsx:453 +#: src/pages/PluginsOverlay.tsx:665 msgid "Adding…" msgstr "추가 중…" -#: src/pages/AccountSettingsOverlay.tsx:247 -#: src/pages/PluginsOverlay.tsx:742 +#: src/pages/AccountSettingsOverlay.tsx:180 +#: src/pages/PluginsOverlay.tsx:744 #: src/pages/RoutineSchedule.tsx:42 -#: src/pages/Shell.tsx:5347 +#: src/pages/Shell.tsx:4262 msgid "Advanced" msgstr "고급 설정" @@ -272,7 +272,7 @@ msgstr "" msgid "Agent access for new servers" msgstr "새 서버를 사용할 Bot" -#: src/pages/Shell.tsx:2736 +#: src/pages/Shell.tsx:2730 msgid "Agent computer" msgstr "Agent 컴퓨터" @@ -319,7 +319,7 @@ msgstr "확인 없이 결제 동작 허용" msgid "Allowed once" msgstr "한 번 허용됨" -#: src/pages/Auth.tsx:159 +#: src/pages/Auth.tsx:169 msgid "Already have an account?" msgstr "이미 계정이 있나요?" @@ -331,6 +331,10 @@ msgstr "이 도구 항상 허용" msgid "Always allowed" msgstr "항상 허용됨" +#: src/pages/Auth.tsx:140 +msgid "An account with this email already exists." +msgstr "" + #: src/components/AskCard.tsx:138 msgid "Answer" msgstr "답변" @@ -352,14 +356,14 @@ msgstr "" #: src/pages/ModelSettingsOverlay.tsx:630 #: src/pages/ModelSettingsOverlay.tsx:633 #: src/pages/ModelSettingsOverlay.tsx:649 -#: src/pages/Onboarding.tsx:496 -#: src/pages/Onboarding.tsx:499 #: src/pages/Onboarding.tsx:510 -#: src/pages/VoiceSettingsOverlay.tsx:236 +#: src/pages/Onboarding.tsx:513 +#: src/pages/Onboarding.tsx:524 +#: src/pages/VoiceSettingsOverlay.tsx:241 msgid "API key" msgstr "API 키" -#: src/pages/PluginsOverlay.tsx:816 +#: src/pages/PluginsOverlay.tsx:818 msgid "API key header" msgstr "API 키 헤더" @@ -371,13 +375,13 @@ msgstr "서버를 추가할 때 적용됩니다. 각 서버 카드의 Bot 버튼 msgid "Approval boundaries" msgstr "승인이 필요한 범위" +#: src/components/conversation/MessageView.tsx:805 #: src/pages/PhoneSettingsOverlay.tsx:243 #: src/pages/PhoneSettingsOverlay.tsx:310 -#: src/pages/Shell.tsx:6259 msgid "Approve" msgstr "승인" -#: src/pages/Shell.tsx:6250 +#: src/components/conversation/MessageView.tsx:796 msgid "Approve this server to let your agent use its tools." msgstr "이 서버를 승인하면 Bot이 제공되는 도구를 사용할 수 있습니다." @@ -385,15 +389,15 @@ msgstr "이 서버를 승인하면 Bot이 제공되는 도구를 사용할 수 msgid "Archive" msgstr "보관" -#: src/pages/Shell.tsx:4892 +#: src/components/conversation/MessageView.tsx:312 msgid "archived" msgstr "보관됨" -#: src/pages/Shell.tsx:2487 +#: src/pages/Shell.tsx:2476 msgid "Archived" msgstr "보관됨" -#: src/pages/Shell.tsx:4903 +#: src/components/conversation/MessageView.tsx:323 msgid "Archived. Chat, memory, and files kept." msgstr "보관되었습니다. 대화, 기억, 파일은 유지됩니다." @@ -432,7 +436,7 @@ msgstr "결제하기 전에 확인" msgid "Ask before sending external email" msgstr "외부 이메일을 보내기 전에 확인" -#: src/pages/Shell.tsx:2939 +#: src/pages/Shell.tsx:2933 msgid "Asleep" msgstr "절전 중" @@ -447,16 +451,21 @@ msgstr "{0}에" msgid "at {timeSelect}" msgstr "{timeSelect}에" -#: src/pages/Shell.tsx:4297 +#: src/pages/Auth.tsx:134 +#: src/pages/ResetPassword.tsx:197 +msgid "At least 8 characters" +msgstr "" + +#: src/components/composer/Composer.tsx:437 msgid "Attach file" msgstr "파일 첨부" -#: src/pages/Shell.tsx:4498 +#: src/components/composer/shared.ts:21 msgid "Attachment" msgstr "첨부 파일" #: src/pages/ModelSettingsOverlay.tsx:563 -#: src/pages/Onboarding.tsx:437 +#: src/pages/Onboarding.tsx:451 msgid "Authorization code or callback URL" msgstr "인증 코드 또는 돌아온 페이지 주소" @@ -464,12 +473,12 @@ msgstr "인증 코드 또는 돌아온 페이지 주소" msgid "Authorization expired — reconnect required" msgstr "인증이 만료됨 — 다시 연결해야 함" -#: src/pages/Shell.tsx:6051 +#: src/components/conversation/MessageView.tsx:597 msgid "Authorization timed out. Please try again." msgstr "인증 시간이 만료되었습니다. 다시 시도해 주세요." -#: src/pages/Shell.tsx:6093 -#: src/pages/Shell.tsx:6259 +#: src/components/conversation/MessageView.tsx:639 +#: src/components/conversation/MessageView.tsx:805 msgid "Authorize" msgstr "인증하기" @@ -477,34 +486,35 @@ msgstr "인증하기" msgid "Available after the routine is saved" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:161 -msgid "Avatars" -msgstr "" - #: src/pages/RoutineEditor.tsx:243 msgid "Back" msgstr "" +#: src/pages/ResetPassword.tsx:61 +#: src/pages/ResetPassword.tsx:107 +msgid "Back to sign in" +msgstr "" + #: src/pages/memory-providers/SupermemorySettingsForm.tsx:48 msgid "Base URL" msgstr "서버 주소" -#: src/pages/PluginsOverlay.tsx:813 +#: src/pages/PluginsOverlay.tsx:815 msgid "Bearer token" msgstr "Bearer 토큰" -#: src/pages/Shell.tsx:5935 +#: src/pages/Shell.tsx:4850 msgid "Booting live desktop…" msgstr "라이브 데스크톱 시작 중…" #. placeholder {0}: active?.name -#: src/pages/Shell.tsx:3528 +#: src/pages/Shell.tsx:3517 msgid "Booting up {0}’s computer" msgstr "{0}의 컴퓨터를 켜는 중" -#: src/pages/Shell.tsx:4752 -#: src/pages/Shell.tsx:4753 -#: src/pages/Shell.tsx:4896 +#: src/components/conversation/MessageView.tsx:172 +#: src/components/conversation/MessageView.tsx:173 +#: src/components/conversation/MessageView.tsx:316 msgid "bot" msgstr "Bot" @@ -513,7 +523,7 @@ msgstr "Bot" msgid "Bot" msgstr "" -#: src/pages/Shell.tsx:1559 +#: src/pages/Shell.tsx:1542 msgid "Bot" msgstr "봇" @@ -521,11 +531,11 @@ msgstr "봇" msgid "Bot messages" msgstr "Bot 메시지" -#: src/pages/Shell.tsx:3625 +#: src/pages/Shell.tsx:3614 msgid "Bot screen" msgstr "Bot 화면" -#: src/pages/Shell.tsx:2903 +#: src/pages/Shell.tsx:2897 msgid "Bot screen preview" msgstr "Bot 화면 미리보기" @@ -533,36 +543,36 @@ msgstr "Bot 화면 미리보기" msgid "Bots act without asking by default. Add an exception only when you want to review a type of action first. These preferences apply across all your bots." msgstr "Bot은 기본적으로 묻지 않고 작업합니다. 먼저 확인하고 싶은 작업만 예외로 추가하세요. 이 설정은 모든 Bot에 적용됩니다." -#: src/pages/Shell.tsx:3724 +#: src/pages/Shell.tsx:3713 msgid "Bots are working" msgstr "봇 작업 중" -#: src/pages/VoiceSettingsOverlay.tsx:130 +#: src/pages/VoiceSettingsOverlay.tsx:135 msgid "Bring your own key. The provider is swappable; your bots keep the same speak and call buttons." msgstr "사용 중인 서비스의 API 키를 연결하세요. 서비스를 바꿔도 Bot의 읽기·통화 기능은 그대로 유지됩니다." #: src/pages/CallView.tsx:233 -#: src/pages/Shell.tsx:2718 -#: src/pages/Shell.tsx:2719 +#: src/pages/Shell.tsx:2712 +#: src/pages/Shell.tsx:2713 msgid "Call" msgstr "통화" -#: src/App.tsx:125 +#: src/App.tsx:129 msgid "Can't reach the server." msgstr "서버에 연결할 수 없습니다." #: src/components/AskCard.tsx:161 #: src/components/ComputerMaintenanceActions.tsx:108 #: src/components/teach/TeachComputerSection.tsx:122 -#: src/pages/PluginsOverlay.tsx:864 -#: src/pages/Shell.tsx:5611 -#: src/pages/Shell.tsx:5683 -#: src/pages/Shell.tsx:5798 -#: src/pages/Shell.tsx:5874 +#: src/pages/PluginsOverlay.tsx:866 +#: src/pages/Shell.tsx:4526 +#: src/pages/Shell.tsx:4598 +#: src/pages/Shell.tsx:4713 +#: src/pages/Shell.tsx:4789 msgid "Cancel" msgstr "취소" -#: src/pages/Shell.tsx:5140 +#: src/pages/Shell.tsx:4055 msgid "Cancel new bot" msgstr "새 Bot 만들기 취소" @@ -570,7 +580,7 @@ msgstr "새 Bot 만들기 취소" msgid "Cancel new group" msgstr "새 그룹 만들기 취소" -#: src/pages/Shell.tsx:4170 +#: src/components/composer/Composer.tsx:310 msgid "Cancel reply" msgstr "답장 취소" @@ -582,11 +592,11 @@ msgstr "취소됨" msgid "Channels" msgstr "" -#: src/pages/Shell.tsx:6156 +#: src/components/conversation/MessageView.tsx:702 msgid "Chart failed to render: {error}" msgstr "차트를 표시하지 못했습니다: {error}" -#: src/pages/Shell.tsx:4439 +#: src/components/composer/Composer.tsx:579 msgid "Chat Settings" msgstr "채팅 설정" @@ -602,11 +612,15 @@ msgstr "" msgid "Check for updates" msgstr "" -#: src/pages/Shell.tsx:3170 -#: src/pages/Shell.tsx:3180 +#: src/pages/Shell.tsx:3164 +#: src/pages/Shell.tsx:3174 msgid "Check in." msgstr "확인해 주세요." +#: src/pages/ResetPassword.tsx:52 +msgid "Check your email" +msgstr "" + #: src/components/SoftwareUpdateSection.tsx:71 msgid "Checking…" msgstr "" @@ -615,33 +629,33 @@ msgstr "" msgid "Checkout has local changes. Clean it before updating." msgstr "" -#: src/pages/Onboarding.tsx:269 +#: src/pages/Onboarding.tsx:283 msgid "Choose a model to get started." msgstr "먼저 사용할 AI 모델을 선택하세요." +#: src/pages/ResetPassword.tsx:162 +msgid "Choose a new password" +msgstr "" + #: src/pages/ModelSettingsOverlay.tsx:310 msgid "Choose which connected model Sentra Bot uses." msgstr "Sentra Bot에서 기본으로 사용할 연결된 모델을 선택하세요." -#: src/pages/AccountSettingsOverlay.tsx:187 -msgid "Clay" -msgstr "" - -#: src/pages/Shell.tsx:5698 +#: src/pages/Shell.tsx:4613 msgid "Clear" msgstr "비우기" #. placeholder {0}: bot.name -#: src/pages/Shell.tsx:5664 +#: src/pages/Shell.tsx:4579 msgid "Clear {0}’s conversation?" msgstr "{0}와의 대화 내용을 비울까요?" #: src/pages/BotContextMenu.tsx:103 -#: src/pages/Shell.tsx:5499 +#: src/pages/Shell.tsx:4414 msgid "Clear conversation" msgstr "대화 내용 비우기" -#: src/pages/Shell.tsx:5698 +#: src/pages/Shell.tsx:4613 msgid "Clearing…" msgstr "비우는 중…" @@ -655,19 +669,19 @@ msgstr "닫기" msgid "Close bot messages" msgstr "Bot 메시지 닫기" -#: src/pages/Shell.tsx:6341 +#: src/components/conversation/MessageView.tsx:887 msgid "Close chart" msgstr "차트 닫기" -#: src/pages/Shell.tsx:3599 +#: src/pages/Shell.tsx:3588 msgid "Close computer" msgstr "컴퓨터 닫기" -#: src/pages/Shell.tsx:6441 +#: src/components/conversation/MessageView.tsx:987 msgid "Close image preview" msgstr "이미지 미리보기 닫기" -#: src/pages/PluginsOverlay.tsx:586 +#: src/pages/PluginsOverlay.tsx:587 msgid "Close integrations" msgstr "앱·도구 연동 닫기" @@ -683,11 +697,11 @@ msgstr "기억 설정 닫기" msgid "Close model settings" msgstr "AI 모델 설정 닫기" -#: src/pages/Shell.tsx:2195 +#: src/pages/Shell.tsx:2184 msgid "Close navigation" msgstr "메뉴 닫기" -#: src/pages/Shell.tsx:2881 +#: src/pages/Shell.tsx:2875 msgid "Close panel" msgstr "패널 닫기" @@ -700,11 +714,11 @@ msgstr "" msgid "Close preview" msgstr "미리보기 닫기" -#: src/pages/AccountSettingsOverlay.tsx:118 +#: src/pages/AccountSettingsOverlay.tsx:97 msgid "Close user settings" msgstr "계정 설정 닫기" -#: src/pages/VoiceSettingsOverlay.tsx:139 +#: src/pages/VoiceSettingsOverlay.tsx:144 msgid "Close voice settings" msgstr "음성 설정 닫기" @@ -718,7 +732,7 @@ msgid "Code" msgstr "" #. placeholder {0}: group.title -#: src/pages/Shell.tsx:2305 +#: src/pages/Shell.tsx:2294 msgid "Collapse {0}" msgstr "" @@ -734,28 +748,28 @@ msgstr "실행 명령" msgid "Complete" msgstr "완료" -#: src/pages/Shell.tsx:5050 -#: src/pages/Shell.tsx:5078 +#: src/components/conversation/MessageView.tsx:470 +#: src/pages/Shell.tsx:3993 msgid "Computer" msgstr "컴퓨터" -#: src/pages/Shell.tsx:5938 +#: src/pages/Shell.tsx:4853 msgid "Computer failed to boot" msgstr "컴퓨터를 시작하지 못했습니다" -#: src/pages/Shell.tsx:3647 +#: src/pages/Shell.tsx:3636 msgid "Computer is asleep" msgstr "컴퓨터가 절전 상태입니다" -#: src/pages/Shell.tsx:5937 +#: src/pages/Shell.tsx:4852 msgid "Computer is asleep. Take control to wake it." msgstr "컴퓨터가 잠들어 있습니다. 제어권을 가져와 깨우세요." -#: src/pages/Shell.tsx:5939 +#: src/pages/Shell.tsx:4854 msgid "Computer is stopped" msgstr "컴퓨터가 중지됨" -#: src/pages/AccountSettingsOverlay.tsx:234 +#: src/pages/AccountSettingsOverlay.tsx:167 msgid "Computers" msgstr "컴퓨터" @@ -776,12 +790,12 @@ msgid "Confirm delete" msgstr "삭제 확인" #: src/pages/memory-providers/SupermemorySettingsForm.tsx:80 -#: src/pages/PluginsOverlay.tsx:494 -#: src/pages/VoiceSettingsOverlay.tsx:257 +#: src/pages/PluginsOverlay.tsx:495 +#: src/pages/VoiceSettingsOverlay.tsx:262 msgid "Connect" msgstr "연결" -#: src/pages/Onboarding.tsx:266 +#: src/pages/Onboarding.tsx:280 msgid "Connect a model" msgstr "AI 모델 연결" @@ -789,11 +803,11 @@ msgstr "AI 모델 연결" msgid "Connect API key" msgstr "API 키 연결" -#: src/pages/VoiceSettingsOverlay.tsx:160 +#: src/pages/VoiceSettingsOverlay.tsx:165 msgid "Connect ElevenLabs, OpenAI, or Cartesia" msgstr "ElevenLabs, OpenAI 또는 Cartesia 연결" -#: src/pages/Shell.tsx:6239 +#: src/components/conversation/MessageView.tsx:785 msgid "Connect MCP server “{name}”" msgstr "MCP 서버 ‘{name}’ 연결" @@ -809,31 +823,31 @@ msgstr "원격 또는 로컬 도구 서버를 연결하고 사용할 Bot을 선 msgid "Connect this provider to use it as your personal model." msgstr "이 AI 서비스를 연결하면 내 기본 모델로 사용할 수 있습니다." -#: src/pages/PluginsOverlay.tsx:778 +#: src/pages/PluginsOverlay.tsx:780 msgid "Connect Treg" msgstr "Treg 연결" +#: src/components/conversation/MessageView.tsx:636 #: src/pages/McpOAuthCallback.tsx:53 #: src/pages/MemorySettingsOverlay.tsx:163 #: src/pages/ModelSettingsOverlay.tsx:378 -#: src/pages/Shell.tsx:6090 -#: src/pages/VoiceSettingsOverlay.tsx:202 +#: src/pages/VoiceSettingsOverlay.tsx:207 msgid "Connected" msgstr "연결됨" -#: src/pages/Shell.tsx:6269 +#: src/components/conversation/MessageView.tsx:815 msgid "Connected — its tools are available from your next message." msgstr "연결되었습니다. 다음 메시지부터 이 도구를 사용할 수 있습니다." #. placeholder {0}: credential.label #. placeholder {0}: selected.name #: src/pages/ModelSettingsOverlay.tsx:522 -#: src/pages/VoiceSettingsOverlay.tsx:223 +#: src/pages/VoiceSettingsOverlay.tsx:228 msgid "Connected · {0}" msgstr "연결됨 · {0}" #. placeholder {0}: selected.name -#: src/pages/VoiceSettingsOverlay.tsx:73 +#: src/pages/VoiceSettingsOverlay.tsx:78 msgid "Connected {0}." msgstr "{0}에 연결했습니다." @@ -844,29 +858,29 @@ msgstr "{0}에 연결했습니다." msgid "Connected and using {0}." msgstr "{0}에 연결하고 기본 모델로 설정했습니다." +#: src/components/conversation/MessageView.tsx:805 #: src/pages/McpServersOverlay.tsx:16 #: src/pages/memory-providers/SupermemorySettingsForm.tsx:80 -#: src/pages/PluginsOverlay.tsx:494 -#: src/pages/Shell.tsx:6259 -#: src/pages/VoiceSettingsOverlay.tsx:253 +#: src/pages/PluginsOverlay.tsx:495 +#: src/pages/VoiceSettingsOverlay.tsx:258 msgid "Connecting…" msgstr "연결 중…" #. placeholder {0}: item.name -#: src/pages/PluginsOverlay.tsx:297 +#: src/pages/PluginsOverlay.tsx:298 msgid "Connection to {0} is still pending. You can close this and check again." msgstr "{0} 연결이 아직 진행 중입니다. 이 창을 닫고 나중에 다시 확인할 수 있습니다." -#: src/pages/Onboarding.tsx:538 -#: src/pages/Onboarding.tsx:697 +#: src/pages/Onboarding.tsx:552 +#: src/pages/Onboarding.tsx:711 msgid "Continue" msgstr "계속" -#: src/pages/Auth.tsx:144 +#: src/pages/Auth.tsx:154 msgid "Continue with email" msgstr "이메일로 계속하기" -#: src/pages/Shell.tsx:4535 +#: src/pages/Shell.tsx:3921 msgid "Copy" msgstr "복사" @@ -878,11 +892,11 @@ msgstr "추가하지 못했습니다." msgid "Could not add MCP server" msgstr "MCP 서버를 추가하지 못했습니다." -#: src/pages/Shell.tsx:6226 +#: src/components/conversation/MessageView.tsx:772 msgid "Could not approve this server" msgstr "서버를 승인하지 못했습니다." -#: src/pages/Shell.tsx:6054 +#: src/components/conversation/MessageView.tsx:600 msgid "Could not authorize this app" msgstr "앱 인증을 완료하지 못했습니다." @@ -890,7 +904,7 @@ msgstr "앱 인증을 완료하지 못했습니다." msgid "Could not change the default model" msgstr "기본 모델을 변경하지 못했습니다." -#: src/pages/Shell.tsx:5692 +#: src/pages/Shell.tsx:4607 msgid "Could not clear conversation" msgstr "대화 내용을 비우지 못했습니다." @@ -898,7 +912,7 @@ msgstr "대화 내용을 비우지 못했습니다." msgid "Could not complete OAuth" msgstr "OAuth 인증을 완료하지 못했습니다." -#: src/pages/PluginsOverlay.tsx:301 +#: src/pages/PluginsOverlay.tsx:302 msgid "Could not connect" msgstr "연결하지 못했습니다." @@ -911,15 +925,15 @@ msgstr "{0}에 연결하지 못했습니다." msgid "Could not connect this provider" msgstr "AI 서비스에 연결하지 못했습니다." -#: src/pages/VoiceSettingsOverlay.tsx:75 +#: src/pages/VoiceSettingsOverlay.tsx:80 msgid "Could not connect this voice provider" msgstr "음성 서비스에 연결하지 못했습니다." -#: src/pages/Auth.tsx:33 +#: src/pages/Auth.tsx:50 msgid "Could not continue" msgstr "계속 진행하지 못했습니다." -#: src/pages/Shell.tsx:5128 +#: src/pages/Shell.tsx:4043 msgid "Could not create bot" msgstr "Bot을 만들지 못했습니다." @@ -927,19 +941,19 @@ msgstr "Bot을 만들지 못했습니다." msgid "Could not create group" msgstr "그룹을 만들지 못했습니다." -#: src/pages/Shell.tsx:5583 +#: src/pages/Shell.tsx:4498 msgid "Could not create section" msgstr "섹션을 만들지 못했습니다." -#: src/pages/Onboarding.tsx:251 +#: src/pages/Onboarding.tsx:265 msgid "Could not create your bot" msgstr "Bot을 만들지 못했습니다." -#: src/pages/Shell.tsx:5807 +#: src/pages/Shell.tsx:4722 msgid "Could not delete bot" msgstr "Bot을 삭제하지 못했습니다." -#: src/pages/Shell.tsx:5887 +#: src/pages/Shell.tsx:4802 msgid "Could not delete group" msgstr "" @@ -947,7 +961,7 @@ msgstr "" msgid "Could not delete MCP server" msgstr "MCP 서버를 삭제하지 못했습니다." -#: src/pages/Shell.tsx:5888 +#: src/pages/Shell.tsx:4803 msgid "Could not delete routine" msgstr "자동 실행을 삭제하지 못했습니다." @@ -968,15 +982,15 @@ msgstr "{0}을 다운로드하지 못했습니다. 다시 시도해 주세요." msgid "Could not download {name}. Try again." msgstr "{name}을 다운로드하지 못했습니다. 다시 시도해 주세요." -#: src/pages/PluginsOverlay.tsx:952 +#: src/pages/PluginsOverlay.tsx:954 msgid "Could not install connector" msgstr "도구 연결을 추가하지 못했습니다." -#: src/pages/PluginsOverlay.tsx:370 +#: src/pages/PluginsOverlay.tsx:371 msgid "Could not install MCP server" msgstr "" -#: src/pages/PluginsOverlay.tsx:409 +#: src/pages/PluginsOverlay.tsx:410 msgid "Could not install skill" msgstr "" @@ -984,7 +998,7 @@ msgstr "" msgid "Could not load approval rules" msgstr "확인 규칙을 불러오지 못했습니다." -#: src/pages/PluginsOverlay.tsx:130 +#: src/pages/PluginsOverlay.tsx:133 msgid "Could not load integrations" msgstr "연동 목록을 불러오지 못했습니다." @@ -1004,16 +1018,16 @@ msgstr "파일을 불러오지 못했습니다." msgid "Could not load update status" msgstr "" -#: src/pages/VoiceSettingsOverlay.tsx:47 +#: src/pages/VoiceSettingsOverlay.tsx:52 msgid "Could not load voice settings" msgstr "음성 설정을 불러오지 못했습니다." -#: src/pages/VoiceSettingsOverlay.tsx:109 +#: src/pages/VoiceSettingsOverlay.tsx:114 msgid "Could not play a test clip" msgstr "샘플 음성을 재생하지 못했습니다." #: src/pages/ModelSettingsOverlay.tsx:221 -#: src/pages/Onboarding.tsx:197 +#: src/pages/Onboarding.tsx:211 msgid "Could not reach this model server" msgstr "모델 서버에 연결하지 못했습니다." @@ -1021,7 +1035,7 @@ msgstr "모델 서버에 연결하지 못했습니다." msgid "Could not remove" msgstr "삭제하지 못했습니다." -#: src/pages/PluginsOverlay.tsx:965 +#: src/pages/PluginsOverlay.tsx:967 msgid "Could not remove connector" msgstr "도구 연결을 삭제하지 못했습니다." @@ -1029,7 +1043,7 @@ msgstr "도구 연결을 삭제하지 못했습니다." msgid "Could not remove group" msgstr "그룹을 삭제하지 못했습니다." -#: src/pages/PluginsOverlay.tsx:396 +#: src/pages/PluginsOverlay.tsx:397 msgid "Could not remove MCP server" msgstr "" @@ -1037,23 +1051,27 @@ msgstr "" msgid "Could not remove rule" msgstr "확인 규칙을 삭제하지 못했습니다." -#: src/pages/PluginsOverlay.tsx:423 +#: src/pages/PluginsOverlay.tsx:424 msgid "Could not remove skill" msgstr "" -#: src/pages/Shell.tsx:6146 +#: src/components/conversation/MessageView.tsx:692 msgid "Could not render chart" msgstr "차트를 만들지 못했습니다." -#: src/pages/PluginsOverlay.tsx:327 +#: src/pages/ResetPassword.tsx:139 +msgid "Could not reset your password" +msgstr "" + +#: src/pages/PluginsOverlay.tsx:328 msgid "Could not revoke connection" msgstr "연결을 해제하지 못했습니다." -#: src/pages/Shell.tsx:3232 +#: src/pages/Shell.tsx:3226 msgid "Could not run routine" msgstr "" -#: src/pages/Shell.tsx:5484 +#: src/pages/Shell.tsx:4399 msgid "Could not save" msgstr "저장하지 못했습니다." @@ -1065,11 +1083,11 @@ msgstr "" msgid "Could not save group" msgstr "그룹을 저장하지 못했습니다." -#: src/pages/Onboarding.tsx:224 +#: src/pages/Onboarding.tsx:238 msgid "Could not save model" msgstr "AI 모델을 저장하지 못했습니다." -#: src/pages/Shell.tsx:3203 +#: src/pages/Shell.tsx:3197 msgid "Could not save routine" msgstr "자동 실행을 저장하지 못했습니다." @@ -1081,11 +1099,11 @@ msgstr "확인 규칙을 저장하지 못했습니다." msgid "Could not save that choice" msgstr "선택 내용을 저장하지 못했습니다." -#: src/pages/VoiceSettingsOverlay.tsx:90 +#: src/pages/VoiceSettingsOverlay.tsx:95 msgid "Could not save that voice" msgstr "목소리를 저장하지 못했습니다." -#: src/pages/Shell.tsx:5966 +#: src/components/conversation/MessageView.tsx:508 msgid "Could not save this choice" msgstr "선택 내용을 저장하지 못했습니다." @@ -1093,8 +1111,12 @@ msgstr "선택 내용을 저장하지 못했습니다." msgid "Could not send that" msgstr "메시지를 보내지 못했습니다." +#: src/pages/ResetPassword.tsx:44 +msgid "Could not send the link. Try again." +msgstr "" + #: src/pages/McpServersOverlay.tsx:172 -#: src/pages/PluginsOverlay.tsx:384 +#: src/pages/PluginsOverlay.tsx:385 msgid "Could not start OAuth" msgstr "OAuth 인증을 시작하지 못했습니다." @@ -1102,7 +1124,7 @@ msgstr "OAuth 인증을 시작하지 못했습니다." msgid "Could not submit this answer" msgstr "답변을 보내지 못했습니다." -#: src/pages/Shell.tsx:2043 +#: src/pages/Shell.tsx:2032 msgid "Could not take control" msgstr "직접 조작으로 전환하지 못했습니다." @@ -1130,26 +1152,22 @@ msgstr "" msgid "Couldn't start WhatsApp pairing" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:93 -msgid "Couldn't update avatars" -msgstr "" - #: src/pages/PhoneSettingsOverlay.tsx:99 msgid "Couldn't update phone settings" msgstr "" -#: src/pages/Shell.tsx:2233 -#: src/pages/Shell.tsx:5187 -#: src/pages/Shell.tsx:5618 +#: src/pages/Shell.tsx:2222 +#: src/pages/Shell.tsx:4102 +#: src/pages/Shell.tsx:4533 msgid "Create" msgstr "만들기" #. placeholder {0}: bot.name -#: src/pages/Shell.tsx:5592 +#: src/pages/Shell.tsx:4507 msgid "Create a section and move {0} into it." msgstr "새 섹션을 만들고 {0}을 옮깁니다." -#: src/pages/Auth.tsx:146 +#: src/pages/Auth.tsx:156 msgid "Create account" msgstr "계정 만들기" @@ -1157,29 +1175,29 @@ msgstr "계정 만들기" msgid "Create group" msgstr "그룹 만들기" -#: src/pages/Onboarding.tsx:557 +#: src/pages/Onboarding.tsx:571 msgid "Create your first bot" msgstr "첫 Bot 만들기" -#: src/pages/Auth.tsx:17 +#: src/pages/Auth.tsx:29 msgid "Create your Sentra Bot" msgstr "Sentra Bot 계정 만들기" #: src/pages/GroupPanel.tsx:134 -#: src/pages/Shell.tsx:5187 -#: src/pages/Shell.tsx:5618 +#: src/pages/Shell.tsx:4102 +#: src/pages/Shell.tsx:4533 msgid "Creating…" msgstr "만드는 중…" -#: src/pages/PluginsOverlay.tsx:569 +#: src/pages/PluginsOverlay.tsx:570 msgid "Creativity" msgstr "" -#: src/pages/PluginsOverlay.tsx:834 +#: src/pages/PluginsOverlay.tsx:836 msgid "Credential" msgstr "인증 정보" -#: src/pages/PluginsOverlay.tsx:892 +#: src/pages/PluginsOverlay.tsx:894 msgid "credential saved" msgstr "인증 정보 저장됨" @@ -1204,7 +1222,7 @@ msgstr "일" msgid "Decline" msgstr "" -#: src/pages/Shell.tsx:5391 +#: src/pages/Shell.tsx:4306 msgid "Default (medium)" msgstr "기본(보통)" @@ -1215,24 +1233,24 @@ msgstr "기본 기억 범위" #: src/pages/BotContextMenu.tsx:105 #: src/pages/McpServersOverlay.tsx:481 #: src/pages/RoutineEditor.tsx:280 -#: src/pages/Shell.tsx:2522 -#: src/pages/Shell.tsx:2552 -#: src/pages/Shell.tsx:5813 -#: src/pages/Shell.tsx:5895 +#: src/pages/Shell.tsx:2511 +#: src/pages/Shell.tsx:2541 +#: src/pages/Shell.tsx:4728 +#: src/pages/Shell.tsx:4810 msgid "Delete" msgstr "삭제" #. placeholder {0}: bot.name #. placeholder {0}: group.name -#: src/pages/Shell.tsx:2518 -#: src/pages/Shell.tsx:2548 +#: src/pages/Shell.tsx:2507 +#: src/pages/Shell.tsx:2537 msgid "Delete {0}" msgstr "{0} 삭제" #. placeholder {0}: bot.name #. placeholder {0}: item.name -#: src/pages/Shell.tsx:5745 -#: src/pages/Shell.tsx:5861 +#: src/pages/Shell.tsx:4660 +#: src/pages/Shell.tsx:4776 msgid "Delete {0}?" msgstr "{0}을 삭제할까요?" @@ -1240,17 +1258,17 @@ msgstr "{0}을 삭제할까요?" msgid "Delete group" msgstr "그룹 삭제" -#: src/pages/Shell.tsx:5782 +#: src/pages/Shell.tsx:4697 msgid "Delete memories too" msgstr "기억도 함께 삭제" -#: src/pages/Shell.tsx:4894 +#: src/components/conversation/MessageView.tsx:314 msgid "deleted" msgstr "삭제됨" #: src/pages/GroupPanel.tsx:232 -#: src/pages/Shell.tsx:5813 -#: src/pages/Shell.tsx:5895 +#: src/pages/Shell.tsx:4728 +#: src/pages/Shell.tsx:4810 msgid "Deleting…" msgstr "삭제 중…" @@ -1266,26 +1284,30 @@ msgstr "거부" msgid "Deployment default" msgstr "서버 기본값" -#: src/pages/Onboarding.tsx:676 -#: src/pages/Shell.tsx:5165 +#: src/pages/Onboarding.tsx:690 +#: src/pages/Shell.tsx:4080 msgid "Describe what this bot does" msgstr "이 Bot이 하는 일을 짧게 설명하세요" -#: src/pages/Onboarding.tsx:651 +#: src/pages/Onboarding.tsx:665 msgid "Describe your own bot in the panel." msgstr "" -#: src/pages/Onboarding.tsx:681 -#: src/pages/Shell.tsx:5170 -#: src/pages/Shell.tsx:5335 +#: src/pages/Onboarding.tsx:695 +#: src/pages/Shell.tsx:4085 +#: src/pages/Shell.tsx:4250 msgid "Description" msgstr "설명" -#: src/pages/PluginsOverlay.tsx:565 +#: src/pages/Shell.tsx:2704 +msgid "Desktop Runtime offline" +msgstr "" + +#: src/pages/PluginsOverlay.tsx:566 msgid "Developer" msgstr "" -#: src/pages/Shell.tsx:4306 +#: src/components/composer/Composer.tsx:446 msgid "Dictate" msgstr "음성 입력" @@ -1298,15 +1320,15 @@ msgstr "연결 해제" msgid "Disconnecting…" msgstr "연결 해제 중…" -#: src/pages/Shell.tsx:4153 +#: src/components/composer/Composer.tsx:293 msgid "Dismiss error" msgstr "" -#: src/pages/Shell.tsx:6274 +#: src/components/conversation/MessageView.tsx:820 msgid "Dismissed — reconnect anytime from MCP settings." msgstr "지금은 연결하지 않았습니다. MCP 설정에서 언제든 다시 연결할 수 있습니다." -#: src/pages/PluginsOverlay.tsx:788 +#: src/pages/PluginsOverlay.tsx:790 msgid "Display name" msgstr "표시 이름" @@ -1323,7 +1345,7 @@ msgstr "Docker에서 실행(권장)" msgid "Docker is the default: bots use a shared Team Computer." msgstr "기본 설정은 Docker이며, Bot들이 격리된 팀 컴퓨터를 함께 사용합니다." -#: src/pages/Auth.tsx:152 +#: src/pages/Auth.tsx:162 msgid "Don’t have an account?" msgstr "계정이 없나요?" @@ -1350,7 +1372,7 @@ msgstr "작업 기술 초안" msgid "Duplicate" msgstr "복제" -#: src/pages/Shell.tsx:4697 +#: src/components/conversation/MessageView.tsx:117 msgid "Earlier message" msgstr "이전 메시지" @@ -1362,7 +1384,8 @@ msgstr "수정 후 보내기" msgid "Edit Profile" msgstr "Bot 정보 수정" -#: src/pages/Auth.tsx:62 +#: src/pages/Auth.tsx:73 +#: src/pages/ResetPassword.tsx:82 msgid "Email" msgstr "이메일" @@ -1372,7 +1395,7 @@ msgstr "암호화된 고정 인증 정보가 저장됨" #. placeholder {0}: oauth.verificationUri.replace(/^https:\/\//, "") #: src/pages/ModelSettingsOverlay.tsx:586 -#: src/pages/Onboarding.tsx:459 +#: src/pages/Onboarding.tsx:473 msgid "Enter this code at <0>{0}" msgstr "<0>{0}에서 이 코드를 입력하세요" @@ -1410,16 +1433,16 @@ msgstr "매월" msgid "Every week" msgstr "매주" -#: src/pages/Shell.tsx:6320 +#: src/components/conversation/MessageView.tsx:866 msgid "Expand" msgstr "펼치기" #. placeholder {0}: group.title -#: src/pages/Shell.tsx:2305 +#: src/pages/Shell.tsx:2294 msgid "Expand {0}" msgstr "" -#: src/pages/Shell.tsx:5496 +#: src/pages/Shell.tsx:4411 msgid "Export" msgstr "내보내기" @@ -1427,7 +1450,7 @@ msgstr "내보내기" msgid "Export this week's list from the CRM and drop it in the shared folder" msgstr "CRM에서 이번 주 목록을 내려받아 공유 폴더에 넣기" -#: src/pages/Shell.tsx:5516 +#: src/pages/Shell.tsx:4431 msgid "Extra high" msgstr "매우 높음" @@ -1435,14 +1458,14 @@ msgstr "매우 높음" msgid "Failed" msgstr "실패" -#: src/pages/Shell.tsx:1878 -#: src/pages/Shell.tsx:1880 -#: src/pages/Shell.tsx:1882 +#: src/pages/Shell.tsx:1867 +#: src/pages/Shell.tsx:1869 +#: src/pages/Shell.tsx:1871 msgid "Failed to send message" msgstr "메시지를 보내지 못했습니다." -#: src/pages/Shell.tsx:1912 -#: src/pages/Shell.tsx:1931 +#: src/pages/Shell.tsx:1901 +#: src/pages/Shell.tsx:1920 msgid "Failed to stop" msgstr "작업을 중지하지 못했습니다." @@ -1456,18 +1479,18 @@ msgid "Failure handling" msgstr "실패했을 때 처리" #: src/pages/ModelSettingsOverlay.tsx:427 -#: src/pages/Onboarding.tsx:336 +#: src/pages/Onboarding.tsx:350 msgid "Find models" msgstr "모델 찾기" #: src/pages/ModelSettingsOverlay.tsx:427 -#: src/pages/Onboarding.tsx:336 +#: src/pages/Onboarding.tsx:350 msgid "Finding…" msgstr "찾는 중…" #. placeholder {0}: new URL(oauth.verificationUri).hostname #: src/pages/ModelSettingsOverlay.tsx:546 -#: src/pages/Onboarding.tsx:420 +#: src/pages/Onboarding.tsx:434 msgid "Finish signing in at <0>{0}. The final page may not load; paste its URL or code here." msgstr "<0>{0}에서 로그인을 마치세요. 마지막 페이지가 열리지 않아도 괜찮습니다. 그 페이지의 URL이나 코드를 여기에 붙여넣으세요." @@ -1484,6 +1507,10 @@ msgstr "MCP 연결을 마무리하는 중…" msgid "Flag unexpected actions" msgstr "" +#: src/pages/Auth.tsx:99 +msgid "Forgot password?" +msgstr "" + #: src/pages/ModelSettingsOverlay.tsx:1026 msgid "Free" msgstr "무료" @@ -1497,8 +1524,8 @@ msgid "Git event" msgstr "" #: src/pages/PhoneSettingsOverlay.tsx:224 -#: src/pages/Shell.tsx:2708 -#: src/pages/Shell.tsx:2863 +#: src/pages/Shell.tsx:2697 +#: src/pages/Shell.tsx:2857 msgid "Group" msgstr "그룹" @@ -1524,7 +1551,7 @@ msgid "header" msgstr "" #: src/pages/McpServersOverlay.tsx:342 -#: src/pages/PluginsOverlay.tsx:824 +#: src/pages/PluginsOverlay.tsx:826 msgid "Header name" msgstr "헤더 이름" @@ -1532,27 +1559,28 @@ msgstr "헤더 이름" msgid "Header value" msgstr "헤더 값" -#: src/pages/VoiceSettingsOverlay.tsx:284 +#: src/pages/VoiceSettingsOverlay.tsx:289 msgid "Hear a sample" msgstr "샘플 듣기" -#: src/pages/VoiceSettingsOverlay.tsx:102 +#: src/pages/VoiceSettingsOverlay.tsx:107 msgid "Hi, this is how I'll sound when I read replies out loud." msgstr "안녕하세요. 답변을 소리 내어 읽을 때 이런 목소리로 들립니다." -#: src/pages/Auth.tsx:95 +#: src/pages/Auth.tsx:122 +#: src/pages/ResetPassword.tsx:186 msgid "Hide password" msgstr "" -#: src/pages/Shell.tsx:5519 +#: src/pages/Shell.tsx:4434 msgid "High" msgstr "높음" -#: src/pages/Shell.tsx:4325 +#: src/components/composer/Composer.tsx:465 msgid "Hold to talk" msgstr "누르고 말하기" -#: src/pages/Shell.tsx:4325 +#: src/components/composer/Composer.tsx:465 msgid "Hold to talk (on-device dictation)" msgstr "누르고 말하기(기기 내 음성 인식)" @@ -1572,15 +1600,19 @@ msgstr "실행 주기" msgid "How to check" msgstr "완료 확인 방법" -#: src/pages/Shell.tsx:4591 +#: src/pages/Shell.tsx:3977 msgid "I’m done" msgstr "조작 끝내기" -#: src/pages/VoiceSettingsOverlay.tsx:107 +#: src/pages/ResetPassword.tsx:54 +msgid "If an account exists for {email}, we sent a link to reset your password. It works for one hour." +msgstr "" + +#: src/pages/VoiceSettingsOverlay.tsx:112 msgid "If you heard that, voice is ready." msgstr "샘플이 들렸다면 음성 설정이 완료되었습니다." -#: src/pages/AccountSettingsOverlay.tsx:140 +#: src/pages/AccountSettingsOverlay.tsx:119 msgid "iMessage channels and agent connections." msgstr "" @@ -1588,15 +1620,15 @@ msgstr "" msgid "iMessage line" msgstr "" -#: src/pages/PluginsOverlay.tsx:782 +#: src/pages/PluginsOverlay.tsx:784 msgid "Import OpenAPI JSON" msgstr "OpenAPI JSON 가져오기" -#: src/pages/Onboarding.tsx:701 +#: src/pages/Onboarding.tsx:715 msgid "Includes a full operating playbook for this role." msgstr "" -#: src/pages/Shell.tsx:5406 +#: src/pages/Shell.tsx:4321 msgid "Inherit default" msgstr "기본 설정 사용" @@ -1604,18 +1636,18 @@ msgstr "기본 설정 사용" msgid "Inputs" msgstr "입력값" -#: src/pages/PluginsOverlay.tsx:482 -#: src/pages/PluginsOverlay.tsx:533 +#: src/pages/PluginsOverlay.tsx:483 +#: src/pages/PluginsOverlay.tsx:534 msgid "Install" msgstr "" -#: src/pages/PluginsOverlay.tsx:498 -#: src/pages/PluginsOverlay.tsx:537 +#: src/pages/PluginsOverlay.tsx:499 +#: src/pages/PluginsOverlay.tsx:538 msgid "Installed" msgstr "" -#: src/pages/PluginsOverlay.tsx:482 -#: src/pages/PluginsOverlay.tsx:533 +#: src/pages/PluginsOverlay.tsx:483 +#: src/pages/PluginsOverlay.tsx:534 msgid "Installing…" msgstr "" @@ -1627,8 +1659,8 @@ msgstr "인스턴스 API 키" msgid "Instruction" msgstr "실행할 내용" -#: src/pages/PluginsOverlay.tsx:582 -#: src/pages/Shell.tsx:2570 +#: src/pages/PluginsOverlay.tsx:583 +#: src/pages/Shell.tsx:2559 msgid "Integrations" msgstr "앱·도구 연동" @@ -1650,19 +1682,19 @@ msgid "Interval unit" msgstr "간격 단위" #: src/pages/MemorySettingsOverlay.tsx:39 -#: src/pages/Shell.tsx:5407 +#: src/pages/Shell.tsx:4322 msgid "Isolated" msgstr "이 Bot만 사용" -#: src/pages/Shell.tsx:5748 +#: src/pages/Shell.tsx:4663 msgid "Its conversation, files, and routines will be permanently deleted. Bots it created stay in your list." msgstr "대화, 파일, 자동 실행이 영구 삭제됩니다. 이 Bot이 만든 다른 Bot은 목록에 남습니다." -#: src/pages/Shell.tsx:3886 +#: src/pages/Shell.tsx:3875 msgid "Jump to latest" msgstr "최신 메시지로 이동" -#: src/pages/Shell.tsx:4692 +#: src/components/conversation/MessageView.tsx:112 msgid "Jump to replied message" msgstr "답장한 메시지로 이동" @@ -1670,7 +1702,7 @@ msgstr "답장한 메시지로 이동" msgid "just now" msgstr "방금" -#: src/pages/Shell.tsx:5766 +#: src/pages/Shell.tsx:4681 msgid "Keep memories" msgstr "기억은 유지" @@ -1678,17 +1710,17 @@ msgstr "기억은 유지" msgid "key" msgstr "" -#: src/pages/VoiceSettingsOverlay.tsx:229 +#: src/pages/VoiceSettingsOverlay.tsx:234 msgid "Keys stay on the server. The app only learns whether a provider is configured." msgstr "API 키는 서버에만 안전하게 보관되며, 앱에는 연결 여부만 표시됩니다." -#: src/pages/PluginsOverlay.tsx:571 +#: src/pages/PluginsOverlay.tsx:572 msgid "Knowledge" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:154 -#: src/pages/AccountSettingsOverlay.tsx:363 -#: src/pages/AccountSettingsOverlay.tsx:380 +#: src/pages/AccountSettingsOverlay.tsx:133 +#: src/pages/AccountSettingsOverlay.tsx:296 +#: src/pages/AccountSettingsOverlay.tsx:313 msgid "Language" msgstr "언어" @@ -1709,7 +1741,7 @@ msgstr "" msgid "Listening…" msgstr "듣는 중…" -#: src/pages/Shell.tsx:3839 +#: src/pages/Shell.tsx:3828 msgid "Load earlier messages" msgstr "이전 메시지 불러오기" @@ -1717,7 +1749,7 @@ msgstr "이전 메시지 불러오기" msgid "Loading activity…" msgstr "활동을 불러오는 중…" -#: src/pages/PluginsOverlay.tsx:608 +#: src/pages/PluginsOverlay.tsx:609 msgid "Loading integrations…" msgstr "연동 목록을 불러오는 중…" @@ -1743,13 +1775,13 @@ msgstr "미리보기를 불러오는 중…" msgid "Loading rules…" msgstr "확인 규칙을 불러오는 중…" -#: src/pages/VoiceSettingsOverlay.tsx:128 +#: src/pages/VoiceSettingsOverlay.tsx:133 msgid "Loading voice providers…" msgstr "음성 서비스를 불러오는 중…" -#: src/App.tsx:50 -#: src/pages/Onboarding.tsx:260 -#: src/pages/Shell.tsx:3839 +#: src/App.tsx:53 +#: src/pages/Onboarding.tsx:274 +#: src/pages/Shell.tsx:3828 msgid "Loading…" msgstr "불러오는 중…" @@ -1757,15 +1789,15 @@ msgstr "불러오는 중…" msgid "Local" msgstr "로컬" -#: src/pages/Shell.tsx:2656 +#: src/pages/Shell.tsx:2645 msgid "Log out" msgstr "로그아웃" -#: src/pages/Shell.tsx:5517 +#: src/pages/Shell.tsx:4432 msgid "Low" msgstr "낮음" -#: src/pages/AccountSettingsOverlay.tsx:147 +#: src/pages/AccountSettingsOverlay.tsx:126 msgid "Manage phone settings" msgstr "" @@ -1781,17 +1813,17 @@ msgstr "읽음으로 표시" msgid "Mark as Unread" msgstr "읽지 않음으로 표시" -#: src/pages/Shell.tsx:5521 +#: src/pages/Shell.tsx:4436 msgid "Max" msgstr "최대" #: src/pages/McpServersOverlay.tsx:224 #: src/pages/McpServersOverlay.tsx:229 -#: src/pages/PluginsOverlay.tsx:756 +#: src/pages/PluginsOverlay.tsx:758 msgid "MCP servers" msgstr "MCP 서버" -#: src/pages/Shell.tsx:5518 +#: src/pages/Shell.tsx:4433 msgid "Medium" msgstr "보통" @@ -1804,11 +1836,11 @@ msgid "Members (pick {GROUP_MEMBER_MIN}–{GROUP_MEMBER_MAX})" msgstr "참여 Bot ({GROUP_MEMBER_MIN}~{GROUP_MEMBER_MAX}개 선택)" #: src/pages/MemorySettingsOverlay.tsx:134 -#: src/pages/Shell.tsx:2614 +#: src/pages/Shell.tsx:2603 msgid "Memory" msgstr "기억" -#: src/pages/Shell.tsx:5402 +#: src/pages/Shell.tsx:4317 msgid "Memory scope" msgstr "기억 사용 범위" @@ -1817,29 +1849,29 @@ msgstr "기억 사용 범위" msgid "Message" msgstr "" -#: src/pages/Shell.tsx:4403 -#: src/pages/Shell.tsx:4500 +#: src/components/composer/Composer.tsx:543 +#: src/components/composer/shared.ts:23 msgid "Message" msgstr "메시지" -#: src/pages/Shell.tsx:4399 -#: src/pages/Shell.tsx:4403 +#: src/components/composer/Composer.tsx:539 +#: src/components/composer/Composer.tsx:543 msgid "Message {activeName}" msgstr "{activeName}에게 메시지 보내기" -#: src/pages/Shell.tsx:4134 +#: src/components/composer/Composer.tsx:274 msgid "Message composer" msgstr "" -#: src/pages/Shell.tsx:4770 +#: src/components/conversation/MessageView.tsx:190 msgid "Message from {peer}" msgstr "{peer}의 메시지" -#: src/pages/Shell.tsx:4400 +#: src/components/composer/Composer.tsx:540 msgid "Message…" msgstr "메시지를 입력하세요" -#: src/pages/Shell.tsx:4770 +#: src/components/conversation/MessageView.tsx:190 msgid "Messaged {peer}" msgstr "{peer}에게 메시지 보냄" @@ -1847,7 +1879,7 @@ msgstr "{peer}에게 메시지 보냄" msgid "Microphone failed" msgstr "마이크를 사용할 수 없습니다." -#: src/pages/Shell.tsx:5520 +#: src/pages/Shell.tsx:4435 msgid "Minimal" msgstr "최소" @@ -1866,15 +1898,15 @@ msgstr "분" #: src/pages/ModelSettingsOverlay.tsx:432 #: src/pages/ModelSettingsOverlay.tsx:493 #: src/pages/ModelSettingsOverlay.tsx:914 -#: src/pages/Onboarding.tsx:341 -#: src/pages/Onboarding.tsx:390 -#: src/pages/Onboarding.tsx:398 -#: src/pages/Shell.tsx:5358 +#: src/pages/Onboarding.tsx:355 +#: src/pages/Onboarding.tsx:404 +#: src/pages/Onboarding.tsx:412 +#: src/pages/Shell.tsx:4273 msgid "Model" msgstr "모델" #: src/pages/ModelSettingsOverlay.tsx:474 -#: src/pages/Onboarding.tsx:371 +#: src/pages/Onboarding.tsx:385 msgid "Model id" msgstr "모델 ID" @@ -1882,7 +1914,7 @@ msgstr "모델 ID" msgid "Model options" msgstr "모델 선택지" -#: src/pages/AccountSettingsOverlay.tsx:222 +#: src/pages/AccountSettingsOverlay.tsx:155 msgid "Model spend uses your provider keys." msgstr "모델 사용 비용은 연결한 서비스의 API 키로 청구됩니다." @@ -1891,12 +1923,12 @@ msgid "Model updated." msgstr "모델이 변경되었습니다." #: src/pages/ModelSettingsOverlay.tsx:304 -#: src/pages/Shell.tsx:2601 +#: src/pages/Shell.tsx:2590 msgid "Models" msgstr "AI 모델" #: src/pages/ModelSettingsOverlay.tsx:445 -#: src/pages/Onboarding.tsx:348 +#: src/pages/Onboarding.tsx:362 msgid "Models from server" msgstr "서버에서 찾은 모델" @@ -1904,7 +1936,7 @@ msgstr "서버에서 찾은 모델" msgid "Monthly" msgstr "매월" -#: src/pages/PluginsOverlay.tsx:573 +#: src/pages/PluginsOverlay.tsx:574 msgid "More apps" msgstr "" @@ -1913,7 +1945,7 @@ msgstr "" msgid "Move {0} to section" msgstr "{0} 섹션 이동" -#: src/pages/Shell.tsx:5769 +#: src/pages/Shell.tsx:4684 msgid "Move them to your shared memory." msgstr "공용 기억으로 옮깁니다." @@ -1922,19 +1954,19 @@ msgid "Move to" msgstr "섹션으로 이동" #: src/components/teach/SkillDraftCard.tsx:82 -#: src/pages/Auth.tsx:49 +#: src/pages/Auth.tsx:60 #: src/pages/GroupPanel.tsx:110 #: src/pages/GroupPanel.tsx:201 -#: src/pages/Onboarding.tsx:663 +#: src/pages/Onboarding.tsx:677 #: src/pages/RoutineEditor.tsx:294 -#: src/pages/Shell.tsx:5150 -#: src/pages/Shell.tsx:5317 -#: src/pages/Shell.tsx:5595 +#: src/pages/Shell.tsx:4065 +#: src/pages/Shell.tsx:4232 +#: src/pages/Shell.tsx:4510 msgid "Name" msgstr "이름" -#: src/pages/Onboarding.tsx:667 -#: src/pages/Shell.tsx:5155 +#: src/pages/Onboarding.tsx:681 +#: src/pages/Shell.tsx:4070 msgid "Name this bot" msgstr "Bot 이름" @@ -1954,13 +1986,13 @@ msgstr "입력 필요" msgid "Needs takeover" msgstr "인수 필요" -#: src/pages/Shell.tsx:2247 -#: src/pages/Shell.tsx:5138 +#: src/pages/Shell.tsx:2236 +#: src/pages/Shell.tsx:4053 msgid "New bot" msgstr "새 Bot 만들기" #: src/pages/GroupPanel.tsx:98 -#: src/pages/Shell.tsx:2257 +#: src/pages/Shell.tsx:2246 msgid "New group" msgstr "새 그룹 만들기" @@ -1968,12 +2000,16 @@ msgstr "새 그룹 만들기" msgid "New open-work item" msgstr "새 진행 작업" +#: src/pages/ResetPassword.tsx:165 +msgid "New password" +msgstr "" + #: src/pages/RoutineEditor.tsx:100 msgid "New routine" msgstr "새 자동 실행" #: src/pages/BotContextMenu.tsx:130 -#: src/pages/Shell.tsx:5589 +#: src/pages/Shell.tsx:4504 msgid "New section" msgstr "새 섹션" @@ -1981,20 +2017,20 @@ msgstr "새 섹션" msgid "No agent connections yet." msgstr "" -#: src/pages/PluginsOverlay.tsx:687 +#: src/pages/PluginsOverlay.tsx:689 msgid "No apps match your search." msgstr "검색 결과가 없습니다." -#: src/pages/PluginsOverlay.tsx:894 +#: src/pages/PluginsOverlay.tsx:896 msgid "no auth" msgstr "인증 없음" -#: src/pages/PluginsOverlay.tsx:810 +#: src/pages/PluginsOverlay.tsx:812 msgid "No authentication" msgstr "인증 없음" #. placeholder {0}: item.name -#: src/pages/PluginsOverlay.tsx:323 +#: src/pages/PluginsOverlay.tsx:324 msgid "No connection record found for {0}." msgstr "{0}의 연결 정보를 찾지 못했습니다." @@ -2014,7 +2050,7 @@ msgstr "" msgid "No longer active" msgstr "이미 종료된 요청입니다" -#: src/pages/PluginsOverlay.tsx:682 +#: src/pages/PluginsOverlay.tsx:684 msgid "No managed app catalog is configured on this deployment." msgstr "이 서버에는 관리형 앱 목록이 설정되지 않았습니다." @@ -2022,7 +2058,7 @@ msgstr "이 서버에는 관리형 앱 목록이 설정되지 않았습니다." msgid "No matching models" msgstr "일치하는 모델 없음" -#: src/pages/PluginsOverlay.tsx:876 +#: src/pages/PluginsOverlay.tsx:878 msgid "No MCP or API tool sources installed yet." msgstr "아직 추가된 MCP 또는 API 도구가 없습니다." @@ -2054,16 +2090,16 @@ msgstr "" msgid "None yet" msgstr "아직 없음" -#: src/pages/VoiceSettingsOverlay.tsx:156 +#: src/pages/VoiceSettingsOverlay.tsx:161 msgid "Not configured" msgstr "설정되지 않음" #: src/pages/ModelSettingsOverlay.tsx:524 -#: src/pages/VoiceSettingsOverlay.tsx:225 +#: src/pages/VoiceSettingsOverlay.tsx:230 msgid "Not connected" msgstr "연결되지 않음" -#: src/pages/PluginsOverlay.tsx:643 +#: src/pages/PluginsOverlay.tsx:645 msgid "Not in the plugin catalog" msgstr "" @@ -2071,7 +2107,7 @@ msgstr "" msgid "Not linked — text the deployment's number once to link your phone to your agent." msgstr "" -#: src/pages/Shell.tsx:6262 +#: src/components/conversation/MessageView.tsx:808 msgid "Not now" msgstr "나중에" @@ -2113,15 +2149,15 @@ msgstr "매월 1일 {0}에" msgid "Open" msgstr "열기" -#: src/pages/Shell.tsx:2926 +#: src/pages/Shell.tsx:2920 msgid "Open computer" msgstr "컴퓨터 열기" -#: src/pages/Shell.tsx:2892 +#: src/pages/Shell.tsx:2886 msgid "Open in full window" msgstr "전체 창으로 열기" -#: src/pages/Shell.tsx:2680 +#: src/pages/Shell.tsx:2669 msgid "Open navigation" msgstr "메뉴 열기" @@ -2142,24 +2178,24 @@ msgid "Open work" msgstr "진행 중인 작업" #: src/pages/ModelSettingsOverlay.tsx:405 -#: src/pages/Onboarding.tsx:315 +#: src/pages/Onboarding.tsx:329 msgid "OpenAI-compatible server URL" msgstr "OpenAI 호환 서버 주소" -#: src/pages/Shell.tsx:4905 +#: src/components/conversation/MessageView.tsx:325 msgid "Opened its thread." msgstr "대화가 만들어졌습니다." -#: src/App.tsx:166 +#: src/App.tsx:170 msgid "Opening your workspace…" msgstr "작업공간을 여는 중…" #: src/pages/ModelSettingsOverlay.tsx:636 -#: src/pages/Onboarding.tsx:502 +#: src/pages/Onboarding.tsx:516 msgid "Optional" msgstr "선택 사항" -#: src/pages/AccountSettingsOverlay.tsx:250 +#: src/pages/AccountSettingsOverlay.tsx:183 msgid "Optional controls most people never need" msgstr "필요할 때만 쓰는 세부 설정" @@ -2171,7 +2207,7 @@ msgstr "선택 사항인 헤더 값" msgid "Or connect an API key" msgstr "또는 API 키 연결" -#: src/pages/Onboarding.tsx:510 +#: src/pages/Onboarding.tsx:524 msgid "Or paste an API key" msgstr "또는 API 키 붙여넣기" @@ -2180,16 +2216,12 @@ msgstr "또는 API 키 붙여넣기" msgid "Or send this code to {0}:" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:191 -msgid "Organic" -msgstr "" - #: src/pages/memory-providers/SupermemorySettingsForm.tsx:60 msgid "Organization API key" msgstr "조직 API 키" #: src/pages/ModelSettingsOverlay.tsx:454 -#: src/pages/Onboarding.tsx:357 +#: src/pages/Onboarding.tsx:371 msgid "Other model…" msgstr "다른 모델 직접 입력…" @@ -2211,21 +2243,26 @@ msgstr "" msgid "Park" msgstr "보류" -#: src/pages/Auth.tsx:77 -#: src/pages/Auth.tsx:86 +#: src/pages/Auth.tsx:91 +#: src/pages/Auth.tsx:110 +#: src/pages/ResetPassword.tsx:174 msgid "Password" msgstr "비밀번호" -#: src/pages/VoiceSettingsOverlay.tsx:242 +#: src/pages/ResetPassword.tsx:147 +msgid "Password updated" +msgstr "" + +#: src/pages/VoiceSettingsOverlay.tsx:247 msgid "Paste a replacement key" msgstr "새 API 키를 붙여넣으세요" #: src/pages/ModelSettingsOverlay.tsx:416 -#: src/pages/Onboarding.tsx:326 +#: src/pages/Onboarding.tsx:340 msgid "Paste the OpenAI-compatible address from your server. Sentra Bot adds /v1 if needed." msgstr "서버의 OpenAI 호환 주소를 붙여넣으세요. 필요하면 Sentra Bot가 /v1을 추가합니다." -#: src/pages/VoiceSettingsOverlay.tsx:242 +#: src/pages/VoiceSettingsOverlay.tsx:247 msgid "Paste your API key" msgstr "API 키를 붙여넣으세요" @@ -2233,21 +2270,21 @@ msgstr "API 키를 붙여넣으세요" msgid "Paused" msgstr "" -#: src/pages/PluginsOverlay.tsx:567 +#: src/pages/PluginsOverlay.tsx:568 msgid "Payments" msgstr "" #: src/pages/ModelSettingsOverlay.tsx:518 -#: src/pages/VoiceSettingsOverlay.tsx:219 +#: src/pages/VoiceSettingsOverlay.tsx:224 msgid "Personal credential" msgstr "내 인증 정보" -#: src/pages/AccountSettingsOverlay.tsx:137 +#: src/pages/AccountSettingsOverlay.tsx:116 #: src/pages/PhoneSettingsOverlay.tsx:116 msgid "Phone" msgstr "" -#: src/pages/VoiceSettingsOverlay.tsx:155 +#: src/pages/VoiceSettingsOverlay.tsx:160 msgid "Pick a voice" msgstr "목소리 선택" @@ -2255,11 +2292,11 @@ msgstr "목소리 선택" msgid "Pin" msgstr "고정" -#: src/pages/VoiceSettingsOverlay.tsx:284 +#: src/pages/VoiceSettingsOverlay.tsx:289 msgid "Playing…" msgstr "재생 중…" -#: src/pages/PluginsOverlay.tsx:615 +#: src/pages/PluginsOverlay.tsx:616 msgid "Popular" msgstr "" @@ -2272,11 +2309,11 @@ msgstr "" msgid "Preview {0}" msgstr "{0} 미리보기" -#: src/pages/Shell.tsx:5093 +#: src/pages/Shell.tsx:4008 msgid "Private" msgstr "Bot 전용" -#: src/pages/PluginsOverlay.tsx:563 +#: src/pages/PluginsOverlay.tsx:564 msgid "Productivity" msgstr "" @@ -2285,7 +2322,7 @@ msgid "Provider" msgstr "서비스" #: src/pages/ModelSettingsOverlay.tsx:341 -#: src/pages/VoiceSettingsOverlay.tsx:168 +#: src/pages/VoiceSettingsOverlay.tsx:173 msgid "Providers" msgstr "서비스" @@ -2293,7 +2330,7 @@ msgstr "서비스" msgid "Queued" msgstr "대기 중" -#: src/pages/Shell.tsx:5434 +#: src/pages/Shell.tsx:4349 msgid "Read replies aloud" msgstr "답변을 자동으로 읽기" @@ -2305,7 +2342,7 @@ msgstr "최근" msgid "Reconnect OAuth" msgstr "OAuth 다시 연결" -#: src/App.tsx:123 +#: src/App.tsx:127 msgid "Reconnecting" msgstr "다시 연결 중" @@ -2327,27 +2364,27 @@ msgstr "" msgid "Recovering…" msgstr "" -#: src/pages/Shell.tsx:4581 +#: src/pages/Shell.tsx:3967 msgid "Release" msgstr "제어권 돌려주기" #: src/components/ApprovalRulesSettings.tsx:178 -#: src/pages/PluginsOverlay.tsx:455 -#: src/pages/PluginsOverlay.tsx:508 -#: src/pages/PluginsOverlay.tsx:547 -#: src/pages/PluginsOverlay.tsx:666 -#: src/pages/PluginsOverlay.tsx:905 +#: src/pages/PluginsOverlay.tsx:456 +#: src/pages/PluginsOverlay.tsx:509 +#: src/pages/PluginsOverlay.tsx:548 +#: src/pages/PluginsOverlay.tsx:668 +#: src/pages/PluginsOverlay.tsx:907 #: src/pages/ScratchpadSection.tsx:162 msgid "Remove" msgstr "삭제" #. placeholder {0}: attachment.file.name -#: src/pages/Shell.tsx:4204 +#: src/components/composer/Composer.tsx:344 msgid "Remove {0}" msgstr "{0} 삭제" #. placeholder {0}: mention.name -#: src/pages/Shell.tsx:4362 +#: src/components/composer/Composer.tsx:502 msgid "Remove mention {0}" msgstr "{0} 멘션 삭제" @@ -2356,7 +2393,7 @@ msgid "Remove schedule" msgstr "" #. placeholder {0}: selectedSkill.name -#: src/pages/Shell.tsx:4341 +#: src/components/composer/Composer.tsx:481 msgid "Remove skill {0}" msgstr "작업 기술 {0} 삭제" @@ -2368,7 +2405,7 @@ msgstr "이 일정 삭제" msgid "Remove webhook" msgstr "" -#: src/pages/Shell.tsx:4904 +#: src/components/conversation/MessageView.tsx:324 msgid "Removed with chat, computer, and memory." msgstr "대화, 컴퓨터, 기억과 함께 삭제되었습니다." @@ -2376,10 +2413,10 @@ msgstr "대화, 컴퓨터, 기억과 함께 삭제되었습니다." msgid "Removed, but list refresh failed" msgstr "삭제했지만 목록을 새로고침하지 못했습니다." -#: src/pages/PluginsOverlay.tsx:450 -#: src/pages/PluginsOverlay.tsx:547 -#: src/pages/PluginsOverlay.tsx:661 -#: src/pages/PluginsOverlay.tsx:905 +#: src/pages/PluginsOverlay.tsx:451 +#: src/pages/PluginsOverlay.tsx:548 +#: src/pages/PluginsOverlay.tsx:663 +#: src/pages/PluginsOverlay.tsx:907 msgid "Removing…" msgstr "삭제 중…" @@ -2393,15 +2430,15 @@ msgstr "다시 열기" msgid "Replace API key" msgstr "API 키 교체" -#: src/pages/VoiceSettingsOverlay.tsx:255 +#: src/pages/VoiceSettingsOverlay.tsx:260 msgid "Replace key" msgstr "키 교체" -#: src/pages/Shell.tsx:4527 +#: src/pages/Shell.tsx:3913 msgid "Reply" msgstr "답장" -#: src/pages/Shell.tsx:4167 +#: src/components/composer/Composer.tsx:307 msgid "Replying to {replyName}" msgstr "{replyName}에게 답장" @@ -2417,13 +2454,21 @@ msgstr "" msgid "Reset computer?" msgstr "" +#: src/pages/ResetPassword.tsx:78 +msgid "Reset links work once and for one hour. Enter your email to get a new one." +msgstr "" + +#: src/pages/ResetPassword.tsx:70 +msgid "Reset your password" +msgstr "" + #: src/components/ComputerMaintenanceActions.tsx:68 #: src/components/ComputerMaintenanceActions.tsx:115 msgid "Resetting…" msgstr "" -#: src/pages/Shell.tsx:2514 -#: src/pages/Shell.tsx:2544 +#: src/pages/Shell.tsx:2503 +#: src/pages/Shell.tsx:2533 msgid "Restore" msgstr "복원" @@ -2431,7 +2476,7 @@ msgstr "복원" msgid "Restore the last saved workspace. Unsaved work on the computer is lost." msgstr "" -#: src/App.tsx:135 +#: src/App.tsx:139 msgid "Retry now" msgstr "지금 다시 시도" @@ -2439,7 +2484,7 @@ msgstr "지금 다시 시도" msgid "Return to Sentra Bot" msgstr "Sentra Bot로 돌아가기" -#: src/pages/PluginsOverlay.tsx:716 +#: src/pages/PluginsOverlay.tsx:718 msgid "Reusable SKILL.md playbooks your agents follow. Install one and invoke it with /Name in the composer." msgstr "" @@ -2447,17 +2492,13 @@ msgstr "" msgid "Revoke" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:189 -msgid "Robot" -msgstr "" - #: src/pages/RoutineEditor.tsx:571 msgid "Rotate key" msgstr "" #: src/pages/RoutineEditor.tsx:247 -#: src/pages/Shell.tsx:3169 -#: src/pages/Shell.tsx:3179 +#: src/pages/Shell.tsx:3163 +#: src/pages/Shell.tsx:3173 msgid "Routine" msgstr "자동 실행" @@ -2474,7 +2515,7 @@ msgstr "" msgid "Run history" msgstr "" -#: src/pages/Shell.tsx:3162 +#: src/pages/Shell.tsx:3156 msgid "Run time must be in the future." msgstr "" @@ -2495,7 +2536,7 @@ msgstr "실행 중…" #: src/pages/GroupPanel.tsx:224 #: src/pages/ModelSettingsOverlay.tsx:675 #: src/pages/RoutineEditor.tsx:479 -#: src/pages/Shell.tsx:5489 +#: src/pages/Shell.tsx:4404 msgid "Save" msgstr "저장" @@ -2537,12 +2578,12 @@ msgid "Say yes or no, or answer in a sentence." msgstr "예 또는 아니요로 답하거나 문장으로 답해 주세요." #: src/pages/ModelSettingsOverlay.tsx:939 -#: src/pages/Shell.tsx:2268 +#: src/pages/Shell.tsx:2257 msgid "Search" msgstr "검색" -#: src/pages/PluginsOverlay.tsx:598 #: src/pages/PluginsOverlay.tsx:599 +#: src/pages/PluginsOverlay.tsx:600 msgid "Search apps" msgstr "앱 검색" @@ -2555,8 +2596,8 @@ msgstr "모델 검색" msgid "Search providers" msgstr "AI 서비스 검색" -#: src/pages/Onboarding.tsx:274 -#: src/pages/Onboarding.tsx:275 +#: src/pages/Onboarding.tsx:288 +#: src/pages/Onboarding.tsx:289 msgid "Search providers and models" msgstr "AI 서비스 또는 모델 검색" @@ -2564,11 +2605,11 @@ msgstr "AI 서비스 또는 모델 검색" msgid "Searching…" msgstr "검색 중…" -#: src/pages/Shell.tsx:2709 +#: src/pages/Shell.tsx:2698 msgid "Select a bot" msgstr "대화할 Bot을 선택하세요" -#: src/pages/Shell.tsx:4423 +#: src/components/composer/Composer.tsx:563 msgid "Send" msgstr "보내기" @@ -2580,6 +2621,10 @@ msgstr "답변 보내기" msgid "Send it" msgstr "보내기" +#: src/pages/ResetPassword.tsx:103 +msgid "Send reset link" +msgstr "" + #: src/components/AskCard.tsx:97 #: src/components/AskCard.tsx:126 #: src/components/AskCard.tsx:150 @@ -2587,7 +2632,7 @@ msgstr "보내기" msgid "Sending…" msgstr "보내는 중…" -#: src/pages/PluginsOverlay.tsx:839 +#: src/pages/PluginsOverlay.tsx:841 msgid "Sentra Bot verifies the source before saving it. Credentials are encrypted and are never returned to clients or exposed to the model." msgstr "Sentra Bot는 저장하기 전에 연결 상태를 확인합니다. 인증 정보는 암호화되며 앱이나 AI 모델에 노출되지 않습니다." @@ -2601,55 +2646,57 @@ msgstr "서버 이름" #: src/pages/McpServersOverlay.tsx:317 #: src/pages/ModelSettingsOverlay.tsx:401 -#: src/pages/Onboarding.tsx:311 +#: src/pages/Onboarding.tsx:325 msgid "Server URL" msgstr "서버 URL" -#: src/pages/Shell.tsx:2718 +#: src/pages/Shell.tsx:2712 msgid "Set up voice to call" msgstr "통화하려면 음성을 먼저 설정하세요" -#: src/pages/AccountSettingsOverlay.tsx:113 -#: src/pages/Shell.tsx:2578 -#: src/pages/Shell.tsx:2588 -#: src/pages/Shell.tsx:2859 +#: src/pages/AccountSettingsOverlay.tsx:92 +#: src/pages/Shell.tsx:2567 +#: src/pages/Shell.tsx:2577 +#: src/pages/Shell.tsx:2853 msgid "Settings" msgstr "설정" -#: src/pages/Shell.tsx:4441 +#: src/components/composer/Composer.tsx:581 msgid "Settings: General" msgstr "설정: 일반" -#: src/pages/Shell.tsx:4443 +#: src/components/composer/Composer.tsx:583 msgid "Settings: Usage" msgstr "설정: 사용량" #: src/pages/ModelSettingsOverlay.tsx:413 -#: src/pages/Onboarding.tsx:323 +#: src/pages/Onboarding.tsx:337 msgid "Setup help" msgstr "설정 도움말" #: src/pages/MemorySettingsOverlay.tsx:39 -#: src/pages/Shell.tsx:5408 +#: src/pages/Shell.tsx:4323 msgid "Shared" msgstr "함께 사용" -#: src/pages/Shell.tsx:2870 +#: src/pages/Shell.tsx:2864 msgid "Show computer" msgstr "컴퓨터 보기" -#: src/pages/Auth.tsx:95 +#: src/pages/Auth.tsx:122 +#: src/pages/ResetPassword.tsx:186 msgid "Show password" msgstr "" -#: src/pages/Shell.tsx:2870 +#: src/pages/Shell.tsx:2864 msgid "Show settings" msgstr "설정 보기" #: src/lib/localized-provider-hint.ts:7 -#: src/pages/Auth.tsx:161 +#: src/pages/Auth.tsx:171 #: src/pages/ModelSettingsOverlay.tsx:618 -#: src/pages/Onboarding.tsx:151 +#: src/pages/Onboarding.tsx:165 +#: src/pages/ResetPassword.tsx:155 msgid "Sign in" msgstr "로그인" @@ -2657,28 +2704,32 @@ msgstr "로그인" msgid "Sign in  →" msgstr "로그인  →" -#: src/pages/Auth.tsx:17 +#: src/pages/Auth.tsx:142 +msgid "Sign in instead" +msgstr "" + +#: src/pages/Auth.tsx:29 msgid "Sign in to Sentra Bot" msgstr "Sentra Bot 로그인" -#: src/pages/Auth.tsx:154 +#: src/pages/Auth.tsx:164 msgid "Sign up" msgstr "가입하기" #. placeholder {0}: skill.name -#: src/pages/Shell.tsx:4251 +#: src/components/composer/Composer.tsx:391 msgid "Skill {0}" msgstr "작업 기술 {0}" -#: src/pages/PluginsOverlay.tsx:713 +#: src/pages/PluginsOverlay.tsx:715 msgid "Skills" msgstr "" -#: src/pages/Shell.tsx:4588 +#: src/pages/Shell.tsx:3974 msgid "Skip" msgstr "건너뛰기" -#: src/pages/Onboarding.tsx:548 +#: src/pages/Onboarding.tsx:562 msgid "Skip for now" msgstr "지금은 건너뛰기" @@ -2687,7 +2738,7 @@ msgid "Skip or deploy key" msgstr "건너뛰거나 배포 키" #. placeholder {0}: skipped.join(", ") -#: src/pages/Shell.tsx:1763 +#: src/pages/Shell.tsx:1746 msgid "Skipped {0}" msgstr "{0} 건너뜀" @@ -2704,21 +2755,21 @@ msgstr "" msgid "Space interrupts · Esc hangs up" msgstr "Space: 끼어들기 · Esc: 통화 종료" -#: src/pages/Shell.tsx:4739 -#: src/pages/Shell.tsx:5002 +#: src/components/conversation/MessageView.tsx:159 +#: src/components/conversation/MessageView.tsx:422 msgid "Speak" msgstr "읽기" -#: src/pages/VoiceSettingsOverlay.tsx:194 +#: src/pages/VoiceSettingsOverlay.tsx:199 msgid "Speak + transcribe" msgstr "음성 출력·받아쓰기" -#: src/pages/VoiceSettingsOverlay.tsx:196 +#: src/pages/VoiceSettingsOverlay.tsx:201 msgid "Speak only" msgstr "음성 출력만" -#: src/pages/Shell.tsx:4735 -#: src/pages/Shell.tsx:4998 +#: src/components/conversation/MessageView.tsx:155 +#: src/components/conversation/MessageView.tsx:418 msgid "Speak this reply" msgstr "이 답변 읽기" @@ -2726,11 +2777,11 @@ msgstr "이 답변 읽기" msgid "Speaking…" msgstr "말하는 중…" -#: src/pages/Onboarding.tsx:560 +#: src/pages/Onboarding.tsx:574 msgid "Start from a proven Chief of Staff, or build your own from scratch." msgstr "" -#: src/pages/Onboarding.tsx:644 +#: src/pages/Onboarding.tsx:658 msgid "Start from scratch" msgstr "" @@ -2744,7 +2795,7 @@ msgstr "시작 중" #: src/components/teach/TeachComputerSection.tsx:115 #: src/pages/ModelSettingsOverlay.tsx:616 -#: src/pages/Onboarding.tsx:487 +#: src/pages/Onboarding.tsx:501 msgid "Starting…" msgstr "시작하는 중…" @@ -2752,20 +2803,20 @@ msgstr "시작하는 중…" msgid "Steps" msgstr "실행 단계" -#: src/pages/Shell.tsx:3568 -#: src/pages/Shell.tsx:3572 -#: src/pages/Shell.tsx:4414 -#: src/pages/Shell.tsx:4739 -#: src/pages/Shell.tsx:5002 +#: src/components/composer/Composer.tsx:554 +#: src/components/conversation/MessageView.tsx:159 +#: src/components/conversation/MessageView.tsx:422 +#: src/pages/Shell.tsx:3557 +#: src/pages/Shell.tsx:3561 msgid "Stop" msgstr "중지" -#: src/pages/Shell.tsx:4306 +#: src/components/composer/Composer.tsx:446 msgid "Stop dictation" msgstr "음성 입력 중지" -#: src/pages/Shell.tsx:4735 -#: src/pages/Shell.tsx:4998 +#: src/components/conversation/MessageView.tsx:155 +#: src/components/conversation/MessageView.tsx:418 msgid "Stop speaking" msgstr "읽기 중지" @@ -2774,8 +2825,8 @@ msgstr "읽기 중지" msgid "Stop teaching" msgstr "가르치기 종료" -#: src/pages/Shell.tsx:2953 -#: src/pages/Shell.tsx:3588 +#: src/pages/Shell.tsx:2947 +#: src/pages/Shell.tsx:3577 msgid "Stop the bot first" msgstr "먼저 Bot을 중지하세요" @@ -2788,13 +2839,13 @@ msgstr "" msgid "Stored encrypted" msgstr "암호화해 저장" -#: src/pages/Shell.tsx:4856 +#: src/components/conversation/MessageView.tsx:276 msgid "subagent" msgstr "보조 에이전트" #: src/components/AskCard.tsx:126 #: src/pages/ModelSettingsOverlay.tsx:576 -#: src/pages/Onboarding.tsx:449 +#: src/pages/Onboarding.tsx:463 msgid "Submit" msgstr "확인" @@ -2806,8 +2857,8 @@ msgstr "" msgid "Switching…" msgstr "전환 중…" -#: src/pages/Shell.tsx:2956 -#: src/pages/Shell.tsx:3593 +#: src/pages/Shell.tsx:2950 +#: src/pages/Shell.tsx:3582 msgid "Take control" msgstr "직접 조작" @@ -2815,7 +2866,7 @@ msgstr "직접 조작" msgid "Teach a task" msgstr "작업 가르치기" -#: src/pages/Shell.tsx:2783 +#: src/pages/Shell.tsx:2777 msgid "Teaching in progress — stop teaching before sending a new message." msgstr "작업을 가르치는 중입니다. 새 메시지를 보내려면 먼저 가르치기를 종료하세요." @@ -2823,11 +2874,11 @@ msgstr "작업을 가르치는 중입니다. 새 메시지를 보내려면 먼 msgid "Teaching needs a graphical sandbox computer. Desktop-host bots can run shell tasks, but not screen recording." msgstr "작업을 가르치려면 화면이 있는 샌드박스 컴퓨터가 필요합니다. 내 컴퓨터에서 실행되는 Bot은 터미널 작업은 가능하지만 화면 녹화는 할 수 없습니다." -#: src/pages/Shell.tsx:5093 +#: src/pages/Shell.tsx:4008 msgid "Team" msgstr "팀 공용" -#: src/pages/Shell.tsx:5943 +#: src/pages/Shell.tsx:4858 msgid "Team Computer" msgstr "팀 컴퓨터" @@ -2852,20 +2903,20 @@ msgstr "" msgid "The selected memory provider is not available in this build." msgstr "선택한 기억 서비스는 현재 빌드에서 사용할 수 없습니다." -#: src/pages/Shell.tsx:5385 +#: src/pages/Shell.tsx:4300 msgid "Thinking" msgstr "생각 깊이" -#: src/pages/Shell.tsx:2896 +#: src/pages/Shell.tsx:2890 msgid "This bot runs on this computer, not a Linux desktop. Shell and files use your home folder." msgstr "이 Bot은 별도 Linux 화면이 아니라 현재 컴퓨터에서 실행됩니다. 터미널과 파일 작업은 홈 폴더를 사용합니다." -#: src/pages/Shell.tsx:3617 +#: src/pages/Shell.tsx:3606 msgid "This bot runs on this computer. There is no separate Linux desktop. Ask it to use the shell; working directories under your home folder are allowed." msgstr "이 Bot은 현재 컴퓨터에서 실행되며 별도 Linux 화면은 없습니다. 터미널을 사용하도록 요청할 수 있고 홈 폴더 아래에서 작업합니다." -#: src/pages/Shell.tsx:5785 -#: src/pages/Shell.tsx:5864 +#: src/pages/Shell.tsx:4700 +#: src/pages/Shell.tsx:4779 msgid "This cannot be undone." msgstr "이 작업은 되돌릴 수 없습니다." @@ -2881,6 +2932,10 @@ msgstr "이 컴퓨터에서는 홈 폴더의 파일을 포함해 내 계정 권 msgid "This file is not valid UTF-8 Markdown." msgstr "이 파일은 올바른 UTF-8 Markdown 형식이 아닙니다." +#: src/pages/ResetPassword.tsx:70 +msgid "This link has expired" +msgstr "" + #: src/pages/HostComputerPrompt.tsx:14 msgid "this Mac" msgstr "이 Mac" @@ -2889,15 +2944,15 @@ msgstr "이 Mac" msgid "This Mac runs shell commands with your account, including files in your home folder. Do not turn it on for a shared or public server." msgstr "이 Mac에서는 홈 폴더의 파일을 포함해 내 계정 권한으로 터미널 명령을 실행합니다. 여러 사람이 쓰거나 공개된 서버에서는 사용하지 마세요." -#: src/pages/Shell.tsx:5670 +#: src/pages/Shell.tsx:4585 msgid "This permanently removes every message and stops current work. The chat remains available." msgstr "" -#: src/pages/Onboarding.tsx:523 +#: src/pages/Onboarding.tsx:537 msgid "This provider cannot paste a key here. Skip if this deployment already has credentials." msgstr "이 서비스는 여기에서 API 키를 입력할 수 없습니다. 서버에 이미 인증 정보가 있다면 건너뛰세요." -#: src/pages/Shell.tsx:6210 +#: src/components/conversation/MessageView.tsx:756 msgid "This server cannot be assigned without a bot." msgstr "연결할 Bot이 없어 이 서버를 배정할 수 없습니다." @@ -2909,7 +2964,7 @@ msgstr "이 서버는 브라우저 인증을 요청하지 않았습니다." msgid "This server is already connected. Disconnect it first to authorize again." msgstr "이 서버는 이미 연결되어 있습니다. 다시 인증하려면 먼저 연결을 해제하세요." -#: src/pages/Shell.tsx:6249 +#: src/components/conversation/MessageView.tsx:795 msgid "This server uses browser sign-in. Authorize it to let your agents use its tools — a popup will open." msgstr "이 서버는 브라우저 로그인이 필요합니다. 인증을 누르면 새 창이 열리고, 완료 후 Bot이 도구를 사용할 수 있습니다." @@ -2921,17 +2976,17 @@ msgstr "이 구독 로그인 방식은 아직 Sentra Bot에서 지원되지 않 msgid "Time of day" msgstr "실행 시각" -#: src/pages/Onboarding.tsx:672 -#: src/pages/Shell.tsx:5160 -#: src/pages/Shell.tsx:5326 +#: src/pages/Onboarding.tsx:686 +#: src/pages/Shell.tsx:4075 +#: src/pages/Shell.tsx:4241 msgid "Title" msgstr "역할" -#: src/pages/PluginsOverlay.tsx:872 +#: src/pages/PluginsOverlay.tsx:874 msgid "Tool sources" msgstr "도구 소스" -#: src/pages/PluginsOverlay.tsx:834 +#: src/pages/PluginsOverlay.tsx:836 msgid "Treg token" msgstr "Treg 토큰" @@ -2952,7 +3007,7 @@ msgid "Unpin" msgstr "고정 해제" #. placeholder {0}: pending.file.name -#: src/pages/Shell.tsx:1834 +#: src/pages/Shell.tsx:1821 msgid "Unsupported file type: {0}" msgstr "지원하지 않는 파일 형식: {0}" @@ -2981,6 +3036,10 @@ msgstr "" msgid "Update finished with errors" msgstr "" +#: src/pages/ResetPassword.tsx:206 +msgid "Update password" +msgstr "" + #: src/components/SoftwareUpdateSection.tsx:172 #: src/components/SoftwareUpdateSection.tsx:189 msgid "Updated" @@ -2991,8 +3050,8 @@ msgstr "" msgid "Updating…" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:212 -#: src/pages/Shell.tsx:2639 +#: src/pages/AccountSettingsOverlay.tsx:145 +#: src/pages/Shell.tsx:2628 msgid "Usage" msgstr "사용량" @@ -3001,7 +3060,7 @@ msgid "Use {hostLabel}" msgstr "{hostLabel} 사용" #: src/pages/ModelSettingsOverlay.tsx:485 -#: src/pages/Onboarding.tsx:382 +#: src/pages/Onboarding.tsx:396 msgid "Use a found model" msgstr "찾은 모델 중에서 선택" @@ -3009,25 +3068,25 @@ msgstr "찾은 모델 중에서 선택" msgid "Use this model" msgstr "이 모델 사용" -#: src/pages/PluginsOverlay.tsx:855 +#: src/pages/PluginsOverlay.tsx:857 msgid "Verify and add" msgstr "확인 후 추가" -#: src/pages/PluginsOverlay.tsx:853 +#: src/pages/PluginsOverlay.tsx:855 msgid "Verifying…" msgstr "확인 중…" -#: src/pages/Shell.tsx:2627 -#: src/pages/Shell.tsx:5438 -#: src/pages/VoiceSettingsOverlay.tsx:124 -#: src/pages/VoiceSettingsOverlay.tsx:264 +#: src/pages/Shell.tsx:2616 +#: src/pages/Shell.tsx:4353 +#: src/pages/VoiceSettingsOverlay.tsx:129 +#: src/pages/VoiceSettingsOverlay.tsx:269 msgid "Voice" msgstr "음성" #: src/pages/ModelSettingsOverlay.tsx:580 #: src/pages/ModelSettingsOverlay.tsx:602 -#: src/pages/Onboarding.tsx:453 -#: src/pages/Onboarding.tsx:475 +#: src/pages/Onboarding.tsx:467 +#: src/pages/Onboarding.tsx:489 msgid "Waiting for sign-in…" msgstr "로그인 완료를 기다리는 중…" @@ -3039,7 +3098,7 @@ msgstr "" msgid "Waiting for your message…" msgstr "" -#: src/pages/Shell.tsx:6093 +#: src/components/conversation/MessageView.tsx:639 msgid "Waiting…" msgstr "기다리는 중…" @@ -3053,7 +3112,7 @@ msgstr "" msgid "Weekdays" msgstr "주중" -#: src/pages/Shell.tsx:5755 +#: src/pages/Shell.tsx:4670 msgid "What about its memories?" msgstr "이 Bot의 기억은 어떻게 할까요?" @@ -3065,8 +3124,8 @@ msgstr "어떤 작업을 직접 보여줄까요?" msgid "What should this routine do each time it runs?" msgstr "" -#: src/pages/Onboarding.tsx:685 -#: src/pages/Shell.tsx:5175 +#: src/pages/Onboarding.tsx:699 +#: src/pages/Shell.tsx:4090 msgid "What this bot is for" msgstr "이 Bot을 언제, 어떤 일에 사용할지 적어주세요" @@ -3099,17 +3158,19 @@ msgstr "언제 사용할지" msgid "Where should bots run?" msgstr "Bot을 어디에서 실행할까요?" -#: src/pages/Auth.tsx:142 +#: src/pages/Auth.tsx:152 #: src/pages/CallView.tsx:242 +#: src/pages/ResetPassword.tsx:103 +#: src/pages/ResetPassword.tsx:206 msgid "Working…" msgstr "처리 중…" -#: src/pages/Shell.tsx:5368 +#: src/pages/Shell.tsx:4283 msgid "Workspace default" msgstr "작업공간 기본값" -#: src/pages/Shell.tsx:1558 -#: src/pages/Shell.tsx:2175 +#: src/pages/Shell.tsx:1541 +#: src/pages/Shell.tsx:2164 msgid "You" msgstr "나" @@ -3121,16 +3182,21 @@ msgstr "자동으로 이동하지 않으면 이 탭을 닫아도 됩니다." msgid "You can close this window." msgstr "이 창을 닫아도 됩니다." -#: src/pages/Shell.tsx:2933 -#: src/pages/Shell.tsx:3558 +#: src/pages/Shell.tsx:2927 +#: src/pages/Shell.tsx:3547 msgid "You have control" msgstr "직접 조작 중" -#: src/pages/Onboarding.tsx:660 +#: src/pages/ResetPassword.tsx:152 +msgid "You’ve been signed out everywhere. Sign in with your new password." +msgstr "" + +#: src/pages/Onboarding.tsx:674 msgid "Your bot" msgstr "" -#: src/pages/Auth.tsx:69 +#: src/pages/Auth.tsx:80 +#: src/pages/ResetPassword.tsx:89 msgid "Your email address" msgstr "이메일 주소" @@ -3138,7 +3204,7 @@ msgstr "이메일 주소" msgid "Your key or subscription token is stored securely and is never shown here." msgstr "API 키 또는 구독 토큰은 서버에 안전하게 저장되며 이 화면에 다시 표시되지 않습니다." -#: src/pages/Auth.tsx:56 +#: src/pages/Auth.tsx:67 msgid "Your name" msgstr "이름" diff --git a/apps/web/src/locales/pt-BR/messages.po b/apps/web/src/locales/pt-BR/messages.po index 4b2b945f..ba8c0d55 100644 --- a/apps/web/src/locales/pt-BR/messages.po +++ b/apps/web/src/locales/pt-BR/messages.po @@ -13,7 +13,7 @@ msgstr "" "Language-Team: \n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: src/pages/Shell.tsx:2423 +#: src/pages/Shell.tsx:2412 msgid " (unread)" msgstr " (não lido)" @@ -31,12 +31,12 @@ msgid "{0, plural, one {# model} other {# models}}" msgstr "{0, plural, one {# modelo} other {# modelos}}" #. placeholder {0}: file.name -#: src/pages/Shell.tsx:1743 +#: src/pages/Shell.tsx:1726 msgid "{0} (max {ATTACHMENT_MAX_COUNT} attachments)" msgstr "{0} (máx. anexos {ATTACHMENT_MAX_COUNT})" #. placeholder {0}: file.name -#: src/pages/Shell.tsx:1747 +#: src/pages/Shell.tsx:1730 msgid "{0} (over 10 MiB)" msgstr "{0} (acima de 10 MiB)" @@ -46,12 +46,12 @@ msgid "{0} {unitLabel}" msgstr "{0} {unitLabel}" #. placeholder {0}: block.name -#: src/pages/Shell.tsx:6066 +#: src/components/conversation/MessageView.tsx:612 msgid "{0} connection" msgstr "Conexão {0}" #. placeholder {0}: computer.busyBotName -#: src/pages/Shell.tsx:2937 +#: src/pages/Shell.tsx:2931 msgid "{0} is using it" msgstr "{0} está usando" @@ -67,8 +67,8 @@ msgstr "{0} MB" #. placeholder {0}: usage.runs #. placeholder {1}: usage.inputTokens + usage.outputTokens -#: src/pages/AccountSettingsOverlay.tsx:216 -#: src/pages/Shell.tsx:2644 +#: src/pages/AccountSettingsOverlay.tsx:149 +#: src/pages/Shell.tsx:2633 msgid "{0} runs · {1} tokens" msgstr "{0} execuções · {1} tokens" @@ -81,7 +81,7 @@ msgstr "{botName} · {0, plural, one {# par} other {# pares}}" msgid "{botName} has not messaged another bot yet." msgstr "O {botName} ainda não enviou mensagens para outro bot." -#: src/pages/Shell.tsx:5943 +#: src/pages/Shell.tsx:4858 msgid "{botName}’s computer" msgstr "Computador do {botName}" @@ -125,12 +125,12 @@ msgstr "{size} B" msgid "{title}, {label}" msgstr "{title}, {label}" -#: src/pages/Shell.tsx:3723 +#: src/pages/Shell.tsx:3712 msgid "{workingBotName} is working" msgstr "{workingBotName} está trabalhando" #. placeholder {0}: mention.name -#: src/pages/Shell.tsx:4223 +#: src/components/composer/Composer.tsx:363 msgid "@{0}" msgstr "@{0}" @@ -146,11 +146,11 @@ msgstr "+ Ensinar uma tarefa" msgid "Access token (optional)" msgstr "Token de acesso (opcional)" -#: src/pages/AccountSettingsOverlay.tsx:128 +#: src/pages/AccountSettingsOverlay.tsx:107 msgid "Account" msgstr "Conta" -#: src/pages/Shell.tsx:5444 +#: src/pages/Shell.tsx:4359 msgid "Account default" msgstr "Padrão da conta" @@ -171,17 +171,17 @@ msgstr "" msgid "Active model" msgstr "Modelo ativo" -#: src/pages/VoiceSettingsOverlay.tsx:149 +#: src/pages/VoiceSettingsOverlay.tsx:154 msgid "Active voice" msgstr "Voz ativa" -#: src/pages/Shell.tsx:2213 -#: src/pages/Shell.tsx:2215 +#: src/pages/Shell.tsx:2202 +#: src/pages/Shell.tsx:2204 msgid "Activity" msgstr "Atividade" -#: src/pages/PluginsOverlay.tsx:457 -#: src/pages/PluginsOverlay.tsx:668 +#: src/pages/PluginsOverlay.tsx:458 +#: src/pages/PluginsOverlay.tsx:670 #: src/pages/ScratchpadSection.tsx:188 msgid "Add" msgstr "Adicionar" @@ -190,7 +190,7 @@ msgstr "Adicionar" msgid "Add a model in Settings to use this." msgstr "" -#: src/pages/Shell.tsx:3157 +#: src/pages/Shell.tsx:3151 msgid "Add a run time for this one-shot." msgstr "" @@ -198,7 +198,7 @@ msgstr "" msgid "Add a schedule or webhook to run this routine." msgstr "" -#: src/pages/Shell.tsx:3129 +#: src/pages/Shell.tsx:3123 msgid "Add a schedule or webhook trigger" msgstr "" @@ -222,15 +222,15 @@ msgstr "Adicione um URL do servidor HTTPS." msgid "Add item" msgstr "Adicionar item" -#: src/pages/PluginsOverlay.tsx:762 +#: src/pages/PluginsOverlay.tsx:764 msgid "Add MCP server" msgstr "Adicionar servidor MCP" -#: src/pages/PluginsOverlay.tsx:765 +#: src/pages/PluginsOverlay.tsx:767 msgid "Add OpenAPI" msgstr "Adicionar OpenAPI" -#: src/pages/PluginsOverlay.tsx:780 +#: src/pages/PluginsOverlay.tsx:782 msgid "Add remote MCP server" msgstr "Adicionar servidor MCP remoto" @@ -243,7 +243,7 @@ msgstr "Adicionar servidor" msgid "Add to routine" msgstr "Adicionar à rotina" -#: src/pages/PluginsOverlay.tsx:768 +#: src/pages/PluginsOverlay.tsx:770 msgid "Add Treg" msgstr "Adicionar Treg" @@ -252,15 +252,15 @@ msgid "Add trigger" msgstr "" #: src/pages/McpServersOverlay.tsx:363 -#: src/pages/PluginsOverlay.tsx:452 -#: src/pages/PluginsOverlay.tsx:663 +#: src/pages/PluginsOverlay.tsx:453 +#: src/pages/PluginsOverlay.tsx:665 msgid "Adding…" msgstr "Adicionando" -#: src/pages/AccountSettingsOverlay.tsx:247 -#: src/pages/PluginsOverlay.tsx:742 +#: src/pages/AccountSettingsOverlay.tsx:180 +#: src/pages/PluginsOverlay.tsx:744 #: src/pages/RoutineSchedule.tsx:42 -#: src/pages/Shell.tsx:5347 +#: src/pages/Shell.tsx:4262 msgid "Advanced" msgstr "Avançado" @@ -272,7 +272,7 @@ msgstr "" msgid "Agent access for new servers" msgstr "Acesso de agente para novos servidores" -#: src/pages/Shell.tsx:2736 +#: src/pages/Shell.tsx:2730 msgid "Agent computer" msgstr "Computador do agente" @@ -319,7 +319,7 @@ msgstr "Permitir ações de compra sem perguntar" msgid "Allowed once" msgstr "Permitido uma vez" -#: src/pages/Auth.tsx:159 +#: src/pages/Auth.tsx:169 msgid "Already have an account?" msgstr "Você já tem cadastro?" @@ -331,6 +331,10 @@ msgstr "Permitir sempre esta ferramenta" msgid "Always allowed" msgstr "Sempre permitido" +#: src/pages/Auth.tsx:140 +msgid "An account with this email already exists." +msgstr "" + #: src/components/AskCard.tsx:138 msgid "Answer" msgstr "Respostas" @@ -352,14 +356,14 @@ msgstr "" #: src/pages/ModelSettingsOverlay.tsx:630 #: src/pages/ModelSettingsOverlay.tsx:633 #: src/pages/ModelSettingsOverlay.tsx:649 -#: src/pages/Onboarding.tsx:496 -#: src/pages/Onboarding.tsx:499 #: src/pages/Onboarding.tsx:510 -#: src/pages/VoiceSettingsOverlay.tsx:236 +#: src/pages/Onboarding.tsx:513 +#: src/pages/Onboarding.tsx:524 +#: src/pages/VoiceSettingsOverlay.tsx:241 msgid "API key" msgstr "Chave de API" -#: src/pages/PluginsOverlay.tsx:816 +#: src/pages/PluginsOverlay.tsx:818 msgid "API key header" msgstr "Cabeçalho da chave API" @@ -371,13 +375,13 @@ msgstr "Aplica-se quando você clica em Adicionar servidor. Use os chips do agen msgid "Approval boundaries" msgstr "Limites de aprovação" +#: src/components/conversation/MessageView.tsx:805 #: src/pages/PhoneSettingsOverlay.tsx:243 #: src/pages/PhoneSettingsOverlay.tsx:310 -#: src/pages/Shell.tsx:6259 msgid "Approve" msgstr "Aprovar" -#: src/pages/Shell.tsx:6250 +#: src/components/conversation/MessageView.tsx:796 msgid "Approve this server to let your agent use its tools." msgstr "Aprove este servidor para permitir que seu agente use suas ferramentas." @@ -385,15 +389,15 @@ msgstr "Aprove este servidor para permitir que seu agente use suas ferramentas." msgid "Archive" msgstr "Arquivar" -#: src/pages/Shell.tsx:4892 +#: src/components/conversation/MessageView.tsx:312 msgid "archived" msgstr "arquivado" -#: src/pages/Shell.tsx:2487 +#: src/pages/Shell.tsx:2476 msgid "Archived" msgstr "Arquivado" -#: src/pages/Shell.tsx:4903 +#: src/components/conversation/MessageView.tsx:323 msgid "Archived. Chat, memory, and files kept." msgstr "Arquivado. Chat, memória e arquivos mantidos." @@ -432,7 +436,7 @@ msgstr "Perguntar antes de comprar" msgid "Ask before sending external email" msgstr "Perguntar antes de enviar e-mail externo" -#: src/pages/Shell.tsx:2939 +#: src/pages/Shell.tsx:2933 msgid "Asleep" msgstr "Dormindo" @@ -447,16 +451,21 @@ msgstr "em {0}" msgid "at {timeSelect}" msgstr "em {timeSelect}" -#: src/pages/Shell.tsx:4297 +#: src/pages/Auth.tsx:134 +#: src/pages/ResetPassword.tsx:197 +msgid "At least 8 characters" +msgstr "" + +#: src/components/composer/Composer.tsx:437 msgid "Attach file" msgstr "Escolher arquivo" -#: src/pages/Shell.tsx:4498 +#: src/components/composer/shared.ts:21 msgid "Attachment" msgstr "Anexo" #: src/pages/ModelSettingsOverlay.tsx:563 -#: src/pages/Onboarding.tsx:437 +#: src/pages/Onboarding.tsx:451 msgid "Authorization code or callback URL" msgstr "Código de autorização ou URL de retorno de chamada" @@ -464,12 +473,12 @@ msgstr "Código de autorização ou URL de retorno de chamada" msgid "Authorization expired — reconnect required" msgstr "Autorização expirada — reconexão necessária" -#: src/pages/Shell.tsx:6051 +#: src/components/conversation/MessageView.tsx:597 msgid "Authorization timed out. Please try again." msgstr "A autorização expirou. Tente novamente." -#: src/pages/Shell.tsx:6093 -#: src/pages/Shell.tsx:6259 +#: src/components/conversation/MessageView.tsx:639 +#: src/components/conversation/MessageView.tsx:805 msgid "Authorize" msgstr "Autorizar" @@ -477,34 +486,35 @@ msgstr "Autorizar" msgid "Available after the routine is saved" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:161 -msgid "Avatars" -msgstr "" - #: src/pages/RoutineEditor.tsx:243 msgid "Back" msgstr "" +#: src/pages/ResetPassword.tsx:61 +#: src/pages/ResetPassword.tsx:107 +msgid "Back to sign in" +msgstr "" + #: src/pages/memory-providers/SupermemorySettingsForm.tsx:48 msgid "Base URL" msgstr "URL Base" -#: src/pages/PluginsOverlay.tsx:813 +#: src/pages/PluginsOverlay.tsx:815 msgid "Bearer token" msgstr "Token portador" -#: src/pages/Shell.tsx:5935 +#: src/pages/Shell.tsx:4850 msgid "Booting live desktop…" msgstr "Iniciando a área de trabalho ao vivo..." #. placeholder {0}: active?.name -#: src/pages/Shell.tsx:3528 +#: src/pages/Shell.tsx:3517 msgid "Booting up {0}’s computer" msgstr "Inicializando o computador do {0}" -#: src/pages/Shell.tsx:4752 -#: src/pages/Shell.tsx:4753 -#: src/pages/Shell.tsx:4896 +#: src/components/conversation/MessageView.tsx:172 +#: src/components/conversation/MessageView.tsx:173 +#: src/components/conversation/MessageView.tsx:316 msgid "bot" msgstr "bot" @@ -513,7 +523,7 @@ msgstr "bot" msgid "Bot" msgstr "" -#: src/pages/Shell.tsx:1559 +#: src/pages/Shell.tsx:1542 msgid "Bot" msgstr "Bot" @@ -521,11 +531,11 @@ msgstr "Bot" msgid "Bot messages" msgstr "Mensagens de bot" -#: src/pages/Shell.tsx:3625 +#: src/pages/Shell.tsx:3614 msgid "Bot screen" msgstr "Tela do bot" -#: src/pages/Shell.tsx:2903 +#: src/pages/Shell.tsx:2897 msgid "Bot screen preview" msgstr "Pré-visualização da tela" @@ -533,36 +543,36 @@ msgstr "Pré-visualização da tela" msgid "Bots act without asking by default. Add an exception only when you want to review a type of action first. These preferences apply across all your bots." msgstr "Os bots agem sem perguntar por padrão. Adicione uma exceção apenas quando quiser analisar um tipo de ação primeiro. Essas preferências se aplicam a todos os seus bots." -#: src/pages/Shell.tsx:3724 +#: src/pages/Shell.tsx:3713 msgid "Bots are working" msgstr "Bots estão trabalhando" -#: src/pages/VoiceSettingsOverlay.tsx:130 +#: src/pages/VoiceSettingsOverlay.tsx:135 msgid "Bring your own key. The provider is swappable; your bots keep the same speak and call buttons." msgstr "Traga sua própria chave. O provedor pode ser trocado; seus bots mantêm os mesmos botões de fala e chamada." #: src/pages/CallView.tsx:233 -#: src/pages/Shell.tsx:2718 -#: src/pages/Shell.tsx:2719 +#: src/pages/Shell.tsx:2712 +#: src/pages/Shell.tsx:2713 msgid "Call" msgstr "Ligar" -#: src/App.tsx:125 +#: src/App.tsx:129 msgid "Can't reach the server." msgstr "Não é possível acessar o servidor." #: src/components/AskCard.tsx:161 #: src/components/ComputerMaintenanceActions.tsx:108 #: src/components/teach/TeachComputerSection.tsx:122 -#: src/pages/PluginsOverlay.tsx:864 -#: src/pages/Shell.tsx:5611 -#: src/pages/Shell.tsx:5683 -#: src/pages/Shell.tsx:5798 -#: src/pages/Shell.tsx:5874 +#: src/pages/PluginsOverlay.tsx:866 +#: src/pages/Shell.tsx:4526 +#: src/pages/Shell.tsx:4598 +#: src/pages/Shell.tsx:4713 +#: src/pages/Shell.tsx:4789 msgid "Cancel" msgstr "Cancelar" -#: src/pages/Shell.tsx:5140 +#: src/pages/Shell.tsx:4055 msgid "Cancel new bot" msgstr "Cancelar novo bot" @@ -570,7 +580,7 @@ msgstr "Cancelar novo bot" msgid "Cancel new group" msgstr "Cancelar novo grupo" -#: src/pages/Shell.tsx:4170 +#: src/components/composer/Composer.tsx:310 msgid "Cancel reply" msgstr "cancelar resposta" @@ -582,11 +592,11 @@ msgstr "Cancelado" msgid "Channels" msgstr "" -#: src/pages/Shell.tsx:6156 +#: src/components/conversation/MessageView.tsx:702 msgid "Chart failed to render: {error}" msgstr "Falha na renderização do gráfico: {error}" -#: src/pages/Shell.tsx:4439 +#: src/components/composer/Composer.tsx:579 msgid "Chat Settings" msgstr "Configurações do chat" @@ -602,11 +612,15 @@ msgstr "" msgid "Check for updates" msgstr "" -#: src/pages/Shell.tsx:3170 -#: src/pages/Shell.tsx:3180 +#: src/pages/Shell.tsx:3164 +#: src/pages/Shell.tsx:3174 msgid "Check in." msgstr "Acompanhamento" +#: src/pages/ResetPassword.tsx:52 +msgid "Check your email" +msgstr "" + #: src/components/SoftwareUpdateSection.tsx:71 msgid "Checking…" msgstr "" @@ -615,33 +629,33 @@ msgstr "" msgid "Checkout has local changes. Clean it before updating." msgstr "" -#: src/pages/Onboarding.tsx:269 +#: src/pages/Onboarding.tsx:283 msgid "Choose a model to get started." msgstr "Escolha um modelo para começar." +#: src/pages/ResetPassword.tsx:162 +msgid "Choose a new password" +msgstr "" + #: src/pages/ModelSettingsOverlay.tsx:310 msgid "Choose which connected model Sentra Bot uses." msgstr "Escolha qual modelo conectado a Sentra Bot usa." -#: src/pages/AccountSettingsOverlay.tsx:187 -msgid "Clay" -msgstr "" - -#: src/pages/Shell.tsx:5698 +#: src/pages/Shell.tsx:4613 msgid "Clear" msgstr "Limpar" #. placeholder {0}: bot.name -#: src/pages/Shell.tsx:5664 +#: src/pages/Shell.tsx:4579 msgid "Clear {0}’s conversation?" msgstr "Limpar a conversa do {0}?" #: src/pages/BotContextMenu.tsx:103 -#: src/pages/Shell.tsx:5499 +#: src/pages/Shell.tsx:4414 msgid "Clear conversation" msgstr "Limpar conversa" -#: src/pages/Shell.tsx:5698 +#: src/pages/Shell.tsx:4613 msgid "Clearing…" msgstr "Limpeza" @@ -655,19 +669,19 @@ msgstr "Fechar" msgid "Close bot messages" msgstr "Fechar mensagens do bot" -#: src/pages/Shell.tsx:6341 +#: src/components/conversation/MessageView.tsx:887 msgid "Close chart" msgstr "Fechar gráfico" -#: src/pages/Shell.tsx:3599 +#: src/pages/Shell.tsx:3588 msgid "Close computer" msgstr "Fechar computador" -#: src/pages/Shell.tsx:6441 +#: src/components/conversation/MessageView.tsx:987 msgid "Close image preview" msgstr "Fechar visualização da imagem" -#: src/pages/PluginsOverlay.tsx:586 +#: src/pages/PluginsOverlay.tsx:587 msgid "Close integrations" msgstr "Fechar integrações" @@ -683,11 +697,11 @@ msgstr "Fechar configurações de memória" msgid "Close model settings" msgstr "Fechar configurações do modelo" -#: src/pages/Shell.tsx:2195 +#: src/pages/Shell.tsx:2184 msgid "Close navigation" msgstr "Fechar navegação" -#: src/pages/Shell.tsx:2881 +#: src/pages/Shell.tsx:2875 msgid "Close panel" msgstr "Fechar painel" @@ -700,11 +714,11 @@ msgstr "" msgid "Close preview" msgstr "Fechar pré-visualização" -#: src/pages/AccountSettingsOverlay.tsx:118 +#: src/pages/AccountSettingsOverlay.tsx:97 msgid "Close user settings" msgstr "Fechar configurações do usuário" -#: src/pages/VoiceSettingsOverlay.tsx:139 +#: src/pages/VoiceSettingsOverlay.tsx:144 msgid "Close voice settings" msgstr "Fechar configurações de voz" @@ -718,7 +732,7 @@ msgid "Code" msgstr "" #. placeholder {0}: group.title -#: src/pages/Shell.tsx:2305 +#: src/pages/Shell.tsx:2294 msgid "Collapse {0}" msgstr "" @@ -734,28 +748,28 @@ msgstr "Comando" msgid "Complete" msgstr "Concluir" -#: src/pages/Shell.tsx:5050 -#: src/pages/Shell.tsx:5078 +#: src/components/conversation/MessageView.tsx:470 +#: src/pages/Shell.tsx:3993 msgid "Computer" msgstr "Computador" -#: src/pages/Shell.tsx:5938 +#: src/pages/Shell.tsx:4853 msgid "Computer failed to boot" msgstr "Falha ao inicializar o computador" -#: src/pages/Shell.tsx:3647 +#: src/pages/Shell.tsx:3636 msgid "Computer is asleep" msgstr "O computador está dormindo" -#: src/pages/Shell.tsx:5937 +#: src/pages/Shell.tsx:4852 msgid "Computer is asleep. Take control to wake it." msgstr "O computador está dormindo. Assuma o controle para acordá-lo." -#: src/pages/Shell.tsx:5939 +#: src/pages/Shell.tsx:4854 msgid "Computer is stopped" msgstr "O computador está parado" -#: src/pages/AccountSettingsOverlay.tsx:234 +#: src/pages/AccountSettingsOverlay.tsx:167 msgid "Computers" msgstr "Computadores" @@ -776,12 +790,12 @@ msgid "Confirm delete" msgstr "Confirmar exclusão" #: src/pages/memory-providers/SupermemorySettingsForm.tsx:80 -#: src/pages/PluginsOverlay.tsx:494 -#: src/pages/VoiceSettingsOverlay.tsx:257 +#: src/pages/PluginsOverlay.tsx:495 +#: src/pages/VoiceSettingsOverlay.tsx:262 msgid "Connect" msgstr "Conectar" -#: src/pages/Onboarding.tsx:266 +#: src/pages/Onboarding.tsx:280 msgid "Connect a model" msgstr "Conectar um modelo" @@ -789,11 +803,11 @@ msgstr "Conectar um modelo" msgid "Connect API key" msgstr "Conecte-se com a chave API" -#: src/pages/VoiceSettingsOverlay.tsx:160 +#: src/pages/VoiceSettingsOverlay.tsx:165 msgid "Connect ElevenLabs, OpenAI, or Cartesia" msgstr "Conecte ElevenLabs, OpenAI ou Cartesia" -#: src/pages/Shell.tsx:6239 +#: src/components/conversation/MessageView.tsx:785 msgid "Connect MCP server “{name}”" msgstr "Conecte o servidor MCP “{name}”" @@ -809,31 +823,31 @@ msgstr "Conecte servidores de ferramentas remotos ou locais e escolha quais agen msgid "Connect this provider to use it as your personal model." msgstr "Conecte este provedor para usá-lo como seu modelo pessoal." -#: src/pages/PluginsOverlay.tsx:778 +#: src/pages/PluginsOverlay.tsx:780 msgid "Connect Treg" msgstr "Conectar Treg" +#: src/components/conversation/MessageView.tsx:636 #: src/pages/McpOAuthCallback.tsx:53 #: src/pages/MemorySettingsOverlay.tsx:163 #: src/pages/ModelSettingsOverlay.tsx:378 -#: src/pages/Shell.tsx:6090 -#: src/pages/VoiceSettingsOverlay.tsx:202 +#: src/pages/VoiceSettingsOverlay.tsx:207 msgid "Connected" msgstr "Conectado" -#: src/pages/Shell.tsx:6269 +#: src/components/conversation/MessageView.tsx:815 msgid "Connected — its tools are available from your next message." msgstr "Conectado — suas ferramentas estão disponíveis na sua próxima mensagem." #. placeholder {0}: credential.label #. placeholder {0}: selected.name #: src/pages/ModelSettingsOverlay.tsx:522 -#: src/pages/VoiceSettingsOverlay.tsx:223 +#: src/pages/VoiceSettingsOverlay.tsx:228 msgid "Connected · {0}" msgstr "Conectado · {0}" #. placeholder {0}: selected.name -#: src/pages/VoiceSettingsOverlay.tsx:73 +#: src/pages/VoiceSettingsOverlay.tsx:78 msgid "Connected {0}." msgstr "Conectado {0}." @@ -844,29 +858,29 @@ msgstr "Conectado {0}." msgid "Connected and using {0}." msgstr "Conectado e usando {0}." +#: src/components/conversation/MessageView.tsx:805 #: src/pages/McpServersOverlay.tsx:16 #: src/pages/memory-providers/SupermemorySettingsForm.tsx:80 -#: src/pages/PluginsOverlay.tsx:494 -#: src/pages/Shell.tsx:6259 -#: src/pages/VoiceSettingsOverlay.tsx:253 +#: src/pages/PluginsOverlay.tsx:495 +#: src/pages/VoiceSettingsOverlay.tsx:258 msgid "Connecting…" msgstr "Conectando…" #. placeholder {0}: item.name -#: src/pages/PluginsOverlay.tsx:297 +#: src/pages/PluginsOverlay.tsx:298 msgid "Connection to {0} is still pending. You can close this and check again." msgstr "A conexão com o {0} ainda está pendente. Você pode fechar isso e verificar novamente." -#: src/pages/Onboarding.tsx:538 -#: src/pages/Onboarding.tsx:697 +#: src/pages/Onboarding.tsx:552 +#: src/pages/Onboarding.tsx:711 msgid "Continue" msgstr "Continuar" -#: src/pages/Auth.tsx:144 +#: src/pages/Auth.tsx:154 msgid "Continue with email" msgstr "Continuar com e-mail" -#: src/pages/Shell.tsx:4535 +#: src/pages/Shell.tsx:3921 msgid "Copy" msgstr "Copiar" @@ -878,11 +892,11 @@ msgstr "Não foi possível adicionar." msgid "Could not add MCP server" msgstr "Não foi possível adicionar o servidor MCP" -#: src/pages/Shell.tsx:6226 +#: src/components/conversation/MessageView.tsx:772 msgid "Could not approve this server" msgstr "Não foi possível aprovar este servidor" -#: src/pages/Shell.tsx:6054 +#: src/components/conversation/MessageView.tsx:600 msgid "Could not authorize this app" msgstr "Não foi possível autorizar este aplicativo" @@ -890,7 +904,7 @@ msgstr "Não foi possível autorizar este aplicativo" msgid "Could not change the default model" msgstr "Não foi possível alterar o modelo padrão" -#: src/pages/Shell.tsx:5692 +#: src/pages/Shell.tsx:4607 msgid "Could not clear conversation" msgstr "Não foi possível limpar a conversa" @@ -898,7 +912,7 @@ msgstr "Não foi possível limpar a conversa" msgid "Could not complete OAuth" msgstr "Não foi possível concluir o OAuth" -#: src/pages/PluginsOverlay.tsx:301 +#: src/pages/PluginsOverlay.tsx:302 msgid "Could not connect" msgstr "Não foi possível conectar" @@ -911,15 +925,15 @@ msgstr "Não foi possível conectar o {0}" msgid "Could not connect this provider" msgstr "Não foi possível conectar este provedor" -#: src/pages/VoiceSettingsOverlay.tsx:75 +#: src/pages/VoiceSettingsOverlay.tsx:80 msgid "Could not connect this voice provider" msgstr "Não foi possível conectar este provedor de voz" -#: src/pages/Auth.tsx:33 +#: src/pages/Auth.tsx:50 msgid "Could not continue" msgstr "Não foi possível continuar" -#: src/pages/Shell.tsx:5128 +#: src/pages/Shell.tsx:4043 msgid "Could not create bot" msgstr "Não foi possível criar o bot" @@ -927,19 +941,19 @@ msgstr "Não foi possível criar o bot" msgid "Could not create group" msgstr "Não foi possível criar o grupo" -#: src/pages/Shell.tsx:5583 +#: src/pages/Shell.tsx:4498 msgid "Could not create section" msgstr "Não foi possível criar a seção" -#: src/pages/Onboarding.tsx:251 +#: src/pages/Onboarding.tsx:265 msgid "Could not create your bot" msgstr "Não foi possível criar o seu bot" -#: src/pages/Shell.tsx:5807 +#: src/pages/Shell.tsx:4722 msgid "Could not delete bot" msgstr "Não foi possível apagar" -#: src/pages/Shell.tsx:5887 +#: src/pages/Shell.tsx:4802 msgid "Could not delete group" msgstr "" @@ -947,7 +961,7 @@ msgstr "" msgid "Could not delete MCP server" msgstr "Não foi possível excluir o servidor MCP" -#: src/pages/Shell.tsx:5888 +#: src/pages/Shell.tsx:4803 msgid "Could not delete routine" msgstr "Não foi possível excluir a rotina" @@ -968,15 +982,15 @@ msgstr "Não foi possível baixar o {0}. Tente novamente." msgid "Could not download {name}. Try again." msgstr "Não foi possível baixar o {name}. Tente novamente." -#: src/pages/PluginsOverlay.tsx:952 +#: src/pages/PluginsOverlay.tsx:954 msgid "Could not install connector" msgstr "Não foi possível instalar o conector" -#: src/pages/PluginsOverlay.tsx:370 +#: src/pages/PluginsOverlay.tsx:371 msgid "Could not install MCP server" msgstr "" -#: src/pages/PluginsOverlay.tsx:409 +#: src/pages/PluginsOverlay.tsx:410 msgid "Could not install skill" msgstr "" @@ -984,7 +998,7 @@ msgstr "" msgid "Could not load approval rules" msgstr "Não foi possível carregar as regras de aprovação" -#: src/pages/PluginsOverlay.tsx:130 +#: src/pages/PluginsOverlay.tsx:133 msgid "Could not load integrations" msgstr "Não foi possível carregar as integrações" @@ -1004,16 +1018,16 @@ msgstr "Não foi possível carregar este arquivo." msgid "Could not load update status" msgstr "" -#: src/pages/VoiceSettingsOverlay.tsx:47 +#: src/pages/VoiceSettingsOverlay.tsx:52 msgid "Could not load voice settings" msgstr "Não foi possível carregar as configurações de voz" -#: src/pages/VoiceSettingsOverlay.tsx:109 +#: src/pages/VoiceSettingsOverlay.tsx:114 msgid "Could not play a test clip" msgstr "Não foi possível reproduzir um clipe de teste" #: src/pages/ModelSettingsOverlay.tsx:221 -#: src/pages/Onboarding.tsx:197 +#: src/pages/Onboarding.tsx:211 msgid "Could not reach this model server" msgstr "Não foi possível acessar este servidor modelo" @@ -1021,7 +1035,7 @@ msgstr "Não foi possível acessar este servidor modelo" msgid "Could not remove" msgstr "Não foi possível remover." -#: src/pages/PluginsOverlay.tsx:965 +#: src/pages/PluginsOverlay.tsx:967 msgid "Could not remove connector" msgstr "Não foi possível remover o conector" @@ -1029,7 +1043,7 @@ msgstr "Não foi possível remover o conector" msgid "Could not remove group" msgstr "Não foi possível remover o grupo" -#: src/pages/PluginsOverlay.tsx:396 +#: src/pages/PluginsOverlay.tsx:397 msgid "Could not remove MCP server" msgstr "" @@ -1037,23 +1051,27 @@ msgstr "" msgid "Could not remove rule" msgstr "Não foi possível remover." -#: src/pages/PluginsOverlay.tsx:423 +#: src/pages/PluginsOverlay.tsx:424 msgid "Could not remove skill" msgstr "" -#: src/pages/Shell.tsx:6146 +#: src/components/conversation/MessageView.tsx:692 msgid "Could not render chart" msgstr "Não foi possível renderizar o gráfico" -#: src/pages/PluginsOverlay.tsx:327 +#: src/pages/ResetPassword.tsx:139 +msgid "Could not reset your password" +msgstr "" + +#: src/pages/PluginsOverlay.tsx:328 msgid "Could not revoke connection" msgstr "Não foi possível revogar a conexão" -#: src/pages/Shell.tsx:3232 +#: src/pages/Shell.tsx:3226 msgid "Could not run routine" msgstr "" -#: src/pages/Shell.tsx:5484 +#: src/pages/Shell.tsx:4399 msgid "Could not save" msgstr "Não foi possível salvar" @@ -1065,11 +1083,11 @@ msgstr "" msgid "Could not save group" msgstr "Não foi possível salvar o grupo" -#: src/pages/Onboarding.tsx:224 +#: src/pages/Onboarding.tsx:238 msgid "Could not save model" msgstr "Não foi possível salvar o modelo" -#: src/pages/Shell.tsx:3203 +#: src/pages/Shell.tsx:3197 msgid "Could not save routine" msgstr "Não foi possível salvar a rotina" @@ -1081,11 +1099,11 @@ msgstr "Não foi possível salvar" msgid "Could not save that choice" msgstr "Não foi possível salvar essa opção" -#: src/pages/VoiceSettingsOverlay.tsx:90 +#: src/pages/VoiceSettingsOverlay.tsx:95 msgid "Could not save that voice" msgstr "Não foi possível salvar essa voz" -#: src/pages/Shell.tsx:5966 +#: src/components/conversation/MessageView.tsx:508 msgid "Could not save this choice" msgstr "Não foi possível salvar esta opção" @@ -1093,8 +1111,12 @@ msgstr "Não foi possível salvar esta opção" msgid "Could not send that" msgstr "Não foi possível enviar" +#: src/pages/ResetPassword.tsx:44 +msgid "Could not send the link. Try again." +msgstr "" + #: src/pages/McpServersOverlay.tsx:172 -#: src/pages/PluginsOverlay.tsx:384 +#: src/pages/PluginsOverlay.tsx:385 msgid "Could not start OAuth" msgstr "Não foi possível iniciar o OAuth" @@ -1102,7 +1124,7 @@ msgstr "Não foi possível iniciar o OAuth" msgid "Could not submit this answer" msgstr "Não foi possível enviar esta resposta" -#: src/pages/Shell.tsx:2043 +#: src/pages/Shell.tsx:2032 msgid "Could not take control" msgstr "Não foi possível assumir o controle" @@ -1130,26 +1152,22 @@ msgstr "" msgid "Couldn't start WhatsApp pairing" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:93 -msgid "Couldn't update avatars" -msgstr "" - #: src/pages/PhoneSettingsOverlay.tsx:99 msgid "Couldn't update phone settings" msgstr "" -#: src/pages/Shell.tsx:2233 -#: src/pages/Shell.tsx:5187 -#: src/pages/Shell.tsx:5618 +#: src/pages/Shell.tsx:2222 +#: src/pages/Shell.tsx:4102 +#: src/pages/Shell.tsx:4533 msgid "Create" msgstr "Criar" #. placeholder {0}: bot.name -#: src/pages/Shell.tsx:5592 +#: src/pages/Shell.tsx:4507 msgid "Create a section and move {0} into it." msgstr "Crie uma seção e mova {0} para ela." -#: src/pages/Auth.tsx:146 +#: src/pages/Auth.tsx:156 msgid "Create account" msgstr "Criar Conta" @@ -1157,29 +1175,29 @@ msgstr "Criar Conta" msgid "Create group" msgstr "Criar grupo" -#: src/pages/Onboarding.tsx:557 +#: src/pages/Onboarding.tsx:571 msgid "Create your first bot" msgstr "Crie seu primeiro bot" -#: src/pages/Auth.tsx:17 +#: src/pages/Auth.tsx:29 msgid "Create your Sentra Bot" msgstr "Crie o seu Sentra Bot" #: src/pages/GroupPanel.tsx:134 -#: src/pages/Shell.tsx:5187 -#: src/pages/Shell.tsx:5618 +#: src/pages/Shell.tsx:4102 +#: src/pages/Shell.tsx:4533 msgid "Creating…" msgstr "Criando..." -#: src/pages/PluginsOverlay.tsx:569 +#: src/pages/PluginsOverlay.tsx:570 msgid "Creativity" msgstr "" -#: src/pages/PluginsOverlay.tsx:834 +#: src/pages/PluginsOverlay.tsx:836 msgid "Credential" msgstr "Credencial" -#: src/pages/PluginsOverlay.tsx:892 +#: src/pages/PluginsOverlay.tsx:894 msgid "credential saved" msgstr "credencial salva" @@ -1204,7 +1222,7 @@ msgstr "dias" msgid "Decline" msgstr "" -#: src/pages/Shell.tsx:5391 +#: src/pages/Shell.tsx:4306 msgid "Default (medium)" msgstr "Padrão (médio)" @@ -1215,24 +1233,24 @@ msgstr "Escopo padrão" #: src/pages/BotContextMenu.tsx:105 #: src/pages/McpServersOverlay.tsx:481 #: src/pages/RoutineEditor.tsx:280 -#: src/pages/Shell.tsx:2522 -#: src/pages/Shell.tsx:2552 -#: src/pages/Shell.tsx:5813 -#: src/pages/Shell.tsx:5895 +#: src/pages/Shell.tsx:2511 +#: src/pages/Shell.tsx:2541 +#: src/pages/Shell.tsx:4728 +#: src/pages/Shell.tsx:4810 msgid "Delete" msgstr "Excluir" #. placeholder {0}: bot.name #. placeholder {0}: group.name -#: src/pages/Shell.tsx:2518 -#: src/pages/Shell.tsx:2548 +#: src/pages/Shell.tsx:2507 +#: src/pages/Shell.tsx:2537 msgid "Delete {0}" msgstr "Excluir {0}" #. placeholder {0}: bot.name #. placeholder {0}: item.name -#: src/pages/Shell.tsx:5745 -#: src/pages/Shell.tsx:5861 +#: src/pages/Shell.tsx:4660 +#: src/pages/Shell.tsx:4776 msgid "Delete {0}?" msgstr "Excluir {0}?" @@ -1240,17 +1258,17 @@ msgstr "Excluir {0}?" msgid "Delete group" msgstr "Excluir o grupo" -#: src/pages/Shell.tsx:5782 +#: src/pages/Shell.tsx:4697 msgid "Delete memories too" msgstr "Excluir memórias também" -#: src/pages/Shell.tsx:4894 +#: src/components/conversation/MessageView.tsx:314 msgid "deleted" msgstr "excluído" #: src/pages/GroupPanel.tsx:232 -#: src/pages/Shell.tsx:5813 -#: src/pages/Shell.tsx:5895 +#: src/pages/Shell.tsx:4728 +#: src/pages/Shell.tsx:4810 msgid "Deleting…" msgstr "Excluindo…" @@ -1266,26 +1284,30 @@ msgstr "Negar" msgid "Deployment default" msgstr "Padrão de implantação" -#: src/pages/Onboarding.tsx:676 -#: src/pages/Shell.tsx:5165 +#: src/pages/Onboarding.tsx:690 +#: src/pages/Shell.tsx:4080 msgid "Describe what this bot does" msgstr "Descreva o que este bot faz" -#: src/pages/Onboarding.tsx:651 +#: src/pages/Onboarding.tsx:665 msgid "Describe your own bot in the panel." msgstr "" -#: src/pages/Onboarding.tsx:681 -#: src/pages/Shell.tsx:5170 -#: src/pages/Shell.tsx:5335 +#: src/pages/Onboarding.tsx:695 +#: src/pages/Shell.tsx:4085 +#: src/pages/Shell.tsx:4250 msgid "Description" msgstr "Descrição" -#: src/pages/PluginsOverlay.tsx:565 +#: src/pages/Shell.tsx:2704 +msgid "Desktop Runtime offline" +msgstr "" + +#: src/pages/PluginsOverlay.tsx:566 msgid "Developer" msgstr "" -#: src/pages/Shell.tsx:4306 +#: src/components/composer/Composer.tsx:446 msgid "Dictate" msgstr "Ditar" @@ -1298,15 +1320,15 @@ msgstr "Desconectar" msgid "Disconnecting…" msgstr "Desconectando…" -#: src/pages/Shell.tsx:4153 +#: src/components/composer/Composer.tsx:293 msgid "Dismiss error" msgstr "" -#: src/pages/Shell.tsx:6274 +#: src/components/conversation/MessageView.tsx:820 msgid "Dismissed — reconnect anytime from MCP settings." msgstr "Dispensado — reconecte a qualquer momento a partir das configurações do MCP." -#: src/pages/PluginsOverlay.tsx:788 +#: src/pages/PluginsOverlay.tsx:790 msgid "Display name" msgstr "Nome de exibição" @@ -1323,7 +1345,7 @@ msgstr "Docker (recomendado)" msgid "Docker is the default: bots use a shared Team Computer." msgstr "O Docker é o padrão: os bots usam um Computador de Equipe compartilhado." -#: src/pages/Auth.tsx:152 +#: src/pages/Auth.tsx:162 msgid "Don’t have an account?" msgstr "Não tem uma conta?" @@ -1350,7 +1372,7 @@ msgstr "Habilidade de rascunho" msgid "Duplicate" msgstr "Duplicar" -#: src/pages/Shell.tsx:4697 +#: src/components/conversation/MessageView.tsx:117 msgid "Earlier message" msgstr "" @@ -1362,7 +1384,8 @@ msgstr "Editar primeiro" msgid "Edit Profile" msgstr "Editar Perfil" -#: src/pages/Auth.tsx:62 +#: src/pages/Auth.tsx:73 +#: src/pages/ResetPassword.tsx:82 msgid "Email" msgstr "E-mail" @@ -1372,7 +1395,7 @@ msgstr "Credencial estática criptografada salva" #. placeholder {0}: oauth.verificationUri.replace(/^https:\/\//, "") #: src/pages/ModelSettingsOverlay.tsx:586 -#: src/pages/Onboarding.tsx:459 +#: src/pages/Onboarding.tsx:473 msgid "Enter this code at <0>{0}" msgstr "Digite este código em <0>{0}" @@ -1410,16 +1433,16 @@ msgstr "A cada mês" msgid "Every week" msgstr "A cada semana" -#: src/pages/Shell.tsx:6320 +#: src/components/conversation/MessageView.tsx:866 msgid "Expand" msgstr "Expandir" #. placeholder {0}: group.title -#: src/pages/Shell.tsx:2305 +#: src/pages/Shell.tsx:2294 msgid "Expand {0}" msgstr "" -#: src/pages/Shell.tsx:5496 +#: src/pages/Shell.tsx:4411 msgid "Export" msgstr "Exportar" @@ -1427,7 +1450,7 @@ msgstr "Exportar" msgid "Export this week's list from the CRM and drop it in the shared folder" msgstr "Exporte a lista desta semana do CRM e solte-a na pasta compartilhada" -#: src/pages/Shell.tsx:5516 +#: src/pages/Shell.tsx:4431 msgid "Extra high" msgstr "Extra alta" @@ -1435,14 +1458,14 @@ msgstr "Extra alta" msgid "Failed" msgstr "Falha" -#: src/pages/Shell.tsx:1878 -#: src/pages/Shell.tsx:1880 -#: src/pages/Shell.tsx:1882 +#: src/pages/Shell.tsx:1867 +#: src/pages/Shell.tsx:1869 +#: src/pages/Shell.tsx:1871 msgid "Failed to send message" msgstr "Ocorreu um erro ao enviar a mensagem" -#: src/pages/Shell.tsx:1912 -#: src/pages/Shell.tsx:1931 +#: src/pages/Shell.tsx:1901 +#: src/pages/Shell.tsx:1920 msgid "Failed to stop" msgstr "Não foi possível parar" @@ -1456,18 +1479,18 @@ msgid "Failure handling" msgstr "Tratamento de falhas" #: src/pages/ModelSettingsOverlay.tsx:427 -#: src/pages/Onboarding.tsx:336 +#: src/pages/Onboarding.tsx:350 msgid "Find models" msgstr "Encontrar modelos" #: src/pages/ModelSettingsOverlay.tsx:427 -#: src/pages/Onboarding.tsx:336 +#: src/pages/Onboarding.tsx:350 msgid "Finding…" msgstr "Localizando…" #. placeholder {0}: new URL(oauth.verificationUri).hostname #: src/pages/ModelSettingsOverlay.tsx:546 -#: src/pages/Onboarding.tsx:420 +#: src/pages/Onboarding.tsx:434 msgid "Finish signing in at <0>{0}. The final page may not load; paste its URL or code here." msgstr "Conclua o login em <0>{0}. A página final não pode ser carregada; cole seu URL ou código aqui." @@ -1484,6 +1507,10 @@ msgstr "Finalizando conexão MCP…" msgid "Flag unexpected actions" msgstr "" +#: src/pages/Auth.tsx:99 +msgid "Forgot password?" +msgstr "" + #: src/pages/ModelSettingsOverlay.tsx:1026 msgid "Free" msgstr "" @@ -1497,8 +1524,8 @@ msgid "Git event" msgstr "" #: src/pages/PhoneSettingsOverlay.tsx:224 -#: src/pages/Shell.tsx:2708 -#: src/pages/Shell.tsx:2863 +#: src/pages/Shell.tsx:2697 +#: src/pages/Shell.tsx:2857 msgid "Group" msgstr "Grupo" @@ -1524,7 +1551,7 @@ msgid "header" msgstr "" #: src/pages/McpServersOverlay.tsx:342 -#: src/pages/PluginsOverlay.tsx:824 +#: src/pages/PluginsOverlay.tsx:826 msgid "Header name" msgstr "Nome do Cabeçalho" @@ -1532,27 +1559,28 @@ msgstr "Nome do Cabeçalho" msgid "Header value" msgstr "Valor do cabeçalho" -#: src/pages/VoiceSettingsOverlay.tsx:284 +#: src/pages/VoiceSettingsOverlay.tsx:289 msgid "Hear a sample" msgstr "Ouvir uma amostra" -#: src/pages/VoiceSettingsOverlay.tsx:102 +#: src/pages/VoiceSettingsOverlay.tsx:107 msgid "Hi, this is how I'll sound when I read replies out loud." msgstr "Olá, é assim que vou soar quando ler as respostas em voz alta." -#: src/pages/Auth.tsx:95 +#: src/pages/Auth.tsx:122 +#: src/pages/ResetPassword.tsx:186 msgid "Hide password" msgstr "" -#: src/pages/Shell.tsx:5519 +#: src/pages/Shell.tsx:4434 msgid "High" msgstr "Alto" -#: src/pages/Shell.tsx:4325 +#: src/components/composer/Composer.tsx:465 msgid "Hold to talk" msgstr "Segure para falar" -#: src/pages/Shell.tsx:4325 +#: src/components/composer/Composer.tsx:465 msgid "Hold to talk (on-device dictation)" msgstr "Segure para falar (ditado no dispositivo)" @@ -1572,15 +1600,19 @@ msgstr "Com que frequência" msgid "How to check" msgstr "Como verificar" -#: src/pages/Shell.tsx:4591 +#: src/pages/Shell.tsx:3977 msgid "I’m done" msgstr "Eu terminei." -#: src/pages/VoiceSettingsOverlay.tsx:107 +#: src/pages/ResetPassword.tsx:54 +msgid "If an account exists for {email}, we sent a link to reset your password. It works for one hour." +msgstr "" + +#: src/pages/VoiceSettingsOverlay.tsx:112 msgid "If you heard that, voice is ready." msgstr "Se você ouviu isso, a voz está pronta." -#: src/pages/AccountSettingsOverlay.tsx:140 +#: src/pages/AccountSettingsOverlay.tsx:119 msgid "iMessage channels and agent connections." msgstr "" @@ -1588,15 +1620,15 @@ msgstr "" msgid "iMessage line" msgstr "" -#: src/pages/PluginsOverlay.tsx:782 +#: src/pages/PluginsOverlay.tsx:784 msgid "Import OpenAPI JSON" msgstr "Importar OpenAPI JSON" -#: src/pages/Onboarding.tsx:701 +#: src/pages/Onboarding.tsx:715 msgid "Includes a full operating playbook for this role." msgstr "" -#: src/pages/Shell.tsx:5406 +#: src/pages/Shell.tsx:4321 msgid "Inherit default" msgstr "Herdar (padrão)" @@ -1604,18 +1636,18 @@ msgstr "Herdar (padrão)" msgid "Inputs" msgstr "Entradas" -#: src/pages/PluginsOverlay.tsx:482 -#: src/pages/PluginsOverlay.tsx:533 +#: src/pages/PluginsOverlay.tsx:483 +#: src/pages/PluginsOverlay.tsx:534 msgid "Install" msgstr "" -#: src/pages/PluginsOverlay.tsx:498 -#: src/pages/PluginsOverlay.tsx:537 +#: src/pages/PluginsOverlay.tsx:499 +#: src/pages/PluginsOverlay.tsx:538 msgid "Installed" msgstr "" -#: src/pages/PluginsOverlay.tsx:482 -#: src/pages/PluginsOverlay.tsx:533 +#: src/pages/PluginsOverlay.tsx:483 +#: src/pages/PluginsOverlay.tsx:534 msgid "Installing…" msgstr "" @@ -1627,8 +1659,8 @@ msgstr "Chave de API da instância" msgid "Instruction" msgstr "Instrução" -#: src/pages/PluginsOverlay.tsx:582 -#: src/pages/Shell.tsx:2570 +#: src/pages/PluginsOverlay.tsx:583 +#: src/pages/Shell.tsx:2559 msgid "Integrations" msgstr "Integrações" @@ -1650,19 +1682,19 @@ msgid "Interval unit" msgstr "Unidade do intervalo:" #: src/pages/MemorySettingsOverlay.tsx:39 -#: src/pages/Shell.tsx:5407 +#: src/pages/Shell.tsx:4322 msgid "Isolated" msgstr "Isolado" -#: src/pages/Shell.tsx:5748 +#: src/pages/Shell.tsx:4663 msgid "Its conversation, files, and routines will be permanently deleted. Bots it created stay in your list." msgstr "Suas conversas, arquivos e rotinas serão excluídos permanentemente. Os bots criados ficam na sua lista." -#: src/pages/Shell.tsx:3886 +#: src/pages/Shell.tsx:3875 msgid "Jump to latest" msgstr "Ir para a mensagem mais recente" -#: src/pages/Shell.tsx:4692 +#: src/components/conversation/MessageView.tsx:112 msgid "Jump to replied message" msgstr "Ir para a mensagem respondida" @@ -1670,7 +1702,7 @@ msgstr "Ir para a mensagem respondida" msgid "just now" msgstr "agora mesmo" -#: src/pages/Shell.tsx:5766 +#: src/pages/Shell.tsx:4681 msgid "Keep memories" msgstr "Manter memórias" @@ -1678,17 +1710,17 @@ msgstr "Manter memórias" msgid "key" msgstr "" -#: src/pages/VoiceSettingsOverlay.tsx:229 +#: src/pages/VoiceSettingsOverlay.tsx:234 msgid "Keys stay on the server. The app only learns whether a provider is configured." msgstr "As chaves permanecem no servidor. O aplicativo só descobre se um provedor está configurado." -#: src/pages/PluginsOverlay.tsx:571 +#: src/pages/PluginsOverlay.tsx:572 msgid "Knowledge" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:154 -#: src/pages/AccountSettingsOverlay.tsx:363 -#: src/pages/AccountSettingsOverlay.tsx:380 +#: src/pages/AccountSettingsOverlay.tsx:133 +#: src/pages/AccountSettingsOverlay.tsx:296 +#: src/pages/AccountSettingsOverlay.tsx:313 msgid "Language" msgstr "Idioma" @@ -1709,7 +1741,7 @@ msgstr "" msgid "Listening…" msgstr "Ouvindo..." -#: src/pages/Shell.tsx:3839 +#: src/pages/Shell.tsx:3828 msgid "Load earlier messages" msgstr "Carregar mensagens anteriores..." @@ -1717,7 +1749,7 @@ msgstr "Carregar mensagens anteriores..." msgid "Loading activity…" msgstr "Carregando minha atividade" -#: src/pages/PluginsOverlay.tsx:608 +#: src/pages/PluginsOverlay.tsx:609 msgid "Loading integrations…" msgstr "Carregando integrações…" @@ -1743,13 +1775,13 @@ msgstr "Carregando Visualização…" msgid "Loading rules…" msgstr "Carregando regras…" -#: src/pages/VoiceSettingsOverlay.tsx:128 +#: src/pages/VoiceSettingsOverlay.tsx:133 msgid "Loading voice providers…" msgstr "Carregando provedores de voz..." -#: src/App.tsx:50 -#: src/pages/Onboarding.tsx:260 -#: src/pages/Shell.tsx:3839 +#: src/App.tsx:53 +#: src/pages/Onboarding.tsx:274 +#: src/pages/Shell.tsx:3828 msgid "Loading…" msgstr "Carregando..." @@ -1757,15 +1789,15 @@ msgstr "Carregando..." msgid "Local" msgstr "Local" -#: src/pages/Shell.tsx:2656 +#: src/pages/Shell.tsx:2645 msgid "Log out" msgstr "Sair" -#: src/pages/Shell.tsx:5517 +#: src/pages/Shell.tsx:4432 msgid "Low" msgstr "Baixo" -#: src/pages/AccountSettingsOverlay.tsx:147 +#: src/pages/AccountSettingsOverlay.tsx:126 msgid "Manage phone settings" msgstr "" @@ -1781,17 +1813,17 @@ msgstr "Marcar como Lido" msgid "Mark as Unread" msgstr "Marcar como Não Lida" -#: src/pages/Shell.tsx:5521 +#: src/pages/Shell.tsx:4436 msgid "Max" msgstr "Máximo" #: src/pages/McpServersOverlay.tsx:224 #: src/pages/McpServersOverlay.tsx:229 -#: src/pages/PluginsOverlay.tsx:756 +#: src/pages/PluginsOverlay.tsx:758 msgid "MCP servers" msgstr "Servidores MCP" -#: src/pages/Shell.tsx:5518 +#: src/pages/Shell.tsx:4433 msgid "Medium" msgstr "Médio" @@ -1804,11 +1836,11 @@ msgid "Members (pick {GROUP_MEMBER_MIN}–{GROUP_MEMBER_MAX})" msgstr "Membros (escolha {GROUP_MEMBER_MIN}–{GROUP_MEMBER_MAX})" #: src/pages/MemorySettingsOverlay.tsx:134 -#: src/pages/Shell.tsx:2614 +#: src/pages/Shell.tsx:2603 msgid "Memory" msgstr "Memória" -#: src/pages/Shell.tsx:5402 +#: src/pages/Shell.tsx:4317 msgid "Memory scope" msgstr "Escopo de memória" @@ -1817,29 +1849,29 @@ msgstr "Escopo de memória" msgid "Message" msgstr "" -#: src/pages/Shell.tsx:4403 -#: src/pages/Shell.tsx:4500 +#: src/components/composer/Composer.tsx:543 +#: src/components/composer/shared.ts:23 msgid "Message" msgstr "Mensagem" -#: src/pages/Shell.tsx:4399 -#: src/pages/Shell.tsx:4403 +#: src/components/composer/Composer.tsx:539 +#: src/components/composer/Composer.tsx:543 msgid "Message {activeName}" msgstr "Mensagem {activeName}" -#: src/pages/Shell.tsx:4134 +#: src/components/composer/Composer.tsx:274 msgid "Message composer" msgstr "" -#: src/pages/Shell.tsx:4770 +#: src/components/conversation/MessageView.tsx:190 msgid "Message from {peer}" msgstr "Mensagem de {peer}" -#: src/pages/Shell.tsx:4400 +#: src/components/composer/Composer.tsx:540 msgid "Message…" msgstr "Mensagem…" -#: src/pages/Shell.tsx:4770 +#: src/components/conversation/MessageView.tsx:190 msgid "Messaged {peer}" msgstr "Enviou mensagem para {peer}" @@ -1847,7 +1879,7 @@ msgstr "Enviou mensagem para {peer}" msgid "Microphone failed" msgstr "Falha no microfone" -#: src/pages/Shell.tsx:5520 +#: src/pages/Shell.tsx:4435 msgid "Minimal" msgstr "Mínimo" @@ -1866,15 +1898,15 @@ msgstr "minutos" #: src/pages/ModelSettingsOverlay.tsx:432 #: src/pages/ModelSettingsOverlay.tsx:493 #: src/pages/ModelSettingsOverlay.tsx:914 -#: src/pages/Onboarding.tsx:341 -#: src/pages/Onboarding.tsx:390 -#: src/pages/Onboarding.tsx:398 -#: src/pages/Shell.tsx:5358 +#: src/pages/Onboarding.tsx:355 +#: src/pages/Onboarding.tsx:404 +#: src/pages/Onboarding.tsx:412 +#: src/pages/Shell.tsx:4273 msgid "Model" msgstr "Modelo" #: src/pages/ModelSettingsOverlay.tsx:474 -#: src/pages/Onboarding.tsx:371 +#: src/pages/Onboarding.tsx:385 msgid "Model id" msgstr "ID do modelo" @@ -1882,7 +1914,7 @@ msgstr "ID do modelo" msgid "Model options" msgstr "Opções do modelo" -#: src/pages/AccountSettingsOverlay.tsx:222 +#: src/pages/AccountSettingsOverlay.tsx:155 msgid "Model spend uses your provider keys." msgstr "O modelo de gasto usa suas chaves de provedor." @@ -1891,12 +1923,12 @@ msgid "Model updated." msgstr "Modelo Atualizado" #: src/pages/ModelSettingsOverlay.tsx:304 -#: src/pages/Shell.tsx:2601 +#: src/pages/Shell.tsx:2590 msgid "Models" msgstr "Modelos" #: src/pages/ModelSettingsOverlay.tsx:445 -#: src/pages/Onboarding.tsx:348 +#: src/pages/Onboarding.tsx:362 msgid "Models from server" msgstr "Modelos do servidor" @@ -1904,7 +1936,7 @@ msgstr "Modelos do servidor" msgid "Monthly" msgstr "Mensalmente" -#: src/pages/PluginsOverlay.tsx:573 +#: src/pages/PluginsOverlay.tsx:574 msgid "More apps" msgstr "" @@ -1913,7 +1945,7 @@ msgstr "" msgid "Move {0} to section" msgstr "Mover {0} para a seção" -#: src/pages/Shell.tsx:5769 +#: src/pages/Shell.tsx:4684 msgid "Move them to your shared memory." msgstr "Mova-os para a sua memória compartilhada." @@ -1922,19 +1954,19 @@ msgid "Move to" msgstr "Mover para" #: src/components/teach/SkillDraftCard.tsx:82 -#: src/pages/Auth.tsx:49 +#: src/pages/Auth.tsx:60 #: src/pages/GroupPanel.tsx:110 #: src/pages/GroupPanel.tsx:201 -#: src/pages/Onboarding.tsx:663 +#: src/pages/Onboarding.tsx:677 #: src/pages/RoutineEditor.tsx:294 -#: src/pages/Shell.tsx:5150 -#: src/pages/Shell.tsx:5317 -#: src/pages/Shell.tsx:5595 +#: src/pages/Shell.tsx:4065 +#: src/pages/Shell.tsx:4232 +#: src/pages/Shell.tsx:4510 msgid "Name" msgstr "Nome" -#: src/pages/Onboarding.tsx:667 -#: src/pages/Shell.tsx:5155 +#: src/pages/Onboarding.tsx:681 +#: src/pages/Shell.tsx:4070 msgid "Name this bot" msgstr "Nomeie este bot" @@ -1954,13 +1986,13 @@ msgstr "Precisa de entrada" msgid "Needs takeover" msgstr "Requer assumir o controle" -#: src/pages/Shell.tsx:2247 -#: src/pages/Shell.tsx:5138 +#: src/pages/Shell.tsx:2236 +#: src/pages/Shell.tsx:4053 msgid "New bot" msgstr "Novo bot" #: src/pages/GroupPanel.tsx:98 -#: src/pages/Shell.tsx:2257 +#: src/pages/Shell.tsx:2246 msgid "New group" msgstr "Novo grupo" @@ -1968,12 +2000,16 @@ msgstr "Novo grupo" msgid "New open-work item" msgstr "Novo item de trabalho aberto" +#: src/pages/ResetPassword.tsx:165 +msgid "New password" +msgstr "" + #: src/pages/RoutineEditor.tsx:100 msgid "New routine" msgstr "Nova rotina" #: src/pages/BotContextMenu.tsx:130 -#: src/pages/Shell.tsx:5589 +#: src/pages/Shell.tsx:4504 msgid "New section" msgstr "Nova seção" @@ -1981,20 +2017,20 @@ msgstr "Nova seção" msgid "No agent connections yet." msgstr "" -#: src/pages/PluginsOverlay.tsx:687 +#: src/pages/PluginsOverlay.tsx:689 msgid "No apps match your search." msgstr "Nenhum aplicativo corresponde à sua pesquisa." -#: src/pages/PluginsOverlay.tsx:894 +#: src/pages/PluginsOverlay.tsx:896 msgid "no auth" msgstr "sem autenticação" -#: src/pages/PluginsOverlay.tsx:810 +#: src/pages/PluginsOverlay.tsx:812 msgid "No authentication" msgstr "Sem autenticação" #. placeholder {0}: item.name -#: src/pages/PluginsOverlay.tsx:323 +#: src/pages/PluginsOverlay.tsx:324 msgid "No connection record found for {0}." msgstr "Nenhum registro de conexão encontrado para {0}." @@ -2014,7 +2050,7 @@ msgstr "" msgid "No longer active" msgstr "Não está mais ativo" -#: src/pages/PluginsOverlay.tsx:682 +#: src/pages/PluginsOverlay.tsx:684 msgid "No managed app catalog is configured on this deployment." msgstr "Nenhum catálogo de aplicativos gerenciados está configurado nesta implantação." @@ -2022,7 +2058,7 @@ msgstr "Nenhum catálogo de aplicativos gerenciados está configurado nesta impl msgid "No matching models" msgstr "" -#: src/pages/PluginsOverlay.tsx:876 +#: src/pages/PluginsOverlay.tsx:878 msgid "No MCP or API tool sources installed yet." msgstr "Nenhuma fonte de ferramenta MCP ou API instalada ainda." @@ -2054,16 +2090,16 @@ msgstr "" msgid "None yet" msgstr "Nenhuma ainda" -#: src/pages/VoiceSettingsOverlay.tsx:156 +#: src/pages/VoiceSettingsOverlay.tsx:161 msgid "Not configured" msgstr "Não configurado" #: src/pages/ModelSettingsOverlay.tsx:524 -#: src/pages/VoiceSettingsOverlay.tsx:225 +#: src/pages/VoiceSettingsOverlay.tsx:230 msgid "Not connected" msgstr "Não Conectado" -#: src/pages/PluginsOverlay.tsx:643 +#: src/pages/PluginsOverlay.tsx:645 msgid "Not in the plugin catalog" msgstr "" @@ -2071,7 +2107,7 @@ msgstr "" msgid "Not linked — text the deployment's number once to link your phone to your agent." msgstr "" -#: src/pages/Shell.tsx:6262 +#: src/components/conversation/MessageView.tsx:808 msgid "Not now" msgstr "Agora não" @@ -2113,15 +2149,15 @@ msgstr "no dia 1º às {0}" msgid "Open" msgstr "Abrir" -#: src/pages/Shell.tsx:2926 +#: src/pages/Shell.tsx:2920 msgid "Open computer" msgstr "Abrir computador" -#: src/pages/Shell.tsx:2892 +#: src/pages/Shell.tsx:2886 msgid "Open in full window" msgstr "Abrir em janela cheia" -#: src/pages/Shell.tsx:2680 +#: src/pages/Shell.tsx:2669 msgid "Open navigation" msgstr "Abrir a navegação" @@ -2142,24 +2178,24 @@ msgid "Open work" msgstr "Trabalho aberto" #: src/pages/ModelSettingsOverlay.tsx:405 -#: src/pages/Onboarding.tsx:315 +#: src/pages/Onboarding.tsx:329 msgid "OpenAI-compatible server URL" msgstr "URL do servidor compatível com OpenAI" -#: src/pages/Shell.tsx:4905 +#: src/components/conversation/MessageView.tsx:325 msgid "Opened its thread." msgstr "Abriu a conversa." -#: src/App.tsx:166 +#: src/App.tsx:170 msgid "Opening your workspace…" msgstr "Abrindo seu espaço de trabalho..." #: src/pages/ModelSettingsOverlay.tsx:636 -#: src/pages/Onboarding.tsx:502 +#: src/pages/Onboarding.tsx:516 msgid "Optional" msgstr "Opcional" -#: src/pages/AccountSettingsOverlay.tsx:250 +#: src/pages/AccountSettingsOverlay.tsx:183 msgid "Optional controls most people never need" msgstr "Controles opcionais que a maioria das pessoas nunca precisa" @@ -2171,7 +2207,7 @@ msgstr "Valor de cabeçalho opcional" msgid "Or connect an API key" msgstr "Ou conecte uma chave de API" -#: src/pages/Onboarding.tsx:510 +#: src/pages/Onboarding.tsx:524 msgid "Or paste an API key" msgstr "Ou cole uma chave de API" @@ -2180,16 +2216,12 @@ msgstr "Ou cole uma chave de API" msgid "Or send this code to {0}:" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:191 -msgid "Organic" -msgstr "" - #: src/pages/memory-providers/SupermemorySettingsForm.tsx:60 msgid "Organization API key" msgstr "Chave da API da organização" #: src/pages/ModelSettingsOverlay.tsx:454 -#: src/pages/Onboarding.tsx:357 +#: src/pages/Onboarding.tsx:371 msgid "Other model…" msgstr "Outro modelo..." @@ -2211,21 +2243,26 @@ msgstr "" msgid "Park" msgstr "Suspender" -#: src/pages/Auth.tsx:77 -#: src/pages/Auth.tsx:86 +#: src/pages/Auth.tsx:91 +#: src/pages/Auth.tsx:110 +#: src/pages/ResetPassword.tsx:174 msgid "Password" msgstr "Senha" -#: src/pages/VoiceSettingsOverlay.tsx:242 +#: src/pages/ResetPassword.tsx:147 +msgid "Password updated" +msgstr "" + +#: src/pages/VoiceSettingsOverlay.tsx:247 msgid "Paste a replacement key" msgstr "Cole uma chave de substituição" #: src/pages/ModelSettingsOverlay.tsx:416 -#: src/pages/Onboarding.tsx:326 +#: src/pages/Onboarding.tsx:340 msgid "Paste the OpenAI-compatible address from your server. Sentra Bot adds /v1 if needed." msgstr "Cole o endereço compatível com OpenAI do seu servidor. Sentra Bot adiciona /v1 se necessário." -#: src/pages/VoiceSettingsOverlay.tsx:242 +#: src/pages/VoiceSettingsOverlay.tsx:247 msgid "Paste your API key" msgstr "Cole sua chave API" @@ -2233,21 +2270,21 @@ msgstr "Cole sua chave API" msgid "Paused" msgstr "" -#: src/pages/PluginsOverlay.tsx:567 +#: src/pages/PluginsOverlay.tsx:568 msgid "Payments" msgstr "" #: src/pages/ModelSettingsOverlay.tsx:518 -#: src/pages/VoiceSettingsOverlay.tsx:219 +#: src/pages/VoiceSettingsOverlay.tsx:224 msgid "Personal credential" msgstr "Senha Pessoal" -#: src/pages/AccountSettingsOverlay.tsx:137 +#: src/pages/AccountSettingsOverlay.tsx:116 #: src/pages/PhoneSettingsOverlay.tsx:116 msgid "Phone" msgstr "" -#: src/pages/VoiceSettingsOverlay.tsx:155 +#: src/pages/VoiceSettingsOverlay.tsx:160 msgid "Pick a voice" msgstr "Escolha uma voz" @@ -2255,11 +2292,11 @@ msgstr "Escolha uma voz" msgid "Pin" msgstr "Fixar" -#: src/pages/VoiceSettingsOverlay.tsx:284 +#: src/pages/VoiceSettingsOverlay.tsx:289 msgid "Playing…" msgstr "Reproduzindo" -#: src/pages/PluginsOverlay.tsx:615 +#: src/pages/PluginsOverlay.tsx:616 msgid "Popular" msgstr "" @@ -2272,11 +2309,11 @@ msgstr "" msgid "Preview {0}" msgstr "Pré-visualizar {0}" -#: src/pages/Shell.tsx:5093 +#: src/pages/Shell.tsx:4008 msgid "Private" msgstr "Privado" -#: src/pages/PluginsOverlay.tsx:563 +#: src/pages/PluginsOverlay.tsx:564 msgid "Productivity" msgstr "" @@ -2285,7 +2322,7 @@ msgid "Provider" msgstr "Provedor" #: src/pages/ModelSettingsOverlay.tsx:341 -#: src/pages/VoiceSettingsOverlay.tsx:168 +#: src/pages/VoiceSettingsOverlay.tsx:173 msgid "Providers" msgstr "Provedores" @@ -2293,7 +2330,7 @@ msgstr "Provedores" msgid "Queued" msgstr "Na fila" -#: src/pages/Shell.tsx:5434 +#: src/pages/Shell.tsx:4349 msgid "Read replies aloud" msgstr "Leia as respostas em voz alta" @@ -2305,7 +2342,7 @@ msgstr "Recente" msgid "Reconnect OAuth" msgstr "Reconectar OAuth" -#: src/App.tsx:123 +#: src/App.tsx:127 msgid "Reconnecting" msgstr "Reconectando" @@ -2327,27 +2364,27 @@ msgstr "Recuperar substitui um computador inacessível e mantém os arquivos no msgid "Recovering…" msgstr "Recuperando…" -#: src/pages/Shell.tsx:4581 +#: src/pages/Shell.tsx:3967 msgid "Release" msgstr "Libere" #: src/components/ApprovalRulesSettings.tsx:178 -#: src/pages/PluginsOverlay.tsx:455 -#: src/pages/PluginsOverlay.tsx:508 -#: src/pages/PluginsOverlay.tsx:547 -#: src/pages/PluginsOverlay.tsx:666 -#: src/pages/PluginsOverlay.tsx:905 +#: src/pages/PluginsOverlay.tsx:456 +#: src/pages/PluginsOverlay.tsx:509 +#: src/pages/PluginsOverlay.tsx:548 +#: src/pages/PluginsOverlay.tsx:668 +#: src/pages/PluginsOverlay.tsx:907 #: src/pages/ScratchpadSection.tsx:162 msgid "Remove" msgstr "Remover" #. placeholder {0}: attachment.file.name -#: src/pages/Shell.tsx:4204 +#: src/components/composer/Composer.tsx:344 msgid "Remove {0}" msgstr "Remover {0}" #. placeholder {0}: mention.name -#: src/pages/Shell.tsx:4362 +#: src/components/composer/Composer.tsx:502 msgid "Remove mention {0}" msgstr "Remover menção {0}" @@ -2356,7 +2393,7 @@ msgid "Remove schedule" msgstr "" #. placeholder {0}: selectedSkill.name -#: src/pages/Shell.tsx:4341 +#: src/components/composer/Composer.tsx:481 msgid "Remove skill {0}" msgstr "Remover habilidade {0}" @@ -2368,7 +2405,7 @@ msgstr "Remover esta programação" msgid "Remove webhook" msgstr "" -#: src/pages/Shell.tsx:4904 +#: src/components/conversation/MessageView.tsx:324 msgid "Removed with chat, computer, and memory." msgstr "Removido com chat, computador e memória." @@ -2376,10 +2413,10 @@ msgstr "Removido com chat, computador e memória." msgid "Removed, but list refresh failed" msgstr "Removido, mas a atualização da lista falhou" -#: src/pages/PluginsOverlay.tsx:450 -#: src/pages/PluginsOverlay.tsx:547 -#: src/pages/PluginsOverlay.tsx:661 -#: src/pages/PluginsOverlay.tsx:905 +#: src/pages/PluginsOverlay.tsx:451 +#: src/pages/PluginsOverlay.tsx:548 +#: src/pages/PluginsOverlay.tsx:663 +#: src/pages/PluginsOverlay.tsx:907 msgid "Removing…" msgstr "Removendo…" @@ -2393,15 +2430,15 @@ msgstr "Reabrir" msgid "Replace API key" msgstr "Substituir chave de API" -#: src/pages/VoiceSettingsOverlay.tsx:255 +#: src/pages/VoiceSettingsOverlay.tsx:260 msgid "Replace key" msgstr "Substituir chave" -#: src/pages/Shell.tsx:4527 +#: src/pages/Shell.tsx:3913 msgid "Reply" msgstr "Responder" -#: src/pages/Shell.tsx:4167 +#: src/components/composer/Composer.tsx:307 msgid "Replying to {replyName}" msgstr "Respondendo a {replyName}" @@ -2417,13 +2454,21 @@ msgstr "Redefinir computador" msgid "Reset computer?" msgstr "Redefinir o computador?" +#: src/pages/ResetPassword.tsx:78 +msgid "Reset links work once and for one hour. Enter your email to get a new one." +msgstr "" + +#: src/pages/ResetPassword.tsx:70 +msgid "Reset your password" +msgstr "" + #: src/components/ComputerMaintenanceActions.tsx:68 #: src/components/ComputerMaintenanceActions.tsx:115 msgid "Resetting…" msgstr "Redefinindo…" -#: src/pages/Shell.tsx:2514 -#: src/pages/Shell.tsx:2544 +#: src/pages/Shell.tsx:2503 +#: src/pages/Shell.tsx:2533 msgid "Restore" msgstr "Restaurar" @@ -2431,7 +2476,7 @@ msgstr "Restaurar" msgid "Restore the last saved workspace. Unsaved work on the computer is lost." msgstr "Restaure o último espaço de trabalho salvo. O trabalho não salvo no computador será perdido." -#: src/App.tsx:135 +#: src/App.tsx:139 msgid "Retry now" msgstr "Nova tentativa agora" @@ -2439,7 +2484,7 @@ msgstr "Nova tentativa agora" msgid "Return to Sentra Bot" msgstr "Retorno a Sentra Bot" -#: src/pages/PluginsOverlay.tsx:716 +#: src/pages/PluginsOverlay.tsx:718 msgid "Reusable SKILL.md playbooks your agents follow. Install one and invoke it with /Name in the composer." msgstr "" @@ -2447,17 +2492,13 @@ msgstr "" msgid "Revoke" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:189 -msgid "Robot" -msgstr "" - #: src/pages/RoutineEditor.tsx:571 msgid "Rotate key" msgstr "" #: src/pages/RoutineEditor.tsx:247 -#: src/pages/Shell.tsx:3169 -#: src/pages/Shell.tsx:3179 +#: src/pages/Shell.tsx:3163 +#: src/pages/Shell.tsx:3173 msgid "Routine" msgstr "Rotina" @@ -2474,7 +2515,7 @@ msgstr "" msgid "Run history" msgstr "" -#: src/pages/Shell.tsx:3162 +#: src/pages/Shell.tsx:3156 msgid "Run time must be in the future." msgstr "" @@ -2495,7 +2536,7 @@ msgstr "Executando..." #: src/pages/GroupPanel.tsx:224 #: src/pages/ModelSettingsOverlay.tsx:675 #: src/pages/RoutineEditor.tsx:479 -#: src/pages/Shell.tsx:5489 +#: src/pages/Shell.tsx:4404 msgid "Save" msgstr "Salvar" @@ -2537,12 +2578,12 @@ msgid "Say yes or no, or answer in a sentence." msgstr "Diga sim ou não, ou responda em uma frase." #: src/pages/ModelSettingsOverlay.tsx:939 -#: src/pages/Shell.tsx:2268 +#: src/pages/Shell.tsx:2257 msgid "Search" msgstr "Pesquisar" -#: src/pages/PluginsOverlay.tsx:598 #: src/pages/PluginsOverlay.tsx:599 +#: src/pages/PluginsOverlay.tsx:600 msgid "Search apps" msgstr "Pesquisar apps" @@ -2555,8 +2596,8 @@ msgstr "" msgid "Search providers" msgstr "Pesquisar provedores" -#: src/pages/Onboarding.tsx:274 -#: src/pages/Onboarding.tsx:275 +#: src/pages/Onboarding.tsx:288 +#: src/pages/Onboarding.tsx:289 msgid "Search providers and models" msgstr "Pesquisar fornecedores e modelos" @@ -2564,11 +2605,11 @@ msgstr "Pesquisar fornecedores e modelos" msgid "Searching…" msgstr "Pesquisando…" -#: src/pages/Shell.tsx:2709 +#: src/pages/Shell.tsx:2698 msgid "Select a bot" msgstr "Selecione um bot" -#: src/pages/Shell.tsx:4423 +#: src/components/composer/Composer.tsx:563 msgid "Send" msgstr "Enviar" @@ -2580,6 +2621,10 @@ msgstr "Enviar resposta" msgid "Send it" msgstr "Enviar" +#: src/pages/ResetPassword.tsx:103 +msgid "Send reset link" +msgstr "" + #: src/components/AskCard.tsx:97 #: src/components/AskCard.tsx:126 #: src/components/AskCard.tsx:150 @@ -2587,7 +2632,7 @@ msgstr "Enviar" msgid "Sending…" msgstr "Enviando…" -#: src/pages/PluginsOverlay.tsx:839 +#: src/pages/PluginsOverlay.tsx:841 msgid "Sentra Bot verifies the source before saving it. Credentials are encrypted and are never returned to clients or exposed to the model." msgstr "Sentra Bot verifica a fonte antes de salvá-la. As credenciais são criptografadas e nunca são devolvidas aos clientes ou expostas ao modelo." @@ -2601,55 +2646,57 @@ msgstr "Nome do servidor" #: src/pages/McpServersOverlay.tsx:317 #: src/pages/ModelSettingsOverlay.tsx:401 -#: src/pages/Onboarding.tsx:311 +#: src/pages/Onboarding.tsx:325 msgid "Server URL" msgstr "URL do servidor" -#: src/pages/Shell.tsx:2718 +#: src/pages/Shell.tsx:2712 msgid "Set up voice to call" msgstr "Configurar voz para ligar" -#: src/pages/AccountSettingsOverlay.tsx:113 -#: src/pages/Shell.tsx:2578 -#: src/pages/Shell.tsx:2588 -#: src/pages/Shell.tsx:2859 +#: src/pages/AccountSettingsOverlay.tsx:92 +#: src/pages/Shell.tsx:2567 +#: src/pages/Shell.tsx:2577 +#: src/pages/Shell.tsx:2853 msgid "Settings" msgstr "Configurações" -#: src/pages/Shell.tsx:4441 +#: src/components/composer/Composer.tsx:581 msgid "Settings: General" msgstr "Opções > Geral" -#: src/pages/Shell.tsx:4443 +#: src/components/composer/Composer.tsx:583 msgid "Settings: Usage" msgstr "Configurações: Uso" #: src/pages/ModelSettingsOverlay.tsx:413 -#: src/pages/Onboarding.tsx:323 +#: src/pages/Onboarding.tsx:337 msgid "Setup help" msgstr "Ajuda" #: src/pages/MemorySettingsOverlay.tsx:39 -#: src/pages/Shell.tsx:5408 +#: src/pages/Shell.tsx:4323 msgid "Shared" msgstr "Compartilhado" -#: src/pages/Shell.tsx:2870 +#: src/pages/Shell.tsx:2864 msgid "Show computer" msgstr "Mostrar computador" -#: src/pages/Auth.tsx:95 +#: src/pages/Auth.tsx:122 +#: src/pages/ResetPassword.tsx:186 msgid "Show password" msgstr "" -#: src/pages/Shell.tsx:2870 +#: src/pages/Shell.tsx:2864 msgid "Show settings" msgstr "Mostrar configurações" #: src/lib/localized-provider-hint.ts:7 -#: src/pages/Auth.tsx:161 +#: src/pages/Auth.tsx:171 #: src/pages/ModelSettingsOverlay.tsx:618 -#: src/pages/Onboarding.tsx:151 +#: src/pages/Onboarding.tsx:165 +#: src/pages/ResetPassword.tsx:155 msgid "Sign in" msgstr "Entrar" @@ -2657,28 +2704,32 @@ msgstr "Entrar" msgid "Sign in  →" msgstr "Entrar" -#: src/pages/Auth.tsx:17 +#: src/pages/Auth.tsx:142 +msgid "Sign in instead" +msgstr "" + +#: src/pages/Auth.tsx:29 msgid "Sign in to Sentra Bot" msgstr "Entrar no Sentra Bot" -#: src/pages/Auth.tsx:154 +#: src/pages/Auth.tsx:164 msgid "Sign up" msgstr "Cadastre-se" #. placeholder {0}: skill.name -#: src/pages/Shell.tsx:4251 +#: src/components/composer/Composer.tsx:391 msgid "Skill {0}" msgstr "Habilidade {0}" -#: src/pages/PluginsOverlay.tsx:713 +#: src/pages/PluginsOverlay.tsx:715 msgid "Skills" msgstr "" -#: src/pages/Shell.tsx:4588 +#: src/pages/Shell.tsx:3974 msgid "Skip" msgstr "Pular" -#: src/pages/Onboarding.tsx:548 +#: src/pages/Onboarding.tsx:562 msgid "Skip for now" msgstr "Ignorar por enquanto" @@ -2687,7 +2738,7 @@ msgid "Skip or deploy key" msgstr "Ignorar ou implantar chave" #. placeholder {0}: skipped.join(", ") -#: src/pages/Shell.tsx:1763 +#: src/pages/Shell.tsx:1746 msgid "Skipped {0}" msgstr "{0} ignorado" @@ -2704,21 +2755,21 @@ msgstr "" msgid "Space interrupts · Esc hangs up" msgstr "Interrupções de espaço · Esc desliga" -#: src/pages/Shell.tsx:4739 -#: src/pages/Shell.tsx:5002 +#: src/components/conversation/MessageView.tsx:159 +#: src/components/conversation/MessageView.tsx:422 msgid "Speak" msgstr "Falar" -#: src/pages/VoiceSettingsOverlay.tsx:194 +#: src/pages/VoiceSettingsOverlay.tsx:199 msgid "Speak + transcribe" msgstr "Falar + transcrever" -#: src/pages/VoiceSettingsOverlay.tsx:196 +#: src/pages/VoiceSettingsOverlay.tsx:201 msgid "Speak only" msgstr "Falar apenas" -#: src/pages/Shell.tsx:4735 -#: src/pages/Shell.tsx:4998 +#: src/components/conversation/MessageView.tsx:155 +#: src/components/conversation/MessageView.tsx:418 msgid "Speak this reply" msgstr "Fale esta resposta" @@ -2726,11 +2777,11 @@ msgstr "Fale esta resposta" msgid "Speaking…" msgstr "Falando…" -#: src/pages/Onboarding.tsx:560 +#: src/pages/Onboarding.tsx:574 msgid "Start from a proven Chief of Staff, or build your own from scratch." msgstr "" -#: src/pages/Onboarding.tsx:644 +#: src/pages/Onboarding.tsx:658 msgid "Start from scratch" msgstr "" @@ -2744,7 +2795,7 @@ msgstr "Iniciando" #: src/components/teach/TeachComputerSection.tsx:115 #: src/pages/ModelSettingsOverlay.tsx:616 -#: src/pages/Onboarding.tsx:487 +#: src/pages/Onboarding.tsx:501 msgid "Starting…" msgstr "Iniciando…" @@ -2752,20 +2803,20 @@ msgstr "Iniciando…" msgid "Steps" msgstr "Passos" -#: src/pages/Shell.tsx:3568 -#: src/pages/Shell.tsx:3572 -#: src/pages/Shell.tsx:4414 -#: src/pages/Shell.tsx:4739 -#: src/pages/Shell.tsx:5002 +#: src/components/composer/Composer.tsx:554 +#: src/components/conversation/MessageView.tsx:159 +#: src/components/conversation/MessageView.tsx:422 +#: src/pages/Shell.tsx:3557 +#: src/pages/Shell.tsx:3561 msgid "Stop" msgstr "Parar" -#: src/pages/Shell.tsx:4306 +#: src/components/composer/Composer.tsx:446 msgid "Stop dictation" msgstr "Parar ditado" -#: src/pages/Shell.tsx:4735 -#: src/pages/Shell.tsx:4998 +#: src/components/conversation/MessageView.tsx:155 +#: src/components/conversation/MessageView.tsx:418 msgid "Stop speaking" msgstr "Pare de Falar" @@ -2774,8 +2825,8 @@ msgstr "Pare de Falar" msgid "Stop teaching" msgstr "Parar de ensinar" -#: src/pages/Shell.tsx:2953 -#: src/pages/Shell.tsx:3588 +#: src/pages/Shell.tsx:2947 +#: src/pages/Shell.tsx:3577 msgid "Stop the bot first" msgstr "Pare o bot primeiro" @@ -2788,13 +2839,13 @@ msgstr "" msgid "Stored encrypted" msgstr "Armazenado criptografado" -#: src/pages/Shell.tsx:4856 +#: src/components/conversation/MessageView.tsx:276 msgid "subagent" msgstr "subagente" #: src/components/AskCard.tsx:126 #: src/pages/ModelSettingsOverlay.tsx:576 -#: src/pages/Onboarding.tsx:449 +#: src/pages/Onboarding.tsx:463 msgid "Submit" msgstr "Enviar" @@ -2806,8 +2857,8 @@ msgstr "" msgid "Switching…" msgstr "Alternando…" -#: src/pages/Shell.tsx:2956 -#: src/pages/Shell.tsx:3593 +#: src/pages/Shell.tsx:2950 +#: src/pages/Shell.tsx:3582 msgid "Take control" msgstr "Assumir o controle" @@ -2815,7 +2866,7 @@ msgstr "Assumir o controle" msgid "Teach a task" msgstr "Ensinar uma tarefa" -#: src/pages/Shell.tsx:2783 +#: src/pages/Shell.tsx:2777 msgid "Teaching in progress — stop teaching before sending a new message." msgstr "Ensino em andamento — pare de ensinar antes de enviar uma nova mensagem." @@ -2823,11 +2874,11 @@ msgstr "Ensino em andamento — pare de ensinar antes de enviar uma nova mensage msgid "Teaching needs a graphical sandbox computer. Desktop-host bots can run shell tasks, but not screen recording." msgstr "O ensino precisa de um computador sandbox gráfico. Os bots de host de desktop podem executar tarefas de shell, mas não a gravação de tela." -#: src/pages/Shell.tsx:5093 +#: src/pages/Shell.tsx:4008 msgid "Team" msgstr "Equipe" -#: src/pages/Shell.tsx:5943 +#: src/pages/Shell.tsx:4858 msgid "Team Computer" msgstr "Computador da equipe" @@ -2852,20 +2903,20 @@ msgstr "" msgid "The selected memory provider is not available in this build." msgstr "O provedor de memória selecionado não está disponível nesta compilação." -#: src/pages/Shell.tsx:5385 +#: src/pages/Shell.tsx:4300 msgid "Thinking" msgstr "Pensando" -#: src/pages/Shell.tsx:2896 +#: src/pages/Shell.tsx:2890 msgid "This bot runs on this computer, not a Linux desktop. Shell and files use your home folder." msgstr "Este bot é executado neste computador, não em um desktop Linux. Shell e arquivos usam sua pasta inicial." -#: src/pages/Shell.tsx:3617 +#: src/pages/Shell.tsx:3606 msgid "This bot runs on this computer. There is no separate Linux desktop. Ask it to use the shell; working directories under your home folder are allowed." msgstr "Este bot é executado neste computador. Não há uma área de trabalho Linux separada. Peça-lhe para usar o shell; diretórios de trabalho na sua pasta pessoal são permitidos." -#: src/pages/Shell.tsx:5785 -#: src/pages/Shell.tsx:5864 +#: src/pages/Shell.tsx:4700 +#: src/pages/Shell.tsx:4779 msgid "This cannot be undone." msgstr "Essa ação não pode ser desfeita." @@ -2881,6 +2932,10 @@ msgstr "Este computador executa comandos shell com sua conta, incluindo arquivos msgid "This file is not valid UTF-8 Markdown." msgstr "Este arquivo não é válido UTF-8 Markdown." +#: src/pages/ResetPassword.tsx:70 +msgid "This link has expired" +msgstr "" + #: src/pages/HostComputerPrompt.tsx:14 msgid "this Mac" msgstr "esse Mac" @@ -2889,15 +2944,15 @@ msgstr "esse Mac" msgid "This Mac runs shell commands with your account, including files in your home folder. Do not turn it on for a shared or public server." msgstr "Este Mac executa comandos do shell com sua conta, incluindo arquivos em sua pasta inicial. Não o ligue para um servidor compartilhado ou público." -#: src/pages/Shell.tsx:5670 +#: src/pages/Shell.tsx:4585 msgid "This permanently removes every message and stops current work. The chat remains available." msgstr "" -#: src/pages/Onboarding.tsx:523 +#: src/pages/Onboarding.tsx:537 msgid "This provider cannot paste a key here. Skip if this deployment already has credentials." msgstr "Este provedor não pode colar uma chave aqui. Ignore se esta implantação já tiver credenciais." -#: src/pages/Shell.tsx:6210 +#: src/components/conversation/MessageView.tsx:756 msgid "This server cannot be assigned without a bot." msgstr "Este servidor não pode ser atribuído sem um bot." @@ -2909,7 +2964,7 @@ msgstr "Este servidor não solicitou autorização do navegador." msgid "This server is already connected. Disconnect it first to authorize again." msgstr "Este servidor já está conectado. Desconecte-o primeiro para autorizar novamente." -#: src/pages/Shell.tsx:6249 +#: src/components/conversation/MessageView.tsx:795 msgid "This server uses browser sign-in. Authorize it to let your agents use its tools — a popup will open." msgstr "Este servidor usa o login do navegador. Autorize-o a permitir que seus agentes usem suas ferramentas — um pop-up será aberto." @@ -2921,17 +2976,17 @@ msgstr "Este login de assinatura ainda não está disponível no Sentra Bot. Use msgid "Time of day" msgstr "Hora do dia" -#: src/pages/Onboarding.tsx:672 -#: src/pages/Shell.tsx:5160 -#: src/pages/Shell.tsx:5326 +#: src/pages/Onboarding.tsx:686 +#: src/pages/Shell.tsx:4075 +#: src/pages/Shell.tsx:4241 msgid "Title" msgstr "Título" -#: src/pages/PluginsOverlay.tsx:872 +#: src/pages/PluginsOverlay.tsx:874 msgid "Tool sources" msgstr "Fontes de ferramentas" -#: src/pages/PluginsOverlay.tsx:834 +#: src/pages/PluginsOverlay.tsx:836 msgid "Treg token" msgstr "Token Treg" @@ -2952,7 +3007,7 @@ msgid "Unpin" msgstr "Desafixar" #. placeholder {0}: pending.file.name -#: src/pages/Shell.tsx:1834 +#: src/pages/Shell.tsx:1821 msgid "Unsupported file type: {0}" msgstr "Tipo de arquivo não suportado: {0}" @@ -2981,6 +3036,10 @@ msgstr "" msgid "Update finished with errors" msgstr "" +#: src/pages/ResetPassword.tsx:206 +msgid "Update password" +msgstr "" + #: src/components/SoftwareUpdateSection.tsx:172 #: src/components/SoftwareUpdateSection.tsx:189 msgid "Updated" @@ -2991,8 +3050,8 @@ msgstr "" msgid "Updating…" msgstr "Atualizando…" -#: src/pages/AccountSettingsOverlay.tsx:212 -#: src/pages/Shell.tsx:2639 +#: src/pages/AccountSettingsOverlay.tsx:145 +#: src/pages/Shell.tsx:2628 msgid "Usage" msgstr "Uso" @@ -3001,7 +3060,7 @@ msgid "Use {hostLabel}" msgstr "Usar {hostLabel}" #: src/pages/ModelSettingsOverlay.tsx:485 -#: src/pages/Onboarding.tsx:382 +#: src/pages/Onboarding.tsx:396 msgid "Use a found model" msgstr "Usar um modelo encontrado" @@ -3009,25 +3068,25 @@ msgstr "Usar um modelo encontrado" msgid "Use this model" msgstr "Use este modelo" -#: src/pages/PluginsOverlay.tsx:855 +#: src/pages/PluginsOverlay.tsx:857 msgid "Verify and add" msgstr "Verificar e adicionar" -#: src/pages/PluginsOverlay.tsx:853 +#: src/pages/PluginsOverlay.tsx:855 msgid "Verifying…" msgstr "Verificando…" -#: src/pages/Shell.tsx:2627 -#: src/pages/Shell.tsx:5438 -#: src/pages/VoiceSettingsOverlay.tsx:124 -#: src/pages/VoiceSettingsOverlay.tsx:264 +#: src/pages/Shell.tsx:2616 +#: src/pages/Shell.tsx:4353 +#: src/pages/VoiceSettingsOverlay.tsx:129 +#: src/pages/VoiceSettingsOverlay.tsx:269 msgid "Voice" msgstr "Voz" #: src/pages/ModelSettingsOverlay.tsx:580 #: src/pages/ModelSettingsOverlay.tsx:602 -#: src/pages/Onboarding.tsx:453 -#: src/pages/Onboarding.tsx:475 +#: src/pages/Onboarding.tsx:467 +#: src/pages/Onboarding.tsx:489 msgid "Waiting for sign-in…" msgstr "Aguardando login..." @@ -3039,7 +3098,7 @@ msgstr "" msgid "Waiting for your message…" msgstr "" -#: src/pages/Shell.tsx:6093 +#: src/components/conversation/MessageView.tsx:639 msgid "Waiting…" msgstr "Aguardando…" @@ -3053,7 +3112,7 @@ msgstr "" msgid "Weekdays" msgstr "Dias da semana" -#: src/pages/Shell.tsx:5755 +#: src/pages/Shell.tsx:4670 msgid "What about its memories?" msgstr "E suas memórias?" @@ -3065,8 +3124,8 @@ msgstr "Que resultado você demonstrará?" msgid "What should this routine do each time it runs?" msgstr "" -#: src/pages/Onboarding.tsx:685 -#: src/pages/Shell.tsx:5175 +#: src/pages/Onboarding.tsx:699 +#: src/pages/Shell.tsx:4090 msgid "What this bot is for" msgstr "Para que serve este bot" @@ -3099,17 +3158,19 @@ msgstr "Quando usar" msgid "Where should bots run?" msgstr "Onde os bots devem ser executados?" -#: src/pages/Auth.tsx:142 +#: src/pages/Auth.tsx:152 #: src/pages/CallView.tsx:242 +#: src/pages/ResetPassword.tsx:103 +#: src/pages/ResetPassword.tsx:206 msgid "Working…" msgstr "Funcionando" -#: src/pages/Shell.tsx:5368 +#: src/pages/Shell.tsx:4283 msgid "Workspace default" msgstr "Padrão do espaço de trabalho" -#: src/pages/Shell.tsx:1558 -#: src/pages/Shell.tsx:2175 +#: src/pages/Shell.tsx:1541 +#: src/pages/Shell.tsx:2164 msgid "You" msgstr "Você" @@ -3121,16 +3182,21 @@ msgstr "Você pode fechar esta guia se ela não for redirecionada automaticament msgid "You can close this window." msgstr "Você pode fechar esta janela." -#: src/pages/Shell.tsx:2933 -#: src/pages/Shell.tsx:3558 +#: src/pages/Shell.tsx:2927 +#: src/pages/Shell.tsx:3547 msgid "You have control" msgstr "Você tem o controle" -#: src/pages/Onboarding.tsx:660 +#: src/pages/ResetPassword.tsx:152 +msgid "You’ve been signed out everywhere. Sign in with your new password." +msgstr "" + +#: src/pages/Onboarding.tsx:674 msgid "Your bot" msgstr "" -#: src/pages/Auth.tsx:69 +#: src/pages/Auth.tsx:80 +#: src/pages/ResetPassword.tsx:89 msgid "Your email address" msgstr "Seu endereço de e-mail" @@ -3138,7 +3204,7 @@ msgstr "Seu endereço de e-mail" msgid "Your key or subscription token is stored securely and is never shown here." msgstr "Sua chave ou token de assinatura é armazenado com segurança e nunca é mostrado aqui." -#: src/pages/Auth.tsx:56 +#: src/pages/Auth.tsx:67 msgid "Your name" msgstr "O seu nome" diff --git a/apps/web/src/locales/tr/messages.po b/apps/web/src/locales/tr/messages.po index d86c6751..262b751d 100644 --- a/apps/web/src/locales/tr/messages.po +++ b/apps/web/src/locales/tr/messages.po @@ -13,7 +13,7 @@ msgstr "" "Language-Team: \n" "Plural-Forms: \n" -#: src/pages/Shell.tsx:2423 +#: src/pages/Shell.tsx:2412 msgid " (unread)" msgstr " (okunmadı)" @@ -31,12 +31,12 @@ msgid "{0, plural, one {# model} other {# models}}" msgstr "{0, plural, one {# model} other {# model}}" #. placeholder {0}: file.name -#: src/pages/Shell.tsx:1743 +#: src/pages/Shell.tsx:1726 msgid "{0} (max {ATTACHMENT_MAX_COUNT} attachments)" msgstr "{0} (en fazla {ATTACHMENT_MAX_COUNT} ek)" #. placeholder {0}: file.name -#: src/pages/Shell.tsx:1747 +#: src/pages/Shell.tsx:1730 msgid "{0} (over 10 MiB)" msgstr "{0} (10 MiB üzeri)" @@ -46,12 +46,12 @@ msgid "{0} {unitLabel}" msgstr "{0} {unitLabel}" #. placeholder {0}: block.name -#: src/pages/Shell.tsx:6066 +#: src/components/conversation/MessageView.tsx:612 msgid "{0} connection" msgstr "{0} bağlantısı" #. placeholder {0}: computer.busyBotName -#: src/pages/Shell.tsx:2937 +#: src/pages/Shell.tsx:2931 msgid "{0} is using it" msgstr "{0} bunu kullanıyor" @@ -67,8 +67,8 @@ msgstr "{0} MB" #. placeholder {0}: usage.runs #. placeholder {1}: usage.inputTokens + usage.outputTokens -#: src/pages/AccountSettingsOverlay.tsx:216 -#: src/pages/Shell.tsx:2644 +#: src/pages/AccountSettingsOverlay.tsx:149 +#: src/pages/Shell.tsx:2633 msgid "{0} runs · {1} tokens" msgstr "{0} çalıştırma · {1} token" @@ -81,7 +81,7 @@ msgstr "{botName} · {0, plural, one {# eş bot} other {# eş bot}}" msgid "{botName} has not messaged another bot yet." msgstr "{botName} henüz başka bir bota mesaj göndermedi." -#: src/pages/Shell.tsx:5943 +#: src/pages/Shell.tsx:4858 msgid "{botName}’s computer" msgstr "{botName} adlı botun bilgisayarı" @@ -125,12 +125,12 @@ msgstr "{size} B" msgid "{title}, {label}" msgstr "{title}, {label}" -#: src/pages/Shell.tsx:3723 +#: src/pages/Shell.tsx:3712 msgid "{workingBotName} is working" msgstr "{workingBotName} çalışıyor" #. placeholder {0}: mention.name -#: src/pages/Shell.tsx:4223 +#: src/components/composer/Composer.tsx:363 msgid "@{0}" msgstr "@{0}" @@ -146,11 +146,11 @@ msgstr "+ Görev öğret" msgid "Access token (optional)" msgstr "Erişim token'ı (isteğe bağlı)" -#: src/pages/AccountSettingsOverlay.tsx:128 +#: src/pages/AccountSettingsOverlay.tsx:107 msgid "Account" msgstr "Hesap" -#: src/pages/Shell.tsx:5444 +#: src/pages/Shell.tsx:4359 msgid "Account default" msgstr "Hesap varsayılanı" @@ -171,17 +171,17 @@ msgstr "" msgid "Active model" msgstr "Etkin model" -#: src/pages/VoiceSettingsOverlay.tsx:149 +#: src/pages/VoiceSettingsOverlay.tsx:154 msgid "Active voice" msgstr "Etkin ses" -#: src/pages/Shell.tsx:2213 -#: src/pages/Shell.tsx:2215 +#: src/pages/Shell.tsx:2202 +#: src/pages/Shell.tsx:2204 msgid "Activity" msgstr "Etkinlik" -#: src/pages/PluginsOverlay.tsx:457 -#: src/pages/PluginsOverlay.tsx:668 +#: src/pages/PluginsOverlay.tsx:458 +#: src/pages/PluginsOverlay.tsx:670 #: src/pages/ScratchpadSection.tsx:188 msgid "Add" msgstr "Ekle" @@ -190,7 +190,7 @@ msgstr "Ekle" msgid "Add a model in Settings to use this." msgstr "" -#: src/pages/Shell.tsx:3157 +#: src/pages/Shell.tsx:3151 msgid "Add a run time for this one-shot." msgstr "" @@ -198,7 +198,7 @@ msgstr "" msgid "Add a schedule or webhook to run this routine." msgstr "" -#: src/pages/Shell.tsx:3129 +#: src/pages/Shell.tsx:3123 msgid "Add a schedule or webhook trigger" msgstr "" @@ -222,15 +222,15 @@ msgstr "Bir HTTPS sunucu URL'si gir." msgid "Add item" msgstr "Öğe ekle" -#: src/pages/PluginsOverlay.tsx:762 +#: src/pages/PluginsOverlay.tsx:764 msgid "Add MCP server" msgstr "MCP sunucusu ekle" -#: src/pages/PluginsOverlay.tsx:765 +#: src/pages/PluginsOverlay.tsx:767 msgid "Add OpenAPI" msgstr "OpenAPI ekle" -#: src/pages/PluginsOverlay.tsx:780 +#: src/pages/PluginsOverlay.tsx:782 msgid "Add remote MCP server" msgstr "Uzak MCP sunucusu ekle" @@ -243,7 +243,7 @@ msgstr "Sunucu ekle" msgid "Add to routine" msgstr "Rutine ekle" -#: src/pages/PluginsOverlay.tsx:768 +#: src/pages/PluginsOverlay.tsx:770 msgid "Add Treg" msgstr "Treg ekle" @@ -252,15 +252,15 @@ msgid "Add trigger" msgstr "" #: src/pages/McpServersOverlay.tsx:363 -#: src/pages/PluginsOverlay.tsx:452 -#: src/pages/PluginsOverlay.tsx:663 +#: src/pages/PluginsOverlay.tsx:453 +#: src/pages/PluginsOverlay.tsx:665 msgid "Adding…" msgstr "Ekleniyor…" -#: src/pages/AccountSettingsOverlay.tsx:247 -#: src/pages/PluginsOverlay.tsx:742 +#: src/pages/AccountSettingsOverlay.tsx:180 +#: src/pages/PluginsOverlay.tsx:744 #: src/pages/RoutineSchedule.tsx:42 -#: src/pages/Shell.tsx:5347 +#: src/pages/Shell.tsx:4262 msgid "Advanced" msgstr "Gelişmiş" @@ -272,7 +272,7 @@ msgstr "" msgid "Agent access for new servers" msgstr "Yeni sunucular için agent erişimi" -#: src/pages/Shell.tsx:2736 +#: src/pages/Shell.tsx:2730 msgid "Agent computer" msgstr "Agent bilgisayarı" @@ -319,7 +319,7 @@ msgstr "Satın alma işlemlerine sormadan izin ver" msgid "Allowed once" msgstr "Bir kez izin verildi" -#: src/pages/Auth.tsx:159 +#: src/pages/Auth.tsx:169 msgid "Already have an account?" msgstr "Zaten hesabın var mı?" @@ -331,6 +331,10 @@ msgstr "Bu araca her zaman izin ver" msgid "Always allowed" msgstr "Her zaman izinli" +#: src/pages/Auth.tsx:140 +msgid "An account with this email already exists." +msgstr "" + #: src/components/AskCard.tsx:138 msgid "Answer" msgstr "Yanıtla" @@ -352,14 +356,14 @@ msgstr "" #: src/pages/ModelSettingsOverlay.tsx:630 #: src/pages/ModelSettingsOverlay.tsx:633 #: src/pages/ModelSettingsOverlay.tsx:649 -#: src/pages/Onboarding.tsx:496 -#: src/pages/Onboarding.tsx:499 #: src/pages/Onboarding.tsx:510 -#: src/pages/VoiceSettingsOverlay.tsx:236 +#: src/pages/Onboarding.tsx:513 +#: src/pages/Onboarding.tsx:524 +#: src/pages/VoiceSettingsOverlay.tsx:241 msgid "API key" msgstr "API anahtarı" -#: src/pages/PluginsOverlay.tsx:816 +#: src/pages/PluginsOverlay.tsx:818 msgid "API key header" msgstr "API anahtarı üstbilgisi" @@ -371,13 +375,13 @@ msgstr "Sunucu ekle'ye tıkladığında uygulanır. Erişimi istediğin zaman de msgid "Approval boundaries" msgstr "Onay sınırları" +#: src/components/conversation/MessageView.tsx:805 #: src/pages/PhoneSettingsOverlay.tsx:243 #: src/pages/PhoneSettingsOverlay.tsx:310 -#: src/pages/Shell.tsx:6259 msgid "Approve" msgstr "Onayla" -#: src/pages/Shell.tsx:6250 +#: src/components/conversation/MessageView.tsx:796 msgid "Approve this server to let your agent use its tools." msgstr "Agent'ının bu sunucunun araçlarını kullanabilmesi için sunucuyu onayla." @@ -385,15 +389,15 @@ msgstr "Agent'ının bu sunucunun araçlarını kullanabilmesi için sunucuyu on msgid "Archive" msgstr "Arşivle" -#: src/pages/Shell.tsx:4892 +#: src/components/conversation/MessageView.tsx:312 msgid "archived" msgstr "arşivlendi" -#: src/pages/Shell.tsx:2487 +#: src/pages/Shell.tsx:2476 msgid "Archived" msgstr "Arşivlendi" -#: src/pages/Shell.tsx:4903 +#: src/components/conversation/MessageView.tsx:323 msgid "Archived. Chat, memory, and files kept." msgstr "Arşivlendi. Sohbet, hafıza ve dosyalar korundu." @@ -432,7 +436,7 @@ msgstr "Satın almadan önce sor" msgid "Ask before sending external email" msgstr "Dışarıya e-posta göndermeden önce sor" -#: src/pages/Shell.tsx:2939 +#: src/pages/Shell.tsx:2933 msgid "Asleep" msgstr "Uykuda" @@ -447,16 +451,21 @@ msgstr "saat {0}" msgid "at {timeSelect}" msgstr "saat {timeSelect}" -#: src/pages/Shell.tsx:4297 +#: src/pages/Auth.tsx:134 +#: src/pages/ResetPassword.tsx:197 +msgid "At least 8 characters" +msgstr "" + +#: src/components/composer/Composer.tsx:437 msgid "Attach file" msgstr "Dosya ekle" -#: src/pages/Shell.tsx:4498 +#: src/components/composer/shared.ts:21 msgid "Attachment" msgstr "Ek" #: src/pages/ModelSettingsOverlay.tsx:563 -#: src/pages/Onboarding.tsx:437 +#: src/pages/Onboarding.tsx:451 msgid "Authorization code or callback URL" msgstr "Yetkilendirme kodu veya callback URL'si" @@ -464,12 +473,12 @@ msgstr "Yetkilendirme kodu veya callback URL'si" msgid "Authorization expired — reconnect required" msgstr "Yetkilendirme süresi doldu — yeniden bağlanmak gerekiyor" -#: src/pages/Shell.tsx:6051 +#: src/components/conversation/MessageView.tsx:597 msgid "Authorization timed out. Please try again." msgstr "Yetkilendirme zaman aşımına uğradı. Lütfen tekrar dene." -#: src/pages/Shell.tsx:6093 -#: src/pages/Shell.tsx:6259 +#: src/components/conversation/MessageView.tsx:639 +#: src/components/conversation/MessageView.tsx:805 msgid "Authorize" msgstr "Yetkilendir" @@ -477,34 +486,35 @@ msgstr "Yetkilendir" msgid "Available after the routine is saved" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:161 -msgid "Avatars" -msgstr "" - #: src/pages/RoutineEditor.tsx:243 msgid "Back" msgstr "" +#: src/pages/ResetPassword.tsx:61 +#: src/pages/ResetPassword.tsx:107 +msgid "Back to sign in" +msgstr "" + #: src/pages/memory-providers/SupermemorySettingsForm.tsx:48 msgid "Base URL" msgstr "Temel URL" -#: src/pages/PluginsOverlay.tsx:813 +#: src/pages/PluginsOverlay.tsx:815 msgid "Bearer token" msgstr "Bearer token" -#: src/pages/Shell.tsx:5935 +#: src/pages/Shell.tsx:4850 msgid "Booting live desktop…" msgstr "Canlı masaüstü başlatılıyor…" #. placeholder {0}: active?.name -#: src/pages/Shell.tsx:3528 +#: src/pages/Shell.tsx:3517 msgid "Booting up {0}’s computer" msgstr "{0} adlı botun bilgisayarı başlatılıyor" -#: src/pages/Shell.tsx:4752 -#: src/pages/Shell.tsx:4753 -#: src/pages/Shell.tsx:4896 +#: src/components/conversation/MessageView.tsx:172 +#: src/components/conversation/MessageView.tsx:173 +#: src/components/conversation/MessageView.tsx:316 msgid "bot" msgstr "bot" @@ -513,7 +523,7 @@ msgstr "bot" msgid "Bot" msgstr "" -#: src/pages/Shell.tsx:1559 +#: src/pages/Shell.tsx:1542 msgid "Bot" msgstr "Bot" @@ -521,11 +531,11 @@ msgstr "Bot" msgid "Bot messages" msgstr "Bot mesajları" -#: src/pages/Shell.tsx:3625 +#: src/pages/Shell.tsx:3614 msgid "Bot screen" msgstr "Bot ekranı" -#: src/pages/Shell.tsx:2903 +#: src/pages/Shell.tsx:2897 msgid "Bot screen preview" msgstr "Bot ekranı önizlemesi" @@ -533,36 +543,36 @@ msgstr "Bot ekranı önizlemesi" msgid "Bots act without asking by default. Add an exception only when you want to review a type of action first. These preferences apply across all your bots." msgstr "Botlar varsayılan olarak sormadan hareket eder. Yalnızca belirli bir işlem türünü önce incelemek istediğinde istisna ekle. Bu tercihler tüm botlarında geçerlidir." -#: src/pages/Shell.tsx:3724 +#: src/pages/Shell.tsx:3713 msgid "Bots are working" msgstr "Botlar çalışıyor" -#: src/pages/VoiceSettingsOverlay.tsx:130 +#: src/pages/VoiceSettingsOverlay.tsx:135 msgid "Bring your own key. The provider is swappable; your bots keep the same speak and call buttons." msgstr "Kendi anahtarını getir. Sağlayıcı değiştirilebilir; botlarındaki seslendirme ve arama düğmeleri aynı kalır." #: src/pages/CallView.tsx:233 -#: src/pages/Shell.tsx:2718 -#: src/pages/Shell.tsx:2719 +#: src/pages/Shell.tsx:2712 +#: src/pages/Shell.tsx:2713 msgid "Call" msgstr "Ara" -#: src/App.tsx:125 +#: src/App.tsx:129 msgid "Can't reach the server." msgstr "Sunucuya ulaşılamıyor." #: src/components/AskCard.tsx:161 #: src/components/ComputerMaintenanceActions.tsx:108 #: src/components/teach/TeachComputerSection.tsx:122 -#: src/pages/PluginsOverlay.tsx:864 -#: src/pages/Shell.tsx:5611 -#: src/pages/Shell.tsx:5683 -#: src/pages/Shell.tsx:5798 -#: src/pages/Shell.tsx:5874 +#: src/pages/PluginsOverlay.tsx:866 +#: src/pages/Shell.tsx:4526 +#: src/pages/Shell.tsx:4598 +#: src/pages/Shell.tsx:4713 +#: src/pages/Shell.tsx:4789 msgid "Cancel" msgstr "İptal" -#: src/pages/Shell.tsx:5140 +#: src/pages/Shell.tsx:4055 msgid "Cancel new bot" msgstr "Yeni botu iptal et" @@ -570,7 +580,7 @@ msgstr "Yeni botu iptal et" msgid "Cancel new group" msgstr "Yeni grubu iptal et" -#: src/pages/Shell.tsx:4170 +#: src/components/composer/Composer.tsx:310 msgid "Cancel reply" msgstr "Yanıtı iptal et" @@ -582,11 +592,11 @@ msgstr "İptal edildi" msgid "Channels" msgstr "" -#: src/pages/Shell.tsx:6156 +#: src/components/conversation/MessageView.tsx:702 msgid "Chart failed to render: {error}" msgstr "Grafik çizilemedi: {error}" -#: src/pages/Shell.tsx:4439 +#: src/components/composer/Composer.tsx:579 msgid "Chat Settings" msgstr "Sohbet Ayarları" @@ -602,11 +612,15 @@ msgstr "" msgid "Check for updates" msgstr "" -#: src/pages/Shell.tsx:3170 -#: src/pages/Shell.tsx:3180 +#: src/pages/Shell.tsx:3164 +#: src/pages/Shell.tsx:3174 msgid "Check in." msgstr "Durum bildir." +#: src/pages/ResetPassword.tsx:52 +msgid "Check your email" +msgstr "" + #: src/components/SoftwareUpdateSection.tsx:71 msgid "Checking…" msgstr "" @@ -615,33 +629,33 @@ msgstr "" msgid "Checkout has local changes. Clean it before updating." msgstr "" -#: src/pages/Onboarding.tsx:269 +#: src/pages/Onboarding.tsx:283 msgid "Choose a model to get started." msgstr "Başlamak için bir model seç." +#: src/pages/ResetPassword.tsx:162 +msgid "Choose a new password" +msgstr "" + #: src/pages/ModelSettingsOverlay.tsx:310 msgid "Choose which connected model Sentra Bot uses." msgstr "Sentra Bot'nun hangi bağlı modeli kullanacağını seç." -#: src/pages/AccountSettingsOverlay.tsx:187 -msgid "Clay" -msgstr "" - -#: src/pages/Shell.tsx:5698 +#: src/pages/Shell.tsx:4613 msgid "Clear" msgstr "Temizle" #. placeholder {0}: bot.name -#: src/pages/Shell.tsx:5664 +#: src/pages/Shell.tsx:4579 msgid "Clear {0}’s conversation?" msgstr "{0} sohbeti temizlensin mi?" #: src/pages/BotContextMenu.tsx:103 -#: src/pages/Shell.tsx:5499 +#: src/pages/Shell.tsx:4414 msgid "Clear conversation" msgstr "Sohbeti temizle" -#: src/pages/Shell.tsx:5698 +#: src/pages/Shell.tsx:4613 msgid "Clearing…" msgstr "Temizleniyor…" @@ -655,19 +669,19 @@ msgstr "Kapat" msgid "Close bot messages" msgstr "Bot mesajlarını kapat" -#: src/pages/Shell.tsx:6341 +#: src/components/conversation/MessageView.tsx:887 msgid "Close chart" msgstr "Grafiği kapat" -#: src/pages/Shell.tsx:3599 +#: src/pages/Shell.tsx:3588 msgid "Close computer" msgstr "Bilgisayarı kapat" -#: src/pages/Shell.tsx:6441 +#: src/components/conversation/MessageView.tsx:987 msgid "Close image preview" msgstr "Görsel önizlemesini kapat" -#: src/pages/PluginsOverlay.tsx:586 +#: src/pages/PluginsOverlay.tsx:587 msgid "Close integrations" msgstr "Entegrasyonları kapat" @@ -683,11 +697,11 @@ msgstr "Hafıza ayarlarını kapat" msgid "Close model settings" msgstr "Model ayarlarını kapat" -#: src/pages/Shell.tsx:2195 +#: src/pages/Shell.tsx:2184 msgid "Close navigation" msgstr "Gezinmeyi kapat" -#: src/pages/Shell.tsx:2881 +#: src/pages/Shell.tsx:2875 msgid "Close panel" msgstr "Paneli kapat" @@ -700,11 +714,11 @@ msgstr "" msgid "Close preview" msgstr "Önizlemeyi kapat" -#: src/pages/AccountSettingsOverlay.tsx:118 +#: src/pages/AccountSettingsOverlay.tsx:97 msgid "Close user settings" msgstr "Kullanıcı ayarlarını kapat" -#: src/pages/VoiceSettingsOverlay.tsx:139 +#: src/pages/VoiceSettingsOverlay.tsx:144 msgid "Close voice settings" msgstr "Ses ayarlarını kapat" @@ -718,7 +732,7 @@ msgid "Code" msgstr "" #. placeholder {0}: group.title -#: src/pages/Shell.tsx:2305 +#: src/pages/Shell.tsx:2294 msgid "Collapse {0}" msgstr "" @@ -734,28 +748,28 @@ msgstr "Komut" msgid "Complete" msgstr "Tamamlandı" -#: src/pages/Shell.tsx:5050 -#: src/pages/Shell.tsx:5078 +#: src/components/conversation/MessageView.tsx:470 +#: src/pages/Shell.tsx:3993 msgid "Computer" msgstr "Bilgisayar" -#: src/pages/Shell.tsx:5938 +#: src/pages/Shell.tsx:4853 msgid "Computer failed to boot" msgstr "Bilgisayar başlatılamadı" -#: src/pages/Shell.tsx:3647 +#: src/pages/Shell.tsx:3636 msgid "Computer is asleep" msgstr "Bilgisayar uykuda" -#: src/pages/Shell.tsx:5937 +#: src/pages/Shell.tsx:4852 msgid "Computer is asleep. Take control to wake it." msgstr "Bilgisayar uykuda. Uyandırmak için kontrolü alın." -#: src/pages/Shell.tsx:5939 +#: src/pages/Shell.tsx:4854 msgid "Computer is stopped" msgstr "Bilgisayar durduruldu" -#: src/pages/AccountSettingsOverlay.tsx:234 +#: src/pages/AccountSettingsOverlay.tsx:167 msgid "Computers" msgstr "Bilgisayarlar" @@ -776,12 +790,12 @@ msgid "Confirm delete" msgstr "Silmeyi onayla" #: src/pages/memory-providers/SupermemorySettingsForm.tsx:80 -#: src/pages/PluginsOverlay.tsx:494 -#: src/pages/VoiceSettingsOverlay.tsx:257 +#: src/pages/PluginsOverlay.tsx:495 +#: src/pages/VoiceSettingsOverlay.tsx:262 msgid "Connect" msgstr "Bağlan" -#: src/pages/Onboarding.tsx:266 +#: src/pages/Onboarding.tsx:280 msgid "Connect a model" msgstr "Model bağla" @@ -789,11 +803,11 @@ msgstr "Model bağla" msgid "Connect API key" msgstr "API anahtarıyla bağlan" -#: src/pages/VoiceSettingsOverlay.tsx:160 +#: src/pages/VoiceSettingsOverlay.tsx:165 msgid "Connect ElevenLabs, OpenAI, or Cartesia" msgstr "ElevenLabs, OpenAI veya Cartesia bağla" -#: src/pages/Shell.tsx:6239 +#: src/components/conversation/MessageView.tsx:785 msgid "Connect MCP server “{name}”" msgstr "“{name}” MCP sunucusunu bağla" @@ -809,31 +823,31 @@ msgstr "Uzak veya yerel araç sunucuları bağla ve hangi agent'ların kullanabi msgid "Connect this provider to use it as your personal model." msgstr "Kişisel modelin olarak kullanmak için bu sağlayıcıyı bağla." -#: src/pages/PluginsOverlay.tsx:778 +#: src/pages/PluginsOverlay.tsx:780 msgid "Connect Treg" msgstr "Treg'i bağla" +#: src/components/conversation/MessageView.tsx:636 #: src/pages/McpOAuthCallback.tsx:53 #: src/pages/MemorySettingsOverlay.tsx:163 #: src/pages/ModelSettingsOverlay.tsx:378 -#: src/pages/Shell.tsx:6090 -#: src/pages/VoiceSettingsOverlay.tsx:202 +#: src/pages/VoiceSettingsOverlay.tsx:207 msgid "Connected" msgstr "Bağlandı" -#: src/pages/Shell.tsx:6269 +#: src/components/conversation/MessageView.tsx:815 msgid "Connected — its tools are available from your next message." msgstr "Bağlandı — araçları bir sonraki mesajından itibaren kullanılabilir." #. placeholder {0}: credential.label #. placeholder {0}: selected.name #: src/pages/ModelSettingsOverlay.tsx:522 -#: src/pages/VoiceSettingsOverlay.tsx:223 +#: src/pages/VoiceSettingsOverlay.tsx:228 msgid "Connected · {0}" msgstr "Bağlı · {0}" #. placeholder {0}: selected.name -#: src/pages/VoiceSettingsOverlay.tsx:73 +#: src/pages/VoiceSettingsOverlay.tsx:78 msgid "Connected {0}." msgstr "{0} bağlandı." @@ -844,29 +858,29 @@ msgstr "{0} bağlandı." msgid "Connected and using {0}." msgstr "Bağlandı, {0} kullanılıyor." +#: src/components/conversation/MessageView.tsx:805 #: src/pages/McpServersOverlay.tsx:16 #: src/pages/memory-providers/SupermemorySettingsForm.tsx:80 -#: src/pages/PluginsOverlay.tsx:494 -#: src/pages/Shell.tsx:6259 -#: src/pages/VoiceSettingsOverlay.tsx:253 +#: src/pages/PluginsOverlay.tsx:495 +#: src/pages/VoiceSettingsOverlay.tsx:258 msgid "Connecting…" msgstr "Bağlanıyor…" #. placeholder {0}: item.name -#: src/pages/PluginsOverlay.tsx:297 +#: src/pages/PluginsOverlay.tsx:298 msgid "Connection to {0} is still pending. You can close this and check again." msgstr "{0} bağlantısı hâlâ beklemede. Bunu kapatıp daha sonra tekrar kontrol edebilirsin." -#: src/pages/Onboarding.tsx:538 -#: src/pages/Onboarding.tsx:697 +#: src/pages/Onboarding.tsx:552 +#: src/pages/Onboarding.tsx:711 msgid "Continue" msgstr "Devam" -#: src/pages/Auth.tsx:144 +#: src/pages/Auth.tsx:154 msgid "Continue with email" msgstr "E-posta ile devam et" -#: src/pages/Shell.tsx:4535 +#: src/pages/Shell.tsx:3921 msgid "Copy" msgstr "Kopyala" @@ -878,11 +892,11 @@ msgstr "Eklenemedi" msgid "Could not add MCP server" msgstr "MCP sunucusu eklenemedi" -#: src/pages/Shell.tsx:6226 +#: src/components/conversation/MessageView.tsx:772 msgid "Could not approve this server" msgstr "Bu sunucu onaylanamadı" -#: src/pages/Shell.tsx:6054 +#: src/components/conversation/MessageView.tsx:600 msgid "Could not authorize this app" msgstr "Bu uygulama yetkilendirilemedi" @@ -890,7 +904,7 @@ msgstr "Bu uygulama yetkilendirilemedi" msgid "Could not change the default model" msgstr "Varsayılan model değiştirilemedi" -#: src/pages/Shell.tsx:5692 +#: src/pages/Shell.tsx:4607 msgid "Could not clear conversation" msgstr "Sohbet temizlenemedi" @@ -898,7 +912,7 @@ msgstr "Sohbet temizlenemedi" msgid "Could not complete OAuth" msgstr "OAuth tamamlanamadı" -#: src/pages/PluginsOverlay.tsx:301 +#: src/pages/PluginsOverlay.tsx:302 msgid "Could not connect" msgstr "Bağlanılamadı" @@ -911,15 +925,15 @@ msgstr "{0} bağlanamadı" msgid "Could not connect this provider" msgstr "Bu sağlayıcı bağlanamadı" -#: src/pages/VoiceSettingsOverlay.tsx:75 +#: src/pages/VoiceSettingsOverlay.tsx:80 msgid "Could not connect this voice provider" msgstr "Bu ses sağlayıcısı bağlanamadı" -#: src/pages/Auth.tsx:33 +#: src/pages/Auth.tsx:50 msgid "Could not continue" msgstr "Devam edilemedi" -#: src/pages/Shell.tsx:5128 +#: src/pages/Shell.tsx:4043 msgid "Could not create bot" msgstr "Bot oluşturulamadı" @@ -927,19 +941,19 @@ msgstr "Bot oluşturulamadı" msgid "Could not create group" msgstr "Grup oluşturulamadı" -#: src/pages/Shell.tsx:5583 +#: src/pages/Shell.tsx:4498 msgid "Could not create section" msgstr "Bölüm oluşturulamadı" -#: src/pages/Onboarding.tsx:251 +#: src/pages/Onboarding.tsx:265 msgid "Could not create your bot" msgstr "Botun oluşturulamadı" -#: src/pages/Shell.tsx:5807 +#: src/pages/Shell.tsx:4722 msgid "Could not delete bot" msgstr "Bot silinemedi" -#: src/pages/Shell.tsx:5887 +#: src/pages/Shell.tsx:4802 msgid "Could not delete group" msgstr "" @@ -947,7 +961,7 @@ msgstr "" msgid "Could not delete MCP server" msgstr "MCP sunucusu silinemedi" -#: src/pages/Shell.tsx:5888 +#: src/pages/Shell.tsx:4803 msgid "Could not delete routine" msgstr "Rutin silinemedi" @@ -968,15 +982,15 @@ msgstr "{0} indirilemedi. Tekrar dene." msgid "Could not download {name}. Try again." msgstr "{name} indirilemedi. Tekrar dene." -#: src/pages/PluginsOverlay.tsx:952 +#: src/pages/PluginsOverlay.tsx:954 msgid "Could not install connector" msgstr "Bağlayıcı kurulamadı" -#: src/pages/PluginsOverlay.tsx:370 +#: src/pages/PluginsOverlay.tsx:371 msgid "Could not install MCP server" msgstr "" -#: src/pages/PluginsOverlay.tsx:409 +#: src/pages/PluginsOverlay.tsx:410 msgid "Could not install skill" msgstr "" @@ -984,7 +998,7 @@ msgstr "" msgid "Could not load approval rules" msgstr "Onay kuralları yüklenemedi" -#: src/pages/PluginsOverlay.tsx:130 +#: src/pages/PluginsOverlay.tsx:133 msgid "Could not load integrations" msgstr "Entegrasyonlar yüklenemedi" @@ -1004,16 +1018,16 @@ msgstr "Bu dosya yüklenemedi." msgid "Could not load update status" msgstr "" -#: src/pages/VoiceSettingsOverlay.tsx:47 +#: src/pages/VoiceSettingsOverlay.tsx:52 msgid "Could not load voice settings" msgstr "Ses ayarları yüklenemedi" -#: src/pages/VoiceSettingsOverlay.tsx:109 +#: src/pages/VoiceSettingsOverlay.tsx:114 msgid "Could not play a test clip" msgstr "Deneme sesi çalınamadı" #: src/pages/ModelSettingsOverlay.tsx:221 -#: src/pages/Onboarding.tsx:197 +#: src/pages/Onboarding.tsx:211 msgid "Could not reach this model server" msgstr "Bu model sunucusuna ulaşılamadı" @@ -1021,7 +1035,7 @@ msgstr "Bu model sunucusuna ulaşılamadı" msgid "Could not remove" msgstr "Kaldırılamadı" -#: src/pages/PluginsOverlay.tsx:965 +#: src/pages/PluginsOverlay.tsx:967 msgid "Could not remove connector" msgstr "Bağlayıcı kaldırılamadı" @@ -1029,7 +1043,7 @@ msgstr "Bağlayıcı kaldırılamadı" msgid "Could not remove group" msgstr "Grup kaldırılamadı" -#: src/pages/PluginsOverlay.tsx:396 +#: src/pages/PluginsOverlay.tsx:397 msgid "Could not remove MCP server" msgstr "" @@ -1037,23 +1051,27 @@ msgstr "" msgid "Could not remove rule" msgstr "Kural kaldırılamadı" -#: src/pages/PluginsOverlay.tsx:423 +#: src/pages/PluginsOverlay.tsx:424 msgid "Could not remove skill" msgstr "" -#: src/pages/Shell.tsx:6146 +#: src/components/conversation/MessageView.tsx:692 msgid "Could not render chart" msgstr "Grafik çizilemedi" -#: src/pages/PluginsOverlay.tsx:327 +#: src/pages/ResetPassword.tsx:139 +msgid "Could not reset your password" +msgstr "" + +#: src/pages/PluginsOverlay.tsx:328 msgid "Could not revoke connection" msgstr "Bağlantı iptal edilemedi" -#: src/pages/Shell.tsx:3232 +#: src/pages/Shell.tsx:3226 msgid "Could not run routine" msgstr "" -#: src/pages/Shell.tsx:5484 +#: src/pages/Shell.tsx:4399 msgid "Could not save" msgstr "Kaydedilemedi" @@ -1065,11 +1083,11 @@ msgstr "" msgid "Could not save group" msgstr "Grup kaydedilemedi" -#: src/pages/Onboarding.tsx:224 +#: src/pages/Onboarding.tsx:238 msgid "Could not save model" msgstr "Model kaydedilemedi" -#: src/pages/Shell.tsx:3203 +#: src/pages/Shell.tsx:3197 msgid "Could not save routine" msgstr "Rutin kaydedilemedi" @@ -1081,11 +1099,11 @@ msgstr "Kural kaydedilemedi" msgid "Could not save that choice" msgstr "Bu seçim kaydedilemedi" -#: src/pages/VoiceSettingsOverlay.tsx:90 +#: src/pages/VoiceSettingsOverlay.tsx:95 msgid "Could not save that voice" msgstr "Bu ses kaydedilemedi" -#: src/pages/Shell.tsx:5966 +#: src/components/conversation/MessageView.tsx:508 msgid "Could not save this choice" msgstr "Bu seçim kaydedilemedi" @@ -1093,8 +1111,12 @@ msgstr "Bu seçim kaydedilemedi" msgid "Could not send that" msgstr "Gönderilemedi" +#: src/pages/ResetPassword.tsx:44 +msgid "Could not send the link. Try again." +msgstr "" + #: src/pages/McpServersOverlay.tsx:172 -#: src/pages/PluginsOverlay.tsx:384 +#: src/pages/PluginsOverlay.tsx:385 msgid "Could not start OAuth" msgstr "OAuth başlatılamadı" @@ -1102,7 +1124,7 @@ msgstr "OAuth başlatılamadı" msgid "Could not submit this answer" msgstr "Bu yanıt gönderilemedi" -#: src/pages/Shell.tsx:2043 +#: src/pages/Shell.tsx:2032 msgid "Could not take control" msgstr "Kontrol alınamadı" @@ -1130,26 +1152,22 @@ msgstr "" msgid "Couldn't start WhatsApp pairing" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:93 -msgid "Couldn't update avatars" -msgstr "" - #: src/pages/PhoneSettingsOverlay.tsx:99 msgid "Couldn't update phone settings" msgstr "" -#: src/pages/Shell.tsx:2233 -#: src/pages/Shell.tsx:5187 -#: src/pages/Shell.tsx:5618 +#: src/pages/Shell.tsx:2222 +#: src/pages/Shell.tsx:4102 +#: src/pages/Shell.tsx:4533 msgid "Create" msgstr "Oluştur" #. placeholder {0}: bot.name -#: src/pages/Shell.tsx:5592 +#: src/pages/Shell.tsx:4507 msgid "Create a section and move {0} into it." msgstr "Bir bölüm oluştur ve {0} botunu içine taşı." -#: src/pages/Auth.tsx:146 +#: src/pages/Auth.tsx:156 msgid "Create account" msgstr "Hesap oluştur" @@ -1157,29 +1175,29 @@ msgstr "Hesap oluştur" msgid "Create group" msgstr "Grup oluştur" -#: src/pages/Onboarding.tsx:557 +#: src/pages/Onboarding.tsx:571 msgid "Create your first bot" msgstr "İlk botunu oluştur" -#: src/pages/Auth.tsx:17 +#: src/pages/Auth.tsx:29 msgid "Create your Sentra Bot" msgstr "Sentra Bot hesabını oluştur" #: src/pages/GroupPanel.tsx:134 -#: src/pages/Shell.tsx:5187 -#: src/pages/Shell.tsx:5618 +#: src/pages/Shell.tsx:4102 +#: src/pages/Shell.tsx:4533 msgid "Creating…" msgstr "Oluşturuluyor…" -#: src/pages/PluginsOverlay.tsx:569 +#: src/pages/PluginsOverlay.tsx:570 msgid "Creativity" msgstr "" -#: src/pages/PluginsOverlay.tsx:834 +#: src/pages/PluginsOverlay.tsx:836 msgid "Credential" msgstr "Kimlik bilgisi" -#: src/pages/PluginsOverlay.tsx:892 +#: src/pages/PluginsOverlay.tsx:894 msgid "credential saved" msgstr "kimlik bilgisi kaydedildi" @@ -1204,7 +1222,7 @@ msgstr "gün" msgid "Decline" msgstr "" -#: src/pages/Shell.tsx:5391 +#: src/pages/Shell.tsx:4306 msgid "Default (medium)" msgstr "Varsayılan (orta)" @@ -1215,24 +1233,24 @@ msgstr "Varsayılan kapsam" #: src/pages/BotContextMenu.tsx:105 #: src/pages/McpServersOverlay.tsx:481 #: src/pages/RoutineEditor.tsx:280 -#: src/pages/Shell.tsx:2522 -#: src/pages/Shell.tsx:2552 -#: src/pages/Shell.tsx:5813 -#: src/pages/Shell.tsx:5895 +#: src/pages/Shell.tsx:2511 +#: src/pages/Shell.tsx:2541 +#: src/pages/Shell.tsx:4728 +#: src/pages/Shell.tsx:4810 msgid "Delete" msgstr "Sil" #. placeholder {0}: bot.name #. placeholder {0}: group.name -#: src/pages/Shell.tsx:2518 -#: src/pages/Shell.tsx:2548 +#: src/pages/Shell.tsx:2507 +#: src/pages/Shell.tsx:2537 msgid "Delete {0}" msgstr "{0} sil" #. placeholder {0}: bot.name #. placeholder {0}: item.name -#: src/pages/Shell.tsx:5745 -#: src/pages/Shell.tsx:5861 +#: src/pages/Shell.tsx:4660 +#: src/pages/Shell.tsx:4776 msgid "Delete {0}?" msgstr "{0} silinsin mi?" @@ -1240,17 +1258,17 @@ msgstr "{0} silinsin mi?" msgid "Delete group" msgstr "Grubu sil" -#: src/pages/Shell.tsx:5782 +#: src/pages/Shell.tsx:4697 msgid "Delete memories too" msgstr "Hafızayı da sil" -#: src/pages/Shell.tsx:4894 +#: src/components/conversation/MessageView.tsx:314 msgid "deleted" msgstr "silindi" #: src/pages/GroupPanel.tsx:232 -#: src/pages/Shell.tsx:5813 -#: src/pages/Shell.tsx:5895 +#: src/pages/Shell.tsx:4728 +#: src/pages/Shell.tsx:4810 msgid "Deleting…" msgstr "Siliniyor…" @@ -1266,26 +1284,30 @@ msgstr "Reddet" msgid "Deployment default" msgstr "Dağıtım varsayılanı" -#: src/pages/Onboarding.tsx:676 -#: src/pages/Shell.tsx:5165 +#: src/pages/Onboarding.tsx:690 +#: src/pages/Shell.tsx:4080 msgid "Describe what this bot does" msgstr "Bu botun ne yaptığını açıkla" -#: src/pages/Onboarding.tsx:651 +#: src/pages/Onboarding.tsx:665 msgid "Describe your own bot in the panel." msgstr "" -#: src/pages/Onboarding.tsx:681 -#: src/pages/Shell.tsx:5170 -#: src/pages/Shell.tsx:5335 +#: src/pages/Onboarding.tsx:695 +#: src/pages/Shell.tsx:4085 +#: src/pages/Shell.tsx:4250 msgid "Description" msgstr "Açıklama" -#: src/pages/PluginsOverlay.tsx:565 +#: src/pages/Shell.tsx:2704 +msgid "Desktop Runtime offline" +msgstr "" + +#: src/pages/PluginsOverlay.tsx:566 msgid "Developer" msgstr "" -#: src/pages/Shell.tsx:4306 +#: src/components/composer/Composer.tsx:446 msgid "Dictate" msgstr "Dikte et" @@ -1298,15 +1320,15 @@ msgstr "Bağlantıyı kes" msgid "Disconnecting…" msgstr "Bağlantı kesiliyor…" -#: src/pages/Shell.tsx:4153 +#: src/components/composer/Composer.tsx:293 msgid "Dismiss error" msgstr "" -#: src/pages/Shell.tsx:6274 +#: src/components/conversation/MessageView.tsx:820 msgid "Dismissed — reconnect anytime from MCP settings." msgstr "Kapatıldı — MCP ayarlarından istediğin zaman yeniden bağlanabilirsin." -#: src/pages/PluginsOverlay.tsx:788 +#: src/pages/PluginsOverlay.tsx:790 msgid "Display name" msgstr "Görünen ad" @@ -1323,7 +1345,7 @@ msgstr "Docker (önerilen)" msgid "Docker is the default: bots use a shared Team Computer." msgstr "Varsayılan Docker'dır: botlar ortak bir Takım Bilgisayarı kullanır." -#: src/pages/Auth.tsx:152 +#: src/pages/Auth.tsx:162 msgid "Don’t have an account?" msgstr "Hesabın yok mu?" @@ -1350,7 +1372,7 @@ msgstr "Taslak beceri" msgid "Duplicate" msgstr "Çoğalt" -#: src/pages/Shell.tsx:4697 +#: src/components/conversation/MessageView.tsx:117 msgid "Earlier message" msgstr "" @@ -1362,7 +1384,8 @@ msgstr "Önce düzenle" msgid "Edit Profile" msgstr "Profili Düzenle" -#: src/pages/Auth.tsx:62 +#: src/pages/Auth.tsx:73 +#: src/pages/ResetPassword.tsx:82 msgid "Email" msgstr "E-posta" @@ -1372,7 +1395,7 @@ msgstr "Şifrelenmiş statik kimlik bilgisi kaydedildi" #. placeholder {0}: oauth.verificationUri.replace(/^https:\/\//, "") #: src/pages/ModelSettingsOverlay.tsx:586 -#: src/pages/Onboarding.tsx:459 +#: src/pages/Onboarding.tsx:473 msgid "Enter this code at <0>{0}" msgstr "Bu kodu <0>{0} adresinde gir" @@ -1410,16 +1433,16 @@ msgstr "Her ay" msgid "Every week" msgstr "Her hafta" -#: src/pages/Shell.tsx:6320 +#: src/components/conversation/MessageView.tsx:866 msgid "Expand" msgstr "Genişlet" #. placeholder {0}: group.title -#: src/pages/Shell.tsx:2305 +#: src/pages/Shell.tsx:2294 msgid "Expand {0}" msgstr "" -#: src/pages/Shell.tsx:5496 +#: src/pages/Shell.tsx:4411 msgid "Export" msgstr "Dışa aktar" @@ -1427,7 +1450,7 @@ msgstr "Dışa aktar" msgid "Export this week's list from the CRM and drop it in the shared folder" msgstr "Bu haftanın listesini CRM'den dışa aktar ve ortak klasöre bırak" -#: src/pages/Shell.tsx:5516 +#: src/pages/Shell.tsx:4431 msgid "Extra high" msgstr "Çok yüksek" @@ -1435,14 +1458,14 @@ msgstr "Çok yüksek" msgid "Failed" msgstr "Başarısız" -#: src/pages/Shell.tsx:1878 -#: src/pages/Shell.tsx:1880 -#: src/pages/Shell.tsx:1882 +#: src/pages/Shell.tsx:1867 +#: src/pages/Shell.tsx:1869 +#: src/pages/Shell.tsx:1871 msgid "Failed to send message" msgstr "Mesaj gönderilemedi" -#: src/pages/Shell.tsx:1912 -#: src/pages/Shell.tsx:1931 +#: src/pages/Shell.tsx:1901 +#: src/pages/Shell.tsx:1920 msgid "Failed to stop" msgstr "Durdurulamadı" @@ -1456,18 +1479,18 @@ msgid "Failure handling" msgstr "Hata yönetimi" #: src/pages/ModelSettingsOverlay.tsx:427 -#: src/pages/Onboarding.tsx:336 +#: src/pages/Onboarding.tsx:350 msgid "Find models" msgstr "Model bul" #: src/pages/ModelSettingsOverlay.tsx:427 -#: src/pages/Onboarding.tsx:336 +#: src/pages/Onboarding.tsx:350 msgid "Finding…" msgstr "Aranıyor…" #. placeholder {0}: new URL(oauth.verificationUri).hostname #: src/pages/ModelSettingsOverlay.tsx:546 -#: src/pages/Onboarding.tsx:420 +#: src/pages/Onboarding.tsx:434 msgid "Finish signing in at <0>{0}. The final page may not load; paste its URL or code here." msgstr "<0>{0} adresinde oturum açmayı tamamla. Son sayfa yüklenmeyebilir; URL'sini veya kodu buraya yapıştır." @@ -1484,6 +1507,10 @@ msgstr "MCP bağlantısı tamamlanıyor…" msgid "Flag unexpected actions" msgstr "" +#: src/pages/Auth.tsx:99 +msgid "Forgot password?" +msgstr "" + #: src/pages/ModelSettingsOverlay.tsx:1026 msgid "Free" msgstr "" @@ -1497,8 +1524,8 @@ msgid "Git event" msgstr "" #: src/pages/PhoneSettingsOverlay.tsx:224 -#: src/pages/Shell.tsx:2708 -#: src/pages/Shell.tsx:2863 +#: src/pages/Shell.tsx:2697 +#: src/pages/Shell.tsx:2857 msgid "Group" msgstr "Grup" @@ -1524,7 +1551,7 @@ msgid "header" msgstr "" #: src/pages/McpServersOverlay.tsx:342 -#: src/pages/PluginsOverlay.tsx:824 +#: src/pages/PluginsOverlay.tsx:826 msgid "Header name" msgstr "Üstbilgi adı" @@ -1532,27 +1559,28 @@ msgstr "Üstbilgi adı" msgid "Header value" msgstr "Üstbilgi değeri" -#: src/pages/VoiceSettingsOverlay.tsx:284 +#: src/pages/VoiceSettingsOverlay.tsx:289 msgid "Hear a sample" msgstr "Örnek dinle" -#: src/pages/VoiceSettingsOverlay.tsx:102 +#: src/pages/VoiceSettingsOverlay.tsx:107 msgid "Hi, this is how I'll sound when I read replies out loud." msgstr "Merhaba, yanıtları sesli okuduğumda böyle duyulacağım." -#: src/pages/Auth.tsx:95 +#: src/pages/Auth.tsx:122 +#: src/pages/ResetPassword.tsx:186 msgid "Hide password" msgstr "" -#: src/pages/Shell.tsx:5519 +#: src/pages/Shell.tsx:4434 msgid "High" msgstr "Yüksek" -#: src/pages/Shell.tsx:4325 +#: src/components/composer/Composer.tsx:465 msgid "Hold to talk" msgstr "Konuşmak için basılı tut" -#: src/pages/Shell.tsx:4325 +#: src/components/composer/Composer.tsx:465 msgid "Hold to talk (on-device dictation)" msgstr "Konuşmak için basılı tut (cihaz üzerinde dikte)" @@ -1572,15 +1600,19 @@ msgstr "Ne sıklıkla" msgid "How to check" msgstr "Nasıl kontrol edilir" -#: src/pages/Shell.tsx:4591 +#: src/pages/Shell.tsx:3977 msgid "I’m done" msgstr "Bitirdim" -#: src/pages/VoiceSettingsOverlay.tsx:107 +#: src/pages/ResetPassword.tsx:54 +msgid "If an account exists for {email}, we sent a link to reset your password. It works for one hour." +msgstr "" + +#: src/pages/VoiceSettingsOverlay.tsx:112 msgid "If you heard that, voice is ready." msgstr "Bunu duyduysan ses hazır." -#: src/pages/AccountSettingsOverlay.tsx:140 +#: src/pages/AccountSettingsOverlay.tsx:119 msgid "iMessage channels and agent connections." msgstr "" @@ -1588,15 +1620,15 @@ msgstr "" msgid "iMessage line" msgstr "" -#: src/pages/PluginsOverlay.tsx:782 +#: src/pages/PluginsOverlay.tsx:784 msgid "Import OpenAPI JSON" msgstr "OpenAPI JSON içe aktar" -#: src/pages/Onboarding.tsx:701 +#: src/pages/Onboarding.tsx:715 msgid "Includes a full operating playbook for this role." msgstr "" -#: src/pages/Shell.tsx:5406 +#: src/pages/Shell.tsx:4321 msgid "Inherit default" msgstr "Varsayılanı devral" @@ -1604,18 +1636,18 @@ msgstr "Varsayılanı devral" msgid "Inputs" msgstr "Girdiler" -#: src/pages/PluginsOverlay.tsx:482 -#: src/pages/PluginsOverlay.tsx:533 +#: src/pages/PluginsOverlay.tsx:483 +#: src/pages/PluginsOverlay.tsx:534 msgid "Install" msgstr "" -#: src/pages/PluginsOverlay.tsx:498 -#: src/pages/PluginsOverlay.tsx:537 +#: src/pages/PluginsOverlay.tsx:499 +#: src/pages/PluginsOverlay.tsx:538 msgid "Installed" msgstr "" -#: src/pages/PluginsOverlay.tsx:482 -#: src/pages/PluginsOverlay.tsx:533 +#: src/pages/PluginsOverlay.tsx:483 +#: src/pages/PluginsOverlay.tsx:534 msgid "Installing…" msgstr "" @@ -1627,8 +1659,8 @@ msgstr "Instance API anahtarı" msgid "Instruction" msgstr "Talimat" -#: src/pages/PluginsOverlay.tsx:582 -#: src/pages/Shell.tsx:2570 +#: src/pages/PluginsOverlay.tsx:583 +#: src/pages/Shell.tsx:2559 msgid "Integrations" msgstr "Entegrasyonlar" @@ -1650,19 +1682,19 @@ msgid "Interval unit" msgstr "Aralık birimi" #: src/pages/MemorySettingsOverlay.tsx:39 -#: src/pages/Shell.tsx:5407 +#: src/pages/Shell.tsx:4322 msgid "Isolated" msgstr "Yalıtılmış" -#: src/pages/Shell.tsx:5748 +#: src/pages/Shell.tsx:4663 msgid "Its conversation, files, and routines will be permanently deleted. Bots it created stay in your list." msgstr "Sohbeti, dosyaları ve rutinleri kalıcı olarak silinecek. Oluşturduğu botlar listende kalır." -#: src/pages/Shell.tsx:3886 +#: src/pages/Shell.tsx:3875 msgid "Jump to latest" msgstr "En son mesaja git" -#: src/pages/Shell.tsx:4692 +#: src/components/conversation/MessageView.tsx:112 msgid "Jump to replied message" msgstr "Yanıtlanan mesaja git" @@ -1670,7 +1702,7 @@ msgstr "Yanıtlanan mesaja git" msgid "just now" msgstr "az önce" -#: src/pages/Shell.tsx:5766 +#: src/pages/Shell.tsx:4681 msgid "Keep memories" msgstr "Hafızayı koru" @@ -1678,17 +1710,17 @@ msgstr "Hafızayı koru" msgid "key" msgstr "" -#: src/pages/VoiceSettingsOverlay.tsx:229 +#: src/pages/VoiceSettingsOverlay.tsx:234 msgid "Keys stay on the server. The app only learns whether a provider is configured." msgstr "Anahtarlar sunucuda kalır. Uygulama yalnızca bir sağlayıcının yapılandırılıp yapılandırılmadığını öğrenir." -#: src/pages/PluginsOverlay.tsx:571 +#: src/pages/PluginsOverlay.tsx:572 msgid "Knowledge" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:154 -#: src/pages/AccountSettingsOverlay.tsx:363 -#: src/pages/AccountSettingsOverlay.tsx:380 +#: src/pages/AccountSettingsOverlay.tsx:133 +#: src/pages/AccountSettingsOverlay.tsx:296 +#: src/pages/AccountSettingsOverlay.tsx:313 msgid "Language" msgstr "Dil" @@ -1709,7 +1741,7 @@ msgstr "" msgid "Listening…" msgstr "Dinliyor…" -#: src/pages/Shell.tsx:3839 +#: src/pages/Shell.tsx:3828 msgid "Load earlier messages" msgstr "Önceki mesajları yükle" @@ -1717,7 +1749,7 @@ msgstr "Önceki mesajları yükle" msgid "Loading activity…" msgstr "Etkinlik yükleniyor…" -#: src/pages/PluginsOverlay.tsx:608 +#: src/pages/PluginsOverlay.tsx:609 msgid "Loading integrations…" msgstr "Entegrasyonlar yükleniyor…" @@ -1743,13 +1775,13 @@ msgstr "Önizleme yükleniyor…" msgid "Loading rules…" msgstr "Kurallar yükleniyor…" -#: src/pages/VoiceSettingsOverlay.tsx:128 +#: src/pages/VoiceSettingsOverlay.tsx:133 msgid "Loading voice providers…" msgstr "Ses sağlayıcıları yükleniyor…" -#: src/App.tsx:50 -#: src/pages/Onboarding.tsx:260 -#: src/pages/Shell.tsx:3839 +#: src/App.tsx:53 +#: src/pages/Onboarding.tsx:274 +#: src/pages/Shell.tsx:3828 msgid "Loading…" msgstr "Yükleniyor…" @@ -1757,15 +1789,15 @@ msgstr "Yükleniyor…" msgid "Local" msgstr "Yerel" -#: src/pages/Shell.tsx:2656 +#: src/pages/Shell.tsx:2645 msgid "Log out" msgstr "Çıkış yap" -#: src/pages/Shell.tsx:5517 +#: src/pages/Shell.tsx:4432 msgid "Low" msgstr "Düşük" -#: src/pages/AccountSettingsOverlay.tsx:147 +#: src/pages/AccountSettingsOverlay.tsx:126 msgid "Manage phone settings" msgstr "" @@ -1781,17 +1813,17 @@ msgstr "Okundu olarak işaretle" msgid "Mark as Unread" msgstr "Okunmadı olarak işaretle" -#: src/pages/Shell.tsx:5521 +#: src/pages/Shell.tsx:4436 msgid "Max" msgstr "Maksimum" #: src/pages/McpServersOverlay.tsx:224 #: src/pages/McpServersOverlay.tsx:229 -#: src/pages/PluginsOverlay.tsx:756 +#: src/pages/PluginsOverlay.tsx:758 msgid "MCP servers" msgstr "MCP sunucuları" -#: src/pages/Shell.tsx:5518 +#: src/pages/Shell.tsx:4433 msgid "Medium" msgstr "Orta" @@ -1804,11 +1836,11 @@ msgid "Members (pick {GROUP_MEMBER_MIN}–{GROUP_MEMBER_MAX})" msgstr "Üyeler ({GROUP_MEMBER_MIN}–{GROUP_MEMBER_MAX} seç)" #: src/pages/MemorySettingsOverlay.tsx:134 -#: src/pages/Shell.tsx:2614 +#: src/pages/Shell.tsx:2603 msgid "Memory" msgstr "Hafıza" -#: src/pages/Shell.tsx:5402 +#: src/pages/Shell.tsx:4317 msgid "Memory scope" msgstr "Hafıza kapsamı" @@ -1817,29 +1849,29 @@ msgstr "Hafıza kapsamı" msgid "Message" msgstr "" -#: src/pages/Shell.tsx:4403 -#: src/pages/Shell.tsx:4500 +#: src/components/composer/Composer.tsx:543 +#: src/components/composer/shared.ts:23 msgid "Message" msgstr "Mesaj" -#: src/pages/Shell.tsx:4399 -#: src/pages/Shell.tsx:4403 +#: src/components/composer/Composer.tsx:539 +#: src/components/composer/Composer.tsx:543 msgid "Message {activeName}" msgstr "{activeName} sohbetine yaz" -#: src/pages/Shell.tsx:4134 +#: src/components/composer/Composer.tsx:274 msgid "Message composer" msgstr "" -#: src/pages/Shell.tsx:4770 +#: src/components/conversation/MessageView.tsx:190 msgid "Message from {peer}" msgstr "{peer} botundan mesaj" -#: src/pages/Shell.tsx:4400 +#: src/components/composer/Composer.tsx:540 msgid "Message…" msgstr "Mesaj…" -#: src/pages/Shell.tsx:4770 +#: src/components/conversation/MessageView.tsx:190 msgid "Messaged {peer}" msgstr "{peer} botuna mesaj gönderildi" @@ -1847,7 +1879,7 @@ msgstr "{peer} botuna mesaj gönderildi" msgid "Microphone failed" msgstr "Mikrofon hatası" -#: src/pages/Shell.tsx:5520 +#: src/pages/Shell.tsx:4435 msgid "Minimal" msgstr "Minimal" @@ -1866,15 +1898,15 @@ msgstr "dakika" #: src/pages/ModelSettingsOverlay.tsx:432 #: src/pages/ModelSettingsOverlay.tsx:493 #: src/pages/ModelSettingsOverlay.tsx:914 -#: src/pages/Onboarding.tsx:341 -#: src/pages/Onboarding.tsx:390 -#: src/pages/Onboarding.tsx:398 -#: src/pages/Shell.tsx:5358 +#: src/pages/Onboarding.tsx:355 +#: src/pages/Onboarding.tsx:404 +#: src/pages/Onboarding.tsx:412 +#: src/pages/Shell.tsx:4273 msgid "Model" msgstr "Model" #: src/pages/ModelSettingsOverlay.tsx:474 -#: src/pages/Onboarding.tsx:371 +#: src/pages/Onboarding.tsx:385 msgid "Model id" msgstr "Model kimliği" @@ -1882,7 +1914,7 @@ msgstr "Model kimliği" msgid "Model options" msgstr "Model seçenekleri" -#: src/pages/AccountSettingsOverlay.tsx:222 +#: src/pages/AccountSettingsOverlay.tsx:155 msgid "Model spend uses your provider keys." msgstr "Model harcaması senin sağlayıcı anahtarlarını kullanır." @@ -1891,12 +1923,12 @@ msgid "Model updated." msgstr "Model güncellendi." #: src/pages/ModelSettingsOverlay.tsx:304 -#: src/pages/Shell.tsx:2601 +#: src/pages/Shell.tsx:2590 msgid "Models" msgstr "Modeller" #: src/pages/ModelSettingsOverlay.tsx:445 -#: src/pages/Onboarding.tsx:348 +#: src/pages/Onboarding.tsx:362 msgid "Models from server" msgstr "Sunucudan gelen modeller" @@ -1904,7 +1936,7 @@ msgstr "Sunucudan gelen modeller" msgid "Monthly" msgstr "Aylık" -#: src/pages/PluginsOverlay.tsx:573 +#: src/pages/PluginsOverlay.tsx:574 msgid "More apps" msgstr "" @@ -1913,7 +1945,7 @@ msgstr "" msgid "Move {0} to section" msgstr "{0} botunu bölüme taşı" -#: src/pages/Shell.tsx:5769 +#: src/pages/Shell.tsx:4684 msgid "Move them to your shared memory." msgstr "Bunları ortak hafızana taşı." @@ -1922,19 +1954,19 @@ msgid "Move to" msgstr "Taşı" #: src/components/teach/SkillDraftCard.tsx:82 -#: src/pages/Auth.tsx:49 +#: src/pages/Auth.tsx:60 #: src/pages/GroupPanel.tsx:110 #: src/pages/GroupPanel.tsx:201 -#: src/pages/Onboarding.tsx:663 +#: src/pages/Onboarding.tsx:677 #: src/pages/RoutineEditor.tsx:294 -#: src/pages/Shell.tsx:5150 -#: src/pages/Shell.tsx:5317 -#: src/pages/Shell.tsx:5595 +#: src/pages/Shell.tsx:4065 +#: src/pages/Shell.tsx:4232 +#: src/pages/Shell.tsx:4510 msgid "Name" msgstr "Ad" -#: src/pages/Onboarding.tsx:667 -#: src/pages/Shell.tsx:5155 +#: src/pages/Onboarding.tsx:681 +#: src/pages/Shell.tsx:4070 msgid "Name this bot" msgstr "Bota bir ad ver" @@ -1954,13 +1986,13 @@ msgstr "Girdi bekliyor" msgid "Needs takeover" msgstr "Devralma bekliyor" -#: src/pages/Shell.tsx:2247 -#: src/pages/Shell.tsx:5138 +#: src/pages/Shell.tsx:2236 +#: src/pages/Shell.tsx:4053 msgid "New bot" msgstr "Yeni bot" #: src/pages/GroupPanel.tsx:98 -#: src/pages/Shell.tsx:2257 +#: src/pages/Shell.tsx:2246 msgid "New group" msgstr "Yeni grup" @@ -1968,12 +2000,16 @@ msgstr "Yeni grup" msgid "New open-work item" msgstr "Yeni açık iş öğesi" +#: src/pages/ResetPassword.tsx:165 +msgid "New password" +msgstr "" + #: src/pages/RoutineEditor.tsx:100 msgid "New routine" msgstr "Yeni rutin" #: src/pages/BotContextMenu.tsx:130 -#: src/pages/Shell.tsx:5589 +#: src/pages/Shell.tsx:4504 msgid "New section" msgstr "Yeni bölüm" @@ -1981,20 +2017,20 @@ msgstr "Yeni bölüm" msgid "No agent connections yet." msgstr "" -#: src/pages/PluginsOverlay.tsx:687 +#: src/pages/PluginsOverlay.tsx:689 msgid "No apps match your search." msgstr "Aramanla eşleşen uygulama yok." -#: src/pages/PluginsOverlay.tsx:894 +#: src/pages/PluginsOverlay.tsx:896 msgid "no auth" msgstr "kimlik doğrulamasız" -#: src/pages/PluginsOverlay.tsx:810 +#: src/pages/PluginsOverlay.tsx:812 msgid "No authentication" msgstr "Kimlik doğrulaması yok" #. placeholder {0}: item.name -#: src/pages/PluginsOverlay.tsx:323 +#: src/pages/PluginsOverlay.tsx:324 msgid "No connection record found for {0}." msgstr "{0} için bağlantı kaydı bulunamadı." @@ -2014,7 +2050,7 @@ msgstr "" msgid "No longer active" msgstr "Artık etkin değil" -#: src/pages/PluginsOverlay.tsx:682 +#: src/pages/PluginsOverlay.tsx:684 msgid "No managed app catalog is configured on this deployment." msgstr "" @@ -2022,7 +2058,7 @@ msgstr "" msgid "No matching models" msgstr "" -#: src/pages/PluginsOverlay.tsx:876 +#: src/pages/PluginsOverlay.tsx:878 msgid "No MCP or API tool sources installed yet." msgstr "Henüz MCP veya API araç kaynağı kurulmadı." @@ -2054,16 +2090,16 @@ msgstr "" msgid "None yet" msgstr "Henüz yok" -#: src/pages/VoiceSettingsOverlay.tsx:156 +#: src/pages/VoiceSettingsOverlay.tsx:161 msgid "Not configured" msgstr "Yapılandırılmadı" #: src/pages/ModelSettingsOverlay.tsx:524 -#: src/pages/VoiceSettingsOverlay.tsx:225 +#: src/pages/VoiceSettingsOverlay.tsx:230 msgid "Not connected" msgstr "Bağlı değil" -#: src/pages/PluginsOverlay.tsx:643 +#: src/pages/PluginsOverlay.tsx:645 msgid "Not in the plugin catalog" msgstr "" @@ -2071,7 +2107,7 @@ msgstr "" msgid "Not linked — text the deployment's number once to link your phone to your agent." msgstr "" -#: src/pages/Shell.tsx:6262 +#: src/components/conversation/MessageView.tsx:808 msgid "Not now" msgstr "Şimdi değil" @@ -2113,15 +2149,15 @@ msgstr "her ayın 1'inde saat {0}" msgid "Open" msgstr "Aç" -#: src/pages/Shell.tsx:2926 +#: src/pages/Shell.tsx:2920 msgid "Open computer" msgstr "Bilgisayarı aç" -#: src/pages/Shell.tsx:2892 +#: src/pages/Shell.tsx:2886 msgid "Open in full window" msgstr "Tam pencerede aç" -#: src/pages/Shell.tsx:2680 +#: src/pages/Shell.tsx:2669 msgid "Open navigation" msgstr "Gezinmeyi aç" @@ -2142,24 +2178,24 @@ msgid "Open work" msgstr "Açık işler" #: src/pages/ModelSettingsOverlay.tsx:405 -#: src/pages/Onboarding.tsx:315 +#: src/pages/Onboarding.tsx:329 msgid "OpenAI-compatible server URL" msgstr "OpenAI uyumlu sunucu URL'si" -#: src/pages/Shell.tsx:4905 +#: src/components/conversation/MessageView.tsx:325 msgid "Opened its thread." msgstr "Sohbeti açıldı." -#: src/App.tsx:166 +#: src/App.tsx:170 msgid "Opening your workspace…" msgstr "Çalışma alanın açılıyor…" #: src/pages/ModelSettingsOverlay.tsx:636 -#: src/pages/Onboarding.tsx:502 +#: src/pages/Onboarding.tsx:516 msgid "Optional" msgstr "İsteğe bağlı" -#: src/pages/AccountSettingsOverlay.tsx:250 +#: src/pages/AccountSettingsOverlay.tsx:183 msgid "Optional controls most people never need" msgstr "Çoğu kişinin hiç ihtiyaç duymadığı isteğe bağlı ayarlar" @@ -2171,7 +2207,7 @@ msgstr "İsteğe bağlı üstbilgi değeri" msgid "Or connect an API key" msgstr "Veya bir API anahtarı bağla" -#: src/pages/Onboarding.tsx:510 +#: src/pages/Onboarding.tsx:524 msgid "Or paste an API key" msgstr "Veya bir API anahtarı yapıştır" @@ -2180,16 +2216,12 @@ msgstr "Veya bir API anahtarı yapıştır" msgid "Or send this code to {0}:" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:191 -msgid "Organic" -msgstr "" - #: src/pages/memory-providers/SupermemorySettingsForm.tsx:60 msgid "Organization API key" msgstr "Kuruluş API anahtarı" #: src/pages/ModelSettingsOverlay.tsx:454 -#: src/pages/Onboarding.tsx:357 +#: src/pages/Onboarding.tsx:371 msgid "Other model…" msgstr "Başka model…" @@ -2211,21 +2243,26 @@ msgstr "" msgid "Park" msgstr "Beklet" -#: src/pages/Auth.tsx:77 -#: src/pages/Auth.tsx:86 +#: src/pages/Auth.tsx:91 +#: src/pages/Auth.tsx:110 +#: src/pages/ResetPassword.tsx:174 msgid "Password" msgstr "Parola" -#: src/pages/VoiceSettingsOverlay.tsx:242 +#: src/pages/ResetPassword.tsx:147 +msgid "Password updated" +msgstr "" + +#: src/pages/VoiceSettingsOverlay.tsx:247 msgid "Paste a replacement key" msgstr "Yeni bir anahtar yapıştır" #: src/pages/ModelSettingsOverlay.tsx:416 -#: src/pages/Onboarding.tsx:326 +#: src/pages/Onboarding.tsx:340 msgid "Paste the OpenAI-compatible address from your server. Sentra Bot adds /v1 if needed." msgstr "Sunucundaki OpenAI uyumlu adresi yapıştır. Gerekirse Sentra Bot /v1 ekler." -#: src/pages/VoiceSettingsOverlay.tsx:242 +#: src/pages/VoiceSettingsOverlay.tsx:247 msgid "Paste your API key" msgstr "API anahtarını yapıştır" @@ -2233,21 +2270,21 @@ msgstr "API anahtarını yapıştır" msgid "Paused" msgstr "" -#: src/pages/PluginsOverlay.tsx:567 +#: src/pages/PluginsOverlay.tsx:568 msgid "Payments" msgstr "" #: src/pages/ModelSettingsOverlay.tsx:518 -#: src/pages/VoiceSettingsOverlay.tsx:219 +#: src/pages/VoiceSettingsOverlay.tsx:224 msgid "Personal credential" msgstr "Kişisel kimlik bilgisi" -#: src/pages/AccountSettingsOverlay.tsx:137 +#: src/pages/AccountSettingsOverlay.tsx:116 #: src/pages/PhoneSettingsOverlay.tsx:116 msgid "Phone" msgstr "" -#: src/pages/VoiceSettingsOverlay.tsx:155 +#: src/pages/VoiceSettingsOverlay.tsx:160 msgid "Pick a voice" msgstr "Bir ses seç" @@ -2255,11 +2292,11 @@ msgstr "Bir ses seç" msgid "Pin" msgstr "Sabitle" -#: src/pages/VoiceSettingsOverlay.tsx:284 +#: src/pages/VoiceSettingsOverlay.tsx:289 msgid "Playing…" msgstr "Çalınıyor…" -#: src/pages/PluginsOverlay.tsx:615 +#: src/pages/PluginsOverlay.tsx:616 msgid "Popular" msgstr "" @@ -2272,11 +2309,11 @@ msgstr "" msgid "Preview {0}" msgstr "{0} önizle" -#: src/pages/Shell.tsx:5093 +#: src/pages/Shell.tsx:4008 msgid "Private" msgstr "Özel" -#: src/pages/PluginsOverlay.tsx:563 +#: src/pages/PluginsOverlay.tsx:564 msgid "Productivity" msgstr "" @@ -2285,7 +2322,7 @@ msgid "Provider" msgstr "Sağlayıcı" #: src/pages/ModelSettingsOverlay.tsx:341 -#: src/pages/VoiceSettingsOverlay.tsx:168 +#: src/pages/VoiceSettingsOverlay.tsx:173 msgid "Providers" msgstr "Sağlayıcılar" @@ -2293,7 +2330,7 @@ msgstr "Sağlayıcılar" msgid "Queued" msgstr "Kuyrukta" -#: src/pages/Shell.tsx:5434 +#: src/pages/Shell.tsx:4349 msgid "Read replies aloud" msgstr "Yanıtları sesli oku" @@ -2305,7 +2342,7 @@ msgstr "Son" msgid "Reconnect OAuth" msgstr "OAuth'u yeniden bağla" -#: src/App.tsx:123 +#: src/App.tsx:127 msgid "Reconnecting" msgstr "Yeniden bağlanıyor" @@ -2327,27 +2364,27 @@ msgstr "" msgid "Recovering…" msgstr "" -#: src/pages/Shell.tsx:4581 +#: src/pages/Shell.tsx:3967 msgid "Release" msgstr "Bırak" #: src/components/ApprovalRulesSettings.tsx:178 -#: src/pages/PluginsOverlay.tsx:455 -#: src/pages/PluginsOverlay.tsx:508 -#: src/pages/PluginsOverlay.tsx:547 -#: src/pages/PluginsOverlay.tsx:666 -#: src/pages/PluginsOverlay.tsx:905 +#: src/pages/PluginsOverlay.tsx:456 +#: src/pages/PluginsOverlay.tsx:509 +#: src/pages/PluginsOverlay.tsx:548 +#: src/pages/PluginsOverlay.tsx:668 +#: src/pages/PluginsOverlay.tsx:907 #: src/pages/ScratchpadSection.tsx:162 msgid "Remove" msgstr "Kaldır" #. placeholder {0}: attachment.file.name -#: src/pages/Shell.tsx:4204 +#: src/components/composer/Composer.tsx:344 msgid "Remove {0}" msgstr "{0} kaldır" #. placeholder {0}: mention.name -#: src/pages/Shell.tsx:4362 +#: src/components/composer/Composer.tsx:502 msgid "Remove mention {0}" msgstr "{0} bahsini kaldır" @@ -2356,7 +2393,7 @@ msgid "Remove schedule" msgstr "" #. placeholder {0}: selectedSkill.name -#: src/pages/Shell.tsx:4341 +#: src/components/composer/Composer.tsx:481 msgid "Remove skill {0}" msgstr "{0} becerisini kaldır" @@ -2368,7 +2405,7 @@ msgstr "Bu zamanlamayı kaldır" msgid "Remove webhook" msgstr "" -#: src/pages/Shell.tsx:4904 +#: src/components/conversation/MessageView.tsx:324 msgid "Removed with chat, computer, and memory." msgstr "Sohbeti, bilgisayarı ve hafızasıyla birlikte kaldırıldı." @@ -2376,10 +2413,10 @@ msgstr "Sohbeti, bilgisayarı ve hafızasıyla birlikte kaldırıldı." msgid "Removed, but list refresh failed" msgstr "Kaldırıldı ama liste yenilenemedi" -#: src/pages/PluginsOverlay.tsx:450 -#: src/pages/PluginsOverlay.tsx:547 -#: src/pages/PluginsOverlay.tsx:661 -#: src/pages/PluginsOverlay.tsx:905 +#: src/pages/PluginsOverlay.tsx:451 +#: src/pages/PluginsOverlay.tsx:548 +#: src/pages/PluginsOverlay.tsx:663 +#: src/pages/PluginsOverlay.tsx:907 msgid "Removing…" msgstr "Kaldırılıyor…" @@ -2393,15 +2430,15 @@ msgstr "Yeniden aç" msgid "Replace API key" msgstr "API anahtarını değiştir" -#: src/pages/VoiceSettingsOverlay.tsx:255 +#: src/pages/VoiceSettingsOverlay.tsx:260 msgid "Replace key" msgstr "Anahtarı değiştir" -#: src/pages/Shell.tsx:4527 +#: src/pages/Shell.tsx:3913 msgid "Reply" msgstr "Yanıtla" -#: src/pages/Shell.tsx:4167 +#: src/components/composer/Composer.tsx:307 msgid "Replying to {replyName}" msgstr "{replyName} yanıtlanıyor" @@ -2417,13 +2454,21 @@ msgstr "" msgid "Reset computer?" msgstr "" +#: src/pages/ResetPassword.tsx:78 +msgid "Reset links work once and for one hour. Enter your email to get a new one." +msgstr "" + +#: src/pages/ResetPassword.tsx:70 +msgid "Reset your password" +msgstr "" + #: src/components/ComputerMaintenanceActions.tsx:68 #: src/components/ComputerMaintenanceActions.tsx:115 msgid "Resetting…" msgstr "" -#: src/pages/Shell.tsx:2514 -#: src/pages/Shell.tsx:2544 +#: src/pages/Shell.tsx:2503 +#: src/pages/Shell.tsx:2533 msgid "Restore" msgstr "Geri yükle" @@ -2431,7 +2476,7 @@ msgstr "Geri yükle" msgid "Restore the last saved workspace. Unsaved work on the computer is lost." msgstr "" -#: src/App.tsx:135 +#: src/App.tsx:139 msgid "Retry now" msgstr "Şimdi tekrar dene" @@ -2439,7 +2484,7 @@ msgstr "Şimdi tekrar dene" msgid "Return to Sentra Bot" msgstr "Sentra Bot'ya dön" -#: src/pages/PluginsOverlay.tsx:716 +#: src/pages/PluginsOverlay.tsx:718 msgid "Reusable SKILL.md playbooks your agents follow. Install one and invoke it with /Name in the composer." msgstr "" @@ -2447,17 +2492,13 @@ msgstr "" msgid "Revoke" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:189 -msgid "Robot" -msgstr "" - #: src/pages/RoutineEditor.tsx:571 msgid "Rotate key" msgstr "" #: src/pages/RoutineEditor.tsx:247 -#: src/pages/Shell.tsx:3169 -#: src/pages/Shell.tsx:3179 +#: src/pages/Shell.tsx:3163 +#: src/pages/Shell.tsx:3173 msgid "Routine" msgstr "Rutin" @@ -2474,7 +2515,7 @@ msgstr "" msgid "Run history" msgstr "" -#: src/pages/Shell.tsx:3162 +#: src/pages/Shell.tsx:3156 msgid "Run time must be in the future." msgstr "" @@ -2495,7 +2536,7 @@ msgstr "Çalışıyor…" #: src/pages/GroupPanel.tsx:224 #: src/pages/ModelSettingsOverlay.tsx:675 #: src/pages/RoutineEditor.tsx:479 -#: src/pages/Shell.tsx:5489 +#: src/pages/Shell.tsx:4404 msgid "Save" msgstr "Kaydet" @@ -2537,12 +2578,12 @@ msgid "Say yes or no, or answer in a sentence." msgstr "Evet ya da hayır de veya bir cümleyle yanıtla." #: src/pages/ModelSettingsOverlay.tsx:939 -#: src/pages/Shell.tsx:2268 +#: src/pages/Shell.tsx:2257 msgid "Search" msgstr "Ara" -#: src/pages/PluginsOverlay.tsx:598 #: src/pages/PluginsOverlay.tsx:599 +#: src/pages/PluginsOverlay.tsx:600 msgid "Search apps" msgstr "Uygulama ara" @@ -2555,8 +2596,8 @@ msgstr "" msgid "Search providers" msgstr "Sağlayıcı ara" -#: src/pages/Onboarding.tsx:274 -#: src/pages/Onboarding.tsx:275 +#: src/pages/Onboarding.tsx:288 +#: src/pages/Onboarding.tsx:289 msgid "Search providers and models" msgstr "Sağlayıcı ve model ara" @@ -2564,11 +2605,11 @@ msgstr "Sağlayıcı ve model ara" msgid "Searching…" msgstr "Aranıyor…" -#: src/pages/Shell.tsx:2709 +#: src/pages/Shell.tsx:2698 msgid "Select a bot" msgstr "Bir bot seç" -#: src/pages/Shell.tsx:4423 +#: src/components/composer/Composer.tsx:563 msgid "Send" msgstr "Gönder" @@ -2580,6 +2621,10 @@ msgstr "Yanıtı gönder" msgid "Send it" msgstr "Gönder" +#: src/pages/ResetPassword.tsx:103 +msgid "Send reset link" +msgstr "" + #: src/components/AskCard.tsx:97 #: src/components/AskCard.tsx:126 #: src/components/AskCard.tsx:150 @@ -2587,7 +2632,7 @@ msgstr "Gönder" msgid "Sending…" msgstr "Gönderiliyor…" -#: src/pages/PluginsOverlay.tsx:839 +#: src/pages/PluginsOverlay.tsx:841 msgid "Sentra Bot verifies the source before saving it. Credentials are encrypted and are never returned to clients or exposed to the model." msgstr "Sentra Bot kaynağı kaydetmeden önce doğrular. Kimlik bilgileri şifrelenir; istemcilere asla geri gönderilmez ve modele gösterilmez." @@ -2601,55 +2646,57 @@ msgstr "Sunucu adı" #: src/pages/McpServersOverlay.tsx:317 #: src/pages/ModelSettingsOverlay.tsx:401 -#: src/pages/Onboarding.tsx:311 +#: src/pages/Onboarding.tsx:325 msgid "Server URL" msgstr "Sunucu URL'si" -#: src/pages/Shell.tsx:2718 +#: src/pages/Shell.tsx:2712 msgid "Set up voice to call" msgstr "Arama için sesi ayarla" -#: src/pages/AccountSettingsOverlay.tsx:113 -#: src/pages/Shell.tsx:2578 -#: src/pages/Shell.tsx:2588 -#: src/pages/Shell.tsx:2859 +#: src/pages/AccountSettingsOverlay.tsx:92 +#: src/pages/Shell.tsx:2567 +#: src/pages/Shell.tsx:2577 +#: src/pages/Shell.tsx:2853 msgid "Settings" msgstr "Ayarlar" -#: src/pages/Shell.tsx:4441 +#: src/components/composer/Composer.tsx:581 msgid "Settings: General" msgstr "Ayarlar: Genel" -#: src/pages/Shell.tsx:4443 +#: src/components/composer/Composer.tsx:583 msgid "Settings: Usage" msgstr "Ayarlar: Kullanım" #: src/pages/ModelSettingsOverlay.tsx:413 -#: src/pages/Onboarding.tsx:323 +#: src/pages/Onboarding.tsx:337 msgid "Setup help" msgstr "Kurulum yardımı" #: src/pages/MemorySettingsOverlay.tsx:39 -#: src/pages/Shell.tsx:5408 +#: src/pages/Shell.tsx:4323 msgid "Shared" msgstr "Ortak" -#: src/pages/Shell.tsx:2870 +#: src/pages/Shell.tsx:2864 msgid "Show computer" msgstr "Bilgisayarı göster" -#: src/pages/Auth.tsx:95 +#: src/pages/Auth.tsx:122 +#: src/pages/ResetPassword.tsx:186 msgid "Show password" msgstr "" -#: src/pages/Shell.tsx:2870 +#: src/pages/Shell.tsx:2864 msgid "Show settings" msgstr "Ayarları göster" #: src/lib/localized-provider-hint.ts:7 -#: src/pages/Auth.tsx:161 +#: src/pages/Auth.tsx:171 #: src/pages/ModelSettingsOverlay.tsx:618 -#: src/pages/Onboarding.tsx:151 +#: src/pages/Onboarding.tsx:165 +#: src/pages/ResetPassword.tsx:155 msgid "Sign in" msgstr "Oturum aç" @@ -2657,28 +2704,32 @@ msgstr "Oturum aç" msgid "Sign in  →" msgstr "Oturum aç  →" -#: src/pages/Auth.tsx:17 +#: src/pages/Auth.tsx:142 +msgid "Sign in instead" +msgstr "" + +#: src/pages/Auth.tsx:29 msgid "Sign in to Sentra Bot" msgstr "Sentra Bot'da oturum aç" -#: src/pages/Auth.tsx:154 +#: src/pages/Auth.tsx:164 msgid "Sign up" msgstr "Kaydol" #. placeholder {0}: skill.name -#: src/pages/Shell.tsx:4251 +#: src/components/composer/Composer.tsx:391 msgid "Skill {0}" msgstr "Beceri: {0}" -#: src/pages/PluginsOverlay.tsx:713 +#: src/pages/PluginsOverlay.tsx:715 msgid "Skills" msgstr "" -#: src/pages/Shell.tsx:4588 +#: src/pages/Shell.tsx:3974 msgid "Skip" msgstr "Atla" -#: src/pages/Onboarding.tsx:548 +#: src/pages/Onboarding.tsx:562 msgid "Skip for now" msgstr "Şimdilik atla" @@ -2687,7 +2738,7 @@ msgid "Skip or deploy key" msgstr "Atla veya dağıtım anahtarı kullan" #. placeholder {0}: skipped.join(", ") -#: src/pages/Shell.tsx:1763 +#: src/pages/Shell.tsx:1746 msgid "Skipped {0}" msgstr "{0} atlandı" @@ -2704,21 +2755,21 @@ msgstr "" msgid "Space interrupts · Esc hangs up" msgstr "Boşluk keser · Esc aramayı sonlandırır" -#: src/pages/Shell.tsx:4739 -#: src/pages/Shell.tsx:5002 +#: src/components/conversation/MessageView.tsx:159 +#: src/components/conversation/MessageView.tsx:422 msgid "Speak" msgstr "Seslendir" -#: src/pages/VoiceSettingsOverlay.tsx:194 +#: src/pages/VoiceSettingsOverlay.tsx:199 msgid "Speak + transcribe" msgstr "Seslendir + yazıya dök" -#: src/pages/VoiceSettingsOverlay.tsx:196 +#: src/pages/VoiceSettingsOverlay.tsx:201 msgid "Speak only" msgstr "Yalnızca seslendir" -#: src/pages/Shell.tsx:4735 -#: src/pages/Shell.tsx:4998 +#: src/components/conversation/MessageView.tsx:155 +#: src/components/conversation/MessageView.tsx:418 msgid "Speak this reply" msgstr "Bu yanıtı seslendir" @@ -2726,11 +2777,11 @@ msgstr "Bu yanıtı seslendir" msgid "Speaking…" msgstr "Konuşuyor…" -#: src/pages/Onboarding.tsx:560 +#: src/pages/Onboarding.tsx:574 msgid "Start from a proven Chief of Staff, or build your own from scratch." msgstr "" -#: src/pages/Onboarding.tsx:644 +#: src/pages/Onboarding.tsx:658 msgid "Start from scratch" msgstr "" @@ -2744,7 +2795,7 @@ msgstr "Başlıyor" #: src/components/teach/TeachComputerSection.tsx:115 #: src/pages/ModelSettingsOverlay.tsx:616 -#: src/pages/Onboarding.tsx:487 +#: src/pages/Onboarding.tsx:501 msgid "Starting…" msgstr "Başlatılıyor…" @@ -2752,20 +2803,20 @@ msgstr "Başlatılıyor…" msgid "Steps" msgstr "Adımlar" -#: src/pages/Shell.tsx:3568 -#: src/pages/Shell.tsx:3572 -#: src/pages/Shell.tsx:4414 -#: src/pages/Shell.tsx:4739 -#: src/pages/Shell.tsx:5002 +#: src/components/composer/Composer.tsx:554 +#: src/components/conversation/MessageView.tsx:159 +#: src/components/conversation/MessageView.tsx:422 +#: src/pages/Shell.tsx:3557 +#: src/pages/Shell.tsx:3561 msgid "Stop" msgstr "Durdur" -#: src/pages/Shell.tsx:4306 +#: src/components/composer/Composer.tsx:446 msgid "Stop dictation" msgstr "Dikteyi durdur" -#: src/pages/Shell.tsx:4735 -#: src/pages/Shell.tsx:4998 +#: src/components/conversation/MessageView.tsx:155 +#: src/components/conversation/MessageView.tsx:418 msgid "Stop speaking" msgstr "Seslendirmeyi durdur" @@ -2774,8 +2825,8 @@ msgstr "Seslendirmeyi durdur" msgid "Stop teaching" msgstr "Öğretmeyi durdur" -#: src/pages/Shell.tsx:2953 -#: src/pages/Shell.tsx:3588 +#: src/pages/Shell.tsx:2947 +#: src/pages/Shell.tsx:3577 msgid "Stop the bot first" msgstr "Önce botu durdur" @@ -2788,13 +2839,13 @@ msgstr "" msgid "Stored encrypted" msgstr "Şifreli saklanıyor" -#: src/pages/Shell.tsx:4856 +#: src/components/conversation/MessageView.tsx:276 msgid "subagent" msgstr "alt ajan" #: src/components/AskCard.tsx:126 #: src/pages/ModelSettingsOverlay.tsx:576 -#: src/pages/Onboarding.tsx:449 +#: src/pages/Onboarding.tsx:463 msgid "Submit" msgstr "Gönder" @@ -2806,8 +2857,8 @@ msgstr "" msgid "Switching…" msgstr "Geçiliyor…" -#: src/pages/Shell.tsx:2956 -#: src/pages/Shell.tsx:3593 +#: src/pages/Shell.tsx:2950 +#: src/pages/Shell.tsx:3582 msgid "Take control" msgstr "Kontrolü al" @@ -2815,7 +2866,7 @@ msgstr "Kontrolü al" msgid "Teach a task" msgstr "Görev öğret" -#: src/pages/Shell.tsx:2783 +#: src/pages/Shell.tsx:2777 msgid "Teaching in progress — stop teaching before sending a new message." msgstr "Öğretme sürüyor — yeni mesaj göndermeden önce öğretmeyi durdur." @@ -2823,11 +2874,11 @@ msgstr "Öğretme sürüyor — yeni mesaj göndermeden önce öğretmeyi durdur msgid "Teaching needs a graphical sandbox computer. Desktop-host bots can run shell tasks, but not screen recording." msgstr "Öğretme, grafik arayüzlü bir sandbox bilgisayarı gerektirir. Masaüstünde çalışan botlar kabuk görevleri çalıştırabilir ama ekran kaydı yapamaz." -#: src/pages/Shell.tsx:5093 +#: src/pages/Shell.tsx:4008 msgid "Team" msgstr "Takım" -#: src/pages/Shell.tsx:5943 +#: src/pages/Shell.tsx:4858 msgid "Team Computer" msgstr "Takım Bilgisayarı" @@ -2852,20 +2903,20 @@ msgstr "" msgid "The selected memory provider is not available in this build." msgstr "Seçilen hafıza sağlayıcısı bu sürümde kullanılamıyor." -#: src/pages/Shell.tsx:5385 +#: src/pages/Shell.tsx:4300 msgid "Thinking" msgstr "Düşünüyor" -#: src/pages/Shell.tsx:2896 +#: src/pages/Shell.tsx:2890 msgid "This bot runs on this computer, not a Linux desktop. Shell and files use your home folder." msgstr "Bu bot bir Linux masaüstünde değil, bu bilgisayarda çalışır. Kabuk ve dosyalar senin kullanıcı klasörünü kullanır." -#: src/pages/Shell.tsx:3617 +#: src/pages/Shell.tsx:3606 msgid "This bot runs on this computer. There is no separate Linux desktop. Ask it to use the shell; working directories under your home folder are allowed." msgstr "Bu bot bu bilgisayarda çalışır. Ayrı bir Linux masaüstü yoktur. Kabuğu kullanmasını isteyebilirsin; kullanıcı klasörünün altındaki çalışma dizinlerine izin verilir." -#: src/pages/Shell.tsx:5785 -#: src/pages/Shell.tsx:5864 +#: src/pages/Shell.tsx:4700 +#: src/pages/Shell.tsx:4779 msgid "This cannot be undone." msgstr "Bu işlem geri alınamaz." @@ -2881,6 +2932,10 @@ msgstr "Bu bilgisayar kabuk komutlarını senin hesabınla çalıştırır; kull msgid "This file is not valid UTF-8 Markdown." msgstr "Bu dosya geçerli bir UTF-8 Markdown değil." +#: src/pages/ResetPassword.tsx:70 +msgid "This link has expired" +msgstr "" + #: src/pages/HostComputerPrompt.tsx:14 msgid "this Mac" msgstr "bu Mac" @@ -2889,15 +2944,15 @@ msgstr "bu Mac" msgid "This Mac runs shell commands with your account, including files in your home folder. Do not turn it on for a shared or public server." msgstr "Bu Mac kabuk komutlarını senin hesabınla çalıştırır; kullanıcı klasöründeki dosyalar buna dahildir. Ortak veya herkese açık bir sunucuda etkinleştirme." -#: src/pages/Shell.tsx:5670 +#: src/pages/Shell.tsx:4585 msgid "This permanently removes every message and stops current work. The chat remains available." msgstr "" -#: src/pages/Onboarding.tsx:523 +#: src/pages/Onboarding.tsx:537 msgid "This provider cannot paste a key here. Skip if this deployment already has credentials." msgstr "Bu sağlayıcı için buraya anahtar yapıştırılamaz. Bu dağıtımda kimlik bilgileri zaten varsa atla." -#: src/pages/Shell.tsx:6210 +#: src/components/conversation/MessageView.tsx:756 msgid "This server cannot be assigned without a bot." msgstr "Bu sunucu bir bot olmadan atanamaz." @@ -2909,7 +2964,7 @@ msgstr "Bu sunucu tarayıcı yetkilendirmesi istemedi." msgid "This server is already connected. Disconnect it first to authorize again." msgstr "Bu sunucu zaten bağlı. Yeniden yetkilendirmek için önce bağlantısını kes." -#: src/pages/Shell.tsx:6249 +#: src/components/conversation/MessageView.tsx:795 msgid "This server uses browser sign-in. Authorize it to let your agents use its tools — a popup will open." msgstr "Bu sunucu tarayıcıyla oturum açar. Agent'larının araçlarını kullanabilmesi için yetkilendir — bir açılır pencere açılacak." @@ -2921,17 +2976,17 @@ msgstr "Bu abonelik girişi Sentra Bot'da henüz kullanılamıyor. Bir dağıtı msgid "Time of day" msgstr "Günün saati" -#: src/pages/Onboarding.tsx:672 -#: src/pages/Shell.tsx:5160 -#: src/pages/Shell.tsx:5326 +#: src/pages/Onboarding.tsx:686 +#: src/pages/Shell.tsx:4075 +#: src/pages/Shell.tsx:4241 msgid "Title" msgstr "Başlık" -#: src/pages/PluginsOverlay.tsx:872 +#: src/pages/PluginsOverlay.tsx:874 msgid "Tool sources" msgstr "Araç kaynakları" -#: src/pages/PluginsOverlay.tsx:834 +#: src/pages/PluginsOverlay.tsx:836 msgid "Treg token" msgstr "Treg token'ı" @@ -2952,7 +3007,7 @@ msgid "Unpin" msgstr "Sabitlemeyi kaldır" #. placeholder {0}: pending.file.name -#: src/pages/Shell.tsx:1834 +#: src/pages/Shell.tsx:1821 msgid "Unsupported file type: {0}" msgstr "Desteklenmeyen dosya türü: {0}" @@ -2981,6 +3036,10 @@ msgstr "" msgid "Update finished with errors" msgstr "" +#: src/pages/ResetPassword.tsx:206 +msgid "Update password" +msgstr "" + #: src/components/SoftwareUpdateSection.tsx:172 #: src/components/SoftwareUpdateSection.tsx:189 msgid "Updated" @@ -2991,8 +3050,8 @@ msgstr "" msgid "Updating…" msgstr "" -#: src/pages/AccountSettingsOverlay.tsx:212 -#: src/pages/Shell.tsx:2639 +#: src/pages/AccountSettingsOverlay.tsx:145 +#: src/pages/Shell.tsx:2628 msgid "Usage" msgstr "Kullanım" @@ -3001,7 +3060,7 @@ msgid "Use {hostLabel}" msgstr "{hostLabel} kullan" #: src/pages/ModelSettingsOverlay.tsx:485 -#: src/pages/Onboarding.tsx:382 +#: src/pages/Onboarding.tsx:396 msgid "Use a found model" msgstr "Bulunan bir modeli kullan" @@ -3009,25 +3068,25 @@ msgstr "Bulunan bir modeli kullan" msgid "Use this model" msgstr "Bu modeli kullan" -#: src/pages/PluginsOverlay.tsx:855 +#: src/pages/PluginsOverlay.tsx:857 msgid "Verify and add" msgstr "Doğrula ve ekle" -#: src/pages/PluginsOverlay.tsx:853 +#: src/pages/PluginsOverlay.tsx:855 msgid "Verifying…" msgstr "Doğrulanıyor…" -#: src/pages/Shell.tsx:2627 -#: src/pages/Shell.tsx:5438 -#: src/pages/VoiceSettingsOverlay.tsx:124 -#: src/pages/VoiceSettingsOverlay.tsx:264 +#: src/pages/Shell.tsx:2616 +#: src/pages/Shell.tsx:4353 +#: src/pages/VoiceSettingsOverlay.tsx:129 +#: src/pages/VoiceSettingsOverlay.tsx:269 msgid "Voice" msgstr "Ses" #: src/pages/ModelSettingsOverlay.tsx:580 #: src/pages/ModelSettingsOverlay.tsx:602 -#: src/pages/Onboarding.tsx:453 -#: src/pages/Onboarding.tsx:475 +#: src/pages/Onboarding.tsx:467 +#: src/pages/Onboarding.tsx:489 msgid "Waiting for sign-in…" msgstr "Oturum açma bekleniyor…" @@ -3039,7 +3098,7 @@ msgstr "" msgid "Waiting for your message…" msgstr "" -#: src/pages/Shell.tsx:6093 +#: src/components/conversation/MessageView.tsx:639 msgid "Waiting…" msgstr "Bekleniyor…" @@ -3053,7 +3112,7 @@ msgstr "" msgid "Weekdays" msgstr "Hafta içi" -#: src/pages/Shell.tsx:5755 +#: src/pages/Shell.tsx:4670 msgid "What about its memories?" msgstr "Hafızası ne olsun?" @@ -3065,8 +3124,8 @@ msgstr "Hangi sonucu göstereceksin?" msgid "What should this routine do each time it runs?" msgstr "" -#: src/pages/Onboarding.tsx:685 -#: src/pages/Shell.tsx:5175 +#: src/pages/Onboarding.tsx:699 +#: src/pages/Shell.tsx:4090 msgid "What this bot is for" msgstr "Bu botun amacı" @@ -3099,17 +3158,19 @@ msgstr "Ne zaman kullanılır" msgid "Where should bots run?" msgstr "Botlar nerede çalışsın?" -#: src/pages/Auth.tsx:142 +#: src/pages/Auth.tsx:152 #: src/pages/CallView.tsx:242 +#: src/pages/ResetPassword.tsx:103 +#: src/pages/ResetPassword.tsx:206 msgid "Working…" msgstr "Çalışıyor…" -#: src/pages/Shell.tsx:5368 +#: src/pages/Shell.tsx:4283 msgid "Workspace default" msgstr "Çalışma alanı varsayılanı" -#: src/pages/Shell.tsx:1558 -#: src/pages/Shell.tsx:2175 +#: src/pages/Shell.tsx:1541 +#: src/pages/Shell.tsx:2164 msgid "You" msgstr "Sen" @@ -3121,16 +3182,21 @@ msgstr "Otomatik yönlendirilmezsen bu sekmeyi kapatabilirsin." msgid "You can close this window." msgstr "Bu pencereyi kapatabilirsin." -#: src/pages/Shell.tsx:2933 -#: src/pages/Shell.tsx:3558 +#: src/pages/Shell.tsx:2927 +#: src/pages/Shell.tsx:3547 msgid "You have control" msgstr "Kontrol sende" -#: src/pages/Onboarding.tsx:660 +#: src/pages/ResetPassword.tsx:152 +msgid "You’ve been signed out everywhere. Sign in with your new password." +msgstr "" + +#: src/pages/Onboarding.tsx:674 msgid "Your bot" msgstr "" -#: src/pages/Auth.tsx:69 +#: src/pages/Auth.tsx:80 +#: src/pages/ResetPassword.tsx:89 msgid "Your email address" msgstr "E-posta adresin" @@ -3138,7 +3204,7 @@ msgstr "E-posta adresin" msgid "Your key or subscription token is stored securely and is never shown here." msgstr "Anahtarın veya abonelik token'ın güvenle saklanır ve burada asla gösterilmez." -#: src/pages/Auth.tsx:56 +#: src/pages/Auth.tsx:67 msgid "Your name" msgstr "Adın" diff --git a/apps/web/src/pages/AccountSettingsOverlay.tsx b/apps/web/src/pages/AccountSettingsOverlay.tsx index bbdc389e..4636059d 100644 --- a/apps/web/src/pages/AccountSettingsOverlay.tsx +++ b/apps/web/src/pages/AccountSettingsOverlay.tsx @@ -1,6 +1,4 @@ import { Trans, useLingui } from "@lingui/react/macro"; -import type { AvatarStyle } from "@sentrabot/contracts"; -import { BotAvatar } from "@sentrabot/ui-web"; import { ChevronDown } from "lucide-react"; import { type KeyboardEvent as ReactKeyboardEvent, @@ -23,8 +21,6 @@ export function AccountSettingsOverlay({ name, usage, focusUsage, - avatarStyle, - onAvatarStyleChange, isDeploymentOwner = false, sandboxProvider, phoneEnabled = false, @@ -35,8 +31,6 @@ export function AccountSettingsOverlay({ name: string; usage?: { runs: number; inputTokens: number; outputTokens: number } | null; focusUsage?: boolean; - avatarStyle: AvatarStyle; - onAvatarStyleChange: (style: AvatarStyle) => Promise; isDeploymentOwner?: boolean; sandboxProvider?: string | null; phoneEnabled?: boolean; @@ -50,8 +44,6 @@ export function AccountSettingsOverlay({ onCloseRef.current = onClose; const [locale, setLocale] = useState(() => getActiveUiLocale()); const localeRequestRef = useRef(0); - const [avatarPending, setAvatarPending] = useState(false); - const [avatarError, setAvatarError] = useState(null); useEffect(() => { const previousFocus = @@ -83,19 +75,6 @@ export function AccountSettingsOverlay({ }); } - async function chooseAvatarStyle(next: AvatarStyle) { - if (avatarPending || next === avatarStyle) return; - setAvatarPending(true); - setAvatarError(null); - try { - await onAvatarStyleChange(next); - } catch { - setAvatarError(t`Couldn't update avatars`); - } finally { - setAvatarPending(false); - } - } - return (
-
-

- Avatars -

-
- {(["clay", "robot", "organic"] as const).map((style) => { - const selected = style === avatarStyle; - return ( - - ); - })} -
- {avatarError ? ( -

- {avatarError} -

- ) : null} -
-
(location.state?.email ?? ""); const [password, setPassword] = useState(""); const [name, setName] = useState(""); const [showPassword, setShowPassword] = useState(false); const [error, setError] = useState(null); + const [duplicateEmail, setDuplicateEmail] = useState(false); const [pending, setPending] = useState(false); const passwordFieldId = mode === "in" ? "current-password" : "new-password"; + const passwordDescribedBy = + [mode === "up" ? "new-password-hint" : null, error ? "auth-error" : null] + .filter(Boolean) + .join(" ") || undefined; const title = mode === "in" ? Sign in to Sentra Bot : Create your Sentra Bot; @@ -20,6 +32,7 @@ export function AuthPage({ mode }: { mode: "in" | "up" }) { e.preventDefault(); setPending(true); setError(null); + setDuplicateEmail(false); const result = mode === "up" ? await authClient.signUp.email({ @@ -30,6 +43,10 @@ export function AuthPage({ mode }: { mode: "in" | "up" }) { : await authClient.signIn.email({ email, password }); setPending(false); if (result.error) { + if (result.error.code && DUPLICATE_EMAIL_CODES.has(result.error.code)) { + setDuplicateEmail(true); + return; + } setError(result.error.message ?? t`Could not continue`); return; } @@ -37,133 +54,125 @@ export function AuthPage({ mode }: { mode: "in" | "up" }) { } return ( -
-
-
- - -
-

{title}

- {mode === "up" ? ( - - ) : null} -
, ); - const gradMatches = [...html.matchAll(/id="([^"]+)"/g)].map((m) => m[1]); + const gradMatches = [...html.matchAll(/id="(clay-body-[^"]+)"/g)].map((m) => m[1]); expect(gradMatches).toHaveLength(2); expect(gradMatches[0]).toBeTruthy(); expect(gradMatches[1]).toBeTruthy(); expect(gradMatches[0]).not.toBe(gradMatches[1]); - expect(html).toContain(`stroke="url(#${gradMatches[0]})"`); - expect(html).toContain(`stroke="url(#${gradMatches[1]})"`); + expect(html).toContain(`fill="url(#${gradMatches[0]})"`); + expect(html).toContain(`fill="url(#${gradMatches[1]})"`); }); it.each(["running", "queued", "leased", "waiting_input", "waiting_takeover"])( - "renders active working ring for %s status", + "renders the chip in its working state for %s status", (status) => { const html = renderToString(); expect(html).toContain(" { + it("keeps the chip mounted when idle so its timeline does not reset", () => { const html = renderToString(); expect(html).toContain('data-working="false"'); - expect(html).toContain("sentrabot-bot-avatar-ring"); + expect(html).toContain("sentrabot-clay-avatar"); }); - it("generates an organic avatar from the bot color", () => { + it("generates the chip avatar from the bot color (formerly the organic variant)", () => { const html = renderToString( , ); - expect(html).toContain("sentrabot-organic-avatar"); + expect(html).toContain("sentrabot-clay-avatar"); expect(html).toContain('data-working="true"'); - expect(html).toMatch(/data-shape-family="\d"/); - expect(html).toMatch(/data-eye-pattern="[0-3]"/); - expect(html).toContain(" { + it("generates distinct chip renders for distinct bot identities", () => { const maya = renderToString(); const github = renderToString( , @@ -61,7 +61,7 @@ describe("BotAvatar", () => { expect(maya).not.toEqual(github); }); - it("assigns animation hooks across every organic shape family", () => { + it("renders the chip avatar working state across many bot identities (formerly per shape family)", () => { const identities = new Map(); for (let index = 0; index < 500 && identities.size < 10; index++) { const identity = `avatar-${index}`; @@ -69,12 +69,11 @@ describe("BotAvatar", () => { } expect(identities.size).toBe(10); - for (const [family, identity] of identities) { + for (const [, identity] of identities) { const html = renderToString( , ); - expect(html).toContain(`data-shape-family="${family}"`); - expect(html).toMatch(/data-eye-pattern="[0-3]"/); + expect(html).toContain("sentrabot-clay-avatar-eyes"); expect(html).toContain('data-working="true"'); } }); @@ -109,17 +108,17 @@ describe("BotAvatar", () => { expect(ids[0]).not.toBe(ids[1]); }); - it("uses the account avatar preference when no local variant is provided", () => { + it("renders the single chip character regardless of the account avatar preference", () => { const html = renderToString( , ); - expect(html).toContain("sentrabot-organic-avatar"); + expect(html).toContain("sentrabot-clay-avatar"); }); - it("keeps the organic morph timeline stable across status updates", () => { + it("keeps the chip idle timeline stable across status updates", () => { const idle = renderToString( , ); @@ -127,15 +126,31 @@ describe("BotAvatar", () => { , ); - expect(working.match(/]+dur="([^"]+)"/)?.[1]).toBe( - idle.match(/]+dur="([^"]+)"/)?.[1], + expect(idle.match(/--sentrabot-clay-idle-duration:([^;"]+)/)?.[1]).toBe( + working.match(/--sentrabot-clay-idle-duration:([^;"]+)/)?.[1], ); - expect(idle).toContain("sentrabot-organic-avatar-eyes-idle"); - expect(idle).toContain("sentrabot-organic-avatar-eyes-working"); - expect(idle).toContain("sentrabot-organic-avatar-body-idle"); - expect(idle).toContain("sentrabot-organic-avatar-body-working"); + expect(idle).toContain("sentrabot-clay-avatar-eyes"); expect(readFileSync(new URL("./styles.css", import.meta.url), "utf8")).not.toMatch( /data-working[^}]+animation:/s, ); }); + + describe("mixHex", () => { + it("returns base for an invalid tint", () => { + expect(mixHex("#F3ECDA", "not-a-color", 0.3)).toBe("#F3ECDA"); + }); + + it("returns the tint at amount 1", () => { + expect(mixHex("#F3ECDA", "#112233", 1)).toBe("#112233"); + }); + + it("returns base at amount 0", () => { + expect(mixHex("#F3ECDA", "#112233", 0)).toBe("#f3ecda"); + }); + + it("clamps an out-of-range amount", () => { + expect(mixHex("#F3ECDA", "#112233", 5)).toBe(mixHex("#F3ECDA", "#112233", 1)); + expect(mixHex("#F3ECDA", "#112233", -5)).toBe(mixHex("#F3ECDA", "#112233", 0)); + }); + }); }); diff --git a/packages/ui-web/src/bot-avatar.tsx b/packages/ui-web/src/bot-avatar.tsx index 6115e537..2c8bb294 100644 --- a/packages/ui-web/src/bot-avatar.tsx +++ b/packages/ui-web/src/bot-avatar.tsx @@ -1,6 +1,6 @@ -import { ACTIVE_RUN_STATUSES, avatarIdentitySeed, organicAvatarPath } from "@sentrabot/core"; +import { ACTIVE_RUN_STATUSES, avatarIdentitySeed } from "@sentrabot/core"; import { type CSSProperties, memo, useEffect, useId, useRef, useSyncExternalStore } from "react"; -import { type AvatarStyle, useAvatarStyle } from "./avatar-style.js"; +import type { AvatarStyle } from "./avatar-style.js"; import { cn } from "./lib/utils.js"; import "./styles.css"; @@ -8,6 +8,7 @@ export interface BotAvatarProps { color: string; size?: number; status?: string; + /** Retained for API and database compatibility while the product ships a single character. */ variant?: AvatarStyle; identity?: string; className?: string; @@ -17,158 +18,84 @@ export const BotAvatar = memo(function BotAvatar({ color, size = 38, status, - variant, identity, className, }: BotAvatarProps) { const isWorking = ACTIVE_RUN_STATUSES.some((activeStatus) => activeStatus === status); - const gradId = `spin-grad-${useId().replace(/[^a-zA-Z0-9-_]/g, "")}`; - const preferredVariant = useAvatarStyle(); - const effectiveVariant = variant ?? preferredVariant; - if (effectiveVariant === "organic") { - return ( - - ); - } - if (effectiveVariant === "clay") { - return ( - - ); - } - const visorW = Math.round(size * 0.68); - const visorH = Math.round(size * 0.44); - const eyeW = Math.max(4, Math.round(size * 0.14)); - const eyeH = Math.max(7, Math.round(size * 0.22)); - const eyeRadius = Math.max(2, Math.round(eyeW * 0.5)); - const eyeGap = Math.max(3, Math.round(size * 0.1)); + return ( + + ); +}); - const seed = hashString(color || "#8B5CF6"); - const eyeVariant = seed % 4; - const idleDuration = (4.2 + ((seed * 7) % 28) / 10).toFixed(2); - const idleDelay = (-(((seed * 13) % 45) / 10)).toFixed(2); - const eyeGlow = `0 0 4px #FFFFFF, 0 0 8px #FFFFFF, 0 0 14px ${lightenColor(color, 20)}`; - const idleEyeAnimation = { - "--sentrabot-eye-animation-name": `sentrabot-eyes-idle-${eyeVariant}`, - "--sentrabot-eye-animation-duration": `${idleDuration}s`, - "--sentrabot-eye-animation-easing": "cubic-bezier(0.4, 0, 0.2, 1)", - "--sentrabot-eye-animation-delay": `${idleDelay}s`, - } as CSSProperties; - const workingEyeAnimation = { - "--sentrabot-eye-animation-name": "sentrabot-eyes-working", - "--sentrabot-eye-animation-duration": "1.4s", - "--sentrabot-eye-animation-easing": "ease-in-out", - "--sentrabot-eye-animation-delay": "0s", - } as CSSProperties; +const EYE_TRACKING_MIN_SIZE = 48; - return ( -
- - - - - - - - - - - +type PointerListener = (x: number, y: number) => void; +const pointerListeners = new Set(); +let pointerFrame = 0; +let pointerX = 0; +let pointerY = 0; -
-
+function flushPointer() { + pointerFrame = 0; + for (const listener of pointerListeners) listener(pointerX, pointerY); +} - {(["idle", "working"] as const).map((mode) => ( -
- {[0, 1].map((eye) => ( - - ))} -
- ))} -
-
- ); -}); +function handlePointerMove(event: PointerEvent) { + pointerX = event.clientX; + pointerY = event.clientY; + if (!pointerFrame) pointerFrame = requestAnimationFrame(flushPointer); +} + +function subscribeToPointer(listener: PointerListener): () => void { + if (pointerListeners.size === 0) { + window.addEventListener("pointermove", handlePointerMove, { passive: true }); + } + pointerListeners.add(listener); + return () => { + pointerListeners.delete(listener); + if (pointerListeners.size === 0) { + window.removeEventListener("pointermove", handlePointerMove); + if (pointerFrame) cancelAnimationFrame(pointerFrame); + pointerFrame = 0; + } + }; +} + +/** Blend `tint` into `base` by `amount` (0..1). Invalid input returns `base`. */ +export function mixHex(base: string, tint: string, amount: number): string { + const a = parseHex(base); + const b = parseHex(tint); + if (!a || !b) return base; + const t = Math.min(1, Math.max(0, amount)); + const channel = (x: number, y: number) => Math.round(x + (y - x) * t); + const r = channel(a[0], b[0]); + const g = channel(a[1], b[1]); + const bl = channel(a[2], b[2]); + return `#${((1 << 24) + (r << 16) + (g << 8) + bl).toString(16).slice(1)}`; +} + +function parseHex(hex: string): [number, number, number] | null { + const clean = hex.replace(/^#/, ""); + const full = + clean.length === 3 + ? clean + .split("") + .map((c) => c + c) + .join("") + : clean; + if (full.length !== 6 || !/^[0-9a-fA-F]{6}$/.test(full)) return null; + const num = Number.parseInt(full, 16); + return [(num >> 16) & 255, (num >> 8) & 255, num & 255]; +} -/** Mascot avatar: glossy cream clay robot — squircle body, pill eyes, stub arms and legs. */ -function ClayAvatar({ +/** Mascot avatar: glossy cream chip robot — squircle body, pill eyes, stub arms and legs. */ +function ChipAvatar({ color, identity, size, @@ -195,42 +122,36 @@ function ClayAvatar({ const svgRef = useRef(null); const eyesRef = useRef(null); - // Eyes follow the pointer: one listener per avatar, rAF-throttled, writing the - // transform directly to the DOM (no React state) so dozens of avatars stay cheap. + // Eyes follow the pointer: one shared window listener for every avatar, rAF-throttled, + // writing the transform directly to the DOM (no React state) so dozens of avatars stay + // cheap. Small avatars (list rows, etc.) skip tracking entirely. useEffect(() => { - if (reducedMotion) return; - let frame = 0; - let pointer: { x: number; y: number } | null = null; - const apply = () => { - frame = 0; + if (reducedMotion || size < EYE_TRACKING_MIN_SIZE) return; + const unsubscribe = subscribeToPointer((x, y) => { const svg = svgRef.current; const eyes = eyesRef.current; - if (!svg || !eyes || !pointer) return; + if (!svg || !eyes) return; const rect = svg.getBoundingClientRect(); if (rect.width === 0) return; - const dx = pointer.x - (rect.left + rect.width / 2); - const dy = pointer.y - (rect.top + rect.height / 2); + const dx = x - (rect.left + rect.width / 2); + const dy = y - (rect.top + rect.height / 2); const distance = Math.hypot(dx, dy) || 1; const reach = Math.min(1, distance / 160); const offsetX = (dx / distance) * 5 * reach; const offsetY = (dy / distance) * 3.5 * reach; eyes.style.transform = `translate(${offsetX.toFixed(2)}px, ${offsetY.toFixed(2)}px)`; - }; - const onPointerMove = (event: PointerEvent) => { - pointer = { x: event.clientX, y: event.clientY }; - if (!frame) frame = requestAnimationFrame(apply); - }; - window.addEventListener("pointermove", onPointerMove, { passive: true }); + }); return () => { - window.removeEventListener("pointermove", onPointerMove); - if (frame) cancelAnimationFrame(frame); + unsubscribe(); if (eyesRef.current) eyesRef.current.style.transform = ""; }; - }, [reducedMotion]); + }, [reducedMotion, size]); - const cream = "#F3ECDA"; - const creamDark = "#E4D8BC"; - const limb = { fill: creamDark, stroke: "rgba(70,58,30,0.16)", strokeWidth: 1 }; + const cream = mixHex("#FBF5E6", color, 0.1); + const creamMid = mixHex("#F3ECDA", color, 0.22); + const creamDark = mixHex("#E4D8BC", color, 0.34); + const limbFill = mixHex("#E4D8BC", color, 0.3); + const limb = { fill: limbFill, stroke: "rgba(70,58,30,0.16)", strokeWidth: 1 }; return ( - - + + @@ -316,88 +237,6 @@ function ClayAvatar({ ); } -function OrganicAvatar({ - color, - identity, - size, - isWorking, - className, -}: { - color: string; - identity?: string; - size: number; - isWorking: boolean; - className?: string; -}) { - const reducedMotion = useSyncExternalStore( - subscribeToReducedMotion, - reducedMotionSnapshot, - () => false, - ); - const seed = avatarIdentitySeed(identity || color || "#8B5CF6"); - const duration = `${4.8 + (seed % 24) / 10}s`; - const shapeA = organicAvatarPath(seed); - const shapeB = organicAvatarPath(seed, 0.42); - - return ( - - ); -} - const reducedMotionMedia = "(prefers-reduced-motion: reduce)"; function reducedMotionSnapshot(): boolean { @@ -410,45 +249,6 @@ function subscribeToReducedMotion(onChange: () => void): () => void { return () => media.removeEventListener("change", onChange); } -function hashString(str: string): number { - let hash = 0; - for (let i = 0; i < str.length; i++) { - hash = (hash << 5) - hash + str.charCodeAt(i); - hash |= 0; - } - return Math.abs(hash); -} - -function lightenColor(hex: string, percent: number): string { - return adjustColor(hex, percent); -} - -function darkenColor(hex: string, percent: number): string { - return adjustColor(hex, -percent); -} - -function adjustColor(hex: string, percent: number): string { - const clean = hex.replace(/^#/, ""); - if (clean.length !== 6 && clean.length !== 3) return hex; - const num = parseInt( - clean.length === 3 - ? clean - .split("") - .map((c) => c + c) - .join("") - : clean, - 16, - ); - if (Number.isNaN(num)) return hex; - let r = (num >> 16) + Math.round((255 * percent) / 100); - let g = ((num >> 8) & 0x00ff) + Math.round((255 * percent) / 100); - let b = (num & 0x0000ff) + Math.round((255 * percent) / 100); - r = Math.min(255, Math.max(0, r)); - g = Math.min(255, Math.max(0, g)); - b = Math.min(255, Math.max(0, b)); - return `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`; -} - export function Wordmark({ className }: { className?: string }) { return (
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 89b8047f..343fdb5f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -100,6 +100,12 @@ importers: '@expo/metro-runtime': specifier: ~57.0.14 version: 57.0.14(@expo/log-box@57.0.4)(expo@57.0.18)(react-dom@19.2.3(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + '@lingui/core': + specifier: 5.9.5 + version: 5.9.5(@lingui/babel-plugin-lingui-macro@5.9.5(typescript@6.0.3)) + '@lingui/react': + specifier: 5.9.5 + version: 5.9.5(@lingui/babel-plugin-lingui-macro@5.9.5(typescript@6.0.3))(react@19.2.3) '@react-native-vector-icons/ionicons': specifier: 13.1.2 version: 13.1.2(@expo/config-plugins@57.0.9(typescript@6.0.3))(@react-native/assets-registry@0.86.3)(expo-font@57.0.2)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) @@ -203,6 +209,12 @@ importers: specifier: 0.10.1 version: 0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) devDependencies: + '@lingui/babel-plugin-lingui-macro': + specifier: 5.9.5 + version: 5.9.5(typescript@6.0.3) + '@lingui/cli': + specifier: 5.9.5 + version: 5.9.5(typescript@6.0.3) '@react-native/metro-config': specifier: 0.86.3 version: 0.86.3(@babel/core@7.29.7) @@ -212,6 +224,9 @@ importers: '@types/react': specifier: ^19.2.18 version: 19.2.18 + babel-preset-expo: + specifier: ~57.0.9 + version: 57.0.9(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo@57.0.18)(react-refresh@0.14.2) typescript: specifier: ~6.0.3 version: 6.0.3 @@ -479,6 +494,9 @@ importers: koffi: specifier: ^2.9.0 version: 2.16.3 + nodemailer: + specifier: ^10.0.2 + version: 10.0.2 pg: specifier: ^8.16.3 version: 8.23.0 @@ -513,6 +531,9 @@ importers: packages/auth: dependencies: + '@sentrabot/adapter-kit': + specifier: workspace:* + version: link:../adapter-kit '@sentrabot/core': specifier: workspace:* version: link:../core @@ -6719,6 +6740,10 @@ packages: resolution: {integrity: sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==} engines: {node: '>=18'} + nodemailer@10.0.2: + resolution: {integrity: sha512-83mO0TnWXySiJXdMAIUYmlXYdJ2KUq/w8EJgc4ogKU2UssaHf7ZPeuHcb4YCxeNiM0DDshnm291U0/ClrSZZsg==} + engines: {node: '>=20.0.0'} + nopt@9.0.0: resolution: {integrity: sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==} engines: {node: ^20.17.0 || >=22.9.0} @@ -10473,6 +10498,18 @@ snapshots: - supports-color - typescript + '@lingui/babel-plugin-lingui-macro@5.9.5(typescript@6.0.3)': + dependencies: + '@babel/core': 7.29.7 + '@babel/runtime': 7.29.7 + '@babel/types': 7.29.8 + '@lingui/conf': 5.9.5(typescript@6.0.3) + '@lingui/core': 5.9.5(@lingui/babel-plugin-lingui-macro@5.9.5(typescript@6.0.3)) + '@lingui/message-utils': 5.9.5 + transitivePeerDependencies: + - supports-color + - typescript + '@lingui/cli@5.9.5(typescript@5.9.3)': dependencies: '@babel/core': 7.29.7 @@ -10507,6 +10544,40 @@ snapshots: - supports-color - typescript + '@lingui/cli@5.9.5(typescript@6.0.3)': + dependencies: + '@babel/core': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/parser': 7.29.8 + '@babel/runtime': 7.29.7 + '@babel/types': 7.29.8 + '@lingui/babel-plugin-extract-messages': 5.9.5 + '@lingui/babel-plugin-lingui-macro': 5.9.5(typescript@6.0.3) + '@lingui/conf': 5.9.5(typescript@6.0.3) + '@lingui/core': 5.9.5(@lingui/babel-plugin-lingui-macro@5.9.5(typescript@6.0.3)) + '@lingui/format-po': 5.9.5(typescript@6.0.3) + '@lingui/message-utils': 5.9.5 + chokidar: 3.5.1 + cli-table: 0.3.11 + commander: 10.0.1 + convert-source-map: 2.0.0 + date-fns: 3.6.0 + esbuild: 0.25.12 + glob: 11.1.0 + micromatch: 4.0.8 + ms: 2.1.3 + normalize-path: 3.0.0 + ora: 5.4.1 + picocolors: 1.1.1 + pofile: 1.1.4 + pseudolocale: 2.3.0 + source-map: 0.7.6 + threads: 1.7.0 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - typescript + '@lingui/conf@5.9.5(typescript@5.9.3)': dependencies: '@babel/runtime': 7.29.7 @@ -10517,6 +10588,16 @@ snapshots: transitivePeerDependencies: - typescript + '@lingui/conf@5.9.5(typescript@6.0.3)': + dependencies: + '@babel/runtime': 7.29.7 + cosmiconfig: 8.3.6(typescript@6.0.3) + jest-validate: 29.7.0 + jiti: 2.7.0 + picocolors: 1.1.1 + transitivePeerDependencies: + - typescript + '@lingui/core@5.9.5(@lingui/babel-plugin-lingui-macro@5.9.5(typescript@5.9.3))': dependencies: '@babel/runtime': 7.29.7 @@ -10524,6 +10605,13 @@ snapshots: optionalDependencies: '@lingui/babel-plugin-lingui-macro': 5.9.5(typescript@5.9.3) + '@lingui/core@5.9.5(@lingui/babel-plugin-lingui-macro@5.9.5(typescript@6.0.3))': + dependencies: + '@babel/runtime': 7.29.7 + '@lingui/message-utils': 5.9.5 + optionalDependencies: + '@lingui/babel-plugin-lingui-macro': 5.9.5(typescript@6.0.3) + '@lingui/format-po@5.9.5(typescript@5.9.3)': dependencies: '@lingui/conf': 5.9.5(typescript@5.9.3) @@ -10533,6 +10621,15 @@ snapshots: transitivePeerDependencies: - typescript + '@lingui/format-po@5.9.5(typescript@6.0.3)': + dependencies: + '@lingui/conf': 5.9.5(typescript@6.0.3) + '@lingui/message-utils': 5.9.5 + date-fns: 3.6.0 + pofile: 1.1.4 + transitivePeerDependencies: + - typescript + '@lingui/macro@5.9.5(@lingui/babel-plugin-lingui-macro@5.9.5(typescript@5.9.3))(react@19.2.3)': dependencies: '@lingui/core': 5.9.5(@lingui/babel-plugin-lingui-macro@5.9.5(typescript@5.9.3)) @@ -10555,6 +10652,14 @@ snapshots: optionalDependencies: '@lingui/babel-plugin-lingui-macro': 5.9.5(typescript@5.9.3) + '@lingui/react@5.9.5(@lingui/babel-plugin-lingui-macro@5.9.5(typescript@6.0.3))(react@19.2.3)': + dependencies: + '@babel/runtime': 7.29.7 + '@lingui/core': 5.9.5(@lingui/babel-plugin-lingui-macro@5.9.5(typescript@6.0.3)) + react: 19.2.3 + optionalDependencies: + '@lingui/babel-plugin-lingui-macro': 5.9.5(typescript@6.0.3) + '@lingui/vite-plugin@5.9.5(typescript@5.9.3)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))': dependencies: '@lingui/cli': 5.9.5(typescript@5.9.3) @@ -13037,6 +13142,15 @@ snapshots: optionalDependencies: typescript: 5.9.3 + cosmiconfig@8.3.6(typescript@6.0.3): + dependencies: + import-fresh: 3.3.1 + js-yaml: 4.3.2 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 6.0.3 + cpu-features@0.0.10: dependencies: buildcheck: 0.0.7 @@ -14313,7 +14427,7 @@ snapshots: es6-error: 4.1.1 matcher: 3.0.0 roarr: 2.15.4 - semver: 7.7.4 + semver: 7.8.5 serialize-error: 7.0.1 optional: true @@ -15631,11 +15745,11 @@ snapshots: node-abi@4.35.0: dependencies: - semver: 7.7.4 + semver: 7.8.5 node-api-version@0.2.1: dependencies: - semver: 7.7.4 + semver: 7.8.5 node-domexception@1.0.0: {} @@ -15658,7 +15772,7 @@ snapshots: graceful-fs: 4.2.11 nopt: 9.0.0 proc-log: 6.1.0 - semver: 7.7.4 + semver: 7.8.5 tar: 7.5.22 tinyglobby: 0.2.17 undici: 6.28.0 @@ -15668,6 +15782,8 @@ snapshots: node-releases@2.0.54: {} + nodemailer@10.0.2: {} + nopt@9.0.0: dependencies: abbrev: 4.0.0