diff --git a/.github/workflows/hf_space_push.yml b/.github/workflows/hf_space_push.yml new file mode 100644 index 0000000..1556734 --- /dev/null +++ b/.github/workflows/hf_space_push.yml @@ -0,0 +1,32 @@ +name: Sync Agent Tide Demo to Hugging Face Space +on: + push: + branches: [main] + tags: [ "*" ] + release: + types: [published, created, edited] + + workflow_dispatch: + +jobs: + sync-to-hub: + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v3 + with: + fetch-depth: 0 + lfs: true + + - name: Deploy examples/hf_demo_space to HF Space + env: + HF_TOKEN: ${{ secrets.HF_TOKEN }} + run: | + cd examples/hf_demo_space + git init --initial-branch=main + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git remote add origin https://McLoviniTtt:$HF_TOKEN@huggingface.co/spaces/McLoviniTtt/AgentTideDemo + git add . + git commit -m "Deploy Agent Tide Demo to HF Space" + git push --force origin main diff --git a/.github/workflows/python_package.yml b/.github/workflows/python_package.yml index e606c29..0f0920c 100644 --- a/.github/workflows/python_package.yml +++ b/.github/workflows/python_package.yml @@ -44,12 +44,12 @@ jobs: flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - name: Test with pytest - run: pytest tests --ignore=tests/agents + run: pytest tests --ignore=tests/agents --ignore=tests/mcp/tools - name: Install package with agents requirements run: | - python -m pip install .[agents] + python -m pip install -r requirements-agents.txt - name: Test agents with pytest - run: pytest tests/agents + run: pytest tests/agents tests/mcp/tools security: name: Security Check runs-on: ubuntu-latest diff --git a/.gitignore b/.gitignore index 2d1f6ee..37205fb 100644 --- a/.gitignore +++ b/.gitignore @@ -177,4 +177,7 @@ storage/ logs/ observability_data/ config/ +*.db +.files/ +codetide/agents/tide/ui/assets/ diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..9e9fb18 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,10 @@ +include requirements.txt +include requirements-agents.txt +include docs/assets/codetide-logo.png +include requirements-visualization.txt +include README.md + +# Include all files in codetide/agents/tide/ui/.chainlit and public directories (and subdirectories) +recursive-include codetide/agents/tide/ui/.chainlit * +recursive-include codetide/agents/tide/ui/public * +recursive-include codetide/agents/tide/ui * \ No newline at end of file diff --git a/MANIFIEST.in b/MANIFIEST.in deleted file mode 100644 index 61bb3d3..0000000 --- a/MANIFIEST.in +++ /dev/null @@ -1,5 +0,0 @@ -include requirements.txt -include requirements-agents.txt -include docs/assets/codetide-logo.png -include requirements-visualization.txt -include README.md diff --git a/README.md b/README.md index 6ad17a5..7bae7f8 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,23 @@ +
+ -# code-tide-logo CodeTide +code-tide-logo + + + [![GitHub Stars](https://img.shields.io/github/stars/BrunoV21/CodeTide?style=social)](https://github.com/BrunoV21/CodeTide/stargazers) [![PyPI Downloads](https://static.pepy.tech/badge/CodeTide)](https://pepy.tech/projects/CodeTide) [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/CodeTide?style=flat)](https://pypi.org/pypi/codetide/) [![PyPI - Version](https://img.shields.io/pypi/v/CodeTide?style=flat)](https://pypi.org/pypi/codetide/) [![Pydantic v2](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/pydantic/pydantic/main/docs/badge/v2.json)](https://pydantic.dev) ---- -**CodeTide** is a fully local, privacy-preserving tool for parsing and understanding Python codebases using symbolic, structural analysis. No internet, no LLMs, no embeddings - just fast, explainable, and deterministic code intelligence. +
--- +**CodeTide** is a fully local, privacy-preserving tool for parsing and understanding Python codebases using symbolic, structural analysis. No internet, no LLMs, no embeddings - just fast, explainable, and deterministic code intelligence. + + ## βœ… Key Features - βœ… 100% **local & private** - all parsing and querying happens on your machine. @@ -20,6 +27,64 @@ - ⚑ Fast, cacheable parsing with smart update detection. - πŸ” Designed to work alongside tools like Copilot, GPT, and Claude - on your terms. + +--- +# Entrypoints & Usage + +CodeTide provides several entrypoints for interacting with the system via command-line and web UI. These entrypoints are exposed through the `uvx` launcher and require the appropriate extras to be installed. + +## CodeTide CLI + +To use the main CodeTide CLI: + +```sh +uvx --from codetide codetide-cli --help +``` +## AgentTide + +AgentTide consists of a demo, showing how CodeTide can integrate with LLMs and augment code generation and condebase related workflows. If you ask Tide to describe himself, he will say something like this: I'm the next-generation, precision-driven software engineering agent built on top of CodeTide. You can use it via the command-line interface (CLI) or a beautiful interactive UI. + +--- + +
+ +agent-tide-demo +
+ +--- + +**AgentTide CLI** + +To use the AgentTide conversational CLI, you must install the `[agents]` extra and launch via: + +```sh +uvx --from codetide[agents] agent-tide +``` + +This will start an interactive terminal session with AgentTide. + +**AgentTide UI** + +To use the AgentTide web UI, you must install the `[agents-ui]` extra and launch via: + +```sh +uvx --from codetide[agents-ui] agent-tide-ui +``` + +This will start a web server for the AgentTide UI. Follow the on-screen instructions to interact with the agent in your browser at [http://localhost:9753](http://localhost:9753) (or the port you specified) + +### Why Try AgentTide? ([Full Guide & Tips Here](codetide/agents/tide/ui/chainlit.md)) + +**Local-First & Private:** All code analysis and patching is performed locally. Your code never leaves your machine. +- **Transparent & Stepwise:** See every plan and patch before it's applied. Edit, reorder, or approve stepsβ€”you're always in control. +- **Context-Aware:** AgentTide loads only the relevant code identifiers and dependencies for your request, making it fast and precise. +- **Human-in-the-Loop:** After each step, review the patch, provide feedback, or continueβ€”no black-box agent behavior. +- **Patch-Based Editing:** All changes are atomic diffs, not full file rewrites, for maximum clarity and efficiency. + +**Usage Tips:** +If you know the exact code context, specify identifiers directly in your request (e.g., `module.submodule.file_withoutextension.object`). +You can request a plan, edit steps, and proceed step-by-stepβ€”see the [chainlit.md](codetide/agents/tide/ui/chainlit.md) for full details and advanced workflows! + --- ## πŸ”Œ VSCode Extension @@ -461,6 +526,9 @@ Here’s what’s next for CodeTide: ~~- 🧭 **Handle relative imports** in Python projects β†’ Improve resolution for intra-package navigation.~~ +- πŸš€ **AgentTideUi Hugging Face Space** + β†’ We are planning to make AgentTideUi available as a Hugging Face Space, supporting GitHub OAuth for user session and allowing users to provide a repo URL for one-time conversations. + --- ## πŸ€– Agents Module: AgentTide diff --git a/codetide/__init__.py b/codetide/__init__.py index 17648a9..3b5f2fc 100644 --- a/codetide/__init__.py +++ b/codetide/__init__.py @@ -1,7 +1,7 @@ from codetide.core.defaults import ( CODETIDE_ASCII_ART, DEFAULT_SERIALIZATION_PATH, DEFAULT_MAX_CONCURRENT_TASKS, DEFAULT_BATCH_SIZE, DEFAULT_CACHED_ELEMENTS_FILE, DEFAULT_CACHED_IDS_FILE, - LANGUAGE_EXTENSIONS + LANGUAGE_EXTENSIONS, SKIP_EXTENSIONS ) from codetide.core.models import CodeFileModel, CodeBase, CodeContextStructure from codetide.core.common import readFile, writeFile @@ -474,6 +474,18 @@ async def check_for_updates(self, include_cached_ids=kwargs.get("include_cached_ids", False) ) + @staticmethod + def _is_file_content_valid(filepath :Path)->bool: + # Lowercase name for case-insensitive matching + name_lower = filepath.name.lower() + + # Skip if extension or full filename is in SKIP_EXTENSIONS + for ext in SKIP_EXTENSIONS: + if name_lower.endswith(ext.lower()): + return False + + return True + def _precheck_id_is_file(self, unique_ids : List[str])->Dict[Path, str]: """ Preload file contents for the given IDs if they correspond to known files. @@ -486,7 +498,7 @@ def _precheck_id_is_file(self, unique_ids : List[str])->Dict[Path, str]: """ return { unique_id: readFile(self.rootpath / unique_id) for unique_id in unique_ids - if self.rootpath / unique_id in self.files + if self.rootpath / unique_id in self.files and self._is_file_content_valid(self.rootpath / unique_id) } def get( diff --git a/codetide/agents/data_layer.py b/codetide/agents/data_layer.py new file mode 100644 index 0000000..e63b6e0 --- /dev/null +++ b/codetide/agents/data_layer.py @@ -0,0 +1,179 @@ +try: + from sqlalchemy.orm import declarative_base, relationship, mapped_column + from sqlalchemy import String, Text, ForeignKey, Boolean, Integer + from sqlalchemy.ext.asyncio import create_async_engine + from sqlalchemy.types import TypeDecorator +except ImportError as e: + raise ImportError( + "This module requires 'sqlalchemy' and 'ulid-py'. " + "Install them with: pip install codetide[agents-ui]" + ) from e + +from datetime import datetime +from sqlalchemy import Select +from ulid import ulid +import asyncio +import json + +# SQLite-compatible JSON and UUID types +class GUID(TypeDecorator): + impl = String + + def process_bind_param(self, value, dialect): + if value is None: + return None + return str(value) + + def process_result_value(self, value, dialect): + return value +class JSONEncodedDict(TypeDecorator): + impl = Text + + def process_bind_param(self, value, dialect): + return json.dumps(value) if value is not None else None + + def process_result_value(self, value, dialect): + return json.loads(value) if value is not None else None + +class JSONEncodedList(TypeDecorator): + impl = Text + + def process_bind_param(self, value, dialect): + return json.dumps(value) if value is not None else None + + def process_result_value(self, value, dialect): + return json.loads(value) if value is not None else None + +Base = declarative_base() + +class User(Base): + __tablename__ = "users" + id = mapped_column(GUID, primary_key=True, default=ulid) + identifier = mapped_column(Text, unique=True, nullable=False) + user_metadata = mapped_column("metadata", JSONEncodedDict, nullable=False) + createdAt = mapped_column(Text, default=lambda: datetime.utcnow().isoformat()) + +class Thread(Base): + __tablename__ = "threads" + id = mapped_column(GUID, primary_key=True, default=ulid) + createdAt = mapped_column(Text, default=lambda: datetime.utcnow().isoformat()) + name = mapped_column(Text) + userId = mapped_column(GUID, ForeignKey("users.id", ondelete="CASCADE")) + userIdentifier = mapped_column(Text) + tags = mapped_column(JSONEncodedList) + user_metadata = mapped_column("metadata", JSONEncodedDict) + + user = relationship("User", backref="threads") + +class Step(Base): + __tablename__ = "steps" + id = mapped_column(GUID, primary_key=True, default=ulid) + name = mapped_column(Text, nullable=False) + type = mapped_column(Text, nullable=False) + threadId = mapped_column(GUID, ForeignKey("threads.id", ondelete="CASCADE"), nullable=False) + parentId = mapped_column(GUID) + streaming = mapped_column(Boolean, nullable=False) + waitForAnswer = mapped_column(Boolean) + isError = mapped_column(Boolean) + user_metadata = mapped_column("metadata", JSONEncodedDict) + tags = mapped_column(JSONEncodedList) + input = mapped_column(Text) + output = mapped_column(Text) + createdAt = mapped_column(Text, default=lambda: datetime.utcnow().isoformat()) + command = mapped_column(Text) + start = mapped_column(Text) + end = mapped_column(Text) + generation = mapped_column(JSONEncodedDict) + showInput = mapped_column(Text) + language = mapped_column(Text) + indent = mapped_column(Integer) + defaultOpen = mapped_column(Boolean, default=False) + +class Element(Base): + __tablename__ = "elements" + id = mapped_column(GUID, primary_key=True, default=ulid) + threadId = mapped_column(GUID, ForeignKey("threads.id", ondelete="CASCADE")) + type = mapped_column(Text) + url = mapped_column(Text) + chainlitKey = mapped_column(Text) + name = mapped_column(Text, nullable=False) + display = mapped_column(Text) + objectKey = mapped_column(Text) + size = mapped_column(Text) + page = mapped_column(Integer) + language = mapped_column(Text) + forId = mapped_column(GUID) + mime = mapped_column(Text) + props = mapped_column(JSONEncodedDict) + +class Feedback(Base): + __tablename__ = "feedbacks" + id = mapped_column(GUID, primary_key=True, default=ulid) + forId = mapped_column(GUID, nullable=False) + threadId = mapped_column(GUID, ForeignKey("threads.id", ondelete="CASCADE"), nullable=False) + value = mapped_column(Integer, nullable=False) + comment = mapped_column(Text) + +# class AsyncMessageDB: +# def __init__(self, db_path: str): +# self.db_url = f"sqlite+aiosqlite:///{db_path}" +# self.engine = create_async_engine(self.db_url, echo=False) +# self.async_session = async_sessionmaker(bind=self.engine, class_=AsyncSession, expire_on_commit=False) + +# async def init_db(self): +# async with self.engine.begin() as conn: +# await conn.run_sync(Base.user_metadata.create_all) + +# async def create_chat(self, name: str) -> Chat: +# async with self.async_session() as session: +# chat = Chat(name=name) +# session.add(chat) +# await session.commit() +# await session.refresh(chat) +# return chat + +# async def add_message(self, chat_id: str, role: str, content: str) -> Message: +# async with self.async_session() as session: +# message = Message(chat_id=chat_id, role=role, content=content) +# session.add(message) +# await session.commit() +# await session.refresh(message) +# return message + +# async def get_messages_for_chat(self, chat_id: str) -> List[Message]: +# async with self.async_session() as session: +# result = await session.execute( +# select(Message).where(Message.chat_id == chat_id).order_by(Message.timestamp) +# ) +# return result.scalars().all() + +# async def list_chats(self) -> List[Chat]: +# async with self.async_session() as session: +# result = await session.execute(select(Chat).order_by(Chat.name)) +# return result.scalars().all() + +# async def main(): +# db = AsyncMessageDB(str(Path(os.path.abspath(__file__)).parent / "my_messages.db")) +# await db.init_db() + +# chat = await db.create_chat("My First Chat") +# await db.add_message(chat.id, "user", "Hello Assistant!") +# await db.add_message(chat.id, "assistant", "Hello, how can I help you?") + +# print(f"Messages for chat '{chat.name}':") +# messages = await db.get_messages_for_chat(chat.id) +# for msg in messages: +# print(f"[{msg.timestamp}] {msg.role.upper()}: {msg.content}") + +# print("\nAll chats:") +# chats = await db.list_chats() +# for c in chats: +# print(f"{c.id} β€” {c.name}") +async def init_db(path: str): + from sqlalchemy.ext.asyncio import async_sessionmaker, AsyncSession + engine = create_async_engine(f"sqlite+aiosqlite:///{path}") + async with engine.begin() as conn: + await conn.run_sync(Base.metadata.create_all) + +if __name__ == "__main__": + asyncio.run(init_db("database.db")) diff --git a/codetide/agents/tide/agent.py b/codetide/agents/tide/agent.py index c61a487..184963d 100644 --- a/codetide/agents/tide/agent.py +++ b/codetide/agents/tide/agent.py @@ -1,15 +1,18 @@ +from functools import partial from codetide import CodeTide from ...mcp.tools.patch_code import file_exists, open_file, process_patch, remove_file, write_file +from ...core.defaults import DEFAULT_ENCODING, DEFAULT_STORAGE_PATH from ...autocomplete import AutoComplete +from .models import Steps from .prompts import ( - AGENT_TIDE_SYSTEM_PROMPT, GET_CODE_IDENTIFIERS_SYSTEM_PROMPT, WRITE_PATCH_SYSTEM_PROMPT + AGENT_TIDE_SYSTEM_PROMPT, GET_CODE_IDENTIFIERS_SYSTEM_PROMPT, STEPS_SYSTEM_PROMPT, WRITE_PATCH_SYSTEM_PROMPT ) +from .utils import parse_patch_blocks, parse_steps_markdown, trim_to_patch_section from .consts import AGENT_TIDE_ASCII_ART -from .utils import parse_patch_blocks try: from aicore.llm import Llm - from aicore.logger import _logger + from aicore.logger import _logger, SPECIAL_TOKENS except ImportError as e: raise ImportError( "The 'codetide.agents' module requires the 'aicore' package. " @@ -18,16 +21,41 @@ from prompt_toolkit.key_binding import KeyBindings from prompt_toolkit import PromptSession -from pydantic import BaseModel -from typing import Optional +from pydantic import BaseModel, Field, model_validator +from typing_extensions import Self +from typing import List, Optional from datetime import date +from pathlib import Path +from ulid import ulid +import aiofiles import asyncio import os +async def custom_logger_fn(message :str, session_id :str, filepath :str): + if message not in SPECIAL_TOKENS: + async with aiofiles.open(filepath, 'a', encoding=DEFAULT_ENCODING) as f: + await f.write(message) + + await _logger.log_chunk_to_queue(message, session_id) + class AgentTide(BaseModel): llm :Llm tide :CodeTide history :Optional[list]=None + steps :Optional[Steps]=None + session_id :str=Field(default_factory=ulid) + + @model_validator(mode="after") + def pass_custom_logger_fn(self)->Self: + self.llm.logger_fn = partial(custom_logger_fn, session_id=self.session_id, filepath=self.patch_path) + return self + + @property + def patch_path(self)->Path: + if not os.path.exists(DEFAULT_STORAGE_PATH): + os.makedirs(DEFAULT_STORAGE_PATH, exist_ok=True) + + return DEFAULT_STORAGE_PATH / f"{self.session_id}.bash" @staticmethod def trim_messages(messages, tokenizer_fn, max_tokens :Optional[int]=None): @@ -35,20 +63,25 @@ def trim_messages(messages, tokenizer_fn, max_tokens :Optional[int]=None): while messages and sum(len(tokenizer_fn(str(msg))) for msg in messages) > max_tokens: messages.pop(0) # Remove from the beginning - async def agent_loop(self): + async def agent_loop(self, codeIdentifiers :Optional[List[str]]=None): TODAY = date.today() + + # update codetide with the latest changes made by the human and agent + await self.tide.check_for_updates(serialize=True, include_cached_ids=True) + repo_tree = self.tide.codebase.get_tree_view( include_modules=True, include_types=True ) - codeIdentifiers = await self.llm.acomplete( - self.history, - system_prompt=[GET_CODE_IDENTIFIERS_SYSTEM_PROMPT.format(DATE=TODAY)], - prefix_prompt=repo_tree, - stream=False, - json_output=True - ) + if codeIdentifiers is None: + codeIdentifiers = await self.llm.acomplete( + self.history, + system_prompt=[GET_CODE_IDENTIFIERS_SYSTEM_PROMPT.format(DATE=TODAY)], + prefix_prompt=repo_tree, + stream=False, + json_output=True + ) codeContext = None if codeIdentifiers: @@ -69,21 +102,26 @@ async def agent_loop(self): self.history, system_prompt=[ AGENT_TIDE_SYSTEM_PROMPT.format(DATE=TODAY), + STEPS_SYSTEM_PROMPT.format(DATE=TODAY, REPO_TREE=repo_tree), WRITE_PATCH_SYSTEM_PROMPT.format(DATE=TODAY) ], prefix_prompt=codeContext ) - + + await trim_to_patch_section(self.patch_path) + if os.path.exists(self.patch_path): + process_patch(self.patch_path, open_file, write_file, remove_file, file_exists) + + steps = parse_steps_markdown(response) + if steps: + self.steps = Steps.from_steps(steps) + diffPatches = parse_patch_blocks(response, multiple=True) if diffPatches: - for patch in diffPatches: - patch = patch.replace("\'", "'").replace('\"', '"') - process_patch(patch, open_file, write_file, remove_file, file_exists) + # TODO this deletes previouspatches from history to make sure changes are always focused on the latest version of the file + response = response.replace(f"*** Begin Patch\n{patch}*** End Patch", "") - - await self.tide.check_for_updates(serialize=True, include_cached_ids=True) - self.history.append(response) async def run(self, max_tokens: int = 48000): diff --git a/codetide/agents/tide/cli.py b/codetide/agents/tide/cli.py index ef3a6d3..debd4c1 100644 --- a/codetide/agents/tide/cli.py +++ b/codetide/agents/tide/cli.py @@ -3,8 +3,9 @@ import argparse import asyncio +from .defaults import DEFAULT_MAX_HISTORY_TOKENS from ...mcp.utils import initCodeTide -from .cli_step import init_llm, DEFAULT_MAX_HISTORY_TOKENS +from .cli_step import init_llm from .agent import AgentTide def main(): @@ -38,3 +39,4 @@ async def run_agent_tide_cli(project_path: str, max_history_tokens: int): if __name__ == "__main__": main() + #TODO add support to receive -ui param in which case a chainlit ui is launched to interact with the agent! diff --git a/codetide/agents/tide/cli_step.py b/codetide/agents/tide/cli_step.py index ca5355a..1fca966 100644 --- a/codetide/agents/tide/cli_step.py +++ b/codetide/agents/tide/cli_step.py @@ -1,3 +1,5 @@ +from .defaults import DEFAULT_AGENT_TIDE_LLM_CONFIG_PATH, DEFAULT_MAX_HISTORY_TOKENS +from ...core.defaults import DEFAULT_ENCODING from ...mcp.utils import initCodeTide from . import AgentTide @@ -15,12 +17,9 @@ from pathlib import Path import os -DEFAULT_AGENT_TIDE_LLM_CONFIG = "./config/agent_tide_llm_config.yml" -DEFAULT_MAX_HISTORY_TOKENS = 48000 - def init_llm(project_path :Path)->Llm: # TODO change this to from default path - config_path = os.getenv("AGENT_TIDE_CONFIG_PATH", DEFAULT_AGENT_TIDE_LLM_CONFIG) + config_path = os.getenv("AGENT_TIDE_CONFIG_PATH", DEFAULT_AGENT_TIDE_LLM_CONFIG_PATH) llm = Llm.from_config(Config.from_yaml(project_path / config_path).llm) return llm @@ -50,7 +49,7 @@ def parse_history_arg(history_arg): if not history_arg: return [] if os.path.isfile(history_arg): - with open(history_arg, "r", encoding="utf-8") as f: + with open(history_arg, "r", encoding=DEFAULT_ENCODING) as f: return json.load(f) try: return json.loads(history_arg) diff --git a/codetide/agents/tide/defaults.py b/codetide/agents/tide/defaults.py new file mode 100644 index 0000000..65b8b13 --- /dev/null +++ b/codetide/agents/tide/defaults.py @@ -0,0 +1,2 @@ +DEFAULT_AGENT_TIDE_LLM_CONFIG_PATH = "./config/agent_tide_llm_config.yml" +DEFAULT_MAX_HISTORY_TOKENS = 48000 \ No newline at end of file diff --git a/codetide/agents/tide/models.py b/codetide/agents/tide/models.py new file mode 100644 index 0000000..62be8d2 --- /dev/null +++ b/codetide/agents/tide/models.py @@ -0,0 +1,39 @@ + +from pydantic import BaseModel, RootModel +from typing import Dict, List, Optional + +STEP_INSTRUCTION_TEMPLATE = """ +## Step {step}: + +**Goal** +{description} + +**Detailed Instructions** +{instructions} + +--- +Please ensure: +- All requirements in the instructions are fully addressed. +- Edge cases and error handling are considered. +- The solution is clear, actionable, and ready for implementation. +""" + +class Step(BaseModel): + step :int + description :str + instructions :str + context_identifiers :Optional[List[str]]=None + + def as_instruction(self)->str: + return STEP_INSTRUCTION_TEMPLATE.format( + step=self.step, + description=self.description, + instructions=self.instructions + ) + +class Steps(RootModel): + root :List[Step] + + @classmethod + def from_steps(cls, steps :List[Dict])->"Steps": + return cls(root=[Step(**kwargs) for kwargs in steps]) \ No newline at end of file diff --git a/codetide/agents/tide/prompts.py b/codetide/agents/tide/prompts.py index 13f4546..c7cb122 100644 --- a/codetide/agents/tide/prompts.py +++ b/codetide/agents/tide/prompts.py @@ -44,6 +44,11 @@ Take initiative, take responsibility, and take pride in completing tasks to their fullest. Never submit code you would not be confident using in a live production environment. +**Commit Message Guidelines:** + +If the user requests a commit message, generate a concise, descriptive message that summarizes the change. +The message should be one to two lines, easy to read, and clearly communicate the purpose and impact of the change. + """ GET_CODE_IDENTIFIERS_SYSTEM_PROMPT = """ @@ -112,7 +117,7 @@ """ WRITE_PATCH_SYSTEM_PROMPT = """ -You are Agent Tide, operating in Patch Generation Mode on {DATE}. +You are Agent **Tide**, operating in Patch Generation Mode on {DATE}. Your mission is to generate atomic, high-precision, diff-style patches that exactly satisfy the user’s request while adhering to the STRICT PATCH PROTOCOL. --- @@ -151,6 +156,9 @@ * You may include **multiple `@@` hunks** inside the same patch block if multiple changes are needed in that file. * Always preserve context and formatting as returned by `getCodeContext()`. +* When adding new content (such as inserting lines without replacing any existing ones), you **must** include relevant, unmodified +context lines inside the `@@` headers and surrounding the insertion. This context is essential for precisely locating where the new +content should be added. Never emit a patch hunk without real, verbatim context from the file. --- @@ -195,7 +203,10 @@ * Inside each file patch: * Use one or more @@ context headers to uniquely identify the code location - * Include exactly 3 lines of context above and below the change + * Include exactly 3 lines of context above the change + +* For insertions (where no lines are being removed), always provide the 3 lines of real, unaltered context above the insertion point, as they appear in the original file. This ensures the patch can be applied unambiguously and in the correct location. + * Each @@ header MUST: @@ -220,11 +231,21 @@ --- +**IMPORTS AND CLASS STRUCTURE RULES:** + +* All import statements must be placed at the very top of the file, before any other code. +* When referencing imports in the patch, use a separate context block at the start of the file, distinct from code changes. +* When adding or modifying methods or attributes in a class, ensure they are placed in the correct logical order (attributes first, then methods). Do +not insert methods or attributes at the beginning of the class unless it is appropriate by convention. + +--- + DO NOT: * Invent, paraphrase, or transform location lines β€” all lines must exist exactly in the source * Add or remove formatting, inferred syntax, or markdown rendering * Use ellipses, placeholders, or extra unchanged lines +* Reference contents in a patch that were removed by the current or previous patches --- @@ -246,4 +267,80 @@ This is a surgical, precision editing mode. You must mirror source files exactly β€” no assumptions, no reformatting, no transformations. +""" + +STEPS_SYSTEM_PROMPT = """ +You are Agent **Tide**, operating in a multi-step planning and execution mode. Today is **{DATE}**. + +Your job is to take a user request, analyze any provided code context (including repository structure / repo_tree identifiers), and decompose the work into the minimal set of concrete implementation steps needed to fully satisfy the request. +If the requirement is simple, output a single step; if it’s complex, decompose it into multiple ordered steps. You must build upon, refine, or correct any existing code context rather than ignoring it. +If the user provides feedback on prior steps, update the current steps to reflect that feedback. If the user responds β€œall is good” or equivalent, do not repeat the stepsβ€”reply exactly with: + + + +Important Note: +If the user's request already contains a complete step, is direct enough to be solved without additional decomposition, or does not require implementation planning at all (e.g., general questions, documentation requests, commit messages), you may skip the multi-step planning and execution mode entirely. +Proceed directly with fulfilling the request or returning the appropriate output. + +**Before the steps**, you may include brief, high-level comments clarifying assumptions, ambiguities, or summary of how you interpreted the request. Then output the implementation plan in the exact format below: + +*** Begin Steps +1. **step_description** + **instructions**: precise instructions of the task to be implemented in this step + **context_identifiers**: + - fully qualified code identifiers or file paths (as taken from the repo_tree) that this step touches, depends on, or must update +--- +2. **next_step_description** + **instructions**: ... + **context_identifiers**: + - ... +--- +... +*** End Steps + +**Key expectations for the agent:** + +1. **Completeness:** No task should be partially specified. Each step must be actionable and sufficient for a developer (or downstream executor) to implement it. If any requirement is ambiguous, explicitly list assumptions in the preliminary comment section. + +2. **Code Awareness:** If code or repository context is provided, identify and reference valid identifiers from the repo_tree (functions, classes, modules, file paths when necessary). Steps must not refer to nonexistent identifiers. + +3. **Feedback Incorporation:** When the user supplies feedback on previous planning, modify the existing steps to reflect corrections, removals, additions, or reprioritizations. Do not regenerate from scratch unless the user’s feedback indicates a full redesign is desired. + +4. **Granularity:** Break complex requirements into logical sub-steps. Order them so dependencies are respected (e.g., setup β†’ implementation β†’ validation β†’ integration). + +5. **Traceability:** Each step’s `context_identifiers` must clearly tie that step to specific code areas; this enables downstream mapping to actual implementation targets. + +6. **Single-Responsibility per Step:** Aim for each numbered step to encapsulate a coherent unit of work. Avoid mixing unrelated concerns in one step. + +7. **Decision Points:** If a step involves a choice or alternative, surface the options in the instructions and, if necessary, flag which you assume unless the user directs otherwise. + +8. **Testing & Validation:** Where appropriate, include in steps the need for testing, how to validate success, and any edge cases to cover. + +9. **Failure Modes & Corrections:** If the user’s request implies potential pitfalls (e.g., backward compatibility, race conditions, security), surface those in early steps or in the comments and include remediation as part of the plan. + +10. **Succinctness of Format:** Strictly adhere to the step formatting with separators (`---`) and the beginning/end markers. Do not add extraneous numbering or narrative outside the prescribed structure. + +When the user confirms everything is correct and no further planning is needed, respond only with: + + + +--- + +`repo_tree` +{REPO_TREE} +""" + +CMD_WRITE_TESTS_PROMPT = """ +Analyze the provided code and write comprehensive tests. +Ensure high coverage by including unit, integration, and end-to-end tests that address edge cases and follow best practices. +""" + +CMD_CODE_REVIEW_PROMPT = """ +Review the following code submission for bugs, style inconsistencies, and performance issues. +Provide specific, actionable feedback to improve code quality, maintainability, and adherence to established coding standards. +""" + +CMD_COMMIT_PROMPT = """ +Generate a conventional commit message that summarizes the work done since the previous commit. +The message should have a clear subject line and a body explaining the problem solved and the implementation approach. """ \ No newline at end of file diff --git a/codetide/agents/tide/ui/.chainlit/config.toml b/codetide/agents/tide/ui/.chainlit/config.toml new file mode 100644 index 0000000..cfe4afc --- /dev/null +++ b/codetide/agents/tide/ui/.chainlit/config.toml @@ -0,0 +1,88 @@ +[project] +# Whether to enable telemetry (default: true). No personal data is collected. +enable_telemetry = true + + +# List of environment variables to be provided by each user to use the app. +user_env = [] + +# Duration (in seconds) during which the session is saved when the connection is lost +session_timeout = 3600 + +# Duration (in seconds) of the user session expiry +user_session_timeout = 1296000 # 15 days + +# Enable third parties caching (e.g LangChain cache) +cache = false + +# Authorized origins +allow_origins = ["*"] + +[features] +# Process and display HTML in messages. This can be a security risk (see https://stackoverflow.com/questions/19603097/why-is-it-dangerous-to-render-user-generated-html-or-javascript) +unsafe_allow_html = false + +# Process and display mathematical expressions. This can clash with "$" characters in messages. +latex = false + +# Automatically tag threads with the current chat profile (if a chat profile is used) +auto_tag_thread = true + +# Allow users to edit their own messages +edit_message = true + +# Authorize users to spontaneously upload files with messages +[features.spontaneous_file_upload] + enabled = false + # Define accepted file types using MIME types + # Examples: + # 1. For specific file types: + # accept = ["image/jpeg", "image/png", "application/pdf"] + # 2. For all files of certain type: + # accept = ["image/*", "audio/*", "video/*"] + # 3. For specific file extensions: + # accept = { "application/octet-stream" = [".xyz", ".pdb"] } + # Note: Using "*/*" is not recommended as it may cause browser warnings + accept = ["*/*"] + max_files = 20 + max_size_mb = 500 + +[features.audio] + # Sample rate of the audio + sample_rate = 24000 + +[UI] +# Name of the assistant. +name = "Agent Tide" + +# default_theme = "dark" + +layout = "wide" + +# Description of the assistant. This is used for HTML tags. +# description = "" + +# Chain of Thought (CoT) display mode. Can be "hidden", "tool_call" or "full". +cot = "tool_call" + +# Link to your github repo. This will add a github button in the UI's header. +github = "https://github.com/BrunoV21/CodeTide" + +# Specify a CSS file that can be used to customize the user interface. +# The CSS file can be served from the public directory or via an external link. +custom_css = '/public/stylesheet.css' + +# Specify a Javascript file that can be used to customize the user interface. +# The Javascript file can be served from the public directory. +# custom_js = "/public/test.js" + +# Specify a custom meta image url. +custom_meta_image_url = "https://github.com/BrunoV21/CodeTide/blob/09a2f958a8ecec0e2e61f03bc5397a0457ac61fc/docs/assets/codetide-logo.png" + +# Specify a custom build directory for the frontend. +# This can be used to customize the frontend code. +# Be careful: If this is a relative path, it should not start with a slash. +# custom_build = "./public/build" + +[meta] +generated_by = "2.1.0" diff --git a/codetide/agents/tide/ui/.chainlit/translations/bn.json b/codetide/agents/tide/ui/.chainlit/translations/bn.json new file mode 100644 index 0000000..36c8676 --- /dev/null +++ b/codetide/agents/tide/ui/.chainlit/translations/bn.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "\u09ac\u09be\u09a4\u09bf\u09b2 \u0995\u09b0\u09c1\u09a8", + "confirm": "\u09a8\u09bf\u09b6\u09cd\u099a\u09bf\u09a4 \u0995\u09b0\u09c1\u09a8", + "continue": "\u099a\u09be\u09b2\u09bf\u09af\u09bc\u09c7 \u09af\u09be\u09a8", + "goBack": "\u09aa\u09bf\u099b\u09a8\u09c7 \u09af\u09be\u09a8", + "reset": "\u09b0\u09bf\u09b8\u09c7\u099f \u0995\u09b0\u09c1\u09a8", + "submit": "\u099c\u09ae\u09be \u09a6\u09bf\u09a8" + }, + "status": { + "loading": "\u09b2\u09cb\u09a1 \u09b9\u099a\u09cd\u099b\u09c7...", + "error": { + "default": "\u098f\u0995\u099f\u09bf \u09a4\u09cd\u09b0\u09c1\u099f\u09bf \u0998\u099f\u09c7\u099b\u09c7", + "serverConnection": "\u09b8\u09be\u09b0\u09cd\u09ad\u09be\u09b0\u09c7\u09b0 \u09b8\u09be\u09a5\u09c7 \u09b8\u0982\u09af\u09cb\u0997 \u0995\u09b0\u09be \u09af\u09be\u099a\u09cd\u099b\u09c7 \u09a8\u09be" + } + } + }, + "auth": { + "login": { + "title": "\u0985\u09cd\u09af\u09be\u09aa\u09cd\u09b2\u09bf\u0995\u09c7\u09b6\u09a8 \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09a4\u09c7 \u09b2\u0997\u0987\u09a8 \u0995\u09b0\u09c1\u09a8", + "form": { + "email": { + "label": "\u0987\u09ae\u09c7\u0987\u09b2 \u09a0\u09bf\u0995\u09be\u09a8\u09be", + "required": "\u0987\u09ae\u09c7\u0987\u09b2 \u098f\u0995\u099f\u09bf \u0986\u09ac\u09b6\u09cd\u09af\u0995 \u0995\u09cd\u09b7\u09c7\u09a4\u09cd\u09b0" + }, + "password": { + "label": "\u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1", + "required": "\u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1 \u098f\u0995\u099f\u09bf \u0986\u09ac\u09b6\u09cd\u09af\u0995 \u0995\u09cd\u09b7\u09c7\u09a4\u09cd\u09b0" + }, + "actions": { + "signin": "\u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09c1\u09a8" + }, + "alternativeText": { + "or": "\u0985\u09a5\u09ac\u09be" + } + }, + "errors": { + "default": "\u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be \u09b8\u09ae\u09cd\u09ad\u09ac \u09b9\u099a\u09cd\u099b\u09c7 \u09a8\u09be", + "signin": "\u0985\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8", + "oauthSignin": "\u0985\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8", + "redirectUriMismatch": "\u09b0\u09bf\u09a1\u09be\u0987\u09b0\u09c7\u0995\u09cd\u099f URI \u0993\u0986\u09a5 \u0985\u09cd\u09af\u09be\u09aa \u0995\u09a8\u09ab\u09bf\u0997\u09be\u09b0\u09c7\u09b6\u09a8\u09c7\u09b0 \u09b8\u09be\u09a5\u09c7 \u09ae\u09bf\u09b2\u099b\u09c7 \u09a8\u09be", + "oauthCallback": "\u0985\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8", + "oauthCreateAccount": "\u0985\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8", + "emailCreateAccount": "\u0985\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8", + "callback": "\u0985\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8", + "oauthAccountNotLinked": "\u0986\u09aa\u09a8\u09be\u09b0 \u09aa\u09b0\u09bf\u099a\u09af\u09bc \u09a8\u09bf\u09b6\u09cd\u099a\u09bf\u09a4 \u0995\u09b0\u09a4\u09c7, \u0986\u09aa\u09a8\u09bf \u09af\u09c7 \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f\u099f\u09bf \u09ae\u09c2\u09b2\u09a4 \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09c7\u099b\u09bf\u09b2\u09c7\u09a8 \u09b8\u09c7\u099f\u09bf \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09c1\u09a8", + "emailSignin": "\u0987\u09ae\u09c7\u0987\u09b2 \u09aa\u09be\u09a0\u09be\u09a8\u09cb \u09af\u09be\u09af\u09bc\u09a8\u09bf", + "emailVerify": "\u0985\u09a8\u09c1\u0997\u09cd\u09b0\u09b9 \u0995\u09b0\u09c7 \u0986\u09aa\u09a8\u09be\u09b0 \u0987\u09ae\u09c7\u0987\u09b2 \u09af\u09be\u099a\u09be\u0987 \u0995\u09b0\u09c1\u09a8, \u098f\u0995\u099f\u09bf \u09a8\u09a4\u09c1\u09a8 \u0987\u09ae\u09c7\u0987\u09b2 \u09aa\u09be\u09a0\u09be\u09a8\u09cb \u09b9\u09af\u09bc\u09c7\u099b\u09c7", + "credentialsSignin": "\u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u09ac\u09cd\u09af\u09b0\u09cd\u09a5 \u09b9\u09af\u09bc\u09c7\u099b\u09c7\u0964 \u0986\u09aa\u09a8\u09be\u09b0 \u09a6\u09c7\u0993\u09af\u09bc\u09be \u09a4\u09a5\u09cd\u09af \u09b8\u09a0\u09bf\u0995 \u0995\u09bf\u09a8\u09be \u09af\u09be\u099a\u09be\u0987 \u0995\u09b0\u09c1\u09a8", + "sessionRequired": "\u098f\u0987 \u09aa\u09c3\u09b7\u09cd\u09a0\u09be \u09a6\u09c7\u0996\u09a4\u09c7 \u0985\u09a8\u09c1\u0997\u09cd\u09b0\u09b9 \u0995\u09b0\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09c1\u09a8" + } + }, + "provider": { + "continue": "{{provider}} \u09a6\u09bf\u09af\u09bc\u09c7 \u099a\u09be\u09b2\u09bf\u09af\u09bc\u09c7 \u09af\u09be\u09a8" + } + }, + "chat": { + "input": { + "placeholder": "\u0986\u09aa\u09a8\u09be\u09b0 \u09ac\u09be\u09b0\u09cd\u09a4\u09be \u098f\u0996\u09be\u09a8\u09c7 \u099f\u09be\u0987\u09aa \u0995\u09b0\u09c1\u09a8...", + "actions": { + "send": "\u09ac\u09be\u09b0\u09cd\u09a4\u09be \u09aa\u09be\u09a0\u09be\u09a8", + "stop": "\u0995\u09be\u099c \u09ac\u09a8\u09cd\u09a7 \u0995\u09b0\u09c1\u09a8", + "attachFiles": "\u09ab\u09be\u0987\u09b2 \u09b8\u0982\u09af\u09c1\u0995\u09cd\u09a4 \u0995\u09b0\u09c1\u09a8" + } + }, + "speech": { + "start": "\u09b0\u09c7\u0995\u09b0\u09cd\u09a1\u09bf\u0982 \u09b6\u09c1\u09b0\u09c1 \u0995\u09b0\u09c1\u09a8", + "stop": "\u09b0\u09c7\u0995\u09b0\u09cd\u09a1\u09bf\u0982 \u09ac\u09a8\u09cd\u09a7 \u0995\u09b0\u09c1\u09a8", + "connecting": "\u09b8\u0982\u09af\u09cb\u0997 \u0995\u09b0\u09be \u09b9\u099a\u09cd\u099b\u09c7" + }, + "fileUpload": { + "dragDrop": "\u098f\u0996\u09be\u09a8\u09c7 \u09ab\u09be\u0987\u09b2 \u099f\u09c7\u09a8\u09c7 \u0986\u09a8\u09c1\u09a8", + "browse": "\u09ab\u09be\u0987\u09b2 \u09ac\u09cd\u09b0\u09be\u0989\u099c \u0995\u09b0\u09c1\u09a8", + "sizeLimit": "\u09b8\u09c0\u09ae\u09be:", + "errors": { + "failed": "\u0986\u09aa\u09b2\u09cb\u09a1 \u09ac\u09cd\u09af\u09b0\u09cd\u09a5 \u09b9\u09af\u09bc\u09c7\u099b\u09c7", + "cancelled": "\u0986\u09aa\u09b2\u09cb\u09a1 \u09ac\u09be\u09a4\u09bf\u09b2 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7" + } + }, + "messages": { + "status": { + "using": "\u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u099b\u09c7", + "used": "\u09ac\u09cd\u09af\u09ac\u09b9\u09c3\u09a4" + }, + "actions": { + "copy": { + "button": "\u0995\u09cd\u09b2\u09bf\u09aa\u09ac\u09cb\u09b0\u09cd\u09a1\u09c7 \u0995\u09aa\u09bf \u0995\u09b0\u09c1\u09a8", + "success": "\u0995\u09aa\u09bf \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7!" + } + }, + "feedback": { + "positive": "\u09b8\u09b9\u09be\u09af\u09bc\u0995", + "negative": "\u09b8\u09b9\u09be\u09af\u09bc\u0995 \u09a8\u09af\u09bc", + "edit": "\u09aa\u09cd\u09b0\u09a4\u09bf\u0995\u09cd\u09b0\u09bf\u09af\u09bc\u09be \u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8\u09be \u0995\u09b0\u09c1\u09a8", + "dialog": { + "title": "\u09ae\u09a8\u09cd\u09a4\u09ac\u09cd\u09af \u09af\u09cb\u0997 \u0995\u09b0\u09c1\u09a8", + "submit": "\u09aa\u09cd\u09b0\u09a4\u09bf\u0995\u09cd\u09b0\u09bf\u09af\u09bc\u09be \u099c\u09ae\u09be \u09a6\u09bf\u09a8" + }, + "status": { + "updating": "\u09b9\u09be\u09b2\u09a8\u09be\u0997\u09be\u09a6 \u0995\u09b0\u09be \u09b9\u099a\u09cd\u099b\u09c7", + "updated": "\u09aa\u09cd\u09b0\u09a4\u09bf\u0995\u09cd\u09b0\u09bf\u09af\u09bc\u09be \u09b9\u09be\u09b2\u09a8\u09be\u0997\u09be\u09a6 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7" + } + } + }, + "history": { + "title": "\u09b8\u09b0\u09cd\u09ac\u09b6\u09c7\u09b7 \u0987\u09a8\u09aa\u09c1\u099f", + "empty": "\u0995\u09cb\u09a8\u09cb \u09a4\u09a5\u09cd\u09af \u09a8\u09c7\u0987...", + "show": "\u0987\u09a4\u09bf\u09b9\u09be\u09b8 \u09a6\u09c7\u0996\u09c1\u09a8" + }, + "settings": { + "title": "\u09b8\u09c7\u099f\u09bf\u0982\u09b8 \u09aa\u09cd\u09af\u09be\u09a8\u09c7\u09b2" + }, + "watermark": "\u09a6\u09cd\u09ac\u09be\u09b0\u09be \u09a8\u09bf\u09b0\u09cd\u09ae\u09bf\u09a4" + }, + "threadHistory": { + "sidebar": { + "title": "\u09aa\u09c2\u09b0\u09cd\u09ac\u09ac\u09b0\u09cd\u09a4\u09c0 \u099a\u09cd\u09af\u09be\u099f", + "filters": { + "search": "\u0985\u09a8\u09c1\u09b8\u09a8\u09cd\u09a7\u09be\u09a8", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "\u0986\u099c", + "yesterday": "\u0997\u09a4\u0995\u09be\u09b2", + "previous7days": "\u0997\u09a4 \u09ed \u09a6\u09bf\u09a8", + "previous30days": "\u0997\u09a4 \u09e9\u09e6 \u09a6\u09bf\u09a8" + }, + "empty": "\u0995\u09cb\u09a8\u09cb \u09a5\u09cd\u09b0\u09c7\u09a1 \u09aa\u09be\u0993\u09af\u09bc\u09be \u09af\u09be\u09af\u09bc\u09a8\u09bf", + "actions": { + "close": "\u09b8\u09be\u0987\u09a1\u09ac\u09be\u09b0 \u09ac\u09a8\u09cd\u09a7 \u0995\u09b0\u09c1\u09a8", + "open": "\u09b8\u09be\u0987\u09a1\u09ac\u09be\u09b0 \u0996\u09c1\u09b2\u09c1\u09a8" + } + }, + "thread": { + "untitled": "\u09b6\u09bf\u09b0\u09cb\u09a8\u09be\u09ae\u09b9\u09c0\u09a8 \u0986\u09b2\u09cb\u099a\u09a8\u09be", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "\u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09be \u09a8\u09bf\u09b6\u09cd\u099a\u09bf\u09a4 \u0995\u09b0\u09c1\u09a8", + "description": "\u098f\u099f\u09bf \u09a5\u09cd\u09b0\u09c7\u09a1 \u098f\u09ac\u0982 \u098f\u09b0 \u09ac\u09be\u09b0\u09cd\u09a4\u09be \u0993 \u0989\u09aa\u09be\u09a6\u09be\u09a8\u0997\u09c1\u09b2\u09bf \u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09ac\u09c7\u0964 \u098f\u0987 \u0995\u09be\u099c\u099f\u09bf \u09aa\u09c2\u09b0\u09cd\u09ac\u09be\u09ac\u09b8\u09cd\u09a5\u09be\u09af\u09bc \u09ab\u09c7\u09b0\u09be\u09a8\u09cb \u09af\u09be\u09ac\u09c7 \u09a8\u09be", + "success": "\u099a\u09cd\u09af\u09be\u099f \u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7", + "inProgress": "\u099a\u09cd\u09af\u09be\u099f \u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09be \u09b9\u099a\u09cd\u099b\u09c7" + }, + "rename": { + "title": "\u09a5\u09cd\u09b0\u09c7\u09a1\u09c7\u09b0 \u09a8\u09be\u09ae \u09aa\u09b0\u09bf\u09ac\u09b0\u09cd\u09a4\u09a8 \u0995\u09b0\u09c1\u09a8", + "description": "\u098f\u0987 \u09a5\u09cd\u09b0\u09c7\u09a1\u09c7\u09b0 \u099c\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u09a8\u09a4\u09c1\u09a8 \u09a8\u09be\u09ae \u09a6\u09bf\u09a8", + "form": { + "name": { + "label": "\u09a8\u09be\u09ae", + "placeholder": "\u09a8\u09a4\u09c1\u09a8 \u09a8\u09be\u09ae \u09b2\u09bf\u0996\u09c1\u09a8" + } + }, + "success": "\u09a5\u09cd\u09b0\u09c7\u09a1\u09c7\u09b0 \u09a8\u09be\u09ae \u09aa\u09b0\u09bf\u09ac\u09b0\u09cd\u09a4\u09a8 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7!", + "inProgress": "\u09a5\u09cd\u09b0\u09c7\u09a1\u09c7\u09b0 \u09a8\u09be\u09ae \u09aa\u09b0\u09bf\u09ac\u09b0\u09cd\u09a4\u09a8 \u0995\u09b0\u09be \u09b9\u099a\u09cd\u099b\u09c7" + } + } + } + }, + "navigation": { + "header": { + "chat": "\u099a\u09cd\u09af\u09be\u099f", + "readme": "\u09b0\u09bf\u09a1\u09ae\u09bf", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "\u09a8\u09a4\u09c1\u09a8 \u099a\u09cd\u09af\u09be\u099f", + "dialog": { + "title": "\u09a8\u09a4\u09c1\u09a8 \u099a\u09cd\u09af\u09be\u099f \u09a4\u09c8\u09b0\u09bf \u0995\u09b0\u09c1\u09a8", + "description": "\u098f\u099f\u09bf \u0986\u09aa\u09a8\u09be\u09b0 \u09ac\u09b0\u09cd\u09a4\u09ae\u09be\u09a8 \u099a\u09cd\u09af\u09be\u099f \u0987\u09a4\u09bf\u09b9\u09be\u09b8 \u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09ac\u09c7\u0964 \u0986\u09aa\u09a8\u09bf \u0995\u09bf \u099a\u09be\u09b2\u09bf\u09af\u09bc\u09c7 \u09af\u09c7\u09a4\u09c7 \u099a\u09be\u09a8?", + "tooltip": "\u09a8\u09a4\u09c1\u09a8 \u099a\u09cd\u09af\u09be\u099f" + } + }, + "user": { + "menu": { + "settings": "\u09b8\u09c7\u099f\u09bf\u0982\u09b8", + "settingsKey": "S", + "apiKeys": "\u098f\u09aa\u09bf\u0986\u0987 \u0995\u09c0", + "logout": "\u09b2\u0997\u0986\u0989\u099f" + } + } + }, + "apiKeys": { + "title": "\u09aa\u09cd\u09b0\u09af\u09bc\u09cb\u099c\u09a8\u09c0\u09af\u09bc \u098f\u09aa\u09bf\u0986\u0987 \u0995\u09c0", + "description": "\u098f\u0987 \u0985\u09cd\u09af\u09be\u09aa\u09cd\u09b2\u09bf\u0995\u09c7\u09b6\u09a8 \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09a4\u09c7 \u09a8\u09bf\u09ae\u09cd\u09a8\u09b2\u09bf\u0996\u09bf\u09a4 \u098f\u09aa\u09bf\u0986\u0987 \u0995\u09c0 \u09aa\u09cd\u09b0\u09af\u09bc\u09cb\u099c\u09a8\u0964 \u0995\u09c0\u0997\u09c1\u09b2\u09bf \u0986\u09aa\u09a8\u09be\u09b0 \u09a1\u09bf\u09ad\u09be\u0987\u09b8\u09c7\u09b0 \u09b2\u09cb\u0995\u09be\u09b2 \u09b8\u09cd\u099f\u09cb\u09b0\u09c7\u099c\u09c7 \u09b8\u0982\u09b0\u0995\u09cd\u09b7\u09bf\u09a4 \u09a5\u09be\u0995\u09c7\u0964", + "success": { + "saved": "\u09b8\u09ab\u09b2\u09ad\u09be\u09ac\u09c7 \u09b8\u0982\u09b0\u0995\u09cd\u09b7\u09bf\u09a4 \u09b9\u09af\u09bc\u09c7\u099b\u09c7" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/codetide/agents/tide/ui/.chainlit/translations/en-US.json b/codetide/agents/tide/ui/.chainlit/translations/en-US.json new file mode 100644 index 0000000..87b8d74 --- /dev/null +++ b/codetide/agents/tide/ui/.chainlit/translations/en-US.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "Cancel", + "confirm": "Confirm", + "continue": "Continue", + "goBack": "Go Back", + "reset": "Reset", + "submit": "Submit" + }, + "status": { + "loading": "Loading...", + "error": { + "default": "An error occurred", + "serverConnection": "Could not reach the server" + } + } + }, + "auth": { + "login": { + "title": "Login to access the app", + "form": { + "email": { + "label": "Email address", + "required": "email is a required field" + }, + "password": { + "label": "Password", + "required": "password is a required field" + }, + "actions": { + "signin": "Sign In" + }, + "alternativeText": { + "or": "OR" + } + }, + "errors": { + "default": "Unable to sign in", + "signin": "Try signing in with a different account", + "oauthSignin": "Try signing in with a different account", + "redirectUriMismatch": "The redirect URI is not matching the oauth app configuration", + "oauthCallback": "Try signing in with a different account", + "oauthCreateAccount": "Try signing in with a different account", + "emailCreateAccount": "Try signing in with a different account", + "callback": "Try signing in with a different account", + "oauthAccountNotLinked": "To confirm your identity, sign in with the same account you used originally", + "emailSignin": "The e-mail could not be sent", + "emailVerify": "Please verify your email, a new email has been sent", + "credentialsSignin": "Sign in failed. Check the details you provided are correct", + "sessionRequired": "Please sign in to access this page" + } + }, + "provider": { + "continue": "Continue with {{provider}}" + } + }, + "chat": { + "input": { + "placeholder": "Type your message here...", + "actions": { + "send": "Send message", + "stop": "Stop Task", + "attachFiles": "Attach files" + } + }, + "speech": { + "start": "Start recording", + "stop": "Stop recording", + "connecting": "Connecting" + }, + "fileUpload": { + "dragDrop": "Drag and drop files here", + "browse": "Browse Files", + "sizeLimit": "Limit:", + "errors": { + "failed": "Failed to upload", + "cancelled": "Cancelled upload of" + } + }, + "messages": { + "status": { + "using": "Using", + "used": "Used" + }, + "actions": { + "copy": { + "button": "Copy to clipboard", + "success": "Copied!" + } + }, + "feedback": { + "positive": "Helpful", + "negative": "Not helpful", + "edit": "Edit feedback", + "dialog": { + "title": "Add a comment", + "submit": "Submit feedback" + }, + "status": { + "updating": "Updating", + "updated": "Feedback updated" + } + } + }, + "history": { + "title": "Last Inputs", + "empty": "Such empty...", + "show": "Show history" + }, + "settings": { + "title": "Settings panel" + }, + "watermark": "Built with" + }, + "threadHistory": { + "sidebar": { + "title": "Past Chats", + "filters": { + "search": "Search", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "Today", + "yesterday": "Yesterday", + "previous7days": "Previous 7 days", + "previous30days": "Previous 30 days" + }, + "empty": "No threads found", + "actions": { + "close": "Close sidebar", + "open": "Open sidebar" + } + }, + "thread": { + "untitled": "Untitled Conversation", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "Confirm deletion", + "description": "This will delete the thread as well as its messages and elements. This action cannot be undone", + "success": "Chat deleted", + "inProgress": "Deleting chat" + }, + "rename": { + "title": "Rename Thread", + "description": "Enter a new name for this thread", + "form": { + "name": { + "label": "Name", + "placeholder": "Enter new name" + } + }, + "success": "Thread renamed!", + "inProgress": "Renaming thread" + } + } + } + }, + "navigation": { + "header": { + "chat": "Chat", + "readme": "Readme", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "New Chat", + "dialog": { + "title": "Create New Chat", + "description": "This will clear your current chat history. Are you sure you want to continue?", + "tooltip": "New Chat" + } + }, + "user": { + "menu": { + "settings": "Settings", + "settingsKey": "S", + "apiKeys": "API Keys", + "logout": "Logout" + } + } + }, + "apiKeys": { + "title": "Required API Keys", + "description": "To use this app, the following API keys are required. The keys are stored on your device's local storage.", + "success": { + "saved": "Saved successfully" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/codetide/agents/tide/ui/.chainlit/translations/gu.json b/codetide/agents/tide/ui/.chainlit/translations/gu.json new file mode 100644 index 0000000..6292b95 --- /dev/null +++ b/codetide/agents/tide/ui/.chainlit/translations/gu.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "\u0ab0\u0aa6 \u0a95\u0ab0\u0acb", + "confirm": "\u0aaa\u0ac1\u0ab7\u0acd\u0a9f\u0abf \u0a95\u0ab0\u0acb", + "continue": "\u0a9a\u0abe\u0ab2\u0ac1 \u0ab0\u0abe\u0a96\u0acb", + "goBack": "\u0aaa\u0abe\u0a9b\u0abe \u0a9c\u0abe\u0a93", + "reset": "\u0ab0\u0ac0\u0ab8\u0ac7\u0a9f \u0a95\u0ab0\u0acb", + "submit": "\u0ab8\u0aac\u0aae\u0abf\u0a9f \u0a95\u0ab0\u0acb" + }, + "status": { + "loading": "\u0ab2\u0acb\u0aa1 \u0aa5\u0a88 \u0ab0\u0ab9\u0acd\u0aaf\u0ac1\u0a82 \u0a9b\u0ac7...", + "error": { + "default": "\u0a8f\u0a95 \u0aad\u0ac2\u0ab2 \u0aa5\u0a88", + "serverConnection": "\u0ab8\u0ab0\u0acd\u0ab5\u0ab0 \u0ab8\u0ac1\u0aa7\u0ac0 \u0aaa\u0ab9\u0acb\u0a82\u0a9a\u0ac0 \u0ab6\u0a95\u0abe\u0aaf\u0ac1\u0a82 \u0aa8\u0aa5\u0ac0" + } + } + }, + "auth": { + "login": { + "title": "\u0a8f\u0aaa\u0acd\u0ab2\u0abf\u0a95\u0ac7\u0ab6\u0aa8 \u0a8d\u0a95\u0acd\u0ab8\u0ac7\u0ab8 \u0a95\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7 \u0ab2\u0ac9\u0a97\u0abf\u0aa8 \u0a95\u0ab0\u0acb", + "form": { + "email": { + "label": "\u0a88\u0aae\u0ac7\u0ab2 \u0a8f\u0aa1\u0acd\u0ab0\u0ac7\u0ab8", + "required": "\u0a88\u0aae\u0ac7\u0ab2 \u0a86\u0ab5\u0ab6\u0acd\u0aaf\u0a95 \u0a9b\u0ac7" + }, + "password": { + "label": "\u0aaa\u0abe\u0ab8\u0ab5\u0ab0\u0acd\u0aa1", + "required": "\u0aaa\u0abe\u0ab8\u0ab5\u0ab0\u0acd\u0aa1 \u0a86\u0ab5\u0ab6\u0acd\u0aaf\u0a95 \u0a9b\u0ac7" + }, + "actions": { + "signin": "\u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0acb" + }, + "alternativeText": { + "or": "\u0a85\u0aa5\u0ab5\u0abe" + } + }, + "errors": { + "default": "\u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ac0 \u0ab6\u0a95\u0abe\u0aaf\u0ac1\u0a82 \u0aa8\u0aa5\u0ac0", + "signin": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb", + "oauthSignin": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb", + "redirectUriMismatch": "\u0ab0\u0ac0\u0aa1\u0abe\u0aaf\u0ab0\u0ac7\u0a95\u0acd\u0a9f URI oauth \u0a8d\u0aaa \u0a95\u0aa8\u0acd\u0aab\u0abf\u0a97\u0ab0\u0ac7\u0ab6\u0aa8 \u0ab8\u0abe\u0aa5\u0ac7 \u0aae\u0ac7\u0ab3 \u0a96\u0abe\u0aa4\u0acb \u0aa8\u0aa5\u0ac0", + "oauthCallback": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb", + "oauthCreateAccount": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb", + "emailCreateAccount": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb", + "callback": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb", + "oauthAccountNotLinked": "\u0aa4\u0aae\u0abe\u0ab0\u0ac0 \u0a93\u0ab3\u0a96\u0aa8\u0ac0 \u0aaa\u0ac1\u0ab7\u0acd\u0a9f\u0abf \u0a95\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7, \u0aae\u0ac2\u0ab3 \u0ab0\u0ac2\u0aaa\u0ac7 \u0ab5\u0abe\u0aaa\u0ab0\u0ac7\u0ab2\u0abe \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0acb", + "emailSignin": "\u0a88\u0aae\u0ac7\u0ab2 \u0aae\u0acb\u0a95\u0ab2\u0ac0 \u0ab6\u0a95\u0abe\u0aaf\u0acb \u0aa8\u0aa5\u0ac0", + "emailVerify": "\u0a95\u0ac3\u0aaa\u0abe \u0a95\u0ab0\u0ac0 \u0aa4\u0aae\u0abe\u0ab0\u0acb \u0a88\u0aae\u0ac7\u0ab2 \u0a9a\u0a95\u0abe\u0ab8\u0acb, \u0aa8\u0ab5\u0acb \u0a88\u0aae\u0ac7\u0ab2 \u0aae\u0acb\u0a95\u0ab2\u0ab5\u0abe\u0aae\u0abe\u0a82 \u0a86\u0ab5\u0acd\u0aaf\u0acb \u0a9b\u0ac7", + "credentialsSignin": "\u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0aa8\u0abf\u0ab7\u0acd\u0aab\u0ab3. \u0a86\u0aaa\u0ac7\u0ab2\u0ac0 \u0ab5\u0abf\u0a97\u0aa4\u0acb \u0ab8\u0abe\u0a9a\u0ac0 \u0a9b\u0ac7 \u0a95\u0ac7 \u0aa8\u0ab9\u0ac0\u0a82 \u0aa4\u0ac7 \u0a9a\u0a95\u0abe\u0ab8\u0acb", + "sessionRequired": "\u0a86 \u0aaa\u0ac7\u0a9c\u0aa8\u0ac7 \u0a8d\u0a95\u0acd\u0ab8\u0ac7\u0ab8 \u0a95\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7 \u0a95\u0ac3\u0aaa\u0abe \u0a95\u0ab0\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0acb" + } + }, + "provider": { + "continue": "{{provider}} \u0ab8\u0abe\u0aa5\u0ac7 \u0a9a\u0abe\u0ab2\u0ac1 \u0ab0\u0abe\u0a96\u0acb" + } + }, + "chat": { + "input": { + "placeholder": "\u0a85\u0ab9\u0ac0\u0a82 \u0aa4\u0aae\u0abe\u0ab0\u0acb \u0ab8\u0a82\u0aa6\u0ac7\u0ab6 \u0ab2\u0a96\u0acb...", + "actions": { + "send": "\u0ab8\u0a82\u0aa6\u0ac7\u0ab6 \u0aae\u0acb\u0a95\u0ab2\u0acb", + "stop": "\u0a95\u0abe\u0ab0\u0acd\u0aaf \u0ab0\u0acb\u0a95\u0acb", + "attachFiles": "\u0aab\u0abe\u0a87\u0ab2\u0acd\u0ab8 \u0a9c\u0acb\u0aa1\u0acb" + } + }, + "speech": { + "start": "\u0ab0\u0ac7\u0a95\u0acb\u0ab0\u0acd\u0aa1\u0abf\u0a82\u0a97 \u0ab6\u0ab0\u0ac2 \u0a95\u0ab0\u0acb", + "stop": "\u0ab0\u0ac7\u0a95\u0acb\u0ab0\u0acd\u0aa1\u0abf\u0a82\u0a97 \u0aac\u0a82\u0aa7 \u0a95\u0ab0\u0acb", + "connecting": "\u0a95\u0aa8\u0ac7\u0a95\u0acd\u0a9f \u0aa5\u0a88 \u0ab0\u0ab9\u0acd\u0aaf\u0ac1\u0a82 \u0a9b\u0ac7" + }, + "fileUpload": { + "dragDrop": "\u0a85\u0ab9\u0ac0\u0a82 \u0aab\u0abe\u0a87\u0ab2\u0acd\u0ab8 \u0a96\u0ac7\u0a82\u0a9a\u0acb \u0a85\u0aa8\u0ac7 \u0a9b\u0acb\u0aa1\u0acb", + "browse": "\u0aab\u0abe\u0a87\u0ab2\u0acd\u0ab8 \u0aac\u0acd\u0ab0\u0abe\u0a89\u0a9d \u0a95\u0ab0\u0acb", + "sizeLimit": "\u0aae\u0ab0\u0acd\u0aaf\u0abe\u0aa6\u0abe:", + "errors": { + "failed": "\u0a85\u0aaa\u0ab2\u0acb\u0aa1 \u0a95\u0ab0\u0ab5\u0abe\u0aae\u0abe\u0a82 \u0aa8\u0abf\u0ab7\u0acd\u0aab\u0ab3", + "cancelled": "\u0a85\u0aaa\u0ab2\u0acb\u0aa1 \u0ab0\u0aa6 \u0a95\u0ab0\u0acd\u0aaf\u0ac1\u0a82" + } + }, + "messages": { + "status": { + "using": "\u0ab5\u0abe\u0aaa\u0ab0\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0abe \u0a9b\u0ac7", + "used": "\u0ab5\u0aaa\u0ab0\u0abe\u0aaf\u0ac7\u0ab2" + }, + "actions": { + "copy": { + "button": "\u0a95\u0acd\u0ab2\u0abf\u0aaa\u0aac\u0acb\u0ab0\u0acd\u0aa1 \u0aaa\u0ab0 \u0a95\u0ac9\u0aaa\u0abf \u0a95\u0ab0\u0acb", + "success": "\u0a95\u0ac9\u0aaa\u0abf \u0aa5\u0aaf\u0ac1\u0a82!" + } + }, + "feedback": { + "positive": "\u0a89\u0aaa\u0aaf\u0acb\u0a97\u0ac0", + "negative": "\u0aac\u0abf\u0aa8\u0a89\u0aaa\u0aaf\u0acb\u0a97\u0ac0", + "edit": "\u0aaa\u0acd\u0ab0\u0aa4\u0abf\u0ab8\u0abe\u0aa6 \u0ab8\u0a82\u0aaa\u0abe\u0aa6\u0abf\u0aa4 \u0a95\u0ab0\u0acb", + "dialog": { + "title": "\u0a9f\u0abf\u0aaa\u0acd\u0aaa\u0aa3\u0ac0 \u0a89\u0aae\u0ac7\u0ab0\u0acb", + "submit": "\u0aaa\u0acd\u0ab0\u0aa4\u0abf\u0ab8\u0abe\u0aa6 \u0ab8\u0aac\u0aae\u0abf\u0a9f \u0a95\u0ab0\u0acb" + }, + "status": { + "updating": "\u0a85\u0aaa\u0aa1\u0ac7\u0a9f \u0aa5\u0a88 \u0ab0\u0ab9\u0acd\u0aaf\u0ac1\u0a82 \u0a9b\u0ac7", + "updated": "\u0aaa\u0acd\u0ab0\u0aa4\u0abf\u0ab8\u0abe\u0aa6 \u0a85\u0aaa\u0aa1\u0ac7\u0a9f \u0aa5\u0aaf\u0acb" + } + } + }, + "history": { + "title": "\u0a9b\u0ac7\u0ab2\u0acd\u0ab2\u0abe \u0a87\u0aa8\u0aaa\u0ac1\u0a9f\u0acd\u0ab8", + "empty": "\u0a96\u0abe\u0ab2\u0ac0 \u0a9b\u0ac7...", + "show": "\u0a87\u0aa4\u0abf\u0ab9\u0abe\u0ab8 \u0aac\u0aa4\u0abe\u0ab5\u0acb" + }, + "settings": { + "title": "\u0ab8\u0ac7\u0a9f\u0abf\u0a82\u0a97\u0acd\u0ab8 \u0aaa\u0ac7\u0aa8\u0ab2" + }, + "watermark": "\u0ab8\u0abe\u0aa5\u0ac7 \u0aac\u0aa8\u0abe\u0ab5\u0ac7\u0ab2" + }, + "threadHistory": { + "sidebar": { + "title": "\u0aaa\u0abe\u0a9b\u0ab2\u0ac0 \u0a9a\u0ac7\u0a9f\u0acd\u0ab8", + "filters": { + "search": "\u0ab6\u0acb\u0aa7\u0acb", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "\u0a86\u0a9c\u0ac7", + "yesterday": "\u0a97\u0a88\u0a95\u0abe\u0ab2\u0ac7", + "previous7days": "\u0aaa\u0abe\u0a9b\u0ab2\u0abe 7 \u0aa6\u0abf\u0ab5\u0ab8", + "previous30days": "\u0aaa\u0abe\u0a9b\u0ab2\u0abe 30 \u0aa6\u0abf\u0ab5\u0ab8" + }, + "empty": "\u0a95\u0acb\u0a88 \u0aa5\u0acd\u0ab0\u0ac7\u0aa1\u0acd\u0ab8 \u0aae\u0ab3\u0acd\u0aaf\u0abe \u0aa8\u0aa5\u0ac0", + "actions": { + "close": "\u0ab8\u0abe\u0a87\u0aa1\u0aac\u0abe\u0ab0 \u0aac\u0a82\u0aa7 \u0a95\u0ab0\u0acb", + "open": "\u0ab8\u0abe\u0a87\u0aa1\u0aac\u0abe\u0ab0 \u0a96\u0acb\u0ab2\u0acb" + } + }, + "thread": { + "untitled": "\u0ab6\u0ac0\u0ab0\u0acd\u0ab7\u0a95 \u0ab5\u0a97\u0ab0\u0aa8\u0ac0 \u0ab5\u0abe\u0aa4\u0a9a\u0ac0\u0aa4", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "\u0a95\u0abe\u0aa2\u0ac0 \u0aa8\u0abe\u0a96\u0ab5\u0abe\u0aa8\u0ac0 \u0aaa\u0ac1\u0ab7\u0acd\u0a9f\u0abf \u0a95\u0ab0\u0acb", + "description": "\u0a86 \u0aa5\u0acd\u0ab0\u0ac7\u0aa1 \u0a85\u0aa8\u0ac7 \u0aa4\u0ac7\u0aa8\u0abe \u0ab8\u0a82\u0aa6\u0ac7\u0ab6\u0abe\u0a93 \u0a85\u0aa8\u0ac7 \u0aa4\u0aa4\u0acd\u0ab5\u0acb\u0aa8\u0ac7 \u0a95\u0abe\u0aa2\u0ac0 \u0aa8\u0abe\u0a96\u0ab6\u0ac7. \u0a86 \u0a95\u0acd\u0ab0\u0abf\u0aaf\u0abe \u0aaa\u0abe\u0a9b\u0ac0 \u0aab\u0ac7\u0ab0\u0ab5\u0ac0 \u0ab6\u0a95\u0abe\u0ab6\u0ac7 \u0aa8\u0ab9\u0ac0\u0a82", + "success": "\u0a9a\u0ac7\u0a9f \u0a95\u0abe\u0aa2\u0ac0 \u0aa8\u0abe\u0a96\u0ac0", + "inProgress": "\u0a9a\u0ac7\u0a9f \u0a95\u0abe\u0aa2\u0ac0 \u0aa8\u0abe\u0a96\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0abe \u0a9b\u0ac0\u0a8f" + }, + "rename": { + "title": "\u0aa5\u0acd\u0ab0\u0ac7\u0aa1\u0aa8\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aac\u0aa6\u0ab2\u0acb", + "description": "\u0a86 \u0aa5\u0acd\u0ab0\u0ac7\u0aa1 \u0aae\u0abe\u0a9f\u0ac7 \u0aa8\u0ab5\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aa6\u0abe\u0a96\u0ab2 \u0a95\u0ab0\u0acb", + "form": { + "name": { + "label": "\u0aa8\u0abe\u0aae", + "placeholder": "\u0aa8\u0ab5\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aa6\u0abe\u0a96\u0ab2 \u0a95\u0ab0\u0acb" + } + }, + "success": "\u0aa5\u0acd\u0ab0\u0ac7\u0aa1\u0aa8\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aac\u0aa6\u0ab2\u0abe\u0aaf\u0ac1\u0a82!", + "inProgress": "\u0aa5\u0acd\u0ab0\u0ac7\u0aa1\u0aa8\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aac\u0aa6\u0ab2\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0abe \u0a9b\u0ac0\u0a8f" + } + } + } + }, + "navigation": { + "header": { + "chat": "\u0a9a\u0ac7\u0a9f", + "readme": "\u0ab5\u0abe\u0a82\u0a9a\u0acb", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "\u0aa8\u0ab5\u0ac0 \u0a9a\u0ac7\u0a9f", + "dialog": { + "title": "\u0aa8\u0ab5\u0ac0 \u0a9a\u0ac7\u0a9f \u0aac\u0aa8\u0abe\u0ab5\u0acb", + "description": "\u0a86 \u0aa4\u0aae\u0abe\u0ab0\u0acb \u0ab5\u0ab0\u0acd\u0aa4\u0aae\u0abe\u0aa8 \u0a9a\u0ac7\u0a9f \u0a87\u0aa4\u0abf\u0ab9\u0abe\u0ab8 \u0ab8\u0abe\u0aab \u0a95\u0ab0\u0ab6\u0ac7. \u0ab6\u0ac1\u0a82 \u0aa4\u0aae\u0ac7 \u0a9a\u0abe\u0ab2\u0ac1 \u0ab0\u0abe\u0a96\u0ab5\u0abe \u0aae\u0abe\u0a82\u0a97\u0acb \u0a9b\u0acb?", + "tooltip": "\u0aa8\u0ab5\u0ac0 \u0a9a\u0ac7\u0a9f" + } + }, + "user": { + "menu": { + "settings": "\u0ab8\u0ac7\u0a9f\u0abf\u0a82\u0a97\u0acd\u0ab8", + "settingsKey": "S", + "apiKeys": "API \u0a95\u0ac0", + "logout": "\u0ab2\u0ac9\u0a97\u0a86\u0a89\u0a9f" + } + } + }, + "apiKeys": { + "title": "\u0a9c\u0ab0\u0ac2\u0ab0\u0ac0 API \u0a95\u0ac0", + "description": "\u0a86 \u0a8f\u0aaa\u0acd\u0ab2\u0abf\u0a95\u0ac7\u0ab6\u0aa8 \u0ab5\u0abe\u0aaa\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7, \u0aa8\u0ac0\u0a9a\u0ac7\u0aa8\u0ac0 API \u0a95\u0ac0 \u0a9c\u0ab0\u0ac2\u0ab0\u0ac0 \u0a9b\u0ac7. \u0a95\u0ac0 \u0aa4\u0aae\u0abe\u0ab0\u0abe \u0aa1\u0abf\u0ab5\u0abe\u0a87\u0ab8\u0aa8\u0abe \u0ab2\u0acb\u0a95\u0ab2 \u0ab8\u0acd\u0a9f\u0acb\u0ab0\u0ac7\u0a9c\u0aae\u0abe\u0a82 \u0ab8\u0a82\u0a97\u0acd\u0ab0\u0ab9\u0abf\u0aa4 \u0aa5\u0ab6\u0ac7.", + "success": { + "saved": "\u0ab8\u0aab\u0ab3\u0aa4\u0abe\u0aaa\u0ac2\u0ab0\u0acd\u0ab5\u0a95 \u0ab8\u0abe\u0a9a\u0ab5\u0acd\u0aaf\u0ac1\u0a82" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/codetide/agents/tide/ui/.chainlit/translations/he-IL.json b/codetide/agents/tide/ui/.chainlit/translations/he-IL.json new file mode 100644 index 0000000..fc07678 --- /dev/null +++ b/codetide/agents/tide/ui/.chainlit/translations/he-IL.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "\u05d1\u05d9\u05d8\u05d5\u05dc", + "confirm": "\u05d0\u05d9\u05e9\u05d5\u05e8", + "continue": "\u05d4\u05de\u05e9\u05da", + "goBack": "\u05d7\u05d6\u05d5\u05e8", + "reset": "\u05d0\u05d9\u05e4\u05d5\u05e1", + "submit": "\u05e9\u05dc\u05d7" + }, + "status": { + "loading": "\u05d8\u05d5\u05e2\u05df...", + "error": { + "default": "\u05d0\u05d9\u05e8\u05e2\u05d4 \u05e9\u05d2\u05d9\u05d0\u05d4", + "serverConnection": "\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05dc\u05e9\u05e8\u05ea" + } + } + }, + "auth": { + "login": { + "title": "\u05d4\u05ea\u05d7\u05d1\u05e8 \u05db\u05d3\u05d9 \u05dc\u05d2\u05e9\u05ea \u05dc\u05d0\u05e4\u05dc\u05d9\u05e7\u05e6\u05d9\u05d4", + "form": { + "email": { + "label": "\u05db\u05ea\u05d5\u05d1\u05ea \u05d0\u05d9\u05de\u05d9\u05d9\u05dc", + "required": "\u05e9\u05d3\u05d4 \u05d4\u05d0\u05d9\u05de\u05d9\u05d9\u05dc \u05d4\u05d5\u05d0 \u05e9\u05d3\u05d4 \u05d7\u05d5\u05d1\u05d4" + }, + "password": { + "label": "\u05e1\u05d9\u05e1\u05de\u05d4", + "required": "\u05e9\u05d3\u05d4 \u05d4\u05e1\u05d9\u05e1\u05de\u05d4 \u05d4\u05d5\u05d0 \u05e9\u05d3\u05d4 \u05d7\u05d5\u05d1\u05d4" + }, + "actions": { + "signin": "\u05d4\u05ea\u05d7\u05d1\u05e8" + }, + "alternativeText": { + "or": "\u05d0\u05d5" + } + }, + "errors": { + "default": "\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8", + "signin": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8", + "oauthSignin": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8", + "redirectUriMismatch": "\u05db\u05ea\u05d5\u05d1\u05ea \u05d4\u05d4\u05e4\u05e0\u05d9\u05d4 \u05d0\u05d9\u05e0\u05d4 \u05ea\u05d5\u05d0\u05de\u05ea \u05d0\u05ea \u05ea\u05e6\u05d5\u05e8\u05ea \u05d0\u05e4\u05dc\u05d9\u05e7\u05e6\u05d9\u05d9\u05ea OAuth", + "oauthCallback": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8", + "oauthCreateAccount": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8", + "emailCreateAccount": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8", + "callback": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8", + "oauthAccountNotLinked": "\u05db\u05d3\u05d9 \u05dc\u05d0\u05de\u05ea \u05d0\u05ea \u05d6\u05d4\u05d5\u05ea\u05da, \u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d0\u05d5\u05ea\u05d5 \u05d7\u05e9\u05d1\u05d5\u05df \u05d1\u05d5 \u05d4\u05e9\u05ea\u05de\u05e9\u05ea \u05d1\u05de\u05e7\u05d5\u05e8", + "emailSignin": "\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05d4\u05d9\u05d4 \u05dc\u05e9\u05dc\u05d5\u05d7 \u05d0\u05ea \u05d4\u05d0\u05d9\u05de\u05d9\u05d9\u05dc", + "emailVerify": "\u05d0\u05e0\u05d0 \u05d0\u05de\u05ea \u05d0\u05ea \u05d4\u05d0\u05d9\u05de\u05d9\u05d9\u05dc \u05e9\u05dc\u05da, \u05e0\u05e9\u05dc\u05d7 \u05d0\u05d9\u05de\u05d9\u05d9\u05dc \u05d7\u05d3\u05e9", + "credentialsSignin": "\u05d4\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05e0\u05db\u05e9\u05dc\u05d4. \u05d1\u05d3\u05d5\u05e7 \u05e9\u05d4\u05e4\u05e8\u05d8\u05d9\u05dd \u05e9\u05d4\u05d6\u05e0\u05ea \u05e0\u05db\u05d5\u05e0\u05d9\u05dd", + "sessionRequired": "\u05d0\u05e0\u05d0 \u05d4\u05ea\u05d7\u05d1\u05e8 \u05db\u05d3\u05d9 \u05dc\u05d2\u05e9\u05ea \u05dc\u05d3\u05e3 \u05d6\u05d4" + } + }, + "provider": { + "continue": "\u05d4\u05de\u05e9\u05da \u05e2\u05dd {{provider}}" + } + }, + "chat": { + "input": { + "placeholder": "\u05d4\u05e7\u05dc\u05d3 \u05d0\u05ea \u05d4\u05d4\u05d5\u05d3\u05e2\u05d4 \u05e9\u05dc\u05da \u05db\u05d0\u05df...", + "actions": { + "send": "\u05e9\u05dc\u05d7 \u05d4\u05d5\u05d3\u05e2\u05d4", + "stop": "\u05e2\u05e6\u05d5\u05e8 \u05de\u05e9\u05d9\u05de\u05d4", + "attachFiles": "\u05e6\u05e8\u05e3 \u05e7\u05d1\u05e6\u05d9\u05dd" + } + }, + "speech": { + "start": "\u05d4\u05ea\u05d7\u05dc \u05d4\u05e7\u05dc\u05d8\u05d4", + "stop": "\u05e2\u05e6\u05d5\u05e8 \u05d4\u05e7\u05dc\u05d8\u05d4", + "connecting": "\u05de\u05ea\u05d7\u05d1\u05e8" + }, + "fileUpload": { + "dragDrop": "\u05d2\u05e8\u05d5\u05e8 \u05d5\u05e9\u05d7\u05e8\u05e8 \u05e7\u05d1\u05e6\u05d9\u05dd \u05db\u05d0\u05df", + "browse": "\u05e2\u05d9\u05d9\u05df \u05d1\u05e7\u05d1\u05e6\u05d9\u05dd", + "sizeLimit": "\u05de\u05d2\u05d1\u05dc\u05d4:", + "errors": { + "failed": "\u05d4\u05e2\u05dc\u05d0\u05d4 \u05e0\u05db\u05e9\u05dc\u05d4", + "cancelled": "\u05d4\u05e2\u05dc\u05d0\u05d4 \u05d1\u05d5\u05d8\u05dc\u05d4 \u05e9\u05dc" + } + }, + "messages": { + "status": { + "using": "\u05de\u05e9\u05ea\u05de\u05e9 \u05d1", + "used": "\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1" + }, + "actions": { + "copy": { + "button": "\u05d4\u05e2\u05ea\u05e7 \u05dc\u05dc\u05d5\u05d7", + "success": "\u05d4\u05d5\u05e2\u05ea\u05e7!" + } + }, + "feedback": { + "positive": "\u05de\u05d5\u05e2\u05d9\u05dc", + "negative": "\u05dc\u05d0 \u05de\u05d5\u05e2\u05d9\u05dc", + "edit": "\u05e2\u05e8\u05d5\u05da \u05de\u05e9\u05d5\u05d1", + "dialog": { + "title": "\u05d4\u05d5\u05e1\u05e3 \u05ea\u05d2\u05d5\u05d1\u05d4", + "submit": "\u05e9\u05dc\u05d7 \u05de\u05e9\u05d5\u05d1" + }, + "status": { + "updating": "\u05de\u05e2\u05d3\u05db\u05df", + "updated": "\u05d4\u05de\u05e9\u05d5\u05d1 \u05e2\u05d5\u05d3\u05db\u05df" + } + } + }, + "history": { + "title": "\u05e7\u05dc\u05d8\u05d9\u05dd \u05d0\u05d7\u05e8\u05d5\u05e0\u05d9\u05dd", + "empty": "\u05db\u05dc \u05db\u05da \u05e8\u05d9\u05e7...", + "show": "\u05d4\u05e6\u05d2 \u05d4\u05d9\u05e1\u05d8\u05d5\u05e8\u05d9\u05d4" + }, + "settings": { + "title": "\u05e4\u05d0\u05e0\u05dc \u05d4\u05d2\u05d3\u05e8\u05d5\u05ea" + }, + "watermark": "\u05e0\u05d1\u05e0\u05d4 \u05d1\u05d0\u05de\u05e6\u05e2\u05d5\u05ea" + }, + "threadHistory": { + "sidebar": { + "title": "\u05e6'\u05d0\u05d8\u05d9\u05dd \u05e7\u05d5\u05d3\u05de\u05d9\u05dd", + "filters": { + "search": "\u05d7\u05d9\u05e4\u05d5\u05e9", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "\u05d4\u05d9\u05d5\u05dd", + "yesterday": "\u05d0\u05ea\u05de\u05d5\u05dc", + "previous7days": "7 \u05d9\u05de\u05d9\u05dd \u05d0\u05d7\u05e8\u05d5\u05e0\u05d9\u05dd", + "previous30days": "30 \u05d9\u05de\u05d9\u05dd \u05d0\u05d7\u05e8\u05d5\u05e0\u05d9\u05dd" + }, + "empty": "\u05dc\u05d0 \u05e0\u05de\u05e6\u05d0\u05d5 \u05e9\u05d9\u05d7\u05d5\u05ea", + "actions": { + "close": "\u05e1\u05d2\u05d5\u05e8 \u05e1\u05e8\u05d2\u05dc \u05e6\u05d3", + "open": "\u05e4\u05ea\u05d7 \u05e1\u05e8\u05d2\u05dc \u05e6\u05d3" + } + }, + "thread": { + "untitled": "\u05e9\u05d9\u05d7\u05d4 \u05dc\u05dc\u05d0 \u05db\u05d5\u05ea\u05e8\u05ea", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "\u05d0\u05e9\u05e8 \u05de\u05d7\u05d9\u05e7\u05d4", + "description": "\u05e4\u05e2\u05d5\u05dc\u05d4 \u05d6\u05d5 \u05ea\u05de\u05d7\u05e7 \u05d0\u05ea \u05d4\u05e9\u05d9\u05d7\u05d4 \u05d5\u05db\u05df \u05d0\u05ea \u05d4\u05d4\u05d5\u05d3\u05e2\u05d5\u05ea \u05d5\u05d4\u05d0\u05dc\u05de\u05e0\u05d8\u05d9\u05dd \u05e9\u05dc\u05d4. \u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d1\u05d8\u05dc \u05e4\u05e2\u05d5\u05dc\u05d4 \u05d6\u05d5", + "success": "\u05d4\u05e6'\u05d0\u05d8 \u05e0\u05de\u05d7\u05e7", + "inProgress": "\u05de\u05d5\u05d7\u05e7 \u05e6'\u05d0\u05d8" + }, + "rename": { + "title": "\u05e9\u05e0\u05d4 \u05e9\u05dd \u05e9\u05d9\u05d7\u05d4", + "description": "\u05d4\u05d6\u05df \u05e9\u05dd \u05d7\u05d3\u05e9 \u05dc\u05e9\u05d9\u05d7\u05d4 \u05d6\u05d5", + "form": { + "name": { + "label": "\u05e9\u05dd", + "placeholder": "\u05d4\u05d6\u05df \u05e9\u05dd \u05d7\u05d3\u05e9" + } + }, + "success": "\u05e9\u05dd \u05d4\u05e9\u05d9\u05d7\u05d4 \u05e9\u05d5\u05e0\u05d4!", + "inProgress": "\u05de\u05e9\u05e0\u05d4 \u05e9\u05dd \u05e9\u05d9\u05d7\u05d4" + } + } + } + }, + "navigation": { + "header": { + "chat": "\u05e6'\u05d0\u05d8", + "readme": "\u05e7\u05e8\u05d0 \u05d0\u05d5\u05ea\u05d9", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "\u05e6'\u05d0\u05d8 \u05d7\u05d3\u05e9", + "dialog": { + "title": "\u05e6\u05d5\u05e8 \u05e6'\u05d0\u05d8 \u05d7\u05d3\u05e9", + "description": "\u05e4\u05e2\u05d5\u05dc\u05d4 \u05d6\u05d5 \u05ea\u05e0\u05e7\u05d4 \u05d0\u05ea \u05d4\u05d9\u05e1\u05d8\u05d5\u05e8\u05d9\u05d9\u05ea \u05d4\u05e6'\u05d0\u05d8 \u05d4\u05e0\u05d5\u05db\u05d7\u05d9\u05ea \u05e9\u05dc\u05da. \u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05d1\u05d8\u05d5\u05d7 \u05e9\u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05de\u05e9\u05d9\u05da?", + "tooltip": "\u05e6'\u05d0\u05d8 \u05d7\u05d3\u05e9" + } + }, + "user": { + "menu": { + "settings": "\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea", + "settingsKey": "\u05d4", + "apiKeys": "\u05de\u05e4\u05ea\u05d7\u05d5\u05ea API", + "logout": "\u05d4\u05ea\u05e0\u05ea\u05e7" + } + } + }, + "apiKeys": { + "title": "\u05de\u05e4\u05ea\u05d7\u05d5\u05ea API \u05e0\u05d3\u05e8\u05e9\u05d9\u05dd", + "description": "\u05db\u05d3\u05d9 \u05dc\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05d0\u05e4\u05dc\u05d9\u05e7\u05e6\u05d9\u05d4 \u05d6\u05d5, \u05e0\u05d3\u05e8\u05e9\u05d9\u05dd \u05de\u05e4\u05ea\u05d7\u05d5\u05ea API \u05d4\u05d1\u05d0\u05d9\u05dd. \u05d4\u05de\u05e4\u05ea\u05d7\u05d5\u05ea \u05de\u05d0\u05d5\u05d7\u05e1\u05e0\u05d9\u05dd \u05d1\u05d0\u05d7\u05e1\u05d5\u05df \u05d4\u05de\u05e7\u05d5\u05de\u05d9 \u05e9\u05dc \u05d4\u05de\u05db\u05e9\u05d9\u05e8 \u05e9\u05dc\u05da.", + "success": { + "saved": "\u05e0\u05e9\u05de\u05e8 \u05d1\u05d4\u05e6\u05dc\u05d7\u05d4" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/codetide/agents/tide/ui/.chainlit/translations/hi.json b/codetide/agents/tide/ui/.chainlit/translations/hi.json new file mode 100644 index 0000000..d6acccb --- /dev/null +++ b/codetide/agents/tide/ui/.chainlit/translations/hi.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "\u0930\u0926\u094d\u0926 \u0915\u0930\u0947\u0902", + "confirm": "\u092a\u0941\u0937\u094d\u091f\u093f \u0915\u0930\u0947\u0902", + "continue": "\u091c\u093e\u0930\u0940 \u0930\u0916\u0947\u0902", + "goBack": "\u0935\u093e\u092a\u0938 \u091c\u093e\u090f\u0902", + "reset": "\u0930\u0940\u0938\u0947\u091f \u0915\u0930\u0947\u0902", + "submit": "\u091c\u092e\u093e \u0915\u0930\u0947\u0902" + }, + "status": { + "loading": "\u0932\u094b\u0921 \u0939\u094b \u0930\u0939\u093e \u0939\u0948...", + "error": { + "default": "\u090f\u0915 \u0924\u094d\u0930\u0941\u091f\u093f \u0939\u0941\u0908", + "serverConnection": "\u0938\u0930\u094d\u0935\u0930 \u0938\u0947 \u0938\u0902\u092a\u0930\u094d\u0915 \u0928\u0939\u0940\u0902 \u0939\u094b \u092a\u093e \u0930\u0939\u093e" + } + } + }, + "auth": { + "login": { + "title": "\u0910\u092a \u0915\u093e \u0909\u092a\u092f\u094b\u0917 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f \u0932\u0949\u0917\u093f\u0928 \u0915\u0930\u0947\u0902", + "form": { + "email": { + "label": "\u0908\u092e\u0947\u0932 \u092a\u0924\u093e", + "required": "\u0908\u092e\u0947\u0932 \u090f\u0915 \u0906\u0935\u0936\u094d\u092f\u0915 \u092b\u093c\u0940\u0932\u094d\u0921 \u0939\u0948" + }, + "password": { + "label": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921", + "required": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u090f\u0915 \u0906\u0935\u0936\u094d\u092f\u0915 \u092b\u093c\u0940\u0932\u094d\u0921 \u0939\u0948" + }, + "actions": { + "signin": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0947\u0902" + }, + "alternativeText": { + "or": "\u092f\u093e" + } + }, + "errors": { + "default": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u092e\u0947\u0902 \u0905\u0938\u092e\u0930\u094d\u0925", + "signin": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u093e \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902", + "oauthSignin": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u093e \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902", + "redirectUriMismatch": "\u0930\u0940\u0921\u093e\u092f\u0930\u0947\u0915\u094d\u091f URI oauth \u0910\u092a \u0915\u0949\u0928\u094d\u092b\u093c\u093f\u0917\u0930\u0947\u0936\u0928 \u0938\u0947 \u092e\u0947\u0932 \u0928\u0939\u0940\u0902 \u0916\u093e \u0930\u0939\u093e", + "oauthCallback": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u093e \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902", + "oauthCreateAccount": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u093e \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902", + "emailCreateAccount": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u093e \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902", + "callback": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u093e \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902", + "oauthAccountNotLinked": "\u0905\u092a\u0928\u0940 \u092a\u0939\u091a\u093e\u0928 \u0915\u0940 \u092a\u0941\u0937\u094d\u091f\u093f \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f, \u0909\u0938\u0940 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0947\u0902 \u091c\u093f\u0938\u0915\u093e \u0909\u092a\u092f\u094b\u0917 \u0906\u092a\u0928\u0947 \u092e\u0942\u0932 \u0930\u0942\u092a \u0938\u0947 \u0915\u093f\u092f\u093e \u0925\u093e", + "emailSignin": "\u0908\u092e\u0947\u0932 \u0928\u0939\u0940\u0902 \u092d\u0947\u091c\u093e \u091c\u093e \u0938\u0915\u093e", + "emailVerify": "\u0915\u0943\u092a\u092f\u093e \u0905\u092a\u0928\u093e \u0908\u092e\u0947\u0932 \u0938\u0924\u094d\u092f\u093e\u092a\u093f\u0924 \u0915\u0930\u0947\u0902, \u090f\u0915 \u0928\u092f\u093e \u0908\u092e\u0947\u0932 \u092d\u0947\u091c\u093e \u0917\u092f\u093e \u0939\u0948", + "credentialsSignin": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0935\u093f\u092b\u0932\u0964 \u0906\u092a\u0915\u0947 \u0926\u094d\u0935\u093e\u0930\u093e \u092a\u094d\u0930\u0926\u093e\u0928 \u0915\u093f\u090f \u0917\u090f \u0935\u093f\u0935\u0930\u0923 \u0915\u0940 \u091c\u093e\u0902\u091a \u0915\u0930\u0947\u0902", + "sessionRequired": "\u0907\u0938 \u092a\u0943\u0937\u094d\u0920 \u0924\u0915 \u092a\u0939\u0941\u0902\u091a\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f \u0915\u0943\u092a\u092f\u093e \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0947\u0902" + } + }, + "provider": { + "continue": "{{provider}} \u0915\u0947 \u0938\u093e\u0925 \u091c\u093e\u0930\u0940 \u0930\u0916\u0947\u0902" + } + }, + "chat": { + "input": { + "placeholder": "\u0905\u092a\u0928\u093e \u0938\u0902\u0926\u0947\u0936 \u092f\u0939\u093e\u0902 \u091f\u093e\u0907\u092a \u0915\u0930\u0947\u0902...", + "actions": { + "send": "\u0938\u0902\u0926\u0947\u0936 \u092d\u0947\u091c\u0947\u0902", + "stop": "\u0915\u093e\u0930\u094d\u092f \u0930\u094b\u0915\u0947\u0902", + "attachFiles": "\u092b\u093c\u093e\u0907\u0932\u0947\u0902 \u0938\u0902\u0932\u0917\u094d\u0928 \u0915\u0930\u0947\u0902" + } + }, + "speech": { + "start": "\u0930\u093f\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902", + "stop": "\u0930\u093f\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u0930\u094b\u0915\u0947\u0902", + "connecting": "\u0915\u0928\u0947\u0915\u094d\u091f \u0939\u094b \u0930\u0939\u093e \u0939\u0948" + }, + "fileUpload": { + "dragDrop": "\u092b\u093c\u093e\u0907\u0932\u094b\u0902 \u0915\u094b \u092f\u0939\u093e\u0902 \u0916\u0940\u0902\u091a\u0947\u0902 \u0914\u0930 \u091b\u094b\u0921\u093c\u0947\u0902", + "browse": "\u092b\u093c\u093e\u0907\u0932\u0947\u0902 \u092c\u094d\u0930\u093e\u0909\u091c\u093c \u0915\u0930\u0947\u0902", + "sizeLimit": "\u0938\u0940\u092e\u093e:", + "errors": { + "failed": "\u0905\u092a\u0932\u094b\u0921 \u0915\u0930\u0928\u0947 \u092e\u0947\u0902 \u0935\u093f\u092b\u0932", + "cancelled": "\u0915\u093e \u0905\u092a\u0932\u094b\u0921 \u0930\u0926\u094d\u0926 \u0915\u093f\u092f\u093e \u0917\u092f\u093e" + } + }, + "messages": { + "status": { + "using": "\u0909\u092a\u092f\u094b\u0917 \u0915\u0930 \u0930\u0939\u0947 \u0939\u0948\u0902", + "used": "\u0909\u092a\u092f\u094b\u0917 \u0915\u093f\u092f\u093e" + }, + "actions": { + "copy": { + "button": "\u0915\u094d\u0932\u093f\u092a\u092c\u094b\u0930\u094d\u0921 \u092a\u0930 \u0915\u0949\u092a\u0940 \u0915\u0930\u0947\u0902", + "success": "\u0915\u0949\u092a\u0940 \u0915\u093f\u092f\u093e \u0917\u092f\u093e!" + } + }, + "feedback": { + "positive": "\u0938\u0939\u093e\u092f\u0915", + "negative": "\u0938\u0939\u093e\u092f\u0915 \u0928\u0939\u0940\u0902", + "edit": "\u092a\u094d\u0930\u0924\u093f\u0915\u094d\u0930\u093f\u092f\u093e \u0938\u0902\u092a\u093e\u0926\u093f\u0924 \u0915\u0930\u0947\u0902", + "dialog": { + "title": "\u091f\u093f\u092a\u094d\u092a\u0923\u0940 \u091c\u094b\u0921\u093c\u0947\u0902", + "submit": "\u092a\u094d\u0930\u0924\u093f\u0915\u094d\u0930\u093f\u092f\u093e \u091c\u092e\u093e \u0915\u0930\u0947\u0902" + }, + "status": { + "updating": "\u0905\u092a\u0921\u0947\u091f \u0939\u094b \u0930\u0939\u093e \u0939\u0948", + "updated": "\u092a\u094d\u0930\u0924\u093f\u0915\u094d\u0930\u093f\u092f\u093e \u0905\u092a\u0921\u0947\u091f \u0915\u0940 \u0917\u0908" + } + } + }, + "history": { + "title": "\u092a\u093f\u091b\u0932\u0947 \u0907\u0928\u092a\u0941\u091f", + "empty": "\u0915\u0941\u091b \u092d\u0940 \u0928\u0939\u0940\u0902 \u0939\u0948...", + "show": "\u0907\u0924\u093f\u0939\u093e\u0938 \u0926\u093f\u0916\u093e\u090f\u0902" + }, + "settings": { + "title": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u0938 \u092a\u0948\u0928\u0932" + }, + "watermark": "\u0915\u0947 \u0938\u093e\u0925 \u092c\u0928\u093e\u092f\u093e \u0917\u092f\u093e" + }, + "threadHistory": { + "sidebar": { + "title": "\u092a\u093f\u091b\u0932\u0940 \u091a\u0948\u091f", + "filters": { + "search": "\u0916\u094b\u091c\u0947\u0902", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "\u0906\u091c", + "yesterday": "\u0915\u0932", + "previous7days": "\u092a\u093f\u091b\u0932\u0947 7 \u0926\u093f\u0928", + "previous30days": "\u092a\u093f\u091b\u0932\u0947 30 \u0926\u093f\u0928" + }, + "empty": "\u0915\u094b\u0908 \u0925\u094d\u0930\u0947\u0921 \u0928\u0939\u0940\u0902 \u092e\u093f\u0932\u093e", + "actions": { + "close": "\u0938\u093e\u0907\u0921\u092c\u093e\u0930 \u092c\u0902\u0926 \u0915\u0930\u0947\u0902", + "open": "\u0938\u093e\u0907\u0921\u092c\u093e\u0930 \u0916\u094b\u0932\u0947\u0902" + } + }, + "thread": { + "untitled": "\u0936\u0940\u0930\u094d\u0937\u0915\u0939\u0940\u0928 \u0935\u093e\u0930\u094d\u0924\u093e\u0932\u093e\u092a", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "\u0939\u091f\u093e\u0928\u0947 \u0915\u0940 \u092a\u0941\u0937\u094d\u091f\u093f \u0915\u0930\u0947\u0902", + "description": "\u092f\u0939 \u0925\u094d\u0930\u0947\u0921 \u0914\u0930 \u0907\u0938\u0915\u0947 \u0938\u0902\u0926\u0947\u0936\u094b\u0902 \u0914\u0930 \u0924\u0924\u094d\u0935\u094b\u0902 \u0915\u094b \u0939\u091f\u093e \u0926\u0947\u0917\u093e\u0964 \u092f\u0939 \u0915\u094d\u0930\u093f\u092f\u093e \u0935\u093e\u092a\u0938 \u0928\u0939\u0940\u0902 \u0915\u0940 \u091c\u093e \u0938\u0915\u0924\u0940", + "success": "\u091a\u0948\u091f \u0939\u091f\u093e \u0926\u0940 \u0917\u0908", + "inProgress": "\u091a\u0948\u091f \u0939\u091f\u093e\u0908 \u091c\u093e \u0930\u0939\u0940 \u0939\u0948" + }, + "rename": { + "title": "\u0925\u094d\u0930\u0947\u0921 \u0915\u093e \u0928\u093e\u092e \u092c\u0926\u0932\u0947\u0902", + "description": "\u0907\u0938 \u0925\u094d\u0930\u0947\u0921 \u0915\u0947 \u0932\u093f\u090f \u090f\u0915 \u0928\u092f\u093e \u0928\u093e\u092e \u0926\u0930\u094d\u091c \u0915\u0930\u0947\u0902", + "form": { + "name": { + "label": "\u0928\u093e\u092e", + "placeholder": "\u0928\u092f\u093e \u0928\u093e\u092e \u0926\u0930\u094d\u091c \u0915\u0930\u0947\u0902" + } + }, + "success": "\u0925\u094d\u0930\u0947\u0921 \u0915\u093e \u0928\u093e\u092e \u092c\u0926\u0932 \u0926\u093f\u092f\u093e \u0917\u092f\u093e!", + "inProgress": "\u0925\u094d\u0930\u0947\u0921 \u0915\u093e \u0928\u093e\u092e \u092c\u0926\u0932\u093e \u091c\u093e \u0930\u0939\u093e \u0939\u0948" + } + } + } + }, + "navigation": { + "header": { + "chat": "\u091a\u0948\u091f", + "readme": "\u0930\u0940\u0921\u092e\u0940", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "\u0928\u0908 \u091a\u0948\u091f", + "dialog": { + "title": "\u0928\u0908 \u091a\u0948\u091f \u092c\u0928\u093e\u090f\u0902", + "description": "\u092f\u0939 \u0906\u092a\u0915\u093e \u0935\u0930\u094d\u0924\u092e\u093e\u0928 \u091a\u0948\u091f \u0907\u0924\u093f\u0939\u093e\u0938 \u0938\u093e\u092b\u093c \u0915\u0930 \u0926\u0947\u0917\u093e\u0964 \u0915\u094d\u092f\u093e \u0906\u092a \u091c\u093e\u0930\u0940 \u0930\u0916\u0928\u093e \u091a\u093e\u0939\u0924\u0947 \u0939\u0948\u0902?", + "tooltip": "\u0928\u0908 \u091a\u0948\u091f" + } + }, + "user": { + "menu": { + "settings": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u0938", + "settingsKey": "S", + "apiKeys": "API \u0915\u0941\u0902\u091c\u093f\u092f\u093e\u0902", + "logout": "\u0932\u0949\u0917\u0906\u0909\u091f" + } + } + }, + "apiKeys": { + "title": "\u0906\u0935\u0936\u094d\u092f\u0915 API \u0915\u0941\u0902\u091c\u093f\u092f\u093e\u0902", + "description": "\u0907\u0938 \u0910\u092a \u0915\u093e \u0909\u092a\u092f\u094b\u0917 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f, \u0928\u093f\u092e\u094d\u0928\u0932\u093f\u0916\u093f\u0924 API \u0915\u0941\u0902\u091c\u093f\u092f\u093e\u0902 \u0906\u0935\u0936\u094d\u092f\u0915 \u0939\u0948\u0902\u0964 \u0915\u0941\u0902\u091c\u093f\u092f\u093e\u0902 \u0906\u092a\u0915\u0947 \u0921\u093f\u0935\u093e\u0907\u0938 \u0915\u0947 \u0938\u094d\u0925\u093e\u0928\u0940\u092f \u0938\u0902\u0917\u094d\u0930\u0939\u0923 \u092e\u0947\u0902 \u0938\u0902\u0917\u094d\u0930\u0939\u0940\u0924 \u0915\u0940 \u091c\u093e\u0924\u0940 \u0939\u0948\u0902\u0964", + "success": { + "saved": "\u0938\u092b\u0932\u0924\u093e\u092a\u0942\u0930\u094d\u0935\u0915 \u0938\u0939\u0947\u091c\u093e \u0917\u092f\u093e" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/codetide/agents/tide/ui/.chainlit/translations/ja.json b/codetide/agents/tide/ui/.chainlit/translations/ja.json new file mode 100644 index 0000000..343ee37 --- /dev/null +++ b/codetide/agents/tide/ui/.chainlit/translations/ja.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "\u30ad\u30e3\u30f3\u30bb\u30eb", + "confirm": "\u78ba\u8a8d", + "continue": "\u7d9a\u3051\u308b", + "goBack": "\u623b\u308b", + "reset": "\u30ea\u30bb\u30c3\u30c8", + "submit": "\u9001\u4fe1" + }, + "status": { + "loading": "\u8aad\u307f\u8fbc\u307f\u4e2d...", + "error": { + "default": "\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f", + "serverConnection": "\u30b5\u30fc\u30d0\u30fc\u306b\u63a5\u7d9a\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f" + } + } + }, + "auth": { + "login": { + "title": "\u30a2\u30d7\u30ea\u306b\u30ed\u30b0\u30a4\u30f3", + "form": { + "email": { + "label": "\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9", + "required": "\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306f\u5fc5\u9808\u9805\u76ee\u3067\u3059" + }, + "password": { + "label": "\u30d1\u30b9\u30ef\u30fc\u30c9", + "required": "\u30d1\u30b9\u30ef\u30fc\u30c9\u306f\u5fc5\u9808\u9805\u76ee\u3067\u3059" + }, + "actions": { + "signin": "\u30b5\u30a4\u30f3\u30a4\u30f3" + }, + "alternativeText": { + "or": "\u307e\u305f\u306f" + } + }, + "errors": { + "default": "\u30b5\u30a4\u30f3\u30a4\u30f3\u3067\u304d\u307e\u305b\u3093", + "signin": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044", + "oauthSignin": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044", + "redirectUriMismatch": "\u30ea\u30c0\u30a4\u30ec\u30af\u30c8URI\u304cOAuth\u30a2\u30d7\u30ea\u306e\u8a2d\u5b9a\u3068\u4e00\u81f4\u3057\u307e\u305b\u3093", + "oauthCallback": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044", + "oauthCreateAccount": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044", + "emailCreateAccount": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044", + "callback": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044", + "oauthAccountNotLinked": "\u672c\u4eba\u78ba\u8a8d\u306e\u305f\u3081\u3001\u6700\u521d\u306b\u4f7f\u7528\u3057\u305f\u306e\u3068\u540c\u3058\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044", + "emailSignin": "\u30e1\u30fc\u30eb\u3092\u9001\u4fe1\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f", + "emailVerify": "\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u65b0\u3057\u3044\u30e1\u30fc\u30eb\u304c\u9001\u4fe1\u3055\u308c\u307e\u3057\u305f", + "credentialsSignin": "\u30b5\u30a4\u30f3\u30a4\u30f3\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u5165\u529b\u3057\u305f\u60c5\u5831\u304c\u6b63\u3057\u3044\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044", + "sessionRequired": "\u3053\u306e\u30da\u30fc\u30b8\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u306b\u306f\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044" + } + }, + "provider": { + "continue": "{{provider}}\u3067\u7d9a\u3051\u308b" + } + }, + "chat": { + "input": { + "placeholder": "\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044...", + "actions": { + "send": "\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u4fe1", + "stop": "\u30bf\u30b9\u30af\u3092\u505c\u6b62", + "attachFiles": "\u30d5\u30a1\u30a4\u30eb\u3092\u6dfb\u4ed8" + } + }, + "speech": { + "start": "\u9332\u97f3\u958b\u59cb", + "stop": "\u9332\u97f3\u505c\u6b62", + "connecting": "\u63a5\u7d9a\u4e2d" + }, + "fileUpload": { + "dragDrop": "\u3053\u3053\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u30c9\u30e9\u30c3\u30b0\uff06\u30c9\u30ed\u30c3\u30d7", + "browse": "\u30d5\u30a1\u30a4\u30eb\u3092\u53c2\u7167", + "sizeLimit": "\u5236\u9650\uff1a", + "errors": { + "failed": "\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u306b\u5931\u6557\u3057\u307e\u3057\u305f", + "cancelled": "\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3092\u30ad\u30e3\u30f3\u30bb\u30eb\u3057\u307e\u3057\u305f\uff1a" + } + }, + "messages": { + "status": { + "using": "\u4f7f\u7528\u4e2d", + "used": "\u4f7f\u7528\u6e08\u307f" + }, + "actions": { + "copy": { + "button": "\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc", + "success": "\u30b3\u30d4\u30fc\u3057\u307e\u3057\u305f\uff01" + } + }, + "feedback": { + "positive": "\u5f79\u306b\u7acb\u3063\u305f", + "negative": "\u5f79\u306b\u7acb\u305f\u306a\u304b\u3063\u305f", + "edit": "\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3092\u7de8\u96c6", + "dialog": { + "title": "\u30b3\u30e1\u30f3\u30c8\u3092\u8ffd\u52a0", + "submit": "\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3092\u9001\u4fe1" + }, + "status": { + "updating": "\u66f4\u65b0\u4e2d", + "updated": "\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3092\u66f4\u65b0\u3057\u307e\u3057\u305f" + } + } + }, + "history": { + "title": "\u6700\u8fd1\u306e\u5165\u529b", + "empty": "\u4f55\u3082\u3042\u308a\u307e\u305b\u3093...", + "show": "\u5c65\u6b74\u3092\u8868\u793a" + }, + "settings": { + "title": "\u8a2d\u5b9a\u30d1\u30cd\u30eb" + }, + "watermark": "\u958b\u767a\u5143\uff1a" + }, + "threadHistory": { + "sidebar": { + "title": "\u904e\u53bb\u306e\u30c1\u30e3\u30c3\u30c8", + "filters": { + "search": "\u691c\u7d22", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "\u4eca\u65e5", + "yesterday": "\u6628\u65e5", + "previous7days": "\u904e\u53bb7\u65e5\u9593", + "previous30days": "\u904e\u53bb30\u65e5\u9593" + }, + "empty": "\u30b9\u30ec\u30c3\u30c9\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093", + "actions": { + "close": "\u30b5\u30a4\u30c9\u30d0\u30fc\u3092\u9589\u3058\u308b", + "open": "\u30b5\u30a4\u30c9\u30d0\u30fc\u3092\u958b\u304f" + } + }, + "thread": { + "untitled": "\u7121\u984c\u306e\u4f1a\u8a71", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "\u524a\u9664\u306e\u78ba\u8a8d", + "description": "\u3053\u306e\u30b9\u30ec\u30c3\u30c9\u3068\u305d\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u3001\u8981\u7d20\u304c\u524a\u9664\u3055\u308c\u307e\u3059\u3002\u3053\u306e\u64cd\u4f5c\u306f\u53d6\u308a\u6d88\u305b\u307e\u305b\u3093", + "success": "\u30c1\u30e3\u30c3\u30c8\u3092\u524a\u9664\u3057\u307e\u3057\u305f", + "inProgress": "\u30c1\u30e3\u30c3\u30c8\u3092\u524a\u9664\u4e2d" + }, + "rename": { + "title": "\u30b9\u30ec\u30c3\u30c9\u306e\u540d\u524d\u3092\u5909\u66f4", + "description": "\u3053\u306e\u30b9\u30ec\u30c3\u30c9\u306e\u65b0\u3057\u3044\u540d\u524d\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044", + "form": { + "name": { + "label": "\u540d\u524d", + "placeholder": "\u65b0\u3057\u3044\u540d\u524d\u3092\u5165\u529b" + } + }, + "success": "\u30b9\u30ec\u30c3\u30c9\u540d\u3092\u5909\u66f4\u3057\u307e\u3057\u305f\uff01", + "inProgress": "\u30b9\u30ec\u30c3\u30c9\u540d\u3092\u5909\u66f4\u4e2d" + } + } + } + }, + "navigation": { + "header": { + "chat": "\u30c1\u30e3\u30c3\u30c8", + "readme": "\u8aac\u660e\u66f8", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "\u65b0\u898f\u30c1\u30e3\u30c3\u30c8", + "dialog": { + "title": "\u65b0\u898f\u30c1\u30e3\u30c3\u30c8\u306e\u4f5c\u6210", + "description": "\u73fe\u5728\u306e\u30c1\u30e3\u30c3\u30c8\u5c65\u6b74\u304c\u30af\u30ea\u30a2\u3055\u308c\u307e\u3059\u3002\u7d9a\u884c\u3057\u307e\u3059\u304b\uff1f", + "tooltip": "\u65b0\u898f\u30c1\u30e3\u30c3\u30c8" + } + }, + "user": { + "menu": { + "settings": "\u8a2d\u5b9a", + "settingsKey": "S", + "apiKeys": "API\u30ad\u30fc", + "logout": "\u30ed\u30b0\u30a2\u30a6\u30c8" + } + } + }, + "apiKeys": { + "title": "\u5fc5\u8981\u306aAPI\u30ad\u30fc", + "description": "\u3053\u306e\u30a2\u30d7\u30ea\u3092\u4f7f\u7528\u3059\u308b\u306b\u306f\u3001\u4ee5\u4e0b\u306eAPI\u30ad\u30fc\u304c\u5fc5\u8981\u3067\u3059\u3002\u30ad\u30fc\u306f\u304a\u4f7f\u3044\u306e\u30c7\u30d0\u30a4\u30b9\u306e\u30ed\u30fc\u30ab\u30eb\u30b9\u30c8\u30ec\u30fc\u30b8\u306b\u4fdd\u5b58\u3055\u308c\u307e\u3059\u3002", + "success": { + "saved": "\u4fdd\u5b58\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/codetide/agents/tide/ui/.chainlit/translations/kn.json b/codetide/agents/tide/ui/.chainlit/translations/kn.json new file mode 100644 index 0000000..c8ffabc --- /dev/null +++ b/codetide/agents/tide/ui/.chainlit/translations/kn.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "\u0cb0\u0ca6\u0ccd\u0ca6\u0cc1\u0cae\u0cbe\u0ca1\u0cbf", + "confirm": "\u0ca6\u0cc3\u0ca2\u0cc0\u0c95\u0cb0\u0cbf\u0cb8\u0cbf", + "continue": "\u0cae\u0cc1\u0c82\u0ca6\u0cc1\u0cb5\u0cb0\u0cbf\u0cb8\u0cbf", + "goBack": "\u0cb9\u0cbf\u0c82\u0ca6\u0cc6 \u0cb9\u0ccb\u0c97\u0cbf", + "reset": "\u0cae\u0cb0\u0cc1\u0cb9\u0cca\u0c82\u0ca6\u0cbf\u0cb8\u0cbf", + "submit": "\u0cb8\u0cb2\u0ccd\u0cb2\u0cbf\u0cb8\u0cbf" + }, + "status": { + "loading": "\u0cb2\u0ccb\u0ca1\u0ccd \u0c86\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0ca6\u0cc6...", + "error": { + "default": "\u0ca6\u0ccb\u0cb7 \u0cb8\u0c82\u0cad\u0cb5\u0cbf\u0cb8\u0cbf\u0ca6\u0cc6", + "serverConnection": "\u0cb8\u0cb0\u0ccd\u0cb5\u0cb0\u0ccd\u200c \u0c85\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca4\u0cb2\u0cc1\u0caa\u0cb2\u0cc1 \u0cb8\u0cbe\u0ca7\u0ccd\u0caf\u0cb5\u0cbe\u0c97\u0cb2\u0cbf\u0cb2\u0ccd\u0cb2" + } + } + }, + "auth": { + "login": { + "title": "\u0c85\u0caa\u0ccd\u0cb2\u0cbf\u0c95\u0cc7\u0cb6\u0ca8\u0ccd\u200c\u0c97\u0cc6 \u0caa\u0ccd\u0cb0\u0cb5\u0cc7\u0cb6\u0cbf\u0cb8\u0cb2\u0cc1 \u0cb2\u0cbe\u0c97\u0cbf\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cbf", + "form": { + "email": { + "label": "\u0c87\u0cae\u0cc7\u0cb2\u0ccd \u0cb5\u0cbf\u0cb3\u0cbe\u0cb8", + "required": "\u0c87\u0cae\u0cc7\u0cb2\u0ccd \u0c85\u0c97\u0ca4\u0ccd\u0caf\u0cb5\u0cbf\u0cb0\u0cc1\u0cb5 \u0c95\u0ccd\u0cb7\u0cc7\u0ca4\u0ccd\u0cb0" + }, + "password": { + "label": "\u0caa\u0cbe\u0cb8\u0ccd\u200c\u0cb5\u0cb0\u0ccd\u0ca1\u0ccd", + "required": "\u0caa\u0cbe\u0cb8\u0ccd\u200c\u0cb5\u0cb0\u0ccd\u0ca1\u0ccd \u0c85\u0c97\u0ca4\u0ccd\u0caf\u0cb5\u0cbf\u0cb0\u0cc1\u0cb5 \u0c95\u0ccd\u0cb7\u0cc7\u0ca4\u0ccd\u0cb0" + }, + "actions": { + "signin": "\u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cbf" + }, + "alternativeText": { + "or": "\u0c85\u0ca5\u0cb5\u0cbe" + } + }, + "errors": { + "default": "\u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0cb8\u0cbe\u0ca7\u0ccd\u0caf\u0cb5\u0cbe\u0c97\u0cb2\u0cbf\u0cb2\u0ccd\u0cb2", + "signin": "\u0cac\u0cc7\u0cb0\u0cc6 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0caa\u0ccd\u0cb0\u0caf\u0ca4\u0ccd\u0ca8\u0cbf\u0cb8\u0cbf", + "oauthSignin": "\u0cac\u0cc7\u0cb0\u0cc6 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0caa\u0ccd\u0cb0\u0caf\u0ca4\u0ccd\u0ca8\u0cbf\u0cb8\u0cbf", + "redirectUriMismatch": "\u0cb0\u0cc0\u0ca1\u0cc8\u0cb0\u0cc6\u0c95\u0ccd\u0c9f\u0ccd URI \u0c93\u0ca5\u0ccd \u0c85\u0caa\u0ccd\u0cb2\u0cbf\u0c95\u0cc7\u0cb6\u0ca8\u0ccd \u0c95\u0cbe\u0ca8\u0ccd\u0cab\u0cbf\u0c97\u0cb0\u0cc7\u0cb6\u0ca8\u0ccd\u200c\u0c97\u0cc6 \u0cb9\u0cca\u0c82\u0ca6\u0cbf\u0c95\u0cc6\u0caf\u0cbe\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0cb2\u0ccd\u0cb2", + "oauthCallback": "\u0cac\u0cc7\u0cb0\u0cc6 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0caa\u0ccd\u0cb0\u0caf\u0ca4\u0ccd\u0ca8\u0cbf\u0cb8\u0cbf", + "oauthCreateAccount": "\u0cac\u0cc7\u0cb0\u0cc6 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0caa\u0ccd\u0cb0\u0caf\u0ca4\u0ccd\u0ca8\u0cbf\u0cb8\u0cbf", + "emailCreateAccount": "\u0cac\u0cc7\u0cb0\u0cc6 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0caa\u0ccd\u0cb0\u0caf\u0ca4\u0ccd\u0ca8\u0cbf\u0cb8\u0cbf", + "callback": "\u0cac\u0cc7\u0cb0\u0cc6 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0caa\u0ccd\u0cb0\u0caf\u0ca4\u0ccd\u0ca8\u0cbf\u0cb8\u0cbf", + "oauthAccountNotLinked": "\u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0c97\u0cc1\u0cb0\u0cc1\u0ca4\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca6\u0cc3\u0ca2\u0cc0\u0c95\u0cb0\u0cbf\u0cb8\u0cb2\u0cc1, \u0ca8\u0cc0\u0cb5\u0cc1 \u0cae\u0cca\u0ca6\u0cb2\u0cc1 \u0cac\u0cb3\u0cb8\u0cbf\u0ca6 \u0c85\u0ca6\u0cc7 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cbf", + "emailSignin": "\u0c87\u0cae\u0cc7\u0cb2\u0ccd \u0c95\u0cb3\u0cc1\u0cb9\u0cbf\u0cb8\u0cb2\u0cc1 \u0cb8\u0cbe\u0ca7\u0ccd\u0caf\u0cb5\u0cbe\u0c97\u0cb2\u0cbf\u0cb2\u0ccd\u0cb2", + "emailVerify": "\u0ca6\u0caf\u0cb5\u0cbf\u0c9f\u0ccd\u0c9f\u0cc1 \u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0c87\u0cae\u0cc7\u0cb2\u0ccd \u0caa\u0cb0\u0cbf\u0cb6\u0cc0\u0cb2\u0cbf\u0cb8\u0cbf, \u0cb9\u0cca\u0cb8 \u0c87\u0cae\u0cc7\u0cb2\u0ccd \u0c95\u0cb3\u0cc1\u0cb9\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6", + "credentialsSignin": "\u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cb5\u0cbf\u0cab\u0cb2\u0cb5\u0cbe\u0c97\u0cbf\u0ca6\u0cc6. \u0ca8\u0cc0\u0cb5\u0cc1 \u0c92\u0ca6\u0c97\u0cbf\u0cb8\u0cbf\u0ca6 \u0cb5\u0cbf\u0cb5\u0cb0\u0c97\u0cb3\u0cc1 \u0cb8\u0cb0\u0cbf\u0caf\u0cbe\u0c97\u0cbf\u0cb5\u0cc6\u0caf\u0cc7 \u0c8e\u0c82\u0ca6\u0cc1 \u0caa\u0cb0\u0cbf\u0cb6\u0cc0\u0cb2\u0cbf\u0cb8\u0cbf", + "sessionRequired": "\u0c88 \u0caa\u0cc1\u0c9f\u0cb5\u0ca8\u0ccd\u0ca8\u0cc1 \u0caa\u0ccd\u0cb0\u0cb5\u0cc7\u0cb6\u0cbf\u0cb8\u0cb2\u0cc1 \u0ca6\u0caf\u0cb5\u0cbf\u0c9f\u0ccd\u0c9f\u0cc1 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cbf" + } + }, + "provider": { + "continue": "{{provider}} \u0ca8\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cae\u0cc1\u0c82\u0ca6\u0cc1\u0cb5\u0cb0\u0cbf\u0cb8\u0cbf" + } + }, + "chat": { + "input": { + "placeholder": "\u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0cb8\u0c82\u0ca6\u0cc7\u0cb6\u0cb5\u0ca8\u0ccd\u0ca8\u0cc1 \u0c87\u0cb2\u0ccd\u0cb2\u0cbf \u0c9f\u0cc8\u0caa\u0ccd \u0cae\u0cbe\u0ca1\u0cbf...", + "actions": { + "send": "\u0cb8\u0c82\u0ca6\u0cc7\u0cb6 \u0c95\u0cb3\u0cc1\u0cb9\u0cbf\u0cb8\u0cbf", + "stop": "\u0c95\u0cbe\u0cb0\u0ccd\u0caf \u0ca8\u0cbf\u0cb2\u0ccd\u0cb2\u0cbf\u0cb8\u0cbf", + "attachFiles": "\u0cab\u0cc8\u0cb2\u0ccd\u200c\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0cb2\u0c97\u0ca4\u0ccd\u0ca4\u0cbf\u0cb8\u0cbf" + } + }, + "speech": { + "start": "\u0cb0\u0cc6\u0c95\u0cbe\u0cb0\u0ccd\u0ca1\u0cbf\u0c82\u0c97\u0ccd \u0caa\u0ccd\u0cb0\u0cbe\u0cb0\u0c82\u0cad\u0cbf\u0cb8\u0cbf", + "stop": "\u0cb0\u0cc6\u0c95\u0cbe\u0cb0\u0ccd\u0ca1\u0cbf\u0c82\u0c97\u0ccd \u0ca8\u0cbf\u0cb2\u0ccd\u0cb2\u0cbf\u0cb8\u0cbf", + "connecting": "\u0cb8\u0c82\u0caa\u0cb0\u0ccd\u0c95\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0ca6\u0cc6" + }, + "fileUpload": { + "dragDrop": "\u0cab\u0cc8\u0cb2\u0ccd\u200c\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0c87\u0cb2\u0ccd\u0cb2\u0cbf \u0c8e\u0cb3\u0cc6\u0ca6\u0cc1 \u0cac\u0cbf\u0ca1\u0cbf", + "browse": "\u0cab\u0cc8\u0cb2\u0ccd\u200c\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0cac\u0ccd\u0cb0\u0ccc\u0cb8\u0ccd \u0cae\u0cbe\u0ca1\u0cbf", + "sizeLimit": "\u0cae\u0cbf\u0ca4\u0cbf:", + "errors": { + "failed": "\u0c85\u0caa\u0ccd\u200c\u0cb2\u0ccb\u0ca1\u0ccd \u0cb5\u0cbf\u0cab\u0cb2\u0cb5\u0cbe\u0c97\u0cbf\u0ca6\u0cc6", + "cancelled": "\u0c85\u0caa\u0ccd\u200c\u0cb2\u0ccb\u0ca1\u0ccd \u0cb0\u0ca6\u0ccd\u0ca6\u0cc1\u0c97\u0cca\u0cb3\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6" + } + }, + "messages": { + "status": { + "using": "\u0cac\u0cb3\u0cb8\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0cb0\u0cc1\u0cb5\u0cc1\u0ca6\u0cc1", + "used": "\u0cac\u0cb3\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6" + }, + "actions": { + "copy": { + "button": "\u0c95\u0ccd\u0cb2\u0cbf\u0caa\u0ccd\u200c\u0cac\u0ccb\u0cb0\u0ccd\u0ca1\u0ccd\u200c\u0c97\u0cc6 \u0ca8\u0c95\u0cb2\u0cbf\u0cb8\u0cbf", + "success": "\u0ca8\u0c95\u0cb2\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6!" + } + }, + "feedback": { + "positive": "\u0cb8\u0cb9\u0cbe\u0caf\u0c95\u0cb5\u0cbe\u0c97\u0cbf\u0ca6\u0cc6", + "negative": "\u0cb8\u0cb9\u0cbe\u0caf\u0c95\u0cb5\u0cbe\u0c97\u0cbf\u0cb2\u0ccd\u0cb2", + "edit": "\u0caa\u0ccd\u0cb0\u0ca4\u0cbf\u0c95\u0ccd\u0cb0\u0cbf\u0caf\u0cc6 \u0cb8\u0c82\u0caa\u0cbe\u0ca6\u0cbf\u0cb8\u0cbf", + "dialog": { + "title": "\u0c95\u0cbe\u0cae\u0cc6\u0c82\u0c9f\u0ccd \u0cb8\u0cc7\u0cb0\u0cbf\u0cb8\u0cbf", + "submit": "\u0caa\u0ccd\u0cb0\u0ca4\u0cbf\u0c95\u0ccd\u0cb0\u0cbf\u0caf\u0cc6 \u0cb8\u0cb2\u0ccd\u0cb2\u0cbf\u0cb8\u0cbf" + }, + "status": { + "updating": "\u0ca8\u0cb5\u0cc0\u0c95\u0cb0\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0ca6\u0cc6", + "updated": "\u0caa\u0ccd\u0cb0\u0ca4\u0cbf\u0c95\u0ccd\u0cb0\u0cbf\u0caf\u0cc6 \u0ca8\u0cb5\u0cc0\u0c95\u0cb0\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6" + } + } + }, + "history": { + "title": "\u0c95\u0cca\u0ca8\u0cc6\u0caf \u0c87\u0ca8\u0ccd\u200c\u0caa\u0cc1\u0c9f\u0ccd\u200c\u0c97\u0cb3\u0cc1", + "empty": "\u0c96\u0cbe\u0cb2\u0cbf\u0caf\u0cbe\u0c97\u0cbf\u0ca6\u0cc6...", + "show": "\u0c87\u0ca4\u0cbf\u0cb9\u0cbe\u0cb8 \u0ca4\u0ccb\u0cb0\u0cbf\u0cb8\u0cbf" + }, + "settings": { + "title": "\u0cb8\u0cc6\u0c9f\u0ccd\u0c9f\u0cbf\u0c82\u0c97\u0ccd\u200c\u0c97\u0cb3 \u0caa\u0ccd\u0caf\u0cbe\u0ca8\u0cc6\u0cb2\u0ccd" + }, + "watermark": "\u0c87\u0ca6\u0cb0\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0ca8\u0cbf\u0cb0\u0ccd\u0cae\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6" + }, + "threadHistory": { + "sidebar": { + "title": "\u0cb9\u0cbf\u0c82\u0ca6\u0cbf\u0ca8 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0c97\u0cb3\u0cc1", + "filters": { + "search": "\u0cb9\u0cc1\u0ca1\u0cc1\u0c95\u0cbf", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "\u0c87\u0c82\u0ca6\u0cc1", + "yesterday": "\u0ca8\u0cbf\u0ca8\u0ccd\u0ca8\u0cc6", + "previous7days": "\u0cb9\u0cbf\u0c82\u0ca6\u0cbf\u0ca8 7 \u0ca6\u0cbf\u0ca8\u0c97\u0cb3\u0cc1", + "previous30days": "\u0cb9\u0cbf\u0c82\u0ca6\u0cbf\u0ca8 30 \u0ca6\u0cbf\u0ca8\u0c97\u0cb3\u0cc1" + }, + "empty": "\u0caf\u0cbe\u0cb5\u0cc1\u0ca6\u0cc7 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0c97\u0cb3\u0cc1 \u0c95\u0c82\u0ca1\u0cc1\u0cac\u0c82\u0ca6\u0cbf\u0cb2\u0ccd\u0cb2", + "actions": { + "close": "\u0caa\u0c95\u0ccd\u0c95\u0ca6 \u0caa\u0c9f\u0ccd\u0c9f\u0cbf \u0cae\u0cc1\u0c9a\u0ccd\u0c9a\u0cbf", + "open": "\u0caa\u0c95\u0ccd\u0c95\u0ca6 \u0caa\u0c9f\u0ccd\u0c9f\u0cbf \u0ca4\u0cc6\u0cb0\u0cc6\u0caf\u0cbf\u0cb0\u0cbf" + } + }, + "thread": { + "untitled": "\u0cb6\u0cc0\u0cb0\u0ccd\u0cb7\u0cbf\u0c95\u0cc6\u0cb0\u0cb9\u0cbf\u0ca4 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "\u0c85\u0cb3\u0cbf\u0cb8\u0cc1\u0cb5\u0cbf\u0c95\u0cc6\u0caf\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca6\u0cc3\u0ca2\u0cc0\u0c95\u0cb0\u0cbf\u0cb8\u0cbf", + "description": "\u0c87\u0ca6\u0cc1 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0caf\u0ca8\u0ccd\u0ca8\u0cc1 \u0cb9\u0cbe\u0c97\u0cc2 \u0c85\u0ca6\u0cb0 \u0cb8\u0c82\u0ca6\u0cc7\u0cb6\u0c97\u0cb3\u0cc1 \u0cae\u0ca4\u0ccd\u0ca4\u0cc1 \u0c85\u0c82\u0cb6\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0c85\u0cb3\u0cbf\u0cb8\u0cc1\u0ca4\u0ccd\u0ca4\u0ca6\u0cc6. \u0c88 \u0c95\u0ccd\u0cb0\u0cbf\u0caf\u0cc6\u0caf\u0ca8\u0ccd\u0ca8\u0cc1 \u0cb0\u0ca6\u0ccd\u0ca6\u0cc1\u0c97\u0cca\u0cb3\u0cbf\u0cb8\u0cb2\u0cc1 \u0cb8\u0cbe\u0ca7\u0ccd\u0caf\u0cb5\u0cbf\u0cb2\u0ccd\u0cb2", + "success": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6 \u0c85\u0cb3\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6", + "inProgress": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6 \u0c85\u0cb3\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0ca6\u0cc6" + }, + "rename": { + "title": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0caf \u0cb9\u0cc6\u0cb8\u0cb0\u0cc1 \u0cac\u0ca6\u0cb2\u0cbe\u0caf\u0cbf\u0cb8\u0cbf", + "description": "\u0c88 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0c97\u0cc6 \u0cb9\u0cca\u0cb8 \u0cb9\u0cc6\u0cb8\u0cb0\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca8\u0cae\u0cc2\u0ca6\u0cbf\u0cb8\u0cbf", + "form": { + "name": { + "label": "\u0cb9\u0cc6\u0cb8\u0cb0\u0cc1", + "placeholder": "\u0cb9\u0cca\u0cb8 \u0cb9\u0cc6\u0cb8\u0cb0\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca8\u0cae\u0cc2\u0ca6\u0cbf\u0cb8\u0cbf" + } + }, + "success": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0caf \u0cb9\u0cc6\u0cb8\u0cb0\u0cc1 \u0cac\u0ca6\u0cb2\u0cbe\u0caf\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6!", + "inProgress": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0caf \u0cb9\u0cc6\u0cb8\u0cb0\u0cc1 \u0cac\u0ca6\u0cb2\u0cbe\u0caf\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0ca6\u0cc6" + } + } + } + }, + "navigation": { + "header": { + "chat": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6", + "readme": "\u0c93\u0ca6\u0cbf", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "\u0cb9\u0cca\u0cb8 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6", + "dialog": { + "title": "\u0cb9\u0cca\u0cb8 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6 \u0cb0\u0c9a\u0cbf\u0cb8\u0cbf", + "description": "\u0c87\u0ca6\u0cc1 \u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0caa\u0ccd\u0cb0\u0cb8\u0ccd\u0ca4\u0cc1\u0ca4 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0caf \u0c87\u0ca4\u0cbf\u0cb9\u0cbe\u0cb8\u0cb5\u0ca8\u0ccd\u0ca8\u0cc1 \u0c85\u0cb3\u0cbf\u0cb8\u0cc1\u0ca4\u0ccd\u0ca4\u0ca6\u0cc6. \u0ca8\u0cc0\u0cb5\u0cc1 \u0cae\u0cc1\u0c82\u0ca6\u0cc1\u0cb5\u0cb0\u0cc6\u0caf\u0cb2\u0cc1 \u0cac\u0caf\u0cb8\u0cc1\u0cb5\u0cbf\u0cb0\u0cbe?", + "tooltip": "\u0cb9\u0cca\u0cb8 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6" + } + }, + "user": { + "menu": { + "settings": "\u0cb8\u0cc6\u0c9f\u0ccd\u0c9f\u0cbf\u0c82\u0c97\u0ccd\u200c\u0c97\u0cb3\u0cc1", + "settingsKey": "S", + "apiKeys": "API \u0c95\u0cc0\u0c97\u0cb3\u0cc1", + "logout": "\u0cb2\u0cbe\u0c97\u0ccd \u0c94\u0c9f\u0ccd" + } + } + }, + "apiKeys": { + "title": "\u0c85\u0c97\u0ca4\u0ccd\u0caf\u0cb5\u0cbf\u0cb0\u0cc1\u0cb5 API \u0c95\u0cc0\u0c97\u0cb3\u0cc1", + "description": "\u0c88 \u0c85\u0caa\u0ccd\u0cb2\u0cbf\u0c95\u0cc7\u0cb6\u0ca8\u0ccd \u0cac\u0cb3\u0cb8\u0cb2\u0cc1, \u0c88 \u0c95\u0cc6\u0cb3\u0c97\u0cbf\u0ca8 API \u0c95\u0cc0\u0c97\u0cb3\u0cc1 \u0c85\u0c97\u0ca4\u0ccd\u0caf\u0cb5\u0cbf\u0cb0\u0cc1\u0ca4\u0ccd\u0ca4\u0cb5\u0cc6. \u0c95\u0cc0\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0cb8\u0cbe\u0ca7\u0ca8\u0ca6 \u0cb8\u0ccd\u0ca5\u0cb3\u0cc0\u0caf \u0cb8\u0c82\u0c97\u0ccd\u0cb0\u0cb9\u0ca3\u0cc6\u0caf\u0cb2\u0ccd\u0cb2\u0cbf \u0cb8\u0c82\u0c97\u0ccd\u0cb0\u0cb9\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0ca6\u0cc6.", + "success": { + "saved": "\u0caf\u0cb6\u0cb8\u0ccd\u0cb5\u0cbf\u0caf\u0cbe\u0c97\u0cbf \u0c89\u0cb3\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/codetide/agents/tide/ui/.chainlit/translations/ml.json b/codetide/agents/tide/ui/.chainlit/translations/ml.json new file mode 100644 index 0000000..f932bd3 --- /dev/null +++ b/codetide/agents/tide/ui/.chainlit/translations/ml.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "\u0d31\u0d26\u0d4d\u0d26\u0d3e\u0d15\u0d4d\u0d15\u0d41\u0d15", + "confirm": "\u0d38\u0d4d\u0d25\u0d3f\u0d30\u0d40\u0d15\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "continue": "\u0d24\u0d41\u0d1f\u0d30\u0d41\u0d15", + "goBack": "\u0d24\u0d3f\u0d30\u0d3f\u0d15\u0d46 \u0d2a\u0d4b\u0d15\u0d41\u0d15", + "reset": "\u0d2a\u0d41\u0d28\u0d03\u0d38\u0d1c\u0d4d\u0d1c\u0d2e\u0d3e\u0d15\u0d4d\u0d15\u0d41\u0d15", + "submit": "\u0d38\u0d2e\u0d7c\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15" + }, + "status": { + "loading": "\u0d32\u0d4b\u0d21\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d41...", + "error": { + "default": "\u0d12\u0d30\u0d41 \u0d2a\u0d3f\u0d36\u0d15\u0d4d \u0d38\u0d02\u0d2d\u0d35\u0d3f\u0d1a\u0d4d\u0d1a\u0d41", + "serverConnection": "\u0d38\u0d46\u0d7c\u0d35\u0d31\u0d41\u0d2e\u0d3e\u0d2f\u0d3f \u0d2c\u0d28\u0d4d\u0d27\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d3e\u0d7b \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d3f\u0d32\u0d4d\u0d32" + } + } + }, + "auth": { + "login": { + "title": "\u0d06\u0d2a\u0d4d\u0d2a\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d15\u0d4d\u0d15\u0d3e\u0d7b \u0d32\u0d4b\u0d17\u0d3f\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", + "form": { + "email": { + "label": "\u0d07\u0d2e\u0d46\u0d2f\u0d3f\u0d7d \u0d35\u0d3f\u0d32\u0d3e\u0d38\u0d02", + "required": "\u0d07\u0d2e\u0d46\u0d2f\u0d3f\u0d7d \u0d12\u0d30\u0d41 \u0d06\u0d35\u0d36\u0d4d\u0d2f\u0d2e\u0d3e\u0d2f \u0d2b\u0d40\u0d7d\u0d21\u0d4d \u0d06\u0d23\u0d4d" + }, + "password": { + "label": "\u0d2a\u0d3e\u0d38\u0d4d\u200c\u0d35\u0d47\u0d21\u0d4d", + "required": "\u0d2a\u0d3e\u0d38\u0d4d\u200c\u0d35\u0d47\u0d21\u0d4d \u0d12\u0d30\u0d41 \u0d06\u0d35\u0d36\u0d4d\u0d2f\u0d2e\u0d3e\u0d2f \u0d2b\u0d40\u0d7d\u0d21\u0d4d \u0d06\u0d23\u0d4d" + }, + "actions": { + "signin": "\u0d38\u0d48\u0d7b \u0d07\u0d7b" + }, + "alternativeText": { + "or": "\u0d05\u0d32\u0d4d\u0d32\u0d46\u0d19\u0d4d\u0d15\u0d3f\u0d7d" + } + }, + "errors": { + "default": "\u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d15\u0d34\u0d3f\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d3f\u0d32\u0d4d\u0d32", + "signin": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "oauthSignin": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "redirectUriMismatch": "\u0d31\u0d40\u0d21\u0d2f\u0d31\u0d15\u0d4d\u0d1f\u0d4d URI oauth \u0d06\u0d2a\u0d4d\u0d2a\u0d4d \u0d15\u0d4b\u0d7a\u0d2b\u0d3f\u0d17\u0d31\u0d47\u0d37\u0d28\u0d41\u0d2e\u0d3e\u0d2f\u0d3f \u0d2a\u0d4a\u0d30\u0d41\u0d24\u0d4d\u0d24\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d41\u0d28\u0d4d\u0d28\u0d3f\u0d32\u0d4d\u0d32", + "oauthCallback": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "oauthCreateAccount": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "emailCreateAccount": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "callback": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "oauthAccountNotLinked": "\u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d35\u0d4d\u0d2f\u0d15\u0d4d\u0d24\u0d3f\u0d24\u0d4d\u0d35\u0d02 \u0d38\u0d4d\u0d25\u0d3f\u0d30\u0d40\u0d15\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d3e\u0d7b, \u0d06\u0d26\u0d4d\u0d2f\u0d02 \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a \u0d05\u0d24\u0d47 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", + "emailSignin": "\u0d07\u0d2e\u0d46\u0d2f\u0d3f\u0d7d \u0d05\u0d2f\u0d2f\u0d4d\u0d15\u0d4d\u0d15\u0d3e\u0d7b \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d3f\u0d32\u0d4d\u0d32", + "emailVerify": "\u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d07\u0d2e\u0d46\u0d2f\u0d3f\u0d7d \u0d2a\u0d30\u0d3f\u0d36\u0d4b\u0d27\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15, \u0d12\u0d30\u0d41 \u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d07\u0d2e\u0d46\u0d2f\u0d3f\u0d7d \u0d05\u0d2f\u0d1a\u0d4d\u0d1a\u0d3f\u0d1f\u0d4d\u0d1f\u0d41\u0d23\u0d4d\u0d1f\u0d4d", + "credentialsSignin": "\u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d2a\u0d30\u0d3e\u0d1c\u0d2f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41. \u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d7e \u0d28\u0d7d\u0d15\u0d3f\u0d2f \u0d35\u0d3f\u0d35\u0d30\u0d19\u0d4d\u0d19\u0d7e \u0d36\u0d30\u0d3f\u0d2f\u0d3e\u0d23\u0d46\u0d28\u0d4d\u0d28\u0d4d \u0d2a\u0d30\u0d3f\u0d36\u0d4b\u0d27\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "sessionRequired": "\u0d08 \u0d2a\u0d47\u0d1c\u0d4d \u0d06\u0d15\u0d4d\u0d38\u0d38\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d26\u0d2f\u0d35\u0d3e\u0d2f\u0d3f \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15" + } + }, + "provider": { + "continue": "{{provider}} \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d24\u0d41\u0d1f\u0d30\u0d41\u0d15" + } + }, + "chat": { + "input": { + "placeholder": "\u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d38\u0d28\u0d4d\u0d26\u0d47\u0d36\u0d02 \u0d07\u0d35\u0d3f\u0d1f\u0d46 \u0d1f\u0d48\u0d2a\u0d4d\u0d2a\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15...", + "actions": { + "send": "\u0d38\u0d28\u0d4d\u0d26\u0d47\u0d36\u0d02 \u0d05\u0d2f\u0d2f\u0d4d\u0d15\u0d4d\u0d15\u0d41\u0d15", + "stop": "\u0d1f\u0d3e\u0d38\u0d4d\u0d15\u0d4d \u0d28\u0d3f\u0d7c\u0d24\u0d4d\u0d24\u0d41\u0d15", + "attachFiles": "\u0d2b\u0d2f\u0d32\u0d41\u0d15\u0d7e \u0d05\u0d31\u0d4d\u0d31\u0d3e\u0d1a\u0d4d\u0d1a\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15" + } + }, + "speech": { + "start": "\u0d31\u0d46\u0d15\u0d4d\u0d15\u0d4b\u0d7c\u0d21\u0d3f\u0d02\u0d17\u0d4d \u0d06\u0d30\u0d02\u0d2d\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "stop": "\u0d31\u0d46\u0d15\u0d4d\u0d15\u0d4b\u0d7c\u0d21\u0d3f\u0d02\u0d17\u0d4d \u0d28\u0d3f\u0d7c\u0d24\u0d4d\u0d24\u0d41\u0d15", + "connecting": "\u0d2c\u0d28\u0d4d\u0d27\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41" + }, + "fileUpload": { + "dragDrop": "\u0d2b\u0d2f\u0d32\u0d41\u0d15\u0d7e \u0d07\u0d35\u0d3f\u0d1f\u0d46 \u0d35\u0d32\u0d3f\u0d1a\u0d4d\u0d1a\u0d3f\u0d1f\u0d41\u0d15", + "browse": "\u0d2b\u0d2f\u0d32\u0d41\u0d15\u0d7e \u0d24\u0d3f\u0d30\u0d2f\u0d41\u0d15", + "sizeLimit": "\u0d2a\u0d30\u0d3f\u0d27\u0d3f:", + "errors": { + "failed": "\u0d05\u0d2a\u0d4d\u200c\u0d32\u0d4b\u0d21\u0d4d \u0d2a\u0d30\u0d3e\u0d1c\u0d2f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41", + "cancelled": "\u0d05\u0d2a\u0d4d\u200c\u0d32\u0d4b\u0d21\u0d4d \u0d31\u0d26\u0d4d\u0d26\u0d3e\u0d15\u0d4d\u0d15\u0d3f" + } + }, + "messages": { + "status": { + "using": "\u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41", + "used": "\u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d41" + }, + "actions": { + "copy": { + "button": "\u0d15\u0d4d\u0d32\u0d3f\u0d2a\u0d4d\u0d2a\u0d4d\u0d2c\u0d4b\u0d7c\u0d21\u0d3f\u0d32\u0d47\u0d15\u0d4d\u0d15\u0d4d \u0d2a\u0d15\u0d7c\u0d24\u0d4d\u0d24\u0d41\u0d15", + "success": "\u0d2a\u0d15\u0d7c\u0d24\u0d4d\u0d24\u0d3f!" + } + }, + "feedback": { + "positive": "\u0d38\u0d39\u0d3e\u0d2f\u0d15\u0d30\u0d02", + "negative": "\u0d38\u0d39\u0d3e\u0d2f\u0d15\u0d30\u0d2e\u0d32\u0d4d\u0d32", + "edit": "\u0d2b\u0d40\u0d21\u0d4d\u0d2c\u0d3e\u0d15\u0d4d\u0d15\u0d4d \u0d0e\u0d21\u0d3f\u0d31\u0d4d\u0d31\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", + "dialog": { + "title": "\u0d12\u0d30\u0d41 \u0d15\u0d2e\u0d28\u0d4d\u0d31\u0d4d \u0d1a\u0d47\u0d7c\u0d15\u0d4d\u0d15\u0d41\u0d15", + "submit": "\u0d2b\u0d40\u0d21\u0d4d\u0d2c\u0d3e\u0d15\u0d4d\u0d15\u0d4d \u0d38\u0d2e\u0d7c\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15" + }, + "status": { + "updating": "\u0d05\u0d2a\u0d4d\u0d21\u0d47\u0d31\u0d4d\u0d31\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d41", + "updated": "\u0d2b\u0d40\u0d21\u0d4d\u0d2c\u0d3e\u0d15\u0d4d\u0d15\u0d4d \u0d05\u0d2a\u0d4d\u0d21\u0d47\u0d31\u0d4d\u0d31\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d41" + } + } + }, + "history": { + "title": "\u0d05\u0d35\u0d38\u0d3e\u0d28 \u0d07\u0d7b\u0d2a\u0d41\u0d1f\u0d4d\u0d1f\u0d41\u0d15\u0d7e", + "empty": "\u0d12\u0d28\u0d4d\u0d28\u0d41\u0d2e\u0d3f\u0d32\u0d4d\u0d32...", + "show": "\u0d39\u0d3f\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d31\u0d3f \u0d15\u0d3e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15" + }, + "settings": { + "title": "\u0d15\u0d4d\u0d30\u0d2e\u0d40\u0d15\u0d30\u0d23\u0d19\u0d4d\u0d19\u0d7e \u0d2a\u0d3e\u0d28\u0d7d" + }, + "watermark": "\u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d28\u0d3f\u0d7c\u0d2e\u0d4d\u0d2e\u0d3f\u0d1a\u0d4d\u0d1a\u0d24\u0d4d" + }, + "threadHistory": { + "sidebar": { + "title": "\u0d2e\u0d41\u0d7b \u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d41\u0d15\u0d7e", + "filters": { + "search": "\u0d24\u0d3f\u0d30\u0d2f\u0d41\u0d15", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "\u0d07\u0d28\u0d4d\u0d28\u0d4d", + "yesterday": "\u0d07\u0d28\u0d4d\u0d28\u0d32\u0d46", + "previous7days": "\u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e 7 \u0d26\u0d3f\u0d35\u0d38\u0d02", + "previous30days": "\u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e 30 \u0d26\u0d3f\u0d35\u0d38\u0d02" + }, + "empty": "\u0d24\u0d4d\u0d30\u0d46\u0d21\u0d41\u0d15\u0d7e \u0d15\u0d23\u0d4d\u0d1f\u0d46\u0d24\u0d4d\u0d24\u0d3f\u0d2f\u0d3f\u0d32\u0d4d\u0d32", + "actions": { + "close": "\u0d38\u0d48\u0d21\u0d4d\u0d2c\u0d3e\u0d7c \u0d05\u0d1f\u0d2f\u0d4d\u0d15\u0d4d\u0d15\u0d41\u0d15", + "open": "\u0d38\u0d48\u0d21\u0d4d\u0d2c\u0d3e\u0d7c \u0d24\u0d41\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d15" + } + }, + "thread": { + "untitled": "\u0d2a\u0d47\u0d30\u0d3f\u0d32\u0d4d\u0d32\u0d3e\u0d24\u0d4d\u0d24 \u0d38\u0d02\u0d2d\u0d3e\u0d37\u0d23\u0d02", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "\u0d21\u0d3f\u0d32\u0d40\u0d31\u0d4d\u0d31\u0d4d \u0d38\u0d4d\u0d25\u0d3f\u0d30\u0d40\u0d15\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "description": "\u0d07\u0d24\u0d4d \u0d24\u0d4d\u0d30\u0d46\u0d21\u0d41\u0d02 \u0d05\u0d24\u0d3f\u0d28\u0d4d\u0d31\u0d46 \u0d38\u0d28\u0d4d\u0d26\u0d47\u0d36\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d02 \u0d18\u0d1f\u0d15\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d02 \u0d21\u0d3f\u0d32\u0d40\u0d31\u0d4d\u0d31\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d02. \u0d08 \u0d2a\u0d4d\u0d30\u0d35\u0d7c\u0d24\u0d4d\u0d24\u0d3f \u0d2a\u0d34\u0d2f\u0d2a\u0d1f\u0d3f\u0d2f\u0d3e\u0d15\u0d4d\u0d15\u0d3e\u0d7b \u0d15\u0d34\u0d3f\u0d2f\u0d3f\u0d32\u0d4d\u0d32", + "success": "\u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d \u0d21\u0d3f\u0d32\u0d40\u0d31\u0d4d\u0d31\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d41", + "inProgress": "\u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d \u0d21\u0d3f\u0d32\u0d40\u0d31\u0d4d\u0d31\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d41" + }, + "rename": { + "title": "\u0d24\u0d4d\u0d30\u0d46\u0d21\u0d4d \u0d2a\u0d41\u0d28\u0d7c\u0d28\u0d3e\u0d2e\u0d15\u0d30\u0d23\u0d02 \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", + "description": "\u0d08 \u0d24\u0d4d\u0d30\u0d46\u0d21\u0d3f\u0d28\u0d4d \u0d12\u0d30\u0d41 \u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d2a\u0d47\u0d30\u0d4d \u0d28\u0d7d\u0d15\u0d41\u0d15", + "form": { + "name": { + "label": "\u0d2a\u0d47\u0d30\u0d4d", + "placeholder": "\u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d2a\u0d47\u0d30\u0d4d \u0d28\u0d7d\u0d15\u0d41\u0d15" + } + }, + "success": "\u0d24\u0d4d\u0d30\u0d46\u0d21\u0d4d \u0d2a\u0d41\u0d28\u0d7c\u0d28\u0d3e\u0d2e\u0d15\u0d30\u0d23\u0d02 \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d41!", + "inProgress": "\u0d24\u0d4d\u0d30\u0d46\u0d21\u0d4d \u0d2a\u0d41\u0d28\u0d7c\u0d28\u0d3e\u0d2e\u0d15\u0d30\u0d23\u0d02 \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d41" + } + } + } + }, + "navigation": { + "header": { + "chat": "\u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d", + "readme": "\u0d35\u0d3e\u0d2f\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "\u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d", + "dialog": { + "title": "\u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d \u0d38\u0d43\u0d37\u0d4d\u0d1f\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "description": "\u0d07\u0d24\u0d4d \u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d28\u0d3f\u0d32\u0d35\u0d3f\u0d32\u0d46 \u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d \u0d39\u0d3f\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d31\u0d3f \u0d2e\u0d3e\u0d2f\u0d4d\u0d15\u0d4d\u0d15\u0d41\u0d02. \u0d24\u0d41\u0d1f\u0d30\u0d3e\u0d7b \u0d24\u0d3e\u0d7d\u0d2a\u0d4d\u0d2a\u0d30\u0d4d\u0d2f\u0d2e\u0d41\u0d23\u0d4d\u0d1f\u0d4b?", + "tooltip": "\u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d" + } + }, + "user": { + "menu": { + "settings": "\u0d15\u0d4d\u0d30\u0d2e\u0d40\u0d15\u0d30\u0d23\u0d19\u0d4d\u0d19\u0d7e", + "settingsKey": "S", + "apiKeys": "API \u0d15\u0d40\u0d15\u0d7e", + "logout": "\u0d32\u0d4b\u0d17\u0d4d\u0d14\u0d1f\u0d4d\u0d1f\u0d4d" + } + } + }, + "apiKeys": { + "title": "\u0d06\u0d35\u0d36\u0d4d\u0d2f\u0d2e\u0d3e\u0d2f API \u0d15\u0d40\u0d15\u0d7e", + "description": "\u0d08 \u0d06\u0d2a\u0d4d\u0d2a\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d15\u0d4d\u0d15\u0d3e\u0d7b, \u0d24\u0d3e\u0d34\u0d46\u0d2a\u0d4d\u0d2a\u0d31\u0d2f\u0d41\u0d28\u0d4d\u0d28 API \u0d15\u0d40\u0d15\u0d7e \u0d06\u0d35\u0d36\u0d4d\u0d2f\u0d2e\u0d3e\u0d23\u0d4d. \u0d15\u0d40\u0d15\u0d7e \u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d09\u0d2a\u0d15\u0d30\u0d23\u0d24\u0d4d\u0d24\u0d3f\u0d28\u0d4d\u0d31\u0d46 \u0d32\u0d4b\u0d15\u0d4d\u0d15\u0d7d \u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4b\u0d31\u0d47\u0d1c\u0d3f\u0d7d \u0d38\u0d02\u0d2d\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d41\u0d28\u0d4d\u0d28\u0d41.", + "success": { + "saved": "\u0d35\u0d3f\u0d1c\u0d2f\u0d15\u0d30\u0d2e\u0d3e\u0d2f\u0d3f \u0d38\u0d02\u0d30\u0d15\u0d4d\u0d37\u0d3f\u0d1a\u0d4d\u0d1a\u0d41" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/codetide/agents/tide/ui/.chainlit/translations/mr.json b/codetide/agents/tide/ui/.chainlit/translations/mr.json new file mode 100644 index 0000000..04a990b --- /dev/null +++ b/codetide/agents/tide/ui/.chainlit/translations/mr.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "\u0930\u0926\u094d\u0926 \u0915\u0930\u093e", + "confirm": "\u092a\u0941\u0937\u094d\u091f\u0940 \u0915\u0930\u093e", + "continue": "\u092a\u0941\u0922\u0947 \u091c\u093e", + "goBack": "\u092e\u093e\u0917\u0947 \u091c\u093e", + "reset": "\u0930\u0940\u0938\u0947\u091f \u0915\u0930\u093e", + "submit": "\u0938\u092c\u092e\u093f\u091f \u0915\u0930\u093e" + }, + "status": { + "loading": "\u0932\u094b\u0921 \u0915\u0930\u0924 \u0906\u0939\u0947...", + "error": { + "default": "\u090f\u0915 \u0924\u094d\u0930\u0941\u091f\u0940 \u0906\u0932\u0940", + "serverConnection": "\u0938\u0930\u094d\u0935\u094d\u0939\u0930\u0936\u0940 \u0915\u0928\u0947\u0915\u094d\u091f \u0939\u094b\u090a \u0936\u0915\u0932\u0947 \u0928\u093e\u0939\u0940" + } + } + }, + "auth": { + "login": { + "title": "\u0905\u0945\u092a \u0935\u093e\u092a\u0930\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940 \u0932\u0949\u0917\u093f\u0928 \u0915\u0930\u093e", + "form": { + "email": { + "label": "\u0908\u092e\u0947\u0932 \u092a\u0924\u094d\u0924\u093e", + "required": "\u0908\u092e\u0947\u0932 \u0906\u0935\u0936\u094d\u092f\u0915 \u0906\u0939\u0947" + }, + "password": { + "label": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921", + "required": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u0906\u0935\u0936\u094d\u092f\u0915 \u0906\u0939\u0947" + }, + "actions": { + "signin": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u093e" + }, + "alternativeText": { + "or": "\u0915\u093f\u0902\u0935\u093e" + } + }, + "errors": { + "default": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0942 \u0936\u0915\u0924 \u0928\u093e\u0939\u0940", + "signin": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e", + "oauthSignin": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e", + "redirectUriMismatch": "\u0930\u0940\u0921\u093e\u092f\u0930\u0947\u0915\u094d\u091f URI \u0913\u0925 \u0905\u0945\u092a \u0915\u0949\u0928\u094d\u092b\u093f\u0917\u0930\u0947\u0936\u0928\u0936\u0940 \u091c\u0941\u0933\u0924 \u0928\u093e\u0939\u0940", + "oauthCallback": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e", + "oauthCreateAccount": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e", + "emailCreateAccount": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e", + "callback": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e", + "oauthAccountNotLinked": "\u0924\u0941\u092e\u091a\u0940 \u0913\u0933\u0916 \u092a\u091f\u0935\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940, \u092e\u0942\u0933 \u0935\u093e\u092a\u0930\u0932\u0947\u0932\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947\u091a \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u093e", + "emailSignin": "\u0908\u092e\u0947\u0932 \u092a\u093e\u0920\u0935\u0942 \u0936\u0915\u0932\u0947 \u0928\u093e\u0939\u0940", + "emailVerify": "\u0915\u0943\u092a\u092f\u093e \u0924\u0941\u092e\u091a\u093e \u0908\u092e\u0947\u0932 \u0924\u092a\u093e\u0938\u093e, \u0928\u0935\u0940\u0928 \u0908\u092e\u0947\u0932 \u092a\u093e\u0920\u0935\u0932\u093e \u0917\u0947\u0932\u093e \u0906\u0939\u0947", + "credentialsSignin": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0905\u092f\u0936\u0938\u094d\u0935\u0940. \u0924\u0941\u092e\u094d\u0939\u0940 \u0926\u093f\u0932\u0947\u0932\u0940 \u092e\u093e\u0939\u093f\u0924\u0940 \u092f\u094b\u0917\u094d\u092f \u0906\u0939\u0947 \u0915\u093e \u0924\u0947 \u0924\u092a\u093e\u0938\u093e", + "sessionRequired": "\u092f\u093e \u092a\u0943\u0937\u094d\u0920\u093e\u0935\u0930 \u092a\u094d\u0930\u0935\u0947\u0936 \u0915\u0930\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940 \u0915\u0943\u092a\u092f\u093e \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u093e" + } + }, + "provider": { + "continue": "{{provider}} \u0938\u0939 \u092a\u0941\u0922\u0947 \u091c\u093e" + } + }, + "chat": { + "input": { + "placeholder": "\u0924\u0941\u092e\u091a\u093e \u0938\u0902\u0926\u0947\u0936 \u092f\u0947\u0925\u0947 \u091f\u093e\u0907\u092a \u0915\u0930\u093e...", + "actions": { + "send": "\u0938\u0902\u0926\u0947\u0936 \u092a\u093e\u0920\u0935\u093e", + "stop": "\u0915\u093e\u0930\u094d\u092f \u0925\u093e\u0902\u092c\u0935\u093e", + "attachFiles": "\u092b\u093e\u0907\u0932\u094d\u0938 \u091c\u094b\u0921\u093e" + } + }, + "speech": { + "start": "\u0930\u0947\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u0938\u0941\u0930\u0942 \u0915\u0930\u093e", + "stop": "\u0930\u0947\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u0925\u093e\u0902\u092c\u0935\u093e", + "connecting": "\u0915\u0928\u0947\u0915\u094d\u091f \u0915\u0930\u0924 \u0906\u0939\u0947" + }, + "fileUpload": { + "dragDrop": "\u092b\u093e\u0907\u0932\u094d\u0938 \u092f\u0947\u0925\u0947 \u0921\u094d\u0930\u0945\u0917 \u0906\u0923\u093f \u0921\u094d\u0930\u0949\u092a \u0915\u0930\u093e", + "browse": "\u092b\u093e\u0907\u0932\u094d\u0938 \u092c\u094d\u0930\u093e\u0909\u091d \u0915\u0930\u093e", + "sizeLimit": "\u092e\u0930\u094d\u092f\u093e\u0926\u093e:", + "errors": { + "failed": "\u0905\u092a\u0932\u094b\u0921 \u0905\u092f\u0936\u0938\u094d\u0935\u0940", + "cancelled": "\u092f\u093e\u0902\u091a\u0947 \u0905\u092a\u0932\u094b\u0921 \u0930\u0926\u094d\u0926 \u0915\u0947\u0932\u0947" + } + }, + "messages": { + "status": { + "using": "\u0935\u093e\u092a\u0930\u0924 \u0906\u0939\u0947", + "used": "\u0935\u093e\u092a\u0930\u0932\u0947" + }, + "actions": { + "copy": { + "button": "\u0915\u094d\u0932\u093f\u092a\u092c\u094b\u0930\u094d\u0921\u0935\u0930 \u0915\u0949\u092a\u0940 \u0915\u0930\u093e", + "success": "\u0915\u0949\u092a\u0940 \u0915\u0947\u0932\u0947!" + } + }, + "feedback": { + "positive": "\u0909\u092a\u092f\u0941\u0915\u094d\u0924", + "negative": "\u0909\u092a\u092f\u0941\u0915\u094d\u0924 \u0928\u093e\u0939\u0940", + "edit": "\u092b\u0940\u0921\u092c\u0945\u0915 \u0938\u0902\u092a\u093e\u0926\u093f\u0924 \u0915\u0930\u093e", + "dialog": { + "title": "\u091f\u093f\u092a\u094d\u092a\u0923\u0940 \u091c\u094b\u0921\u093e", + "submit": "\u092b\u0940\u0921\u092c\u0945\u0915 \u0938\u092c\u092e\u093f\u091f \u0915\u0930\u093e" + }, + "status": { + "updating": "\u0905\u092a\u0921\u0947\u091f \u0915\u0930\u0924 \u0906\u0939\u0947", + "updated": "\u092b\u0940\u0921\u092c\u0945\u0915 \u0905\u092a\u0921\u0947\u091f \u0915\u0947\u0932\u0947" + } + } + }, + "history": { + "title": "\u0936\u0947\u0935\u091f\u091a\u0947 \u0907\u0928\u092a\u0941\u091f", + "empty": "\u0930\u093f\u0915\u093e\u092e\u0947 \u0906\u0939\u0947...", + "show": "\u0907\u0924\u093f\u0939\u093e\u0938 \u0926\u093e\u0916\u0935\u093e" + }, + "settings": { + "title": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u091c \u092a\u0945\u0928\u0932" + }, + "watermark": "\u0938\u0939 \u092c\u0928\u0935\u0932\u0947" + }, + "threadHistory": { + "sidebar": { + "title": "\u092e\u093e\u0917\u0940\u0932 \u091a\u0945\u091f\u094d\u0938", + "filters": { + "search": "\u0936\u094b\u0927\u093e", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "\u0906\u091c", + "yesterday": "\u0915\u093e\u0932", + "previous7days": "\u092e\u093e\u0917\u0940\u0932 7 \u0926\u093f\u0935\u0938", + "previous30days": "\u092e\u093e\u0917\u0940\u0932 30 \u0926\u093f\u0935\u0938" + }, + "empty": "\u0915\u094b\u0923\u0924\u0947\u0939\u0940 \u0925\u094d\u0930\u0947\u0921 \u0938\u093e\u092a\u0921\u0932\u0947 \u0928\u093e\u0939\u0940\u0924", + "actions": { + "close": "\u0938\u093e\u0907\u0921\u092c\u093e\u0930 \u092c\u0902\u0926 \u0915\u0930\u093e", + "open": "\u0938\u093e\u0907\u0921\u092c\u093e\u0930 \u0909\u0918\u0921\u093e" + } + }, + "thread": { + "untitled": "\u0936\u0940\u0930\u094d\u0937\u0915\u0935\u093f\u0930\u0939\u093f\u0924 \u0938\u0902\u092d\u093e\u0937\u0923", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "\u0939\u091f\u0935\u093f\u0923\u094d\u092f\u093e\u091a\u0940 \u092a\u0941\u0937\u094d\u091f\u0940 \u0915\u0930\u093e", + "description": "\u0939\u0947 \u0925\u094d\u0930\u0947\u0921 \u0906\u0923\u093f \u0924\u094d\u092f\u093e\u091a\u0947 \u0938\u0902\u0926\u0947\u0936 \u0935 \u0918\u091f\u0915 \u0939\u091f\u0935\u0947\u0932. \u0939\u0940 \u0915\u094d\u0930\u093f\u092f\u093e \u092a\u0942\u0930\u094d\u0935\u0935\u0924 \u0915\u0947\u0932\u0940 \u091c\u093e\u090a \u0936\u0915\u0924 \u0928\u093e\u0939\u0940", + "success": "\u091a\u0945\u091f \u0939\u091f\u0935\u0932\u093e", + "inProgress": "\u091a\u0945\u091f \u0939\u091f\u0935\u0924 \u0906\u0939\u0947" + }, + "rename": { + "title": "\u0925\u094d\u0930\u0947\u0921\u091a\u0947 \u0928\u093e\u0935 \u092c\u0926\u0932\u093e", + "description": "\u092f\u093e \u0925\u094d\u0930\u0947\u0921\u0938\u093e\u0920\u0940 \u0928\u0935\u0940\u0928 \u0928\u093e\u0935 \u092a\u094d\u0930\u0935\u093f\u0937\u094d\u091f \u0915\u0930\u093e", + "form": { + "name": { + "label": "\u0928\u093e\u0935", + "placeholder": "\u0928\u0935\u0940\u0928 \u0928\u093e\u0935 \u092a\u094d\u0930\u0935\u093f\u0937\u094d\u091f \u0915\u0930\u093e" + } + }, + "success": "\u0925\u094d\u0930\u0947\u0921\u091a\u0947 \u0928\u093e\u0935 \u092c\u0926\u0932\u0932\u0947!", + "inProgress": "\u0925\u094d\u0930\u0947\u0921\u091a\u0947 \u0928\u093e\u0935 \u092c\u0926\u0932\u0924 \u0906\u0939\u0947" + } + } + } + }, + "navigation": { + "header": { + "chat": "\u091a\u0945\u091f", + "readme": "\u0935\u093e\u091a\u093e", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "\u0928\u0935\u0940\u0928 \u091a\u0945\u091f", + "dialog": { + "title": "\u0928\u0935\u0940\u0928 \u091a\u0945\u091f \u0924\u092f\u093e\u0930 \u0915\u0930\u093e", + "description": "\u0939\u0947 \u0924\u0941\u092e\u091a\u093e \u0938\u0927\u094d\u092f\u093e\u091a\u093e \u091a\u0945\u091f \u0907\u0924\u093f\u0939\u093e\u0938 \u0938\u093e\u092b \u0915\u0930\u0947\u0932. \u0924\u0941\u092e\u094d\u0939\u093e\u0932\u093e \u0916\u093e\u0924\u094d\u0930\u0940 \u0906\u0939\u0947 \u0915\u0940 \u0924\u0941\u092e\u094d\u0939\u0940 \u092a\u0941\u0922\u0947 \u091c\u093e\u090a \u0907\u091a\u094d\u091b\u093f\u0924\u093e?", + "tooltip": "\u0928\u0935\u0940\u0928 \u091a\u0945\u091f" + } + }, + "user": { + "menu": { + "settings": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u091c", + "settingsKey": "S", + "apiKeys": "API \u0915\u0940\u091c", + "logout": "\u0932\u0949\u0917\u0906\u0909\u091f" + } + } + }, + "apiKeys": { + "title": "\u0906\u0935\u0936\u094d\u092f\u0915 API \u0915\u0940\u091c", + "description": "\u0939\u0947 \u0905\u0945\u092a \u0935\u093e\u092a\u0930\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940 \u0916\u093e\u0932\u0940\u0932 API \u0915\u0940\u091c \u0906\u0935\u0936\u094d\u092f\u0915 \u0906\u0939\u0947\u0924. \u0915\u0940\u091c \u0924\u0941\u092e\u091a\u094d\u092f\u093e \u0921\u093f\u0935\u094d\u0939\u093e\u0907\u0938\u091a\u094d\u092f\u093e \u0932\u094b\u0915\u0932 \u0938\u094d\u091f\u094b\u0930\u0947\u091c\u092e\u0927\u094d\u092f\u0947 \u0938\u093e\u0920\u0935\u0932\u094d\u092f\u093e \u091c\u093e\u0924\u093e\u0924.", + "success": { + "saved": "\u092f\u0936\u0938\u094d\u0935\u0940\u0930\u093f\u0924\u094d\u092f\u093e \u091c\u0924\u0928 \u0915\u0947\u0932\u0947" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/codetide/agents/tide/ui/.chainlit/translations/nl-NL.json b/codetide/agents/tide/ui/.chainlit/translations/nl-NL.json new file mode 100644 index 0000000..ed33115 --- /dev/null +++ b/codetide/agents/tide/ui/.chainlit/translations/nl-NL.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "Annuleren", + "confirm": "Bevestigen", + "continue": "Doorgaan", + "goBack": "Terug", + "reset": "Herstellen", + "submit": "Versturen" + }, + "status": { + "loading": "Laden...", + "error": { + "default": "Er is een fout opgetreden", + "serverConnection": "Kon geen verbinding maken met de server" + } + } + }, + "auth": { + "login": { + "title": "Inloggen om toegang te krijgen tot de app", + "form": { + "email": { + "label": "E-mailadres", + "required": "e-mail is een verplicht veld" + }, + "password": { + "label": "Wachtwoord", + "required": "wachtwoord is een verplicht veld" + }, + "actions": { + "signin": "Inloggen" + }, + "alternativeText": { + "or": "OF" + } + }, + "errors": { + "default": "Kan niet inloggen", + "signin": "Probeer in te loggen met een ander account", + "oauthSignin": "Probeer in te loggen met een ander account", + "redirectUriMismatch": "De redirect URI komt niet overeen met de oauth app configuratie", + "oauthCallback": "Probeer in te loggen met een ander account", + "oauthCreateAccount": "Probeer in te loggen met een ander account", + "emailCreateAccount": "Probeer in te loggen met een ander account", + "callback": "Probeer in te loggen met een ander account", + "oauthAccountNotLinked": "Om je identiteit te bevestigen, log in met hetzelfde account dat je oorspronkelijk hebt gebruikt", + "emailSignin": "De e-mail kon niet worden verzonden", + "emailVerify": "Verifieer je e-mail, er is een nieuwe e-mail verzonden", + "credentialsSignin": "Inloggen mislukt. Controleer of de ingevoerde gegevens correct zijn", + "sessionRequired": "Log in om toegang te krijgen tot deze pagina" + } + }, + "provider": { + "continue": "Doorgaan met {{provider}}" + } + }, + "chat": { + "input": { + "placeholder": "Typ hier je bericht...", + "actions": { + "send": "Bericht versturen", + "stop": "Taak stoppen", + "attachFiles": "Bestanden bijvoegen" + } + }, + "speech": { + "start": "Start opname", + "stop": "Stop opname", + "connecting": "Verbinden" + }, + "fileUpload": { + "dragDrop": "Sleep bestanden hierheen", + "browse": "Bestanden zoeken", + "sizeLimit": "Limiet:", + "errors": { + "failed": "Uploaden mislukt", + "cancelled": "Upload geannuleerd van" + } + }, + "messages": { + "status": { + "using": "In gebruik", + "used": "Gebruikt" + }, + "actions": { + "copy": { + "button": "Kopi\u00ebren naar klembord", + "success": "Gekopieerd!" + } + }, + "feedback": { + "positive": "Nuttig", + "negative": "Niet nuttig", + "edit": "Feedback bewerken", + "dialog": { + "title": "Voeg een opmerking toe", + "submit": "Feedback versturen" + }, + "status": { + "updating": "Bijwerken", + "updated": "Feedback bijgewerkt" + } + } + }, + "history": { + "title": "Laatste invoer", + "empty": "Zo leeg...", + "show": "Toon geschiedenis" + }, + "settings": { + "title": "Instellingenpaneel" + }, + "watermark": "Gebouwd met" + }, + "threadHistory": { + "sidebar": { + "title": "Eerdere chats", + "filters": { + "search": "Zoeken", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "Vandaag", + "yesterday": "Gisteren", + "previous7days": "Afgelopen 7 dagen", + "previous30days": "Afgelopen 30 dagen" + }, + "empty": "Geen gesprekken gevonden", + "actions": { + "close": "Zijbalk sluiten", + "open": "Zijbalk openen" + } + }, + "thread": { + "untitled": "Naamloos gesprek", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "Verwijdering bevestigen", + "description": "Dit zal het gesprek en bijbehorende berichten en elementen verwijderen. Deze actie kan niet ongedaan worden gemaakt", + "success": "Chat verwijderd", + "inProgress": "Chat verwijderen" + }, + "rename": { + "title": "Gesprek hernoemen", + "description": "Voer een nieuwe naam in voor dit gesprek", + "form": { + "name": { + "label": "Naam", + "placeholder": "Voer nieuwe naam in" + } + }, + "success": "Gesprek hernoemd!", + "inProgress": "Gesprek hernoemen" + } + } + } + }, + "navigation": { + "header": { + "chat": "Chat", + "readme": "Leesmij", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "Nieuwe chat", + "dialog": { + "title": "Nieuwe chat aanmaken", + "description": "Dit zal je huidige chatgeschiedenis wissen. Weet je zeker dat je door wilt gaan?", + "tooltip": "Nieuwe chat" + } + }, + "user": { + "menu": { + "settings": "Instellingen", + "settingsKey": "I", + "apiKeys": "API-sleutels", + "logout": "Uitloggen" + } + } + }, + "apiKeys": { + "title": "Vereiste API-sleutels", + "description": "Om deze app te gebruiken zijn de volgende API-sleutels vereist. De sleutels worden opgeslagen in de lokale opslag van je apparaat.", + "success": { + "saved": "Succesvol opgeslagen" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/codetide/agents/tide/ui/.chainlit/translations/nl.json b/codetide/agents/tide/ui/.chainlit/translations/nl.json new file mode 100644 index 0000000..3b24f98 --- /dev/null +++ b/codetide/agents/tide/ui/.chainlit/translations/nl.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "Annuleren", + "confirm": "Bevestigen", + "continue": "Doorgaan", + "goBack": "Terug", + "reset": "Herstellen", + "submit": "Versturen" + }, + "status": { + "loading": "Laden...", + "error": { + "default": "Er is een fout opgetreden", + "serverConnection": "Kon geen verbinding maken met de server" + } + } + }, + "auth": { + "login": { + "title": "Inloggen om toegang te krijgen tot de app", + "form": { + "email": { + "label": "E-mailadres", + "required": "e-mail is een verplicht veld" + }, + "password": { + "label": "Wachtwoord", + "required": "wachtwoord is een verplicht veld" + }, + "actions": { + "signin": "Inloggen" + }, + "alternativeText": { + "or": "OF" + } + }, + "errors": { + "default": "Kan niet inloggen", + "signin": "Probeer in te loggen met een ander account", + "oauthSignin": "Probeer in te loggen met een ander account", + "redirectUriMismatch": "De redirect URI komt niet overeen met de oauth app configuratie", + "oauthCallback": "Probeer in te loggen met een ander account", + "oauthCreateAccount": "Probeer in te loggen met een ander account", + "emailCreateAccount": "Probeer in te loggen met een ander account", + "callback": "Probeer in te loggen met een ander account", + "oauthAccountNotLinked": "Om je identiteit te bevestigen, log in met hetzelfde account dat je oorspronkelijk hebt gebruikt", + "emailSignin": "De e-mail kon niet worden verzonden", + "emailVerify": "Verifieer je e-mail, er is een nieuwe e-mail verzonden", + "credentialsSignin": "Inloggen mislukt. Controleer of de ingevoerde gegevens correct zijn", + "sessionRequired": "Log in om toegang te krijgen tot deze pagina" + } + }, + "provider": { + "continue": "Doorgaan met {{provider}}" + } + }, + "chat": { + "input": { + "placeholder": "Typ hier je bericht...", + "actions": { + "send": "Bericht versturen", + "stop": "Taak stoppen", + "attachFiles": "Bestanden bijvoegen" + } + }, + "speech": { + "start": "Start opname", + "stop": "Stop opname", + "connecting": "Verbinden" + }, + "fileUpload": { + "dragDrop": "Sleep bestanden hierheen", + "browse": "Bestanden zoeken", + "sizeLimit": "Limiet:", + "errors": { + "failed": "Uploaden mislukt", + "cancelled": "Upload geannuleerd van" + } + }, + "messages": { + "status": { + "using": "In gebruik", + "used": "Gebruikt" + }, + "actions": { + "copy": { + "button": "Kopi\u00ebren naar klembord", + "success": "Gekopieerd!" + } + }, + "feedback": { + "positive": "Nuttig", + "negative": "Niet nuttig", + "edit": "Feedback bewerken", + "dialog": { + "title": "Voeg een opmerking toe", + "submit": "Feedback versturen" + }, + "status": { + "updating": "Bijwerken", + "updated": "Feedback bijgewerkt" + } + } + }, + "history": { + "title": "Laatste invoer", + "empty": "Zo leeg...", + "show": "Toon geschiedenis" + }, + "settings": { + "title": "Instellingenpaneel" + }, + "watermark": "LLM's kunnen fouten maken. Overweeg het controleren van belangrijke informatie." + }, + "threadHistory": { + "sidebar": { + "title": "Eerdere chats", + "filters": { + "search": "Zoeken", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "Vandaag", + "yesterday": "Gisteren", + "previous7days": "Afgelopen 7 dagen", + "previous30days": "Afgelopen 30 dagen" + }, + "empty": "Geen gesprekken gevonden", + "actions": { + "close": "Zijbalk sluiten", + "open": "Zijbalk openen" + } + }, + "thread": { + "untitled": "Naamloos gesprek", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "Verwijdering bevestigen", + "description": "Dit zal het gesprek en bijbehorende berichten en elementen verwijderen. Deze actie kan niet ongedaan worden gemaakt", + "success": "Chat verwijderd", + "inProgress": "Chat verwijderen" + }, + "rename": { + "title": "Gesprek hernoemen", + "description": "Voer een nieuwe naam in voor dit gesprek", + "form": { + "name": { + "label": "Naam", + "placeholder": "Voer nieuwe naam in" + } + }, + "success": "Gesprek hernoemd!", + "inProgress": "Gesprek hernoemen" + } + } + } + }, + "navigation": { + "header": { + "chat": "Chat", + "readme": "Leesmij", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "Nieuwe chat", + "dialog": { + "title": "Nieuwe chat aanmaken", + "description": "Dit zal je huidige chatgeschiedenis wissen. Weet je zeker dat je door wilt gaan?", + "tooltip": "Nieuwe chat" + } + }, + "user": { + "menu": { + "settings": "Instellingen", + "settingsKey": "I", + "apiKeys": "API-sleutels", + "logout": "Uitloggen" + } + } + }, + "apiKeys": { + "title": "Vereiste API-sleutels", + "description": "Om deze app te gebruiken zijn de volgende API-sleutels vereist. De sleutels worden opgeslagen in de lokale opslag van je apparaat.", + "success": { + "saved": "Succesvol opgeslagen" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/codetide/agents/tide/ui/.chainlit/translations/ta.json b/codetide/agents/tide/ui/.chainlit/translations/ta.json new file mode 100644 index 0000000..6990072 --- /dev/null +++ b/codetide/agents/tide/ui/.chainlit/translations/ta.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "\u0bb0\u0ba4\u0bcd\u0ba4\u0bc1 \u0b9a\u0bc6\u0baf\u0bcd", + "confirm": "\u0b89\u0bb1\u0bc1\u0ba4\u0bbf\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1", + "continue": "\u0ba4\u0bca\u0b9f\u0bb0\u0bcd\u0b95", + "goBack": "\u0ba4\u0bbf\u0bb0\u0bc1\u0bae\u0bcd\u0baa\u0bbf\u0b9a\u0bcd \u0b9a\u0bc6\u0bb2\u0bcd", + "reset": "\u0bae\u0bc0\u0b9f\u0bcd\u0b9f\u0bae\u0bc8", + "submit": "\u0b9a\u0bae\u0bb0\u0bcd\u0baa\u0bcd\u0baa\u0bbf" + }, + "status": { + "loading": "\u0b8f\u0bb1\u0bcd\u0bb1\u0bc1\u0b95\u0bbf\u0bb1\u0ba4\u0bc1...", + "error": { + "default": "\u0baa\u0bbf\u0bb4\u0bc8 \u0b8f\u0bb1\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1", + "serverConnection": "\u0b9a\u0bc7\u0bb5\u0bc8\u0baf\u0b95\u0ba4\u0bcd\u0ba4\u0bc8 \u0b85\u0b9f\u0bc8\u0baf \u0bae\u0bc1\u0b9f\u0bbf\u0baf\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8" + } + } + }, + "auth": { + "login": { + "title": "\u0baa\u0baf\u0ba9\u0bcd\u0baa\u0bbe\u0b9f\u0bcd\u0b9f\u0bc8 \u0b85\u0ba3\u0bc1\u0b95 \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf\u0bb5\u0bc1\u0bae\u0bcd", + "form": { + "email": { + "label": "\u0bae\u0bbf\u0ba9\u0bcd\u0ba9\u0b9e\u0bcd\u0b9a\u0bb2\u0bcd \u0bae\u0bc1\u0b95\u0bb5\u0bb0\u0bbf", + "required": "\u0bae\u0bbf\u0ba9\u0bcd\u0ba9\u0b9e\u0bcd\u0b9a\u0bb2\u0bcd \u0ba4\u0bc7\u0bb5\u0bc8\u0baf\u0bbe\u0ba9 \u0baa\u0bc1\u0bb2\u0bae\u0bcd" + }, + "password": { + "label": "\u0b95\u0b9f\u0bb5\u0bc1\u0b9a\u0bcd\u0b9a\u0bca\u0bb2\u0bcd", + "required": "\u0b95\u0b9f\u0bb5\u0bc1\u0b9a\u0bcd\u0b9a\u0bca\u0bb2\u0bcd \u0ba4\u0bc7\u0bb5\u0bc8\u0baf\u0bbe\u0ba9 \u0baa\u0bc1\u0bb2\u0bae\u0bcd" + }, + "actions": { + "signin": "\u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0b95" + }, + "alternativeText": { + "or": "\u0b85\u0bb2\u0bcd\u0bb2\u0ba4\u0bc1" + } + }, + "errors": { + "default": "\u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0b9f\u0bbf\u0baf\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8", + "signin": "\u0bb5\u0bc7\u0bb1\u0bc1 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0baf\u0bb1\u0bcd\u0b9a\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd", + "oauthSignin": "\u0bb5\u0bc7\u0bb1\u0bc1 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0baf\u0bb1\u0bcd\u0b9a\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd", + "redirectUriMismatch": "\u0ba4\u0bbf\u0b9a\u0bc8\u0ba4\u0bbf\u0bb0\u0bc1\u0baa\u0bcd\u0baa\u0bb2\u0bcd URI \u0b93\u0b86\u0ba4\u0bcd \u0baa\u0baf\u0ba9\u0bcd\u0baa\u0bbe\u0b9f\u0bcd\u0b9f\u0bc1 \u0b95\u0b9f\u0bcd\u0b9f\u0bae\u0bc8\u0baa\u0bcd\u0baa\u0bc1\u0b9f\u0ba9\u0bcd \u0baa\u0bca\u0bb0\u0bc1\u0ba8\u0bcd\u0ba4\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8", + "oauthCallback": "\u0bb5\u0bc7\u0bb1\u0bc1 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0baf\u0bb1\u0bcd\u0b9a\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd", + "oauthCreateAccount": "\u0bb5\u0bc7\u0bb1\u0bc1 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0baf\u0bb1\u0bcd\u0b9a\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd", + "emailCreateAccount": "\u0bb5\u0bc7\u0bb1\u0bc1 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0baf\u0bb1\u0bcd\u0b9a\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd", + "callback": "\u0bb5\u0bc7\u0bb1\u0bc1 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0baf\u0bb1\u0bcd\u0b9a\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd", + "oauthAccountNotLinked": "\u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b85\u0b9f\u0bc8\u0baf\u0bbe\u0bb3\u0ba4\u0bcd\u0ba4\u0bc8 \u0b89\u0bb1\u0bc1\u0ba4\u0bbf\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4, \u0bae\u0bc1\u0ba4\u0bb2\u0bbf\u0bb2\u0bcd \u0baa\u0baf\u0ba9\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bbf\u0baf \u0b85\u0ba4\u0bc7 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf\u0bb5\u0bc1\u0bae\u0bcd", + "emailSignin": "\u0bae\u0bbf\u0ba9\u0bcd\u0ba9\u0b9e\u0bcd\u0b9a\u0bb2\u0bc8 \u0b85\u0ba9\u0bc1\u0baa\u0bcd\u0baa \u0bae\u0bc1\u0b9f\u0bbf\u0baf\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8", + "emailVerify": "\u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0bae\u0bbf\u0ba9\u0bcd\u0ba9\u0b9e\u0bcd\u0b9a\u0bb2\u0bc8 \u0b9a\u0bb0\u0bbf\u0baa\u0bbe\u0bb0\u0bcd\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd, \u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0bae\u0bbf\u0ba9\u0bcd\u0ba9\u0b9e\u0bcd\u0b9a\u0bb2\u0bcd \u0b85\u0ba9\u0bc1\u0baa\u0bcd\u0baa\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0bc1\u0bb3\u0bcd\u0bb3\u0ba4\u0bc1", + "credentialsSignin": "\u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0bb5\u0bc1 \u0ba4\u0bcb\u0bb2\u0bcd\u0bb5\u0bbf\u0baf\u0b9f\u0bc8\u0ba8\u0bcd\u0ba4\u0ba4\u0bc1. \u0ba8\u0bc0\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0bb5\u0bb4\u0b99\u0bcd\u0b95\u0bbf\u0baf \u0bb5\u0bbf\u0bb5\u0bb0\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b9a\u0bb0\u0bbf\u0baf\u0bbe\u0ba9\u0bb5\u0bc8 \u0b8e\u0ba9 \u0b9a\u0bb0\u0bbf\u0baa\u0bbe\u0bb0\u0bcd\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd", + "sessionRequired": "\u0b87\u0ba8\u0bcd\u0ba4\u0baa\u0bcd \u0baa\u0b95\u0bcd\u0b95\u0ba4\u0bcd\u0ba4\u0bc8 \u0b85\u0ba3\u0bc1\u0b95 \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf\u0bb5\u0bc1\u0bae\u0bcd" + } + }, + "provider": { + "continue": "{{provider}} \u0bae\u0bc2\u0bb2\u0bae\u0bcd \u0ba4\u0bca\u0b9f\u0bb0\u0bb5\u0bc1\u0bae\u0bcd" + } + }, + "chat": { + "input": { + "placeholder": "\u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b9a\u0bc6\u0baf\u0bcd\u0ba4\u0bbf\u0baf\u0bc8 \u0b87\u0b99\u0bcd\u0b95\u0bc7 \u0ba4\u0b9f\u0bcd\u0b9f\u0b9a\u0bcd\u0b9a\u0bc1 \u0b9a\u0bc6\u0baf\u0bcd\u0baf\u0bb5\u0bc1\u0bae\u0bcd...", + "actions": { + "send": "\u0b9a\u0bc6\u0baf\u0bcd\u0ba4\u0bbf \u0b85\u0ba9\u0bc1\u0baa\u0bcd\u0baa\u0bc1", + "stop": "\u0baa\u0ba3\u0bbf\u0baf\u0bc8 \u0ba8\u0bbf\u0bb1\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1", + "attachFiles": "\u0b95\u0bcb\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bc8 \u0b87\u0ba3\u0bc8" + } + }, + "speech": { + "start": "\u0baa\u0ba4\u0bbf\u0bb5\u0bc1 \u0ba4\u0bca\u0b9f\u0b99\u0bcd\u0b95\u0bc1", + "stop": "\u0baa\u0ba4\u0bbf\u0bb5\u0bc8 \u0ba8\u0bbf\u0bb1\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1", + "connecting": "\u0b87\u0ba3\u0bc8\u0b95\u0bcd\u0b95\u0bbf\u0bb1\u0ba4\u0bc1" + }, + "fileUpload": { + "dragDrop": "\u0b95\u0bcb\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bc8 \u0b87\u0b99\u0bcd\u0b95\u0bc7 \u0b87\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1 \u0bb5\u0bbf\u0b9f\u0bb5\u0bc1\u0bae\u0bcd", + "browse": "\u0b95\u0bcb\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bc8 \u0b89\u0bb2\u0bbe\u0bb5\u0bc1", + "sizeLimit": "\u0bb5\u0bb0\u0bae\u0bcd\u0baa\u0bc1:", + "errors": { + "failed": "\u0baa\u0ba4\u0bbf\u0bb5\u0bc7\u0bb1\u0bcd\u0bb1\u0bae\u0bcd \u0ba4\u0bcb\u0bb2\u0bcd\u0bb5\u0bbf\u0baf\u0b9f\u0bc8\u0ba8\u0bcd\u0ba4\u0ba4\u0bc1", + "cancelled": "\u0baa\u0ba4\u0bbf\u0bb5\u0bc7\u0bb1\u0bcd\u0bb1\u0bae\u0bcd \u0bb0\u0ba4\u0bcd\u0ba4\u0bc1 \u0b9a\u0bc6\u0baf\u0bcd\u0baf\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1" + } + }, + "messages": { + "status": { + "using": "\u0baa\u0baf\u0ba9\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0b95\u0bbf\u0bb1\u0ba4\u0bc1", + "used": "\u0baa\u0baf\u0ba9\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1" + }, + "actions": { + "copy": { + "button": "\u0b95\u0bbf\u0bb3\u0bbf\u0baa\u0bcd\u0baa\u0bcb\u0bb0\u0bcd\u0b9f\u0bc1\u0b95\u0bcd\u0b95\u0bc1 \u0ba8\u0b95\u0bb2\u0bc6\u0b9f\u0bc1", + "success": "\u0ba8\u0b95\u0bb2\u0bc6\u0b9f\u0bc1\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1!" + } + }, + "feedback": { + "positive": "\u0baa\u0baf\u0ba9\u0bc1\u0bb3\u0bcd\u0bb3\u0ba4\u0bbe\u0b95 \u0b87\u0bb0\u0bc1\u0ba8\u0bcd\u0ba4\u0ba4\u0bc1", + "negative": "\u0baa\u0baf\u0ba9\u0bc1\u0bb3\u0bcd\u0bb3\u0ba4\u0bbe\u0b95 \u0b87\u0bb2\u0bcd\u0bb2\u0bc8", + "edit": "\u0b95\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc8 \u0ba4\u0bbf\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1", + "dialog": { + "title": "\u0b95\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc8\u0b9a\u0bcd \u0b9a\u0bc7\u0bb0\u0bcd", + "submit": "\u0b95\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc8 \u0b9a\u0bae\u0bb0\u0bcd\u0baa\u0bcd\u0baa\u0bbf" + }, + "status": { + "updating": "\u0baa\u0bc1\u0ba4\u0bc1\u0baa\u0bcd\u0baa\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb1\u0ba4\u0bc1", + "updated": "\u0b95\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1 \u0baa\u0bc1\u0ba4\u0bc1\u0baa\u0bcd\u0baa\u0bbf\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1" + } + } + }, + "history": { + "title": "\u0b95\u0b9f\u0bc8\u0b9a\u0bbf \u0b89\u0bb3\u0bcd\u0bb3\u0bc0\u0b9f\u0bc1\u0b95\u0bb3\u0bcd", + "empty": "\u0b95\u0bbe\u0bb2\u0bbf\u0baf\u0bbe\u0b95 \u0b89\u0bb3\u0bcd\u0bb3\u0ba4\u0bc1...", + "show": "\u0bb5\u0bb0\u0bb2\u0bbe\u0bb1\u0bcd\u0bb1\u0bc8\u0b95\u0bcd \u0b95\u0bbe\u0b9f\u0bcd\u0b9f\u0bc1" + }, + "settings": { + "title": "\u0b85\u0bae\u0bc8\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd \u0baa\u0bb2\u0b95\u0bae\u0bcd" + }, + "watermark": "\u0b89\u0b9f\u0ba9\u0bcd \u0b89\u0bb0\u0bc1\u0bb5\u0bbe\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1" + }, + "threadHistory": { + "sidebar": { + "title": "\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd\u0b95\u0bb3\u0bcd", + "filters": { + "search": "\u0ba4\u0bc7\u0b9f\u0bc1", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "\u0b87\u0ba9\u0bcd\u0bb1\u0bc1", + "yesterday": "\u0ba8\u0bc7\u0bb1\u0bcd\u0bb1\u0bc1", + "previous7days": "\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 7 \u0ba8\u0bbe\u0b9f\u0bcd\u0b95\u0bb3\u0bcd", + "previous30days": "\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 30 \u0ba8\u0bbe\u0b9f\u0bcd\u0b95\u0bb3\u0bcd" + }, + "empty": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd\u0b95\u0bb3\u0bcd \u0b8e\u0ba4\u0bc1\u0bb5\u0bc1\u0bae\u0bcd \u0b87\u0bb2\u0bcd\u0bb2\u0bc8", + "actions": { + "close": "\u0baa\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0bbf\u0baf\u0bc8 \u0bae\u0bc2\u0b9f\u0bc1", + "open": "\u0baa\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0bbf\u0baf\u0bc8 \u0ba4\u0bbf\u0bb1" + } + }, + "thread": { + "untitled": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bbf\u0b9f\u0bbe\u0ba4 \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "\u0ba8\u0bc0\u0b95\u0bcd\u0b95\u0bc1\u0bb5\u0ba4\u0bc8 \u0b89\u0bb1\u0bc1\u0ba4\u0bbf\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1", + "description": "\u0b87\u0ba4\u0bc1 \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd \u0bae\u0bb1\u0bcd\u0bb1\u0bc1\u0bae\u0bcd \u0b85\u0ba4\u0ba9\u0bcd \u0b9a\u0bc6\u0baf\u0bcd\u0ba4\u0bbf\u0b95\u0bb3\u0bcd, \u0b89\u0bb1\u0bc1\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bc8 \u0ba8\u0bc0\u0b95\u0bcd\u0b95\u0bc1\u0bae\u0bcd. \u0b87\u0ba8\u0bcd\u0ba4 \u0b9a\u0bc6\u0baf\u0bb2\u0bc8 \u0bae\u0bc0\u0b9f\u0bcd\u0b9f\u0bc6\u0b9f\u0bc1\u0b95\u0bcd\u0b95 \u0bae\u0bc1\u0b9f\u0bbf\u0baf\u0bbe\u0ba4\u0bc1", + "success": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd \u0ba8\u0bc0\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1", + "inProgress": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bc8 \u0ba8\u0bc0\u0b95\u0bcd\u0b95\u0bc1\u0b95\u0bbf\u0bb1\u0ba4\u0bc1" + }, + "rename": { + "title": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bc8 \u0bae\u0bb1\u0bc1\u0baa\u0bc6\u0baf\u0bb0\u0bbf\u0b9f\u0bc1", + "description": "\u0b87\u0ba8\u0bcd\u0ba4 \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bc1\u0b95\u0bcd\u0b95\u0bc1 \u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0baa\u0bc6\u0baf\u0bb0\u0bc8 \u0b89\u0bb3\u0bcd\u0bb3\u0bbf\u0b9f\u0bb5\u0bc1\u0bae\u0bcd", + "form": { + "name": { + "label": "\u0baa\u0bc6\u0baf\u0bb0\u0bcd", + "placeholder": "\u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0baa\u0bc6\u0baf\u0bb0\u0bc8 \u0b89\u0bb3\u0bcd\u0bb3\u0bbf\u0b9f\u0bb5\u0bc1\u0bae\u0bcd" + } + }, + "success": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd \u0bae\u0bb1\u0bc1\u0baa\u0bc6\u0baf\u0bb0\u0bbf\u0b9f\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1!", + "inProgress": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bc8 \u0bae\u0bb1\u0bc1\u0baa\u0bc6\u0baf\u0bb0\u0bbf\u0b9f\u0bc1\u0b95\u0bbf\u0bb1\u0ba4\u0bc1" + } + } + } + }, + "navigation": { + "header": { + "chat": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd", + "readme": "\u0baa\u0b9f\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "\u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd", + "dialog": { + "title": "\u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bc8 \u0b89\u0bb0\u0bc1\u0bb5\u0bbe\u0b95\u0bcd\u0b95\u0bc1", + "description": "\u0b87\u0ba4\u0bc1 \u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0ba4\u0bb1\u0bcd\u0baa\u0bcb\u0ba4\u0bc8\u0baf \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd \u0bb5\u0bb0\u0bb2\u0bbe\u0bb1\u0bcd\u0bb1\u0bc8 \u0b85\u0bb4\u0bbf\u0b95\u0bcd\u0b95\u0bc1\u0bae\u0bcd. \u0ba4\u0bca\u0b9f\u0bb0 \u0bb5\u0bbf\u0bb0\u0bc1\u0bae\u0bcd\u0baa\u0bc1\u0b95\u0bbf\u0bb1\u0bc0\u0bb0\u0bcd\u0b95\u0bb3\u0bbe?", + "tooltip": "\u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd" + } + }, + "user": { + "menu": { + "settings": "\u0b85\u0bae\u0bc8\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd", + "settingsKey": "S", + "apiKeys": "API \u0bb5\u0bbf\u0b9a\u0bc8\u0b95\u0bb3\u0bcd", + "logout": "\u0bb5\u0bc6\u0bb3\u0bbf\u0baf\u0bc7\u0bb1\u0bc1" + } + } + }, + "apiKeys": { + "title": "\u0ba4\u0bc7\u0bb5\u0bc8\u0baf\u0bbe\u0ba9 API \u0bb5\u0bbf\u0b9a\u0bc8\u0b95\u0bb3\u0bcd", + "description": "\u0b87\u0ba8\u0bcd\u0ba4 \u0baa\u0baf\u0ba9\u0bcd\u0baa\u0bbe\u0b9f\u0bcd\u0b9f\u0bc8\u0baa\u0bcd \u0baa\u0baf\u0ba9\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4, \u0baa\u0bbf\u0ba9\u0bcd\u0bb5\u0bb0\u0bc1\u0bae\u0bcd API \u0bb5\u0bbf\u0b9a\u0bc8\u0b95\u0bb3\u0bcd \u0ba4\u0bc7\u0bb5\u0bc8. \u0bb5\u0bbf\u0b9a\u0bc8\u0b95\u0bb3\u0bcd \u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b9a\u0bbe\u0ba4\u0ba9\u0ba4\u0bcd\u0ba4\u0bbf\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0bb3\u0bc2\u0bb0\u0bcd \u0b9a\u0bc7\u0bae\u0bbf\u0baa\u0bcd\u0baa\u0b95\u0ba4\u0bcd\u0ba4\u0bbf\u0bb2\u0bcd \u0b9a\u0bc7\u0bae\u0bbf\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0bae\u0bcd.", + "success": { + "saved": "\u0bb5\u0bc6\u0bb1\u0bcd\u0bb1\u0bbf\u0b95\u0bb0\u0bae\u0bbe\u0b95 \u0b9a\u0bc7\u0bae\u0bbf\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/codetide/agents/tide/ui/.chainlit/translations/te.json b/codetide/agents/tide/ui/.chainlit/translations/te.json new file mode 100644 index 0000000..ac92371 --- /dev/null +++ b/codetide/agents/tide/ui/.chainlit/translations/te.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "\u0c30\u0c26\u0c4d\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f", + "confirm": "\u0c28\u0c3f\u0c30\u0c4d\u0c27\u0c3e\u0c30\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "continue": "\u0c15\u0c4a\u0c28\u0c38\u0c3e\u0c17\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "goBack": "\u0c35\u0c46\u0c28\u0c15\u0c4d\u0c15\u0c3f \u0c35\u0c46\u0c33\u0c4d\u0c33\u0c02\u0c21\u0c3f", + "reset": "\u0c30\u0c40\u0c38\u0c46\u0c1f\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f", + "submit": "\u0c38\u0c2e\u0c30\u0c4d\u0c2a\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f" + }, + "status": { + "loading": "\u0c32\u0c4b\u0c21\u0c4d \u0c05\u0c35\u0c41\u0c24\u0c4b\u0c02\u0c26\u0c3f...", + "error": { + "default": "\u0c32\u0c4b\u0c2a\u0c02 \u0c38\u0c02\u0c2d\u0c35\u0c3f\u0c02\u0c1a\u0c3f\u0c02\u0c26\u0c3f", + "serverConnection": "\u0c38\u0c30\u0c4d\u0c35\u0c30\u0c4d\u200c\u0c28\u0c3f \u0c1a\u0c47\u0c30\u0c41\u0c15\u0c4b\u0c32\u0c47\u0c15\u0c2a\u0c4b\u0c2f\u0c3e\u0c2e\u0c41" + } + } + }, + "auth": { + "login": { + "title": "\u0c2f\u0c3e\u0c2a\u0c4d\u200c\u0c28\u0c3f \u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c02\u0c1a\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c32\u0c3e\u0c17\u0c3f\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f", + "form": { + "email": { + "label": "\u0c07\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d \u0c1a\u0c3f\u0c30\u0c41\u0c28\u0c3e\u0c2e\u0c3e", + "required": "\u0c07\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d \u0c24\u0c2a\u0c4d\u0c2a\u0c28\u0c3f\u0c38\u0c30\u0c3f" + }, + "password": { + "label": "\u0c2a\u0c3e\u0c38\u0c4d\u200c\u0c35\u0c30\u0c4d\u0c21\u0c4d", + "required": "\u0c2a\u0c3e\u0c38\u0c4d\u200c\u0c35\u0c30\u0c4d\u0c21\u0c4d \u0c24\u0c2a\u0c4d\u0c2a\u0c28\u0c3f\u0c38\u0c30\u0c3f" + }, + "actions": { + "signin": "\u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f" + }, + "alternativeText": { + "or": "\u0c32\u0c47\u0c26\u0c3e" + } + }, + "errors": { + "default": "\u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c32\u0c47\u0c15\u0c2a\u0c4b\u0c2f\u0c3e\u0c2e\u0c41", + "signin": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "oauthSignin": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "redirectUriMismatch": "\u0c30\u0c40\u0c21\u0c48\u0c30\u0c46\u0c15\u0c4d\u0c1f\u0c4d URI oauth \u0c2f\u0c3e\u0c2a\u0c4d \u0c15\u0c3e\u0c28\u0c4d\u0c2b\u0c3f\u0c17\u0c30\u0c47\u0c37\u0c28\u0c4d\u200c\u0c24\u0c4b \u0c38\u0c30\u0c3f\u0c2a\u0c4b\u0c32\u0c21\u0c02 \u0c32\u0c47\u0c26\u0c41", + "oauthCallback": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "oauthCreateAccount": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "emailCreateAccount": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "callback": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "oauthAccountNotLinked": "\u0c2e\u0c40 \u0c17\u0c41\u0c30\u0c4d\u0c24\u0c3f\u0c02\u0c2a\u0c41\u0c28\u0c41 \u0c28\u0c3f\u0c30\u0c4d\u0c27\u0c3e\u0c30\u0c3f\u0c02\u0c1a\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f, \u0c2e\u0c40\u0c30\u0c41 \u0c2e\u0c4a\u0c26\u0c1f \u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c02\u0c1a\u0c3f\u0c28 \u0c05\u0c26\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f", + "emailSignin": "\u0c07\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d \u0c2a\u0c02\u0c2a\u0c21\u0c02 \u0c38\u0c3e\u0c27\u0c4d\u0c2f\u0c02 \u0c15\u0c3e\u0c32\u0c47\u0c26\u0c41", + "emailVerify": "\u0c26\u0c2f\u0c1a\u0c47\u0c38\u0c3f \u0c2e\u0c40 \u0c07\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d\u200c\u0c28\u0c3f \u0c27\u0c43\u0c35\u0c40\u0c15\u0c30\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f, \u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c07\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d \u0c2a\u0c02\u0c2a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f", + "credentialsSignin": "\u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c35\u0c3f\u0c2b\u0c32\u0c2e\u0c48\u0c02\u0c26\u0c3f. \u0c2e\u0c40\u0c30\u0c41 \u0c05\u0c02\u0c26\u0c3f\u0c02\u0c1a\u0c3f\u0c28 \u0c35\u0c3f\u0c35\u0c30\u0c3e\u0c32\u0c41 \u0c38\u0c30\u0c48\u0c28\u0c35\u0c47\u0c28\u0c3e \u0c05\u0c28\u0c3f \u0c24\u0c28\u0c3f\u0c16\u0c40 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f", + "sessionRequired": "\u0c08 \u0c2a\u0c47\u0c1c\u0c40\u0c28\u0c3f \u0c2f\u0c3e\u0c15\u0c4d\u0c38\u0c46\u0c38\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c26\u0c2f\u0c1a\u0c47\u0c38\u0c3f \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f" + } + }, + "provider": { + "continue": "{{provider}}\u0c24\u0c4b \u0c15\u0c4a\u0c28\u0c38\u0c3e\u0c17\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f" + } + }, + "chat": { + "input": { + "placeholder": "\u0c2e\u0c40 \u0c38\u0c02\u0c26\u0c47\u0c36\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c07\u0c15\u0c4d\u0c15\u0c21 \u0c1f\u0c48\u0c2a\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f...", + "actions": { + "send": "\u0c38\u0c02\u0c26\u0c47\u0c36\u0c02 \u0c2a\u0c02\u0c2a\u0c02\u0c21\u0c3f", + "stop": "\u0c2a\u0c28\u0c3f \u0c06\u0c2a\u0c02\u0c21\u0c3f", + "attachFiles": "\u0c2b\u0c48\u0c32\u0c4d\u0c38\u0c4d \u0c1c\u0c4b\u0c21\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f" + } + }, + "speech": { + "start": "\u0c30\u0c3f\u0c15\u0c3e\u0c30\u0c4d\u0c21\u0c3f\u0c02\u0c17\u0c4d \u0c2a\u0c4d\u0c30\u0c3e\u0c30\u0c02\u0c2d\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "stop": "\u0c30\u0c3f\u0c15\u0c3e\u0c30\u0c4d\u0c21\u0c3f\u0c02\u0c17\u0c4d \u0c06\u0c2a\u0c02\u0c21\u0c3f", + "connecting": "\u0c05\u0c28\u0c41\u0c38\u0c02\u0c27\u0c3e\u0c28\u0c3f\u0c38\u0c4d\u0c24\u0c4b\u0c02\u0c26\u0c3f" + }, + "fileUpload": { + "dragDrop": "\u0c2b\u0c48\u0c32\u0c4d\u0c38\u0c4d\u200c\u0c28\u0c3f \u0c07\u0c15\u0c4d\u0c15\u0c21 \u0c21\u0c4d\u0c30\u0c3e\u0c17\u0c4d \u0c1a\u0c47\u0c38\u0c3f \u0c21\u0c4d\u0c30\u0c3e\u0c2a\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f", + "browse": "\u0c2b\u0c48\u0c32\u0c4d\u0c38\u0c4d \u0c2c\u0c4d\u0c30\u0c4c\u0c1c\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f", + "sizeLimit": "\u0c2a\u0c30\u0c3f\u0c2e\u0c3f\u0c24\u0c3f:", + "errors": { + "failed": "\u0c05\u0c2a\u0c4d\u200c\u0c32\u0c4b\u0c21\u0c4d \u0c35\u0c3f\u0c2b\u0c32\u0c2e\u0c48\u0c02\u0c26\u0c3f", + "cancelled": "\u0c05\u0c2a\u0c4d\u200c\u0c32\u0c4b\u0c21\u0c4d \u0c30\u0c26\u0c4d\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f" + } + }, + "messages": { + "status": { + "using": "\u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c38\u0c4d\u0c24\u0c4b\u0c02\u0c26\u0c3f", + "used": "\u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c02\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f" + }, + "actions": { + "copy": { + "button": "\u0c15\u0c4d\u0c32\u0c3f\u0c2a\u0c4d\u200c\u0c2c\u0c4b\u0c30\u0c4d\u0c21\u0c4d\u200c\u0c15\u0c3f \u0c15\u0c3e\u0c2a\u0c40 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f", + "success": "\u0c15\u0c3e\u0c2a\u0c40 \u0c1a\u0c47\u0c2f\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f!" + } + }, + "feedback": { + "positive": "\u0c38\u0c39\u0c3e\u0c2f\u0c15\u0c30\u0c02", + "negative": "\u0c38\u0c39\u0c3e\u0c2f\u0c15\u0c30\u0c02 \u0c15\u0c3e\u0c26\u0c41", + "edit": "\u0c05\u0c2d\u0c3f\u0c2a\u0c4d\u0c30\u0c3e\u0c2f\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c38\u0c35\u0c30\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "dialog": { + "title": "\u0c35\u0c4d\u0c2f\u0c3e\u0c16\u0c4d\u0c2f \u0c1c\u0c4b\u0c21\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "submit": "\u0c05\u0c2d\u0c3f\u0c2a\u0c4d\u0c30\u0c3e\u0c2f\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c38\u0c2e\u0c30\u0c4d\u0c2a\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f" + }, + "status": { + "updating": "\u0c28\u0c35\u0c40\u0c15\u0c30\u0c3f\u0c38\u0c4d\u0c24\u0c4b\u0c02\u0c26\u0c3f", + "updated": "\u0c05\u0c2d\u0c3f\u0c2a\u0c4d\u0c30\u0c3e\u0c2f\u0c02 \u0c28\u0c35\u0c40\u0c15\u0c30\u0c3f\u0c02\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f" + } + } + }, + "history": { + "title": "\u0c1a\u0c3f\u0c35\u0c30\u0c3f \u0c07\u0c28\u0c4d\u200c\u0c2a\u0c41\u0c1f\u0c4d\u200c\u0c32\u0c41", + "empty": "\u0c16\u0c3e\u0c33\u0c40\u0c17\u0c3e \u0c09\u0c02\u0c26\u0c3f...", + "show": "\u0c1a\u0c30\u0c3f\u0c24\u0c4d\u0c30\u0c28\u0c41 \u0c1a\u0c42\u0c2a\u0c3f\u0c02\u0c1a\u0c41" + }, + "settings": { + "title": "\u0c38\u0c46\u0c1f\u0c4d\u0c1f\u0c3f\u0c02\u0c17\u0c4d\u200c\u0c32 \u0c2a\u0c4d\u0c2f\u0c3e\u0c28\u0c46\u0c32\u0c4d" + }, + "watermark": "\u0c24\u0c4b \u0c28\u0c3f\u0c30\u0c4d\u0c2e\u0c3f\u0c02\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f" + }, + "threadHistory": { + "sidebar": { + "title": "\u0c17\u0c24 \u0c1a\u0c3e\u0c1f\u0c4d\u200c\u0c32\u0c41", + "filters": { + "search": "\u0c35\u0c46\u0c24\u0c15\u0c02\u0c21\u0c3f", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "\u0c08\u0c30\u0c4b\u0c1c\u0c41", + "yesterday": "\u0c28\u0c3f\u0c28\u0c4d\u0c28", + "previous7days": "\u0c17\u0c24 7 \u0c30\u0c4b\u0c1c\u0c41\u0c32\u0c41", + "previous30days": "\u0c17\u0c24 30 \u0c30\u0c4b\u0c1c\u0c41\u0c32\u0c41" + }, + "empty": "\u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d\u200c\u0c32\u0c41 \u0c15\u0c28\u0c41\u0c17\u0c4a\u0c28\u0c2c\u0c21\u0c32\u0c47\u0c26\u0c41", + "actions": { + "close": "\u0c38\u0c48\u0c21\u0c4d\u200c\u0c2c\u0c3e\u0c30\u0c4d \u0c2e\u0c42\u0c38\u0c3f\u0c35\u0c47\u0c2f\u0c02\u0c21\u0c3f", + "open": "\u0c38\u0c48\u0c21\u0c4d\u200c\u0c2c\u0c3e\u0c30\u0c4d \u0c24\u0c46\u0c30\u0c35\u0c02\u0c21\u0c3f" + } + }, + "thread": { + "untitled": "\u0c2a\u0c47\u0c30\u0c41 \u0c32\u0c47\u0c28\u0c3f \u0c38\u0c02\u0c2d\u0c3e\u0c37\u0c23", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "\u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c02\u0c2a\u0c41\u0c28\u0c41 \u0c28\u0c3f\u0c30\u0c4d\u0c27\u0c3e\u0c30\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "description": "\u0c07\u0c26\u0c3f \u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d\u200c\u0c24\u0c4b \u0c2a\u0c3e\u0c1f\u0c41 \u0c26\u0c3e\u0c28\u0c3f \u0c38\u0c02\u0c26\u0c47\u0c36\u0c3e\u0c32\u0c28\u0c41 \u0c2e\u0c30\u0c3f\u0c2f\u0c41 \u0c05\u0c02\u0c36\u0c3e\u0c32\u0c28\u0c41 \u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c38\u0c4d\u0c24\u0c41\u0c02\u0c26\u0c3f. \u0c08 \u0c1a\u0c30\u0c4d\u0c2f\u0c28\u0c41 \u0c30\u0c26\u0c4d\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c32\u0c47\u0c30\u0c41", + "success": "\u0c1a\u0c3e\u0c1f\u0c4d \u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c02\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f", + "inProgress": "\u0c1a\u0c3e\u0c1f\u0c4d\u200c\u0c28\u0c3f \u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c38\u0c4d\u0c24\u0c4b\u0c02\u0c26\u0c3f" + }, + "rename": { + "title": "\u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d \u0c2a\u0c47\u0c30\u0c41 \u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c02\u0c21\u0c3f", + "description": "\u0c08 \u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d \u0c15\u0c4b\u0c38\u0c02 \u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c2a\u0c47\u0c30\u0c41\u0c28\u0c41 \u0c28\u0c2e\u0c4b\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f", + "form": { + "name": { + "label": "\u0c2a\u0c47\u0c30\u0c41", + "placeholder": "\u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c2a\u0c47\u0c30\u0c41\u0c28\u0c41 \u0c28\u0c2e\u0c4b\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f" + } + }, + "success": "\u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d \u0c2a\u0c47\u0c30\u0c41 \u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f!", + "inProgress": "\u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d \u0c2a\u0c47\u0c30\u0c41 \u0c2e\u0c3e\u0c30\u0c41\u0c38\u0c4d\u0c24\u0c4b\u0c02\u0c26\u0c3f" + } + } + } + }, + "navigation": { + "header": { + "chat": "\u0c1a\u0c3e\u0c1f\u0c4d", + "readme": "\u0c1a\u0c26\u0c35\u0c02\u0c21\u0c3f", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "\u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c1a\u0c3e\u0c1f\u0c4d", + "dialog": { + "title": "\u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c1a\u0c3e\u0c1f\u0c4d \u0c38\u0c43\u0c37\u0c4d\u0c1f\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "description": "\u0c07\u0c26\u0c3f \u0c2e\u0c40 \u0c2a\u0c4d\u0c30\u0c38\u0c4d\u0c24\u0c41\u0c24 \u0c1a\u0c3e\u0c1f\u0c4d \u0c1a\u0c30\u0c3f\u0c24\u0c4d\u0c30\u0c28\u0c41 \u0c24\u0c41\u0c21\u0c3f\u0c1a\u0c3f\u0c35\u0c47\u0c38\u0c4d\u0c24\u0c41\u0c02\u0c26\u0c3f. \u0c2e\u0c40\u0c30\u0c41 \u0c15\u0c4a\u0c28\u0c38\u0c3e\u0c17\u0c3f\u0c02\u0c1a\u0c3e\u0c32\u0c28\u0c41\u0c15\u0c41\u0c02\u0c1f\u0c41\u0c28\u0c4d\u0c28\u0c3e\u0c30\u0c3e?", + "tooltip": "\u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c1a\u0c3e\u0c1f\u0c4d" + } + }, + "user": { + "menu": { + "settings": "\u0c38\u0c46\u0c1f\u0c4d\u0c1f\u0c3f\u0c02\u0c17\u0c4d\u200c\u0c32\u0c41", + "settingsKey": "S", + "apiKeys": "API \u0c15\u0c40\u0c32\u0c41", + "logout": "\u0c32\u0c3e\u0c17\u0c4d \u0c05\u0c35\u0c41\u0c1f\u0c4d" + } + } + }, + "apiKeys": { + "title": "\u0c05\u0c35\u0c38\u0c30\u0c2e\u0c48\u0c28 API \u0c15\u0c40\u0c32\u0c41", + "description": "\u0c08 \u0c2f\u0c3e\u0c2a\u0c4d\u200c\u0c28\u0c3f \u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c02\u0c1a\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f, \u0c15\u0c3f\u0c02\u0c26\u0c3f API \u0c15\u0c40\u0c32\u0c41 \u0c05\u0c35\u0c38\u0c30\u0c02. \u0c15\u0c40\u0c32\u0c41 \u0c2e\u0c40 \u0c2a\u0c30\u0c3f\u0c15\u0c30\u0c02 \u0c2f\u0c4a\u0c15\u0c4d\u0c15 \u0c38\u0c4d\u0c25\u0c3e\u0c28\u0c3f\u0c15 \u0c28\u0c3f\u0c32\u0c4d\u0c35\u0c32\u0c4b \u0c28\u0c3f\u0c32\u0c4d\u0c35 \u0c1a\u0c47\u0c2f\u0c2c\u0c21\u0c24\u0c3e\u0c2f\u0c3f.", + "success": { + "saved": "\u0c35\u0c3f\u0c1c\u0c2f\u0c35\u0c02\u0c24\u0c02\u0c17\u0c3e \u0c38\u0c47\u0c35\u0c4d \u0c1a\u0c47\u0c2f\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/codetide/agents/tide/ui/.chainlit/translations/zh-CN.json b/codetide/agents/tide/ui/.chainlit/translations/zh-CN.json new file mode 100644 index 0000000..ae336fc --- /dev/null +++ b/codetide/agents/tide/ui/.chainlit/translations/zh-CN.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "\u53d6\u6d88", + "confirm": "\u786e\u8ba4", + "continue": "\u7ee7\u7eed", + "goBack": "\u8fd4\u56de", + "reset": "\u91cd\u7f6e", + "submit": "\u63d0\u4ea4" + }, + "status": { + "loading": "\u52a0\u8f7d\u4e2d...", + "error": { + "default": "\u53d1\u751f\u9519\u8bef", + "serverConnection": "\u65e0\u6cd5\u8fde\u63a5\u5230\u670d\u52a1\u5668" + } + } + }, + "auth": { + "login": { + "title": "\u767b\u5f55\u4ee5\u8bbf\u95ee\u5e94\u7528", + "form": { + "email": { + "label": "\u7535\u5b50\u90ae\u7bb1", + "required": "\u90ae\u7bb1\u662f\u5fc5\u586b\u9879" + }, + "password": { + "label": "\u5bc6\u7801", + "required": "\u5bc6\u7801\u662f\u5fc5\u586b\u9879" + }, + "actions": { + "signin": "\u767b\u5f55" + }, + "alternativeText": { + "or": "\u6216" + } + }, + "errors": { + "default": "\u65e0\u6cd5\u767b\u5f55", + "signin": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55", + "oauthSignin": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55", + "redirectUriMismatch": "\u91cd\u5b9a\u5411URI\u4e0eOAuth\u5e94\u7528\u914d\u7f6e\u4e0d\u5339\u914d", + "oauthCallback": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55", + "oauthCreateAccount": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55", + "emailCreateAccount": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55", + "callback": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55", + "oauthAccountNotLinked": "\u4e3a\u786e\u8ba4\u60a8\u7684\u8eab\u4efd\uff0c\u8bf7\u4f7f\u7528\u539f\u59cb\u8d26\u53f7\u767b\u5f55", + "emailSignin": "\u90ae\u4ef6\u53d1\u9001\u5931\u8d25", + "emailVerify": "\u8bf7\u9a8c\u8bc1\u60a8\u7684\u90ae\u7bb1\uff0c\u65b0\u7684\u9a8c\u8bc1\u90ae\u4ef6\u5df2\u53d1\u9001", + "credentialsSignin": "\u767b\u5f55\u5931\u8d25\u3002\u8bf7\u68c0\u67e5\u60a8\u63d0\u4f9b\u7684\u4fe1\u606f\u662f\u5426\u6b63\u786e", + "sessionRequired": "\u8bf7\u767b\u5f55\u4ee5\u8bbf\u95ee\u6b64\u9875\u9762" + } + }, + "provider": { + "continue": "\u7ee7\u7eed\u4f7f\u7528{{provider}}" + } + }, + "chat": { + "input": { + "placeholder": "\u5728\u6b64\u8f93\u5165\u60a8\u7684\u6d88\u606f...", + "actions": { + "send": "\u53d1\u9001\u6d88\u606f", + "stop": "\u505c\u6b62\u4efb\u52a1", + "attachFiles": "\u9644\u52a0\u6587\u4ef6" + } + }, + "speech": { + "start": "\u5f00\u59cb\u5f55\u97f3", + "stop": "\u505c\u6b62\u5f55\u97f3", + "connecting": "\u8fde\u63a5\u4e2d" + }, + "fileUpload": { + "dragDrop": "\u5c06\u6587\u4ef6\u62d6\u653e\u5230\u8fd9\u91cc", + "browse": "\u6d4f\u89c8\u6587\u4ef6", + "sizeLimit": "\u9650\u5236\uff1a", + "errors": { + "failed": "\u4e0a\u4f20\u5931\u8d25", + "cancelled": "\u5df2\u53d6\u6d88\u4e0a\u4f20" + } + }, + "messages": { + "status": { + "using": "\u4f7f\u7528\u4e2d", + "used": "\u5df2\u4f7f\u7528" + }, + "actions": { + "copy": { + "button": "\u590d\u5236\u5230\u526a\u8d34\u677f", + "success": "\u5df2\u590d\u5236\uff01" + } + }, + "feedback": { + "positive": "\u6709\u5e2e\u52a9", + "negative": "\u6ca1\u6709\u5e2e\u52a9", + "edit": "\u7f16\u8f91\u53cd\u9988", + "dialog": { + "title": "\u6dfb\u52a0\u8bc4\u8bba", + "submit": "\u63d0\u4ea4\u53cd\u9988" + }, + "status": { + "updating": "\u66f4\u65b0\u4e2d", + "updated": "\u53cd\u9988\u5df2\u66f4\u65b0" + } + } + }, + "history": { + "title": "\u6700\u8fd1\u8f93\u5165", + "empty": "\u7a7a\u7a7a\u5982\u4e5f...", + "show": "\u663e\u793a\u5386\u53f2" + }, + "settings": { + "title": "\u8bbe\u7f6e\u9762\u677f" + }, + "watermark": "\u6280\u672f\u652f\u6301" + }, + "threadHistory": { + "sidebar": { + "title": "\u5386\u53f2\u5bf9\u8bdd", + "filters": { + "search": "\u641c\u7d22", + "placeholder": "\u641c\u7d22\u4f1a\u8bdd..." + }, + "timeframes": { + "today": "\u4eca\u5929", + "yesterday": "\u6628\u5929", + "previous7days": "\u8fc7\u53bb7\u5929", + "previous30days": "\u8fc7\u53bb30\u5929" + }, + "empty": "\u672a\u627e\u5230\u5bf9\u8bdd", + "actions": { + "close": "\u5173\u95ed\u4fa7\u8fb9\u680f", + "open": "\u6253\u5f00\u4fa7\u8fb9\u680f" + } + }, + "thread": { + "untitled": "\u672a\u547d\u540d\u5bf9\u8bdd", + "menu": { + "rename": "\u91cd\u547d\u540d", + "delete": "\u5220\u9664" + }, + "actions": { + "delete": { + "title": "\u786e\u8ba4\u5220\u9664", + "description": "\u8fd9\u5c06\u5220\u9664\u8be5\u5bf9\u8bdd\u53ca\u5176\u6240\u6709\u6d88\u606f\u548c\u5143\u7d20\u3002\u6b64\u64cd\u4f5c\u65e0\u6cd5\u64a4\u9500", + "success": "\u5bf9\u8bdd\u5df2\u5220\u9664", + "inProgress": "\u6b63\u5728\u5220\u9664\u5bf9\u8bdd" + }, + "rename": { + "title": "\u91cd\u547d\u540d\u5bf9\u8bdd", + "description": "\u4e3a\u6b64\u5bf9\u8bdd\u8f93\u5165\u65b0\u540d\u79f0", + "form": { + "name": { + "label": "\u540d\u79f0", + "placeholder": "\u8f93\u5165\u65b0\u540d\u79f0" + } + }, + "success": "\u5bf9\u8bdd\u5df2\u91cd\u547d\u540d\uff01", + "inProgress": "\u6b63\u5728\u91cd\u547d\u540d\u5bf9\u8bdd" + } + } + } + }, + "navigation": { + "header": { + "chat": "\u804a\u5929", + "readme": "\u8bf4\u660e", + "theme": { + "light": "\u6d45\u8272\u4e3b\u9898", + "dark": "\u6df1\u8272\u4e3b\u9898", + "system": "\u8ddf\u968f\u7cfb\u7edf" + } + }, + "newChat": { + "button": "\u65b0\u5efa\u5bf9\u8bdd", + "dialog": { + "title": "\u521b\u5efa\u65b0\u5bf9\u8bdd", + "description": "\u8fd9\u5c06\u6e05\u9664\u60a8\u5f53\u524d\u7684\u804a\u5929\u8bb0\u5f55\u3002\u786e\u5b9a\u8981\u7ee7\u7eed\u5417\uff1f", + "tooltip": "\u65b0\u5efa\u5bf9\u8bdd" + } + }, + "user": { + "menu": { + "settings": "\u8bbe\u7f6e", + "settingsKey": "S", + "apiKeys": "API\u5bc6\u94a5", + "logout": "\u9000\u51fa\u767b\u5f55" + } + } + }, + "apiKeys": { + "title": "\u6240\u9700API\u5bc6\u94a5", + "description": "\u4f7f\u7528\u6b64\u5e94\u7528\u9700\u8981\u4ee5\u4e0bAPI\u5bc6\u94a5\u3002\u8fd9\u4e9b\u5bc6\u94a5\u5b58\u50a8\u5728\u60a8\u8bbe\u5907\u7684\u672c\u5730\u5b58\u50a8\u4e2d\u3002", + "success": { + "saved": "\u4fdd\u5b58\u6210\u529f" + } + }, + "alerts": { + "info": "\u4fe1\u606f", + "note": "\u6ce8\u91ca", + "tip": "\u63d0\u793a", + "important": "\u91cd\u8981", + "warning": "\u8b66\u544a", + "caution": "\u6ce8\u610f", + "debug": "\u8c03\u8bd5", + "example": "\u793a\u4f8b", + "success": "\u6210\u529f", + "help": "\u5e2e\u52a9", + "idea": "\u60f3\u6cd5", + "pending": "\u5f85\u5904\u7406", + "security": "\u5b89\u5168", + "beta": "\u6d4b\u8bd5", + "best-practice": "\u6700\u4f73\u5b9e\u8df5" + } +} \ No newline at end of file diff --git a/codetide/agents/tide/ui/agent_tide_ui.py b/codetide/agents/tide/ui/agent_tide_ui.py new file mode 100644 index 0000000..553a6e5 --- /dev/null +++ b/codetide/agents/tide/ui/agent_tide_ui.py @@ -0,0 +1,130 @@ +try: + from aicore.config import Config + from aicore.llm import Llm, LlmConfig + from chainlit.input_widget import Slider, TextInput + +except ImportError as e: + raise ImportError( + "The 'codetide.agents' module requires the 'aicore' and 'chainlit' packages. " + "Install it with: pip install codetide[agents-ui]" + ) from e + +from codetide.agents.tide.prompts import CMD_CODE_REVIEW_PROMPT, CMD_COMMIT_PROMPT, CMD_WRITE_TESTS_PROMPT +from codetide.agents.tide.defaults import DEFAULT_AGENT_TIDE_LLM_CONFIG_PATH +from codetide.agents.tide.ui.defaults import PLACEHOLDER_LLM_CONFIG +from codetide.agents.tide.agent import AgentTide +from codetide.mcp.utils import initCodeTide + +from typing import Optional +from pathlib import Path +from ulid import ulid +import os + +class AgentTideUi(object): + def __init__(self, project_path: Path = Path("./"), history :Optional[list]=None, llm_config :Optional[LlmConfig]=None, session_id :Optional[str]=None): + self.project_path: Path = Path(project_path) + self.config_path = os.getenv("AGENT_TIDE_CONFIG_PATH", DEFAULT_AGENT_TIDE_LLM_CONFIG_PATH) + + if llm_config is None: + try: + config = Config.from_yaml(self.project_path / self.config_path) + self.llm_config: LlmConfig = config.llm + except Exception: + self.llm_config = LlmConfig(**PLACEHOLDER_LLM_CONFIG) + + else: + self.llm_config = llm_config + + self.agent_tide: AgentTide = None + self.history = [] if history is None else history + self.current_step :Optional[int] = None + self.commands_prompts = { + "review": CMD_CODE_REVIEW_PROMPT, + "test": CMD_WRITE_TESTS_PROMPT, + "commit": CMD_COMMIT_PROMPT + } + self.session_id = session_id if session_id else ulid() + + commands = [ + {"id": "review", "icon": "search-check", "description": "Review file(s) or object(s)"}, + {"id": "test", "icon": "flask-conical", "description": "Test file(s) or object(s)"}, + {"id": "commit", "icon": "git-commit", "description": "Generate commit message"}, + ] + + async def load(self): + llm = Llm.from_config(self.llm_config) + self.agent_tide = AgentTide( + llm=llm, + tide=await initCodeTide(workspace=self.project_path), + history=self.history, + session_id=self.session_id + ) + self.agent_tide.llm.session_id = self.agent_tide.session_id + + def increment_step(self)->bool: + steps = self.agent_tide.steps.root + if steps: + if self.current_step is None: + self.current_step = 0 + return + + self.current_step += 1 + if self.current_step == len(steps): + self.current_step = None + self.agent_tide.steps = None + return True + + async def add_to_history(self, message): + self.history.append(message) + if not self.agent_tide: + await self.load() + else: + self.agent_tide.history.append(message) + + def settings(self): + return [ + TextInput( + id="project_path", + label="Project Path", + initial=str(Path(os.getcwd())/(self.project_path)) + ), + TextInput( + id="provider", + label="Provider", + initial=self.llm_config.provider + ), + TextInput( + id="model", + label="LLM", + initial=self.llm_config.model + ), + TextInput( + id="api_key", + label="API Key", + initial=self.llm_config.api_key + ), + TextInput( + id="base_url", + label="Base URL", + initial=self.llm_config.base_url + ), + Slider( + id="temperature", + label="Temperature", + initial=self.llm_config.temperature, + min=0, + max=1, + step=0.1, + ), + Slider( + id="max_tokens", + label="Max Tokens", + initial=self.llm_config.max_tokens, + min=4096, + max=self.llm_config.max_tokens, + step=4096, + ) + ] + + def get_command_prompt(self, command :str)->Optional[str]: + return self.commands_prompts.get(command) diff --git a/codetide/agents/tide/ui/app.py b/codetide/agents/tide/ui/app.py new file mode 100644 index 0000000..7c6b63f --- /dev/null +++ b/codetide/agents/tide/ui/app.py @@ -0,0 +1,390 @@ +# ruff: noqa: E402 +from pathlib import Path +import os + +os.environ.setdefault("CHAINLIT_APP_ROOT", str(Path(os.path.abspath(__file__)).parent)) +os.environ.setdefault("CHAINLIT_AUTH_SECRET","@6c1HFdtsjiYKe,-t?dZXnq%4xrgS/YaHte/:Dr6uYq0su/:fGX~M2uy0.ACehaK") + +try: + from aicore.config import Config + from aicore.llm import Llm, LlmConfig + from aicore.models import AuthenticationError, ModelError + from aicore.const import STREAM_END_TOKEN, STREAM_START_TOKEN#, REASONING_START_TOKEN, REASONING_STOP_TOKEN + from codetide.agents.tide.ui.stream_processor import StreamProcessor, MarkerConfig + from codetide.agents.tide.ui.utils import process_thread, run_concurrent_tasks + from codetide.agents.tide.ui.defaults import AGENT_TIDE_PORT, STARTERS + from codetide.agents.tide.ui.agent_tide_ui import AgentTideUi + from chainlit.data.sql_alchemy import SQLAlchemyDataLayer + from codetide.agents.tide.models import Step + from chainlit.types import ThreadDict + from chainlit.cli import run_chainlit + from typing import Optional + import chainlit as cl + +except ImportError as e: + raise ImportError( + "The 'codetide.agents' module requires the 'aicore' and 'chainlit' packages. " + "Install it with: pip install codetide[agents-ui]" + ) from e + +from codetide.agents.tide.defaults import DEFAULT_AGENT_TIDE_LLM_CONFIG_PATH, AICORE_CONFIG_EXAMPLE, EXCEPTION_MESSAGE, MISSING_CONFIG_MESSAGE +from codetide.core.defaults import DEFAULT_ENCODING +from codetide.agents.data_layer import init_db +import argparse +import getpass +import asyncio +import json +import yaml + +@cl.password_auth_callback +def auth(): + username = getpass.getuser() + return cl.User(identifier=username, display_name=username) + +@cl.data_layer +def get_data_layer(): + return SQLAlchemyDataLayer(conninfo=f"sqlite+aiosqlite:///{os.environ['CHAINLIT_APP_ROOT']}/database.db") + +@cl.on_settings_update +async def setup_llm_config(settings): + agent_tide_ui: AgentTideUi = cl.user_session.get("AgentTideUi") + settings = await cl.ChatSettings(agent_tide_ui.settings()).send() + + agent_tide_ui.llm_config = LlmConfig(**settings) + if Path(settings.get("project_path")) != agent_tide_ui.project_path: + agent_tide_ui.project_path = Path(settings.get("project_path")) + await agent_tide_ui.load() + await cl.send_window_message(f"Agent Tide is connected to workspace: {settings.get('project_path')}") + else: + agent_tide_ui.agent_tide.llm = Llm.from_config(agent_tide_ui.llm_config) + +async def validate_llm_config(agent_tide_ui: AgentTideUi): + exception = True + while exception: + try: + agent_tide_ui.agent_tide.llm.provider.validate_config(force_check_against_provider=True) + exception = None + + except (AuthenticationError, ModelError) as e: + exception = e + await cl.Message( + content=MISSING_CONFIG_MESSAGE.format( + agent_tide_config_path=os.getenv("AGENT_TIDE_CONFIG_PATH", DEFAULT_AGENT_TIDE_LLM_CONFIG_PATH), + config_file=Path(os.getenv("AGENT_TIDE_CONFIG_PATH", DEFAULT_AGENT_TIDE_LLM_CONFIG_PATH)).name, + example_config=AICORE_CONFIG_EXAMPLE + ), + elements=[ + cl.File( + name="config.yml", + # path=os.getenv("AGENT_TIDE_CONFIG_PATH", DEFAULT_AGENT_TIDE_LLM_CONFIG_PATH), + display="inline", + content=AICORE_CONFIG_EXAMPLE, + size="small" + ), + ] + ).send() + + _config_files = None + while _config_files is None: + _config_files = await cl.AskFileMessage( + content=EXCEPTION_MESSAGE.format(exception=json.dumps(exception.__dict__, indent=4)), + accept=[".yml", ".yaml"], + timeout=3600 + ).send() + + if _config_files: + _config_file = _config_files[0] + + try: + with open(_config_file.path, "r", encoding=DEFAULT_ENCODING) as _file: + config_raw = _file.read() + config_dict = yaml.safe_load(config_raw) + config = Config(**config_dict) + + agent_tide_ui.agent_tide.llm = Llm.from_config(config.llm) + agent_tide_ui.agent_tide.llm.provider.session_id = agent_tide_ui.agent_tide.session_id + + config_path = os.getenv("AGENT_TIDE_CONFIG_PATH", DEFAULT_AGENT_TIDE_LLM_CONFIG_PATH) + config_dir_path = os.path.split(config_path)[0] + if not os.path.exists(config_dir_path): + os.makedirs(config_dir_path, exist_ok=True) + + with open(config_path, "w", encoding=DEFAULT_ENCODING) as _file: + _file.write(config_raw) + + except Exception as e: + exception = e + +@cl.on_chat_start +async def start_chat(): + # TODO think of fast way to initialize and get settings + # agent_tide_ui = AgentTideUi(os.getenv("AGENT_TIDE_PROJECT_PATH", "./")) + # await agent_tide_ui.load() + # cl.user_session.set("AgentTideUi", None) + # cl.user_session.set("session_id", agent_tide_ui.agent_tide.session_id) + # await cl.ChatSettings(agent_tide_ui.settings()).send() + await cl.context.emitter.set_commands(AgentTideUi.commands) + cl.user_session.set("chat_history", []) + +@cl.set_starters +async def set_starters(): + return [cl.Starter(**kwargs) for kwargs in STARTERS] + +@cl.on_chat_resume +async def on_chat_resume(thread: ThreadDict): + history, settings, session_id = process_thread(thread) + cl.user_session.set("session_id", session_id) + cl.user_session.set("settings", settings) + cl.user_session.set("chat_history", history) + +async def loadAgentTideUi()->AgentTideUi: + agent_tide_ui: AgentTideUi = cl.user_session.get("AgentTideUi") + print(f"{agent_tide_ui=}") + if agent_tide_ui is None: + try: + agent_tide_ui = AgentTideUi( + os.getenv("AGENT_TIDE_PROJECT_PATH", "./"), + history=cl.user_session.get("chat_history"), + llm_config=cl.user_session.get("settings") + ) + await agent_tide_ui.load() + + except FileNotFoundError: + ... + + await validate_llm_config(agent_tide_ui) + + session_id = cl.user_session.get("session_id") + if session_id: + agent_tide_ui.agent_tide.llm.provider.session_id = session_id + else: + cl.user_session.set("session_id", agent_tide_ui.agent_tide.llm.provider.session_id) + + cl.user_session.set("AgentTideUi", agent_tide_ui) + + return agent_tide_ui + +@cl.action_callback("execute_steps") +async def on_execute_steps(action :cl.Action): + agent_tide_ui: AgentTideUi = cl.user_session.get("AgentTideUi") + + latest_step_message :cl.Message = cl.user_session.get("latest_step_message") + if latest_step_message and latest_step_message.id == action.payload.get("msg_id"): + await latest_step_message.remove_actions() + + if agent_tide_ui.current_step is None: + task_list = cl.TaskList("Steps") + for step in agent_tide_ui.agent_tide.steps.root: + task = cl.Task(title=step.description)#, forId=message.id) + await task_list.add_task(task) + + # Update the task list in the interface + await task_list.send() + cl.user_session.set("StepsTaskList", task_list) + + else: + task_list = cl.user_session.get("StepsTaskList") + + is_done = agent_tide_ui.increment_step() + # Optionally remove the action button from the chatbot user interface + + if is_done: + task_list.tasks[-1].status = cl.TaskStatus.DONE + await cl.sleep(3) + await task_list.remove() + await action.remove() + + # await cl.send_window_message("Finished implementing Steps") + + else: + current_task_idx = agent_tide_ui.current_step + if current_task_idx >= 1: + task_list.tasks[current_task_idx-1].status = cl.TaskStatus.DONE + + step :Step = agent_tide_ui.agent_tide.steps.root[agent_tide_ui.current_step] + + task_list.status = f"Executing step {current_task_idx}" + await task_list.send() + await action.remove() + + step_instructions_msg = await cl.Message( + content=step.as_instruction(), + author="Agent Tide" + ).send() + + await agent_loop(step_instructions_msg, codeIdentifiers=step.context_identifiers) + + task_list.status = f"Waiting feedback on step {current_task_idx}" + await task_list.send() + +@cl.action_callback("stop_steps") +async def on_stop_steps(action :cl.Action): + agent_tide_ui: AgentTideUi = cl.user_session.get("AgentTideUi") + + latest_step_message :cl.Message = cl.user_session.get("latest_step_message") + if latest_step_message and latest_step_message.id == action.payload.get("msg_id"): + await latest_step_message.remove_actions() + + task_list = cl.user_session.get("StepsTaskList") + if task_list: + agent_tide_ui.current_step = None + await task_list.remove() + + # await cl.send_window_message("Current Steps have beed discarded") + + +@cl.on_message +async def agent_loop(message: cl.Message, codeIdentifiers: Optional[list] = None): + agent_tide_ui = await loadAgentTideUi() + + chat_history = cl.user_session.get("chat_history") + + if message.command: + command_prompt = agent_tide_ui.get_command_prompt(message.command) + if command_prompt: + message.content = "\n\n---\n\n".join([command_prompt, message.content]) + + chat_history.append({"role": "user", "content": message.content}) + await agent_tide_ui.add_to_history(message.content) + + msg = cl.Message(content="", author="Agent Tide") + + async with cl.Step("ApplyPatch", type="tool") as diff_step: + await diff_step.remove() + + # Initialize the stream processor + stream_processor = StreamProcessor( + marker_configs=[ + MarkerConfig( + begin_marker="*** Begin Patch", + end_marker="*** End Patch", + start_wrapper="\n```shell\n", + end_wrapper="\n```\n", + target_step=diff_step + ), + MarkerConfig( + begin_marker="*** Begin Steps", + end_marker="*** End Steps", + start_wrapper="\n```shell\n", + end_wrapper="\n```\n", + target_step=msg + ) + ], + global_fallback_msg=msg + ) + + async for chunk in run_concurrent_tasks(agent_tide_ui, codeIdentifiers): + if chunk == STREAM_START_TOKEN: + continue + + if chunk == STREAM_END_TOKEN: + # Handle any remaining content + await stream_processor.finalize() + break + + await stream_processor.process_chunk(chunk) + + if agent_tide_ui.agent_tide.steps: + cl.user_session.set("latest_step_message", msg) + msg.actions = [ + cl.Action( + name="stop_steps", + tooltip="stop", + icon="octagon-x", + payload={"msg_id": msg.id} + ), + cl.Action( + name="execute_steps", + tooltip="Next step", + icon="fast-forward", + payload={"msg_id": msg.id} + ) + ] + + # # Send the final message + await msg.send() + + chat_history.append({"role": "assistant", "content": msg.content}) + await agent_tide_ui.add_to_history(msg.content) + +# def generate_temp_password(length=16): +# characters = string.ascii_letters + string.digits + string.punctuation +# return ''.join(secrets.choice(characters) for _ in range(length)) + +def serve( + host=None, + port=AGENT_TIDE_PORT, + root_path=None, + ssl_certfile=None, + ssl_keyfile=None, + ws_per_message_deflate="true", + ws_protocol="auto" +): + username = getpass.getuser() + GREEN = "\033[92m" + RESET = "\033[0m" + + print(f"\n{GREEN}Your chainlit username is `{username}`{RESET}\n") + + + # if not os.getenv("_PASSWORD"): + # temp_password = generate_temp_password() + # os.environ["_PASSWORD"] = temp_password + # print(f"Your temporary password is `{temp_password}`") + + if host is not None: + os.environ["CHAINLIT_HOST"] = str(host) + if port is not None: + os.environ["CHAINLIT_PORT"] = str(port) + if root_path is not None: + os.environ["CHAINLIT_ROOT_PATH"] = str(root_path) + if ssl_certfile is not None: + os.environ["CHAINLIT_SSL_CERT"] = str(ssl_certfile) + if ssl_keyfile is not None: + os.environ["CHAINLIT_SSL_KEY"] = str(ssl_keyfile) + if ws_per_message_deflate is not None: + os.environ["UVICORN_WS_PER_MESSAGE_DEFLATE"] = str(ws_per_message_deflate) + if ws_protocol is not None: + os.environ["UVICORN_WS_PROTOCOL"] = str(ws_protocol) + run_chainlit(os.path.abspath(__file__)) + + +def main(): + parser = argparse.ArgumentParser(description="Launch the Tide UI server.") + parser.add_argument("--host", type=str, default=None, help="Host to bind to") + parser.add_argument("--port", type=int, default=AGENT_TIDE_PORT, help="Port to bind to") + parser.add_argument("--root-path", type=str, default=None, help="Root path for the app") + parser.add_argument("--ssl-certfile", type=str, default=None, help="Path to SSL certificate file") + parser.add_argument("--ssl-keyfile", type=str, default=None, help="Path to SSL key file") + parser.add_argument("--ws-per-message-deflate", type=str, default="true", help="WebSocket per-message deflate (true/false)") + parser.add_argument("--ws-protocol", type=str, default="auto", help="WebSocket protocol") + parser.add_argument("--project-path", type=str, default="./", help="Path to the project directory") + parser.add_argument("--config-path", type=str, default=DEFAULT_AGENT_TIDE_LLM_CONFIG_PATH, help="Path to the config file") + args = parser.parse_args() + + os.environ["AGENT_TIDE_PROJECT_PATH"] = args.project_path + os.environ["AGENT_TIDE_CONFIG_PATH"] = args.config_path + + asyncio.run(init_db(f"{os.environ['CHAINLIT_APP_ROOT']}/database.db")) + + serve( + host=args.host, + port=args.port, + root_path=args.root_path, + ssl_certfile=args.ssl_certfile, + ssl_keyfile=args.ssl_keyfile, + ws_per_message_deflate=args.ws_per_message_deflate, + ws_protocol=args.ws_protocol, + ) + +if __name__ == "__main__": + import asyncio + os.environ["AGENT_TIDE_CONFIG_PATH"] = DEFAULT_AGENT_TIDE_LLM_CONFIG_PATH + asyncio.run(init_db(f"{os.environ['CHAINLIT_APP_ROOT']}/database.db")) + serve() + # TODO fix the no time being inserted to msg bug in data-persistance + # TODO there's a bug that changes are not being persistied in untracked files that are deleted so will need to update codetide to track that + # TODO add chainlit commands for writing tests, updating readme, writing commit message and planning + # TODO pre release, create hf orchestrator that launches temp dir, clones repo there and stores api config there + # TODO or just deactivate pre data persistance for hf release + # TODO need to test project path is working as expected... diff --git a/codetide/agents/tide/ui/chainlit.md b/codetide/agents/tide/ui/chainlit.md new file mode 100644 index 0000000..9619f3b --- /dev/null +++ b/codetide/agents/tide/ui/chainlit.md @@ -0,0 +1,177 @@ +# ![Agent Tide Logo](public/logo_dark.png) + +--- + +# Welcome to Agent Tide! πŸš€πŸ€– + +``` +β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— +β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β•β•β• β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ•‘β•šβ•β•β–ˆβ–ˆβ•”β•β•β• β•šβ•β•β–ˆβ–ˆβ•”β•β•β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β•β•β• +β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ•”β–ˆβ–ˆβ•— β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— +β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β• β–ˆβ–ˆβ•‘β•šβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β• +β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘ β•šβ–ˆβ–ˆβ–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— +β•šβ•β• β•šβ•β• β•šβ•β•β•β•β•β• β•šβ•β•β•β•β•β•β•β•šβ•β• β•šβ•β•β•β• β•šβ•β• β•šβ•β• β•šβ•β•β•šβ•β•β•β•β•β• β•šβ•β•β•β•β•β•β• +``` + +--- + +## What is Agent Tide? + +**Agent Tide** is a next-generation, precision-driven software engineering agent built on top of [CodeTide](https://github.com/BrunoV21/CodeTide). It enables you to interact directly with your local codebaseβ€”**everything is local and stays local**. No code, context, or metadata ever leaves your machine. + +Unlike most agent frameworks that rely on hidden inner logic, opaque planning, or LLMs doing everything in a single pass, Agent Tide offers a transparent, stepwise, and human-in-the-loop workflow. Think of it as "ChatGPT, but connected to your codebase"β€”with full visibility and control over every change. + +--- + +## How Does Agent Tide Work? + +1. **Direct Codebase Connection & Context Loading** + - Agent Tide uses CodeTide's fast, symbolic codebase parser to build a tree of all code identifiers (functions, classes, methods, etc.). + - When you make a request, Agent Tide analyzes it and loads only the relevant identifiers and their dependenciesβ€”retrieving just the code snippets needed for your task. + - This context loading is fast, deterministic, and fully local. + +2. **Three Modes of Operation** + - **Clarification:** If your request is ambiguous, Agent Tide will ask for more information before proceeding. + - **Direct Implementation:** For simple, clear requests, Agent Tide will immediately generate a patch to fulfill your request. + - **Planning Mode:** For complex tasks, Agent Tide enters a planning modeβ€”decomposing your request into a step-by-step plan. You can review, edit, or reorder steps before execution. + +3. **Human-in-the-Loop, Stepwise Execution** + - You always see the plan before any code is changed. You can modify steps, request clarifications, or approve the plan. + - When ready, click "Proceed to next step" to have Agent Tide implement each step sequentially. + - After each step, you can review the patch, provide feedback, or continue to the next stepβ€”**keeping you in control at all times**. + +4. **Patch-Based, Token-Efficient Editing** + - All code changes are generated as atomic, high-precision diffs (patches), not full file rewrites. + - This means you see exactly what will change, and can stop or correct the agent at any pointβ€”no waiting for a huge batch of changes to finish before intervening. + - This approach is also highly efficient for LLM token usage and latency. + +5. **Privacy & Local-First Philosophy** + - No code, context, or metadata is sent to any external service other than the selected LLM provider. + - All code analysis, context building, and patching is performed locally. + +6. **Model Compatibility** + - Agent Tide works best with GPT-4.1, Claude Sonnet 4, and Opus 4.1. + - Some models (e.g., DeepSeek Chat) may struggle with patch/diff generation. + +7. **Terminal & MCP Integration** + - Terminal access is not available yet. + - MCP (Multi-Component Patch) integration via aicore is deactivated by default in this demo, but can be enabled for more advanced use cases. + +--- + +## Why Agent Tide? + +- **Transparency:** Every step, plan, and patch is visible and editable before execution. +- **Control:** You decide when and how changes are appliedβ€”no "black box" agent behavior. +- **Precision:** Code changes are atomic, minimal, and always shown as diffs. +- **Speed:** Context loading and patching are fast, thanks to CodeTide's symbolic engine. +- **Privacy:** Your code never leaves your machine. + +--- + +## Example Things to Ask Agent Tide + +You can ask Agent Tide to perform a wide variety of code-related tasks. Here are some example prompts to get you started: + +- **Add new functionality** + - "Add a function to calculate the factorial of a number in `utils.py`." + - "Implement a REST API endpoint for user registration." + +- **Refactor or improve code** + - "Refactor the `process_data` function to improve readability and performance." + - "Rename the variable `x` to `user_id` throughout `models/user.py`." + +- **Fix bugs** + - "Fix the bug where the login form crashes on empty input." + - "Resolve the off-by-one error in the `get_page` method." + +- **Write or update tests** + - "Add unit tests for the `EmailSender` class." + - "Increase test coverage for `api/views.py`." + +- **Documentation** + - "Generate a docstring for the `parse_config` function." + - "Update the README with installation instructions." + +- **Code analysis and suggestions** + - "List all functions in `main.py` that are missing type annotations." + - "Suggest performance improvements for the `data_loader` module." + +- **Other codebase tasks** + - "Delete the deprecated `old_utils.py` file." + - "Move the `helpers` directory into `core/`." + +Feel free to be specific or general in your requests. Agent Tide will analyze your codebase and generate precise, production-ready patches to fulfill your needs! + +--- + +## Usage Tips & Advanced Workflows + +- **Direct Context Control:** + If you already know the exact code context you want Agent Tide to use, you can specify identifiers directly in your request. + Use the format: + ``` + module.submodule.file_withoutextension.object + ``` + For example: + ``` + Please update codetide.agents.tide.ui.app.agent_loop to support async. + ``` + This helps Agent Tide load only the relevant code blocks, making the process faster and more precise. + +- **Planning and Human-in-the-Loop:** + Agent Tide allows you to interact directly with your local codebaseβ€”everything is local and will stay local. + Most agent frameworks are filled with hidden logic, letting the LLM do all the planning and execution at once. + Agent Tide offers a more direct perspective: + - The first thing Agent Tide does is use the CodeTide repo tree to load identifiers related to your request, then builds context blocks with the relevant code snippets (and their dependencies). + - Once context is loaded, Agent Tide can: + 1. Ask for more information or clarification if your request is ambiguous. + 2. Start implementing changes right away if the request is simple. + 3. Enter planning mode and present you with a step-by-step plan (you can also request this explicitly: "create me a plan to do X"). + - You can edit the plan, reorder steps, or request changes until you are satisfied. + - Click "Start implementing steps" and Agent Tide will go step by step, letting you review, correct, or continue after each one. + - This keeps you in the loop and gives you direct control and visualization of every change. + - Code is generated as diffs for optimized token usage and latencyβ€”so you can intervene at any point, even if the agent is working on many files. + +- **Model and Integration Notes:** + - Agent Tide works best with GPT-4.1, Claude Sonnet 4, and Opus 4.1. + - Models like DeepSeek Chat may struggle with patch generation. + - Terminal access is available for advanced workflows. + - MCP integration (via aicore) is deactivated by default in this demo. + +--- + +## Available Slash Commands + +Agent Tide supports special commands that can be invoked directly from the chat input using a `/command` syntax. These commands provide quick access to advanced features and workflows. + +### How to Use + +Type `/command` (replace `command` with the actual command name) in the text input box and press Enter. Agent Tide will recognize and execute the command. + +### Available Commands + +1. **/test** + - **Description:** Request test implmentations for a specific element. + - **Usage:** + `/test` add coverage for apply_patch tool. + +2. **/review** + - **Description:** Request a code review for a specific file, function, or recent patch. + - **Usage:** + `/review` codetide/agents/tide/ui/app.py + +3. **/commit** + - **Description:** Generate a concise, production-ready commit message for the most recent patch or set of changes. + - **Usage:** + `/commit` the changes we just made + +You can use these commands at any time to guide Agent Tide's workflow, request reviews, or generate commit messages. More commands may be added in the futureβ€”refer to this section for updates. + +--- + +**Original repository:** [https://github.com/BrunoV21/CodeTide](https://github.com/BrunoV21/CodeTide) + +--- + +_This README was written by AgentTide!_ diff --git a/codetide/agents/tide/ui/defaults.py b/codetide/agents/tide/ui/defaults.py new file mode 100644 index 0000000..3a60a78 --- /dev/null +++ b/codetide/agents/tide/ui/defaults.py @@ -0,0 +1,74 @@ +AGENT_TIDE_PORT = 9753 + +STARTERS = [ + { + "label": "Generate Mermaid Class Diagram", + "message": ( + "Generate me a mermaid class diaram representing the repo's structure and main modules! Make it visually appealing and clean" + ), + "icon": "/public/diagram.svg" + }, + { + "label": "Implement Missing Tests", + "message": ( + "Review the project’s existing tests (if present) to understand patterns, coverage, and structure. " + "If tests already exist, enhance them by filling coverage gaps, improving clarity, and following " + "best practices for the project's tech stack. If no tests exist, come up with a plan for a full testing suite from " + "scratch, including unit tests, integration tests, and any other relevant types. Prioritize critical " + "components and ensure maintainability." + ), + "icon": "/public/test.svg" + }, + { + "label": "Create Containerized Deployment", + "message": ( + "Examine the project’s structure, dependencies, and services and come up with a detailed plan to either create new or update existing " + "Docker-related files for containerized deployment. Make sure to ask me to review your plan before moving on! If Docker configuration exists, improve it for " + "efficiency, security, and adherence to best practices (multi-stage builds, environment variables, " + "network configuration). If none exists, create optimized Dockerfile and docker-compose.yml files " + "from scratch, including configurations for any required services like databases or caches." + ), + "icon": "/public/docker.svg" + } +] + +MISSING_CONFIG_MESSAGE = """ +A valid configuration was not found at `{agent_tide_config_path}` Please provide a valid `{config_file}` by editing the following config example and uploading it below. + +```yml +{example_config} +``` +""" + +AICORE_CONFIG_EXAMPLE = """ +# learn more about the LlmConfig class at https://github.com/BrunoV21/AiCore/tree/main/config +llm: + temperature: 0 + max_tokens: 32000 + + # provider: "groq" + # api_key: "YOUR-SUPER-SCECRET-GROQ-API-KEY" + # model: "openai/gpt-oss-20b" + + provider: "openai" + api_key: "YOUR-SUPER-SCECRET-OPENAI-API-KEY" + model: "gpt-4.1" + + # provider: "anthropic" + # model: "claude-sonnet-4-20250514" + # api_key: "YOUR-SUPER-SCRET-CLAUDE-API-KEY" +""" + +EXCEPTION_MESSAGE = """ +Here is the original exception: +```json +{exception} +``` +""" + +PLACEHOLDER_LLM_CONFIG = { + "provider": "openai", + "api_key": "YOUR-SUPER-SCECRET-OPENAI-API-KEY", + "model": "gpt-4.1" +} + diff --git a/codetide/agents/tide/ui/public/agent-tide-demo.gif b/codetide/agents/tide/ui/public/agent-tide-demo.gif new file mode 100644 index 0000000..0d969d5 Binary files /dev/null and b/codetide/agents/tide/ui/public/agent-tide-demo.gif differ diff --git a/codetide/agents/tide/ui/public/avatars/agent_tide.png b/codetide/agents/tide/ui/public/avatars/agent_tide.png new file mode 100644 index 0000000..b0b6023 Binary files /dev/null and b/codetide/agents/tide/ui/public/avatars/agent_tide.png differ diff --git a/codetide/agents/tide/ui/public/codetide-banner.png b/codetide/agents/tide/ui/public/codetide-banner.png new file mode 100644 index 0000000..2e25268 Binary files /dev/null and b/codetide/agents/tide/ui/public/codetide-banner.png differ diff --git a/codetide/agents/tide/ui/public/diagram.svg b/codetide/agents/tide/ui/public/diagram.svg new file mode 100644 index 0000000..feb032c --- /dev/null +++ b/codetide/agents/tide/ui/public/diagram.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/codetide/agents/tide/ui/public/docker.svg b/codetide/agents/tide/ui/public/docker.svg new file mode 100644 index 0000000..8d09fd2 --- /dev/null +++ b/codetide/agents/tide/ui/public/docker.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/codetide/agents/tide/ui/public/favicon.ico b/codetide/agents/tide/ui/public/favicon.ico new file mode 100644 index 0000000..066f9b7 Binary files /dev/null and b/codetide/agents/tide/ui/public/favicon.ico differ diff --git a/codetide/agents/tide/ui/public/logo_dark.png b/codetide/agents/tide/ui/public/logo_dark.png new file mode 100644 index 0000000..012d383 Binary files /dev/null and b/codetide/agents/tide/ui/public/logo_dark.png differ diff --git a/codetide/agents/tide/ui/public/logo_light.png b/codetide/agents/tide/ui/public/logo_light.png new file mode 100644 index 0000000..012d383 Binary files /dev/null and b/codetide/agents/tide/ui/public/logo_light.png differ diff --git a/codetide/agents/tide/ui/public/stylesheet.css b/codetide/agents/tide/ui/public/stylesheet.css new file mode 100644 index 0000000..80b0879 --- /dev/null +++ b/codetide/agents/tide/ui/public/stylesheet.css @@ -0,0 +1,16 @@ +/* Only resize avatars where the image's alt text contains 'Avatar for Assistant' */ +span.relative.flex.shrink-0.overflow-hidden.rounded-full:has(img[alt="Avatar for Agent Tide"]) { + width: 48px !important; + height: 48px !important; +} + +span.relative.flex.shrink-0.overflow-hidden.rounded-full img[alt="Avatar for Agent Tide"] { + width: 100% !important; + height: 100% !important; + border-radius: 50% !important; /* keep them round */ +} + +img.logo.w-\[200px\] { + width: 1000px !important; + height: auto; +} \ No newline at end of file diff --git a/codetide/agents/tide/ui/public/test.svg b/codetide/agents/tide/ui/public/test.svg new file mode 100644 index 0000000..c5c76dc --- /dev/null +++ b/codetide/agents/tide/ui/public/test.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/codetide/agents/tide/ui/public/theme.json b/codetide/agents/tide/ui/public/theme.json new file mode 100644 index 0000000..8014e3f --- /dev/null +++ b/codetide/agents/tide/ui/public/theme.json @@ -0,0 +1,68 @@ +{ + "custom_fonts": [], + "variables": { + "light": { + "--font-sans": "'Inter', sans-serif", + "--font-mono": "source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace", + "--background": "210 100% 98%", + "--foreground": "217 100% 12%", + "--card": "210 100% 97%", + "--card-foreground": "217 100% 15%", + "--popover": "210 100% 97%", + "--popover-foreground": "217 100% 15%", + "--primary": "217 91% 60%", + "--primary-foreground": "0 0% 100%", + "--secondary": "210 60% 90%", + "--secondary-foreground": "217 100% 20%", + "--muted": "210 40% 85%", + "--muted-foreground": "217 20% 35%", + "--accent": "200 100% 94%", + "--accent-foreground": "217 100% 20%", + "--destructive": "0 84.2% 60.2%", + "--destructive-foreground": "210 40% 98%", + "--border": "210 40% 90%", + "--input": "210 40% 90%", + "--ring": "217 91% 60%", + "--radius": "0.75rem", + "--sidebar-background": "210 100% 97%", + "--sidebar-foreground": "217 100% 15%", + "--sidebar-primary": "217 91% 60%", + "--sidebar-primary-foreground": "0 0% 100%", + "--sidebar-accent": "210 100% 92%", + "--sidebar-accent-foreground": "217 100% 20%", + "--sidebar-border": "210 40% 88%", + "--sidebar-ring": "217 91% 60%" + }, + "dark": { + "--font-sans": "'Inter', sans-serif", + "--font-mono": "source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace", + "--background": "217 100% 8%", + "--foreground": "210 20% 90%", + "--card": "217 100% 10%", + "--card-foreground": "210 20% 95%", + "--popover": "217 100% 10%", + "--popover-foreground": "210 20% 95%", + "--primary": "199 100% 55%", + "--primary-foreground": "0 0% 100%", + "--secondary": "217 50% 18%", + "--secondary-foreground": "210 40% 95%", + "--muted": "215 30% 25%", + "--muted-foreground": "210 10% 70%", + "--accent": "217 100% 15%", + "--accent-foreground": "210 20% 95%", + "--destructive": "0 62.8% 40%", + "--destructive-foreground": "0 0% 100%", + "--border": "217 50% 20%", + "--input": "217 50% 20%", + "--ring": "199 100% 55%", + "--sidebar-background": "217 100% 6%", + "--sidebar-foreground": "210 20% 95%", + "--sidebar-primary": "217 91% 60%", + "--sidebar-primary-foreground": "0 0% 100%", + "--sidebar-accent": "217 100% 10%", + "--sidebar-accent-foreground": "210 20% 95%", + "--sidebar-border": "217 40% 20%", + "--sidebar-ring": "199 100% 55%" + } + } +} diff --git a/codetide/agents/tide/ui/stream_processor.py b/codetide/agents/tide/ui/stream_processor.py new file mode 100644 index 0000000..652afbd --- /dev/null +++ b/codetide/agents/tide/ui/stream_processor.py @@ -0,0 +1,211 @@ +from typing import Optional, List, NamedTuple +import chainlit as cl + +class MarkerConfig(NamedTuple): + """Configuration for a single marker pair.""" + begin_marker: str + end_marker: str + start_wrapper: str = "" + end_wrapper: str = "" + target_step: Optional[cl.Step] = None + fallback_msg: Optional[cl.Message] = None + +class StreamProcessor: + """ + A reusable class for processing streaming content with multiple configurable markers and wrappers. + """ + + def __init__( + self, + marker_configs: List[MarkerConfig], + global_fallback_msg: Optional[cl.Message] = None + ): + """ + Initialize the stream processor with multiple marker configurations. + + Args: + marker_configs: List of MarkerConfig objects defining different marker behaviors + global_fallback_msg: Default fallback message for content not matching any markers + """ + self.marker_configs = marker_configs + self.global_fallback_msg = global_fallback_msg + + self.buffer = "" + self.current_config = None # Currently active marker config + self.current_config_index = None + + def __init_single__( + self, + begin_marker: str, + end_marker: str, + start_wrapper: str = "", + end_wrapper: str = "", + target_step: Optional[cl.Step] = None, + fallback_msg: Optional[cl.Message] = None + ): + """ + Backward compatibility constructor for single marker configuration. + """ + config = MarkerConfig( + begin_marker=begin_marker, + end_marker=end_marker, + start_wrapper=start_wrapper, + end_wrapper=end_wrapper, + target_step=target_step, + fallback_msg=fallback_msg + ) + self.__init__([config], fallback_msg) + + async def process_chunk(self, chunk: str) -> bool: + """ + Process a chunk of streaming content. + + Args: + chunk: The content chunk to process + + Returns: + True if currently in a special block OR if buffer contains a potential partial begin_marker + """ + self.buffer += chunk + + # Process buffer until no more complete markers can be found + while True: + if self.current_config is None: + if not await self._process_outside_block(): + break + else: + if not await self._process_inside_block(): + break + + # Return True if in special block OR if buffer might contain partial begin_marker + return self.current_config is not None # or self._buffer_might_contain_partial_marker() + + def _buffer_might_contain_partial_marker(self) -> bool: + """Check if buffer might contain a partial begin marker.""" + if not self.buffer: + return False + + for config in self.marker_configs: + marker_len = len(config.begin_marker) + if len(self.buffer) < marker_len: + # Check if buffer could be start of this marker + if config.begin_marker.startswith(self.buffer): + return True + return False + + async def _process_outside_block(self) -> bool: + """ + Process buffer content when outside a special block. + + Returns: + True if processing should continue (found a marker), False otherwise + """ + # Find the earliest begin marker + earliest_idx = len(self.buffer) + earliest_config = None + earliest_config_index = None + + for i, config in enumerate(self.marker_configs): + idx = self.buffer.find(config.begin_marker) + if idx != -1 and idx < earliest_idx: + earliest_idx = idx + earliest_config = config + earliest_config_index = i + + if earliest_config is None: + # No begin marker found, stream everything except potential partial markers + max_marker_len = max(len(config.begin_marker) for config in self.marker_configs) + if len(self.buffer) >= max_marker_len: + stream_content = self.buffer[:-max_marker_len+1] + if stream_content: + fallback_msg = self._get_fallback_msg() + if fallback_msg: + await fallback_msg.stream_token(stream_content) + self.buffer = self.buffer[-max_marker_len+1:] + return False + else: + # Found begin marker + if earliest_idx > 0: + # Stream content before the marker to fallback message + fallback_msg = self._get_fallback_msg() + if fallback_msg: + await fallback_msg.stream_token(self.buffer[:earliest_idx]) + + # Start the special block + if earliest_config.target_step and earliest_config.start_wrapper: + await earliest_config.target_step.stream_token(earliest_config.start_wrapper) + + self.current_config = earliest_config + self.current_config_index = earliest_config_index + + # Remove everything up to and including the begin marker + self.buffer = self.buffer[earliest_idx + len(earliest_config.begin_marker):] + if self.buffer.startswith('\n'): + self.buffer = self.buffer[1:] + + return True + + async def _process_inside_block(self) -> bool: + """ + Process buffer content when inside a special block. + + Returns: + True if processing should continue (found end marker), False otherwise + """ + if self.current_config is None: + return False + + idx = self.buffer.find(self.current_config.end_marker) + if idx == -1: + # No end marker found, stream everything except potential partial marker + marker_len = len(self.current_config.end_marker) + if len(self.buffer) >= marker_len: + stream_content = self.buffer[:-marker_len+1] + if stream_content and self.current_config.target_step: + await self.current_config.target_step.stream_token(stream_content) + self.buffer = self.buffer[-marker_len+1:] + return False + else: + # Found end marker + if idx > 0 and self.current_config.target_step: + # Stream content before the end marker to target step + await self.current_config.target_step.stream_token(self.buffer[:idx]) + + # Close the special block + if self.current_config.target_step and self.current_config.end_wrapper: + await self.current_config.target_step.stream_token(self.current_config.end_wrapper) + + self.buffer = self.buffer[idx + len(self.current_config.end_marker):] + self.current_config = None + self.current_config_index = None + + # Remove everything up to and including the end marker + if self.buffer.startswith('\n'): + self.buffer = self.buffer[1:] + + return True + + def _get_fallback_msg(self) -> Optional[cl.Message]: + """Get the appropriate fallback message.""" + return self.global_fallback_msg + + async def finalize(self) -> None: + """ + Handle any remaining content in buffer and clean up. + """ + if self.buffer: + if self.current_config is not None: + if self.current_config.target_step: + await self.current_config.target_step.stream_token(self.buffer) + if self.current_config.end_wrapper: + await self.current_config.target_step.stream_token(self.current_config.end_wrapper) + else: + fallback_msg = self._get_fallback_msg() + if fallback_msg: + await fallback_msg.stream_token(self.buffer) + await fallback_msg.send() + + # Reset state + self.buffer = "" + self.current_config = None + self.current_config_index = None \ No newline at end of file diff --git a/codetide/agents/tide/ui/utils.py b/codetide/agents/tide/ui/utils.py new file mode 100644 index 0000000..1606800 --- /dev/null +++ b/codetide/agents/tide/ui/utils.py @@ -0,0 +1,72 @@ +from codetide.agents.tide.ui.agent_tide_ui import AgentTideUi + +from typing import List, Optional, Tuple +from chainlit.types import ThreadDict +from aicore.logger import _logger +from aicore.llm import LlmConfig +import asyncio +import orjson + +def process_thread(thread :ThreadDict)->Tuple[List[dict], Optional[LlmConfig], str]: + ### type: tool + ### if nout ouput pop + ### start = end + idx_to_pop = [] + steps = thread.get("steps") + tool_moves = [] + for i, entry in enumerate(steps): + if entry.get("type") == "tool": + if not entry.get("output"): + idx_to_pop.insert(0, i) + continue + entry["start"] = entry["end"] + tool_moves.append(i) + + for idx in idx_to_pop: + steps.pop(idx) + + # Move tool entries with output after the next non-tool entry + # Recompute tool_moves since popping may have changed indices + # We'll process from the end to avoid index shifting issues + # First, collect the indices of tool entries with output again + tool_indices = [] + for i, entry in enumerate(steps): + if entry.get("type") == "tool" and entry.get("output"): + tool_indices.append(i) + # For each tool entry, move it after the next non-tool entry + # Process from last to first to avoid index shifting + for tool_idx in reversed(tool_indices): + tool_entry = steps[tool_idx] + # Find the next non-tool entry after tool_idx + insert_idx = None + for j in range(tool_idx + 1, len(steps)): + if steps[j].get("type") != "tool": + insert_idx = j + 1 + break + if insert_idx is not None and insert_idx - 1 != tool_idx: + # Remove and insert at new position + steps.pop(tool_idx) + # If tool_idx < insert_idx, after pop, insert_idx decreases by 1 + if tool_idx < insert_idx: + insert_idx -= 1 + steps.insert(insert_idx, tool_entry) + + metadata = thread.get("metadata") + if metadata: + metadata = orjson.loads(metadata) + history = metadata.get("chat_history", []) + settings = metadata.get("chat_settings") + session_id = metadata.get("session_id") + else: + history = [] + settings = None + session_id = None + + return history, settings, session_id + +async def run_concurrent_tasks(agent_tide_ui: AgentTideUi, codeIdentifiers :Optional[List[str]]=None): + asyncio.create_task(agent_tide_ui.agent_tide.agent_loop(codeIdentifiers)) + asyncio.create_task(_logger.distribute()) + while True: + async for chunk in _logger.get_session_logs(agent_tide_ui.agent_tide.llm.session_id): + yield chunk \ No newline at end of file diff --git a/codetide/agents/tide/utils.py b/codetide/agents/tide/utils.py index b7f5522..e002da7 100644 --- a/codetide/agents/tide/utils.py +++ b/codetide/agents/tide/utils.py @@ -1,6 +1,37 @@ + from typing import List, Union +import aiofiles +import os import re +async def trim_to_patch_section(filename): + """Remove all lines before '*** Begin Patch' and after '*** End Patch'""" + lines_to_keep = [] + capturing = False + + if not os.path.exists(filename): + return + + async with aiofiles.open(filename, 'r') as f: + async for line in f: + if '*** Begin Patch' in line: + capturing = True + lines_to_keep.append(line) # Include the begin marker + elif '*** End Patch' in line: + lines_to_keep.append(line) # Include the end marker + break # Stop after end marker + elif capturing: + lines_to_keep.append(line) + + if lines_to_keep: # Write back only the lines we want to keep + async with aiofiles.open(filename, 'w') as f: + await f.writelines(lines_to_keep) + else: # Otherwise, delete the file + try: + os.remove(filename) + except FileNotFoundError: + pass + def parse_patch_blocks(text: str, multiple: bool = True) -> Union[str, List[str], None]: """ Extract content between *** Begin Patch and *** End Patch markers (inclusive), @@ -20,4 +51,44 @@ def parse_patch_blocks(text: str, multiple: bool = True) -> Union[str, List[str] if not matches: return None - return matches if multiple else matches[0] \ No newline at end of file + return matches if multiple else matches[0] + +def parse_steps_markdown(md: str): + steps = [] + + # Extract only content between *** Begin Steps and *** End Steps + match = re.search(r"\*\*\* Begin Steps(.*?)\*\*\* End Steps", md, re.DOTALL) + if not match: + return [] + + steps_block = match.group(1).strip() + + # Split steps by '---' + raw_steps = [s.strip() for s in steps_block.split('---') if s.strip()] + + for raw_step in raw_steps: + # Match step number and description + step_header = re.match(r"(\d+)\.\s+\*\*(.*?)\*\*", raw_step) + if not step_header: + continue + + step_num = int(step_header.group(1)) + description = step_header.group(2).strip() + + # Match instructions + instructions_match = re.search(r"\*\*instructions\*\*:\s*(.*?)(?=\*\*context_identifiers\*\*:)", raw_step, re.DOTALL) + instructions = instructions_match.group(1).strip() if instructions_match else "" + + # Match context identifiers + context_match = re.search(r"\*\*context_identifiers\*\*:\s*(.*)", raw_step, re.DOTALL) + context_block = context_match.group(1).strip() if context_match else "" + context_identifiers = re.findall(r"- (.+)", context_block) + + steps.append({ + "step": step_num, + "description": description, + "instructions": instructions, + "context_identifiers": context_identifiers + }) + + return steps diff --git a/codetide/autocomplete.py b/codetide/autocomplete.py index 3a8c74a..b06e118 100644 --- a/codetide/autocomplete.py +++ b/codetide/autocomplete.py @@ -133,4 +133,37 @@ def validate_code_identifier(self, code_identifier, max_suggestions=5, case_sens "code_identifier": code_identifier, "is_valid": False, "matching_identifiers": close_matches - } \ No newline at end of file + } + + def validate_paths(self, file_paths): + """ + Validate a list of file paths. For each path, check if it is valid; if not, try to match it to a valid one using autocomplete logic. + Args: + file_paths (list of str): List of file paths to validate. + Returns: + list of str: List of valid file paths (matched or original). + Raises: + ValueError: If a path cannot be matched to a valid entry. + """ + import os + valid_paths = [] + valid_set = set(self.words) + for path in file_paths: + # Direct match + if path in valid_set: + valid_paths.append(path) + continue + # Try normalization: replace '.' with os.sep, strip leading/trailing spaces + normalized = path.replace('.', os.sep).replace('\\', os.sep).replace('/', os.sep).strip() + # Try to match normalized path + if normalized in valid_set: + valid_paths.append(normalized) + continue + + # Try to find close matches using autocomplete logic + suggestions = [] + if hasattr(self, "get_fuzzy_suggestions"): + suggestions = self.get_fuzzy_suggestions(path, 1) + if not suggestions: + raise ValueError(f"Invalid file path: '{path}'") + return valid_paths \ No newline at end of file diff --git a/codetide/cli.py b/codetide/cli.py index 516c64f..1efc68c 100644 --- a/codetide/cli.py +++ b/codetide/cli.py @@ -1,4 +1,4 @@ -from codetide.core.defaults import DEFAULT_SERIALIZATION_PATH +from codetide.core.defaults import DEFAULT_SERIALIZATION_PATH, DEFAULT_ENCODING from codetide import CodeTide from pathlib import Path @@ -14,8 +14,8 @@ def safe_print(string :str): try: # Try with UTF-8 encoding import sys - if sys.stdout.encoding != 'utf-8': - sys.stdout.reconfigure(encoding='utf-8') # Python 3.7+ + if sys.stdout.encoding != DEFAULT_ENCODING: + sys.stdout.reconfigure(encoding=DEFAULT_ENCODING) # Python 3.7+ print(string) except Exception: # Fallback to ASCII-safe output diff --git a/codetide/core/codegraph.py b/codetide/core/codegraph.py new file mode 100644 index 0000000..f552ad4 --- /dev/null +++ b/codetide/core/codegraph.py @@ -0,0 +1,85 @@ +from .models import CodeBase + +# --- CodeBaseGraph: Project Structure Graph Representation --- +class CodeBaseGraph: + """ + Represents a graph of the codebase, with nodes for classes, functions, and files, + and edges for inheritance, usage, and import relationships. + + Example usage: + codebase = ... # Assume you have a CodeBase object + graph = CodeBaseGraph(codebase) + mermaid_diagram = graph.to_mermaid() + print(mermaid_diagram) + """ + def __init__(self, codebase :CodeBase): + self.codebase = codebase + self.nodes = {} # key: unique_id, value: element (class/function/file) + self.edges = { + "inheritance": set(), # (child_unique_id, parent_unique_id) + "usage": set(), # (from_unique_id, to_unique_id) + "import": set(), # (from_file_unique_id, to_file_unique_id) + } + self._build_graph() + + def _build_graph(self): + # Build nodes for all classes, functions, and files + for code_file in self.codebase.root: + file_uid = code_file.file_path + self.nodes[file_uid] = code_file + # Classes + for class_def in code_file.classes: + self.nodes[class_def.unique_id] = class_def + # Inheritance edges + for base_ref in getattr(class_def, "bases_references", []): + if base_ref.unique_id: + self.edges["inheritance"].add((class_def.unique_id, base_ref.unique_id)) + # Usage edges (attributes and methods) + for ref in getattr(class_def, "references", []): + if ref.unique_id: + self.edges["usage"].add((class_def.unique_id, ref.unique_id)) + # Functions + for func_def in code_file.functions: + self.nodes[func_def.unique_id] = func_def + for ref in getattr(func_def, "references", []): + if ref.unique_id: + self.edges["usage"].add((func_def.unique_id, ref.unique_id)) + # Imports (file-level) + for import_stmt in code_file.imports: + if import_stmt.source: + self.edges["import"].add((file_uid, import_stmt.source)) + + def to_mermaid(self): + """ + Render the graph as a Mermaid class diagram. + Includes class definitions, inheritance, and usage relationships. + """ + lines = ["classDiagram"] + # Add class nodes + for node_id, node in self.nodes.items(): + if hasattr(node, "name") and hasattr(node, "attributes") and hasattr(node, "methods"): + class_name = node.name + attr_lines = [] + for attr in getattr(node, "attributes", []): + attr_lines.append(f" +{attr.name}") + for method in getattr(node, "methods", []): + attr_lines.append(f" +{method.name}()") + if attr_lines: + lines.append(f"class {class_name} {{") + lines.extend(attr_lines) + lines.append("}") + else: + lines.append(f"class {class_name}") + # Add inheritance edges + for from_id, to_id in self.edges["inheritance"]: + from_node = self.nodes.get(from_id) + to_node = self.nodes.get(to_id) + if from_node and to_node and hasattr(from_node, "name") and hasattr(to_node, "name"): + lines.append(f"{from_node.name} <|-- {to_node.name}") + # Add usage edges + for from_id, to_id in self.edges["usage"]: + from_node = self.nodes.get(from_id) + to_node = self.nodes.get(to_id) + if from_node and to_node and hasattr(from_node, "name") and hasattr(to_node, "name"): + lines.append(f"{from_node.name} ..> {to_node.name}") + return "\n".join(lines) \ No newline at end of file diff --git a/codetide/core/common.py b/codetide/core/common.py index 2d5481b..4d38be7 100644 --- a/codetide/core/common.py +++ b/codetide/core/common.py @@ -2,9 +2,15 @@ from typing import Union from pathlib import Path -def readFile(path :Union[str, Path], mode :str="r")->str: - with open(path, mode, encoding=DEFAULT_ENCODING if mode != "rb" else None) as _file: - contents = _file.read() +def readFile(path :Union[str, Path], mode :str="r", skip_errors :bool=False)->str: + try: + with open(path, mode, encoding=DEFAULT_ENCODING if mode != "rb" else None) as _file: + contents = _file.read() + except Exception as e: + if skip_errors: + return "" + raise e + return contents def writeFile(contents: Union[str, bytes], path: Union[str, Path], mode: str = "w"): diff --git a/codetide/core/defaults.py b/codetide/core/defaults.py index f1f4e60..49bc901 100644 --- a/codetide/core/defaults.py +++ b/codetide/core/defaults.py @@ -45,12 +45,45 @@ } +SKIP_EXTENSIONS = [ + # Images + '.png', '.jpg', '.jpeg', '.gif', '.bmp', '.tiff', '.tif', '.webp', '.heic', '.heif', + '.ico', '.icns', '.psd', '.ai', '.eps', + + # Audio + '.mp3', '.wav', '.flac', '.aac', '.ogg', '.m4a', '.wma', '.aiff', + + # Video + '.mp4', '.mkv', '.mov', '.avi', '.wmv', '.flv', '.webm', '.mpeg', '.mpg', '.3gp', + + # Fonts + '.ttf', '.otf', '.woff', '.woff2', '.eot', + + # Archives & Compressed + '.zip', '.tar', '.gz', '.bz2', '.xz', '.rar', '.7z', '.iso', '.dmg', + + # Database & Data Dumps + '.db', '.sqlite', '.sqlite3', '.mdb', '.accdb', '.dbf', + '.frm', '.myd', '.myi', '.ndf', '.ldf', + + # System / OS junk + '.sys', '.dll', '.exe', '.bin', '.msi', '.obj', '.o', '.so', '.dylib', '.class', + '.lock', '.tmp', '.log', '.bak', '.swp', '.swo', '.DS_Store', 'Thumbs.db', + + # 3D / CAD + '.stl', '.obj', '.fbx', '.blend', '.dae', '.3ds', + + # Other binary documents + '.pdf', '.doc', '.docx', '.ppt', '.pptx', '.xls', '.xlsx', '.odt', '.ods', '.odp' +] + DEFAULT_MAX_CONCURRENT_TASKS = 50 DEFAULT_BATCH_SIZE = 128 -DEFAULT_ENCODING = "utf8" +DEFAULT_ENCODING = "utf-8" DEFAULT_SERIALIZATION_PATH = "./storage/tide.json" +DEFAULT_STORAGE_PATH = Path("./storage") DEFAULT_CACHED_ELEMENTS_FILE = "cached_elements.json" DEFAULT_CACHED_IDS_FILE = "cached_ids.json" diff --git a/codetide/core/mermaid.py b/codetide/core/mermaid.py deleted file mode 100644 index 771572c..0000000 --- a/codetide/core/mermaid.py +++ /dev/null @@ -1,119 +0,0 @@ -from .models import CodeBase -import ulid - -def to_mermaid_boxy_flowchart(codebase: CodeBase, include_modules: bool = False, include_types: bool = False) -> str: - tree_dict = codebase._build_tree_dict() - lines = ["flowchart TB"] - _render_mermaid_node(tree_dict, lines, indent=1, include_modules=include_modules, include_types=include_types) - return "\n".join(lines) - - -def _render_mermaid_node(node: dict, lines: list, indent: int, include_modules: bool, include_types: bool): - indent_str = " " * indent - items = [(k, v) for k, v in node.items() if not k.startswith("_")] - items.sort(key=lambda x: (x[1].get("_type", "directory") == "file", x[0])) - - for name, data in items: - node_id = _safe_mermaid_id(name) - if data.get("_type") == "file": - code_file = data["_data"] - lines.append(f'{indent_str}subgraph {node_id}["{name}"]') - if include_modules: - _render_file_contents(code_file, lines, indent + 1, include_types) - lines.append(f'{indent_str}end') - elif data.get("_type") == "directory": - lines.append(f'{indent_str}subgraph {node_id}["{name}/"]') - _render_mermaid_node(data, lines, indent + 1, include_modules, include_types) - lines.append(f'{indent_str}end') - - -def _render_file_contents(code_file, lines: list, indent: int, include_types: bool): - indent_str = " " * indent - - # Add variables - for variable in code_file.variables: - label = variable.name - style = "fill:#FFFBCC" - node_id = _safe_mermaid_id(f"var_{code_file.file_path}_{label}") - lines.append(f'{indent_str}{node_id}["{label}"]') - lines.append(f'style {node_id} {style}') - - # Add functions - for function in code_file.functions: - label = function.name - style = "fill:#D6EFFF" - node_id = _safe_mermaid_id(f"func_{code_file.file_path}_{label}") - lines.append(f'{indent_str}{node_id}["{label}()"]') - lines.append(f'style {node_id} {style}') - - # Add classes and their contents - for class_def in code_file.classes: - class_label = class_def.name - class_node_id = _safe_mermaid_id(f"class_{code_file.file_path}_{class_label}") - lines.append(f'{indent_str}subgraph {class_node_id}["{class_label}"]') - _render_class_contents(class_def, lines, indent + 1) - lines.append(f'{indent_str}end') - - -def _render_class_contents(class_def, lines: list, indent: int): - indent_str = " " * indent - - for attr in class_def.attributes: - label = attr.name - node_id = _safe_mermaid_id(f"attr_{class_def.name}_{label}") - lines.append(f'{indent_str}{node_id}["{label}"]') - lines.append(f'style {node_id} fill:#E8F5E9') - - for method in class_def.methods: - label = method.name - node_id = _safe_mermaid_id(f"method_{class_def.name}_{label}") - lines.append(f'{indent_str}{node_id}["{label}()"]') - lines.append(f'style {node_id} fill:#F3E5F5') - - -def _safe_mermaid_id(label: str) -> str: - return ulid.ulid() + label.replace(" ", "_").replace("-", "_").replace(".", "_").replace("/", "_").replace("\\", "_") - - -def save_mermaid_to_html_file(mermaid_code: str, output_path: str = "diagram.html", title: str = "CodeBase Diagram"): - """ - Save a Mermaid diagram as a standalone HTML file. - - Args: - mermaid_code (str): The Mermaid code to embed. - output_path (str): Path to save the HTML file. - title (str): Optional title for the page. - """ - html_content = f""" - - - - {title} - - - - -

{title}

-
-{mermaid_code} -
- -""" - - with open(output_path, "w", encoding="utf-8") as f: - f.write(html_content) - print(f"βœ… Mermaid diagram saved to: {output_path}") diff --git a/codetide/mcp/tools/apply_patch.py b/codetide/mcp/tools/apply_patch.py index 8ba72f5..977c183 100644 --- a/codetide/mcp/tools/apply_patch.py +++ b/codetide/mcp/tools/apply_patch.py @@ -170,11 +170,10 @@ def run(): * Always match formatting, indentation, and block structure precisely. """ - patch_path = f"./storage/{ulid()}.txt" + patch_path = f"./storage/{ulid()}.txt" + writeFile(patch_text, patch_path) try: - patch_text = patch_text.replace("\'", "'") - patch_text = patch_text.replace('\"', '"') - result = process_patch(patch_text, open_file, write_file, remove_file, file_exists) + result = process_patch(patch_path, open_file, write_file, remove_file, file_exists) _ = await initCodeTide() except DiffError as exc: @@ -189,8 +188,4 @@ def run(): result = f"An unexpected error occurred: {exc}" raise exc - finally: - if "exc" in locals(): - writeFile(patch_text, patch_path) - return result \ No newline at end of file diff --git a/codetide/mcp/tools/patch_code/__init__.py b/codetide/mcp/tools/patch_code/__init__.py index 4a60f35..ccc70ef 100644 --- a/codetide/mcp/tools/patch_code/__init__.py +++ b/codetide/mcp/tools/patch_code/__init__.py @@ -1,39 +1,41 @@ from .models import DiffError, Patch, Commit, ActionType +from ....core.defaults import DEFAULT_ENCODING from .parser import Parser, patch_to_commit +# from ....core.common import writeFile from typing import Dict, Tuple, List, Callable import pathlib -import re import os -BREAKLINE_TOKEN = "" - -BREAKLINE_PER_FILE_TYPE = { - ".md": "\n", - ".py": r"\n" -} - # --------------------------------------------------------------------------- # # User-facing API # --------------------------------------------------------------------------- # def text_to_patch(text: str, orig: Dict[str, str]) -> Tuple[Patch, int]: - """High-level function to parse patch text against original file content.""" + """Improved version with better splitlines handling.""" lines = text.splitlines() + for i, line in enumerate(lines): if line.startswith(("@", "***")): - if line.startswith("@@") and lines[i+1].startswith("+"): + if line.startswith("@@") and i + 1 < len(lines) and lines[i+1].startswith("+"): lines.insert(i+1, line.replace("@@", "")) + elif line.startswith("@") and not line.startswith("@@"): + lines[i] = f" {line}" continue - elif (line.startswith("---") and len(line)==3) or not line.startswith(("+", "-", " ")): + elif (line.startswith("---") and len(line) == 3) or not line.startswith(("+", "-", " ")): + lines[i] = f" {line}" + + elif line.startswith(("+", "-")) and i + 1 < len(lines) and lines[i+1].startswith(" "): lines[i] = f" {line}" - # print(f"\n\n{lines[-2:]=}") + # Debug output + # writeFile("\n".join(lines), "lines_processed.txt") + # writeFile("\n".join(list(orig.values())), "lines_orig.txt") if not lines or not Parser._norm(lines[0]).startswith("*** Begin Patch"): - raise DiffError("Invalid patch text - must start with '*** Begin Patch'.") - if not Parser._norm(lines[-1]) == "*** End Patch": - raise DiffError("Invalid patch text - must end with '*** End Patch'.") + raise DiffError(f"Invalid patch text - must start with '*** Begin Patch'. Found: '{lines[0] if lines else 'empty'}'") + if not lines or not Parser._norm(lines[-1]) == "*** End Patch": + raise DiffError(f"Invalid patch text - must end with '*** End Patch'. Found: '{lines[-1] if lines else 'empty'}'") parser = Parser(current_files=orig, lines=lines, index=1) parser.parse() @@ -101,70 +103,20 @@ def apply_commit( if change.move_path and target_path != path: remove_fn(path) -def replace_newline_in_quotes(text, token=BREAKLINE_TOKEN): - """ - Replace newlines with a special token only within single/double quoted strings, - but NOT within triple-quoted strings. - """ - - # First, let's handle triple-quoted strings by temporarily replacing them - # with placeholders to avoid processing them - triple_quote_placeholders = [] - - # Find all triple-quoted strings (both ''' and """) - triple_pattern = r'(""".*?"""|\'\'\'.*?\'\'\')' - - def store_triple_quote(match): - placeholder = f"__TRIPLE_QUOTE_{len(triple_quote_placeholders)}__" - triple_quote_placeholders.append(match.group(1)) - return placeholder - - # Temporarily replace triple quotes with placeholders - text_with_placeholders = re.sub(triple_pattern, store_triple_quote, text, flags=re.DOTALL) - - # Now process single/double quoted strings (excluding triple quotes) - pattern = r''' - (['"]) # Group 1: single or double quote (opening) - ( # Group 2: content inside the quote - (?: # non-capturing group - \\\1 # escaped quote like \' or \" - | # or - (?!\1). # any char that's not the same quote - )*? - ) - \1 # Closing quote, must match opening - (?!\1{2}) # Negative lookahead: ensure it's not followed by two more of same quote (triple quote) - ''' - - def replacer(match): - quote = match.group(1) - content = match.group(2) - # Replace both literal \n and actual newlines - replaced = content.replace(r'\n', token).replace('\n', token) - return f'{quote}{replaced}{quote}' - - # Apply the replacement to single/double quoted strings only - result = re.sub(pattern, replacer, text_with_placeholders, flags=re.VERBOSE | re.DOTALL) - - # Restore the triple-quoted strings - for i, triple_quote in enumerate(triple_quote_placeholders): - placeholder = f"__TRIPLE_QUOTE_{i}__" - result = result.replace(placeholder, triple_quote) - - return result - def process_patch( - text: str, + patch_path: str, open_fn: Callable[[str], str], write_fn: Callable[[str, str], None], remove_fn: Callable[[str], None], exists_fn: Callable[[str], bool] ) -> str: """The main entrypoint function to process a patch from text to filesystem.""" - if not text.strip(): - raise DiffError("Patch text is empty.") + if not os.path.exists(patch_path): + raise DiffError("Patch path {patch_path} does not exist.") + + # Normalize line endings before processing + text = open_fn(patch_path) - text = replace_newline_in_quotes(text) # FIX: Check for existence of files to be added before parsing. paths_to_add = identify_files_added(text) for p in paths_to_add: @@ -172,29 +124,33 @@ def process_patch( raise DiffError(f"Add File Error - file already exists: {p}") paths_needed = identify_files_needed(text) - orig_files = load_files(paths_needed, open_fn) + + # Load files with normalized line endings + orig_files = {} + for path in paths_needed: + orig_files[path] = open_fn(path) patch, _fuzz = text_to_patch(text, orig_files) commit = patch_to_commit(patch, orig_files) apply_commit(commit, write_fn, remove_fn, exists_fn) + + remove_fn(patch_path) return "Patch applied successfully." # --------------------------------------------------------------------------- # # Default FS wrappers # --------------------------------------------------------------------------- # -def open_file(path: str) -> str: - with open(path, "rt", encoding="utf-8") as fh: - return replace_newline_in_quotes(fh.read()) - +def open_file(path: str) -> str: + _, ext = os.path.splitext(path) + with open(path, "rt", encoding=DEFAULT_ENCODING) as fh: + return fh.read() def write_file(path: str, content: str) -> None: target = pathlib.Path(path) target.parent.mkdir(parents=True, exist_ok=True) - _, ext = os.path.splitext(target) - with target.open("wt", encoding="utf-8", newline="\n") as fh: - fh.write(content.replace(BREAKLINE_TOKEN, BREAKLINE_PER_FILE_TYPE.get(ext, r"\n"))) - + with target.open("wt", encoding=DEFAULT_ENCODING, newline="\n") as fh: + fh.write(content) def remove_file(path: str) -> None: p = pathlib.Path(path) diff --git a/codetide/mcp/tools/patch_code/parser.py b/codetide/mcp/tools/patch_code/parser.py index 8cf0528..bf81f89 100644 --- a/codetide/mcp/tools/patch_code/parser.py +++ b/codetide/mcp/tools/patch_code/parser.py @@ -336,10 +336,14 @@ def _parse_update_file(self, text: str, path_for_error: str) -> PatchAction: new_index, fuzz = find_context(orig_lines, next_ctx, search_start_idx, eof) if new_index == -1: - ctx_txt = "\n".join(next_ctx) - raise DiffError( - f"In file '{path_for_error}', could not find context block:\n---\n{ctx_txt}\n---" - ) + ## try again across the whole file + new_index, fuzz = find_context(orig_lines, next_ctx, 0, eof) + + if new_index == -1: + ctx_txt = "\n".join(next_ctx) + raise DiffError( + f"In file '{path_for_error}', could not find context block:\n---\n{ctx_txt}\n---" + ) self.fuzz += fuzz for ch in chunks: diff --git a/codetide/mcp/utils.py b/codetide/mcp/utils.py index ae46f22..8082627 100644 --- a/codetide/mcp/utils.py +++ b/codetide/mcp/utils.py @@ -1,4 +1,4 @@ -from ..core.defaults import DEFAULT_SERIALIZATION_PATH +from ..core.defaults import DEFAULT_ENCODING, DEFAULT_SERIALIZATION_PATH from codetide import CodeTide from typing import Optional @@ -25,8 +25,8 @@ def safe_print(string :str): try: # Try with UTF-8 encoding import sys - if sys.stdout.encoding != 'utf-8': - sys.stdout.reconfigure(encoding='utf-8') # Python 3.7+ + if sys.stdout.encoding != DEFAULT_ENCODING: + sys.stdout.reconfigure(encoding=DEFAULT_ENCODING) # Python 3.7+ print(string) except Exception: # Fallback to ASCII-safe output diff --git a/codetide/parsers/python_parser.py b/codetide/parsers/python_parser.py index df3f47c..95e8702 100644 --- a/codetide/parsers/python_parser.py +++ b/codetide/parsers/python_parser.py @@ -1,3 +1,4 @@ +from ..core.defaults import DEFAULT_ENCODING from .base_parser import BaseParser from ..core.common import readFile from ..core.models import ( @@ -90,7 +91,7 @@ def init_tree_parser(self) -> "PythonParser": @staticmethod def _get_content(code: bytes, node: Node, preserve_indentation: bool = False) -> str: if not preserve_indentation: - return code[node.start_byte:node.end_byte].decode('utf-8') + return code[node.start_byte:node.end_byte].decode(DEFAULT_ENCODING) if preserve_indentation: # Go back to the start of the line to include indentation @@ -98,7 +99,7 @@ def _get_content(code: bytes, node: Node, preserve_indentation: bool = False) -> while line_start > 0 and code[line_start - 1] not in (10, 13): line_start -= 1 - return code[line_start:node.end_byte].decode('utf-8') + return code[line_start:node.end_byte].decode(DEFAULT_ENCODING) @staticmethod @@ -150,6 +151,8 @@ def _process_node(cls, node: Node, code: bytes, codeFile :CodeFileModel): cls._process_function_definition(child, code, codeFile) elif child.type == "expression_statement": cls._process_expression_statement(child, code, codeFile) + else: + cls._process_node(child, code, codeFile) # elif child.type == "assignment": # <- class attribute # cls._process_assignment(child, code, codeFile) diff --git a/codetide/parsers/typescript_parser.py b/codetide/parsers/typescript_parser.py index 2fa7faf..a362689 100644 --- a/codetide/parsers/typescript_parser.py +++ b/codetide/parsers/typescript_parser.py @@ -1,3 +1,4 @@ +from ..core.defaults import DEFAULT_ENCODING from .base_parser import BaseParser from ..core.common import readFile from ..core.models import ( @@ -66,11 +67,11 @@ def init_tree_parser(self) -> "TypeScriptParser": @staticmethod def _get_content(code: bytes, node: Node, preserve_indentation: bool = False) -> str: if not preserve_indentation: - return code[node.start_byte:node.end_byte].decode('utf-8') + return code[node.start_byte:node.end_byte].decode(DEFAULT_ENCODING) line_start = node.start_byte while line_start > 0 and code[line_start - 1] not in (10, 13): line_start -= 1 - return code[line_start:node.end_byte].decode('utf-8') + return code[line_start:node.end_byte].decode(DEFAULT_ENCODING) @staticmethod def _skip_init_paths(file_path: Path) -> str: @@ -167,6 +168,8 @@ def _process_node(cls, node: Node, code: bytes, codeFile: CodeFileModel): cls._process_class_node(child, code, codeFile, "interface") elif child.type == "type_alias_declaration": cls._process_class_node(child, code, codeFile, "type") + else: + cls._process_node(child, code, codeFile) @classmethod def _process_import_clause_node(cls, node: Node, code: bytes) -> Tuple[List[str], List[Optional[str]]]: diff --git a/examples/hf_demo_space/.chainlit/config.toml b/examples/hf_demo_space/.chainlit/config.toml new file mode 100644 index 0000000..cfe4afc --- /dev/null +++ b/examples/hf_demo_space/.chainlit/config.toml @@ -0,0 +1,88 @@ +[project] +# Whether to enable telemetry (default: true). No personal data is collected. +enable_telemetry = true + + +# List of environment variables to be provided by each user to use the app. +user_env = [] + +# Duration (in seconds) during which the session is saved when the connection is lost +session_timeout = 3600 + +# Duration (in seconds) of the user session expiry +user_session_timeout = 1296000 # 15 days + +# Enable third parties caching (e.g LangChain cache) +cache = false + +# Authorized origins +allow_origins = ["*"] + +[features] +# Process and display HTML in messages. This can be a security risk (see https://stackoverflow.com/questions/19603097/why-is-it-dangerous-to-render-user-generated-html-or-javascript) +unsafe_allow_html = false + +# Process and display mathematical expressions. This can clash with "$" characters in messages. +latex = false + +# Automatically tag threads with the current chat profile (if a chat profile is used) +auto_tag_thread = true + +# Allow users to edit their own messages +edit_message = true + +# Authorize users to spontaneously upload files with messages +[features.spontaneous_file_upload] + enabled = false + # Define accepted file types using MIME types + # Examples: + # 1. For specific file types: + # accept = ["image/jpeg", "image/png", "application/pdf"] + # 2. For all files of certain type: + # accept = ["image/*", "audio/*", "video/*"] + # 3. For specific file extensions: + # accept = { "application/octet-stream" = [".xyz", ".pdb"] } + # Note: Using "*/*" is not recommended as it may cause browser warnings + accept = ["*/*"] + max_files = 20 + max_size_mb = 500 + +[features.audio] + # Sample rate of the audio + sample_rate = 24000 + +[UI] +# Name of the assistant. +name = "Agent Tide" + +# default_theme = "dark" + +layout = "wide" + +# Description of the assistant. This is used for HTML tags. +# description = "" + +# Chain of Thought (CoT) display mode. Can be "hidden", "tool_call" or "full". +cot = "tool_call" + +# Link to your github repo. This will add a github button in the UI's header. +github = "https://github.com/BrunoV21/CodeTide" + +# Specify a CSS file that can be used to customize the user interface. +# The CSS file can be served from the public directory or via an external link. +custom_css = '/public/stylesheet.css' + +# Specify a Javascript file that can be used to customize the user interface. +# The Javascript file can be served from the public directory. +# custom_js = "/public/test.js" + +# Specify a custom meta image url. +custom_meta_image_url = "https://github.com/BrunoV21/CodeTide/blob/09a2f958a8ecec0e2e61f03bc5397a0457ac61fc/docs/assets/codetide-logo.png" + +# Specify a custom build directory for the frontend. +# This can be used to customize the frontend code. +# Be careful: If this is a relative path, it should not start with a slash. +# custom_build = "./public/build" + +[meta] +generated_by = "2.1.0" diff --git a/examples/hf_demo_space/.chainlit/translations/bn.json b/examples/hf_demo_space/.chainlit/translations/bn.json new file mode 100644 index 0000000..36c8676 --- /dev/null +++ b/examples/hf_demo_space/.chainlit/translations/bn.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "\u09ac\u09be\u09a4\u09bf\u09b2 \u0995\u09b0\u09c1\u09a8", + "confirm": "\u09a8\u09bf\u09b6\u09cd\u099a\u09bf\u09a4 \u0995\u09b0\u09c1\u09a8", + "continue": "\u099a\u09be\u09b2\u09bf\u09af\u09bc\u09c7 \u09af\u09be\u09a8", + "goBack": "\u09aa\u09bf\u099b\u09a8\u09c7 \u09af\u09be\u09a8", + "reset": "\u09b0\u09bf\u09b8\u09c7\u099f \u0995\u09b0\u09c1\u09a8", + "submit": "\u099c\u09ae\u09be \u09a6\u09bf\u09a8" + }, + "status": { + "loading": "\u09b2\u09cb\u09a1 \u09b9\u099a\u09cd\u099b\u09c7...", + "error": { + "default": "\u098f\u0995\u099f\u09bf \u09a4\u09cd\u09b0\u09c1\u099f\u09bf \u0998\u099f\u09c7\u099b\u09c7", + "serverConnection": "\u09b8\u09be\u09b0\u09cd\u09ad\u09be\u09b0\u09c7\u09b0 \u09b8\u09be\u09a5\u09c7 \u09b8\u0982\u09af\u09cb\u0997 \u0995\u09b0\u09be \u09af\u09be\u099a\u09cd\u099b\u09c7 \u09a8\u09be" + } + } + }, + "auth": { + "login": { + "title": "\u0985\u09cd\u09af\u09be\u09aa\u09cd\u09b2\u09bf\u0995\u09c7\u09b6\u09a8 \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09a4\u09c7 \u09b2\u0997\u0987\u09a8 \u0995\u09b0\u09c1\u09a8", + "form": { + "email": { + "label": "\u0987\u09ae\u09c7\u0987\u09b2 \u09a0\u09bf\u0995\u09be\u09a8\u09be", + "required": "\u0987\u09ae\u09c7\u0987\u09b2 \u098f\u0995\u099f\u09bf \u0986\u09ac\u09b6\u09cd\u09af\u0995 \u0995\u09cd\u09b7\u09c7\u09a4\u09cd\u09b0" + }, + "password": { + "label": "\u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1", + "required": "\u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1 \u098f\u0995\u099f\u09bf \u0986\u09ac\u09b6\u09cd\u09af\u0995 \u0995\u09cd\u09b7\u09c7\u09a4\u09cd\u09b0" + }, + "actions": { + "signin": "\u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09c1\u09a8" + }, + "alternativeText": { + "or": "\u0985\u09a5\u09ac\u09be" + } + }, + "errors": { + "default": "\u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be \u09b8\u09ae\u09cd\u09ad\u09ac \u09b9\u099a\u09cd\u099b\u09c7 \u09a8\u09be", + "signin": "\u0985\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8", + "oauthSignin": "\u0985\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8", + "redirectUriMismatch": "\u09b0\u09bf\u09a1\u09be\u0987\u09b0\u09c7\u0995\u09cd\u099f URI \u0993\u0986\u09a5 \u0985\u09cd\u09af\u09be\u09aa \u0995\u09a8\u09ab\u09bf\u0997\u09be\u09b0\u09c7\u09b6\u09a8\u09c7\u09b0 \u09b8\u09be\u09a5\u09c7 \u09ae\u09bf\u09b2\u099b\u09c7 \u09a8\u09be", + "oauthCallback": "\u0985\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8", + "oauthCreateAccount": "\u0985\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8", + "emailCreateAccount": "\u0985\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8", + "callback": "\u0985\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8", + "oauthAccountNotLinked": "\u0986\u09aa\u09a8\u09be\u09b0 \u09aa\u09b0\u09bf\u099a\u09af\u09bc \u09a8\u09bf\u09b6\u09cd\u099a\u09bf\u09a4 \u0995\u09b0\u09a4\u09c7, \u0986\u09aa\u09a8\u09bf \u09af\u09c7 \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f\u099f\u09bf \u09ae\u09c2\u09b2\u09a4 \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09c7\u099b\u09bf\u09b2\u09c7\u09a8 \u09b8\u09c7\u099f\u09bf \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09c1\u09a8", + "emailSignin": "\u0987\u09ae\u09c7\u0987\u09b2 \u09aa\u09be\u09a0\u09be\u09a8\u09cb \u09af\u09be\u09af\u09bc\u09a8\u09bf", + "emailVerify": "\u0985\u09a8\u09c1\u0997\u09cd\u09b0\u09b9 \u0995\u09b0\u09c7 \u0986\u09aa\u09a8\u09be\u09b0 \u0987\u09ae\u09c7\u0987\u09b2 \u09af\u09be\u099a\u09be\u0987 \u0995\u09b0\u09c1\u09a8, \u098f\u0995\u099f\u09bf \u09a8\u09a4\u09c1\u09a8 \u0987\u09ae\u09c7\u0987\u09b2 \u09aa\u09be\u09a0\u09be\u09a8\u09cb \u09b9\u09af\u09bc\u09c7\u099b\u09c7", + "credentialsSignin": "\u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u09ac\u09cd\u09af\u09b0\u09cd\u09a5 \u09b9\u09af\u09bc\u09c7\u099b\u09c7\u0964 \u0986\u09aa\u09a8\u09be\u09b0 \u09a6\u09c7\u0993\u09af\u09bc\u09be \u09a4\u09a5\u09cd\u09af \u09b8\u09a0\u09bf\u0995 \u0995\u09bf\u09a8\u09be \u09af\u09be\u099a\u09be\u0987 \u0995\u09b0\u09c1\u09a8", + "sessionRequired": "\u098f\u0987 \u09aa\u09c3\u09b7\u09cd\u09a0\u09be \u09a6\u09c7\u0996\u09a4\u09c7 \u0985\u09a8\u09c1\u0997\u09cd\u09b0\u09b9 \u0995\u09b0\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09c1\u09a8" + } + }, + "provider": { + "continue": "{{provider}} \u09a6\u09bf\u09af\u09bc\u09c7 \u099a\u09be\u09b2\u09bf\u09af\u09bc\u09c7 \u09af\u09be\u09a8" + } + }, + "chat": { + "input": { + "placeholder": "\u0986\u09aa\u09a8\u09be\u09b0 \u09ac\u09be\u09b0\u09cd\u09a4\u09be \u098f\u0996\u09be\u09a8\u09c7 \u099f\u09be\u0987\u09aa \u0995\u09b0\u09c1\u09a8...", + "actions": { + "send": "\u09ac\u09be\u09b0\u09cd\u09a4\u09be \u09aa\u09be\u09a0\u09be\u09a8", + "stop": "\u0995\u09be\u099c \u09ac\u09a8\u09cd\u09a7 \u0995\u09b0\u09c1\u09a8", + "attachFiles": "\u09ab\u09be\u0987\u09b2 \u09b8\u0982\u09af\u09c1\u0995\u09cd\u09a4 \u0995\u09b0\u09c1\u09a8" + } + }, + "speech": { + "start": "\u09b0\u09c7\u0995\u09b0\u09cd\u09a1\u09bf\u0982 \u09b6\u09c1\u09b0\u09c1 \u0995\u09b0\u09c1\u09a8", + "stop": "\u09b0\u09c7\u0995\u09b0\u09cd\u09a1\u09bf\u0982 \u09ac\u09a8\u09cd\u09a7 \u0995\u09b0\u09c1\u09a8", + "connecting": "\u09b8\u0982\u09af\u09cb\u0997 \u0995\u09b0\u09be \u09b9\u099a\u09cd\u099b\u09c7" + }, + "fileUpload": { + "dragDrop": "\u098f\u0996\u09be\u09a8\u09c7 \u09ab\u09be\u0987\u09b2 \u099f\u09c7\u09a8\u09c7 \u0986\u09a8\u09c1\u09a8", + "browse": "\u09ab\u09be\u0987\u09b2 \u09ac\u09cd\u09b0\u09be\u0989\u099c \u0995\u09b0\u09c1\u09a8", + "sizeLimit": "\u09b8\u09c0\u09ae\u09be:", + "errors": { + "failed": "\u0986\u09aa\u09b2\u09cb\u09a1 \u09ac\u09cd\u09af\u09b0\u09cd\u09a5 \u09b9\u09af\u09bc\u09c7\u099b\u09c7", + "cancelled": "\u0986\u09aa\u09b2\u09cb\u09a1 \u09ac\u09be\u09a4\u09bf\u09b2 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7" + } + }, + "messages": { + "status": { + "using": "\u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u099b\u09c7", + "used": "\u09ac\u09cd\u09af\u09ac\u09b9\u09c3\u09a4" + }, + "actions": { + "copy": { + "button": "\u0995\u09cd\u09b2\u09bf\u09aa\u09ac\u09cb\u09b0\u09cd\u09a1\u09c7 \u0995\u09aa\u09bf \u0995\u09b0\u09c1\u09a8", + "success": "\u0995\u09aa\u09bf \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7!" + } + }, + "feedback": { + "positive": "\u09b8\u09b9\u09be\u09af\u09bc\u0995", + "negative": "\u09b8\u09b9\u09be\u09af\u09bc\u0995 \u09a8\u09af\u09bc", + "edit": "\u09aa\u09cd\u09b0\u09a4\u09bf\u0995\u09cd\u09b0\u09bf\u09af\u09bc\u09be \u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8\u09be \u0995\u09b0\u09c1\u09a8", + "dialog": { + "title": "\u09ae\u09a8\u09cd\u09a4\u09ac\u09cd\u09af \u09af\u09cb\u0997 \u0995\u09b0\u09c1\u09a8", + "submit": "\u09aa\u09cd\u09b0\u09a4\u09bf\u0995\u09cd\u09b0\u09bf\u09af\u09bc\u09be \u099c\u09ae\u09be \u09a6\u09bf\u09a8" + }, + "status": { + "updating": "\u09b9\u09be\u09b2\u09a8\u09be\u0997\u09be\u09a6 \u0995\u09b0\u09be \u09b9\u099a\u09cd\u099b\u09c7", + "updated": "\u09aa\u09cd\u09b0\u09a4\u09bf\u0995\u09cd\u09b0\u09bf\u09af\u09bc\u09be \u09b9\u09be\u09b2\u09a8\u09be\u0997\u09be\u09a6 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7" + } + } + }, + "history": { + "title": "\u09b8\u09b0\u09cd\u09ac\u09b6\u09c7\u09b7 \u0987\u09a8\u09aa\u09c1\u099f", + "empty": "\u0995\u09cb\u09a8\u09cb \u09a4\u09a5\u09cd\u09af \u09a8\u09c7\u0987...", + "show": "\u0987\u09a4\u09bf\u09b9\u09be\u09b8 \u09a6\u09c7\u0996\u09c1\u09a8" + }, + "settings": { + "title": "\u09b8\u09c7\u099f\u09bf\u0982\u09b8 \u09aa\u09cd\u09af\u09be\u09a8\u09c7\u09b2" + }, + "watermark": "\u09a6\u09cd\u09ac\u09be\u09b0\u09be \u09a8\u09bf\u09b0\u09cd\u09ae\u09bf\u09a4" + }, + "threadHistory": { + "sidebar": { + "title": "\u09aa\u09c2\u09b0\u09cd\u09ac\u09ac\u09b0\u09cd\u09a4\u09c0 \u099a\u09cd\u09af\u09be\u099f", + "filters": { + "search": "\u0985\u09a8\u09c1\u09b8\u09a8\u09cd\u09a7\u09be\u09a8", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "\u0986\u099c", + "yesterday": "\u0997\u09a4\u0995\u09be\u09b2", + "previous7days": "\u0997\u09a4 \u09ed \u09a6\u09bf\u09a8", + "previous30days": "\u0997\u09a4 \u09e9\u09e6 \u09a6\u09bf\u09a8" + }, + "empty": "\u0995\u09cb\u09a8\u09cb \u09a5\u09cd\u09b0\u09c7\u09a1 \u09aa\u09be\u0993\u09af\u09bc\u09be \u09af\u09be\u09af\u09bc\u09a8\u09bf", + "actions": { + "close": "\u09b8\u09be\u0987\u09a1\u09ac\u09be\u09b0 \u09ac\u09a8\u09cd\u09a7 \u0995\u09b0\u09c1\u09a8", + "open": "\u09b8\u09be\u0987\u09a1\u09ac\u09be\u09b0 \u0996\u09c1\u09b2\u09c1\u09a8" + } + }, + "thread": { + "untitled": "\u09b6\u09bf\u09b0\u09cb\u09a8\u09be\u09ae\u09b9\u09c0\u09a8 \u0986\u09b2\u09cb\u099a\u09a8\u09be", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "\u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09be \u09a8\u09bf\u09b6\u09cd\u099a\u09bf\u09a4 \u0995\u09b0\u09c1\u09a8", + "description": "\u098f\u099f\u09bf \u09a5\u09cd\u09b0\u09c7\u09a1 \u098f\u09ac\u0982 \u098f\u09b0 \u09ac\u09be\u09b0\u09cd\u09a4\u09be \u0993 \u0989\u09aa\u09be\u09a6\u09be\u09a8\u0997\u09c1\u09b2\u09bf \u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09ac\u09c7\u0964 \u098f\u0987 \u0995\u09be\u099c\u099f\u09bf \u09aa\u09c2\u09b0\u09cd\u09ac\u09be\u09ac\u09b8\u09cd\u09a5\u09be\u09af\u09bc \u09ab\u09c7\u09b0\u09be\u09a8\u09cb \u09af\u09be\u09ac\u09c7 \u09a8\u09be", + "success": "\u099a\u09cd\u09af\u09be\u099f \u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7", + "inProgress": "\u099a\u09cd\u09af\u09be\u099f \u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09be \u09b9\u099a\u09cd\u099b\u09c7" + }, + "rename": { + "title": "\u09a5\u09cd\u09b0\u09c7\u09a1\u09c7\u09b0 \u09a8\u09be\u09ae \u09aa\u09b0\u09bf\u09ac\u09b0\u09cd\u09a4\u09a8 \u0995\u09b0\u09c1\u09a8", + "description": "\u098f\u0987 \u09a5\u09cd\u09b0\u09c7\u09a1\u09c7\u09b0 \u099c\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u09a8\u09a4\u09c1\u09a8 \u09a8\u09be\u09ae \u09a6\u09bf\u09a8", + "form": { + "name": { + "label": "\u09a8\u09be\u09ae", + "placeholder": "\u09a8\u09a4\u09c1\u09a8 \u09a8\u09be\u09ae \u09b2\u09bf\u0996\u09c1\u09a8" + } + }, + "success": "\u09a5\u09cd\u09b0\u09c7\u09a1\u09c7\u09b0 \u09a8\u09be\u09ae \u09aa\u09b0\u09bf\u09ac\u09b0\u09cd\u09a4\u09a8 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7!", + "inProgress": "\u09a5\u09cd\u09b0\u09c7\u09a1\u09c7\u09b0 \u09a8\u09be\u09ae \u09aa\u09b0\u09bf\u09ac\u09b0\u09cd\u09a4\u09a8 \u0995\u09b0\u09be \u09b9\u099a\u09cd\u099b\u09c7" + } + } + } + }, + "navigation": { + "header": { + "chat": "\u099a\u09cd\u09af\u09be\u099f", + "readme": "\u09b0\u09bf\u09a1\u09ae\u09bf", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "\u09a8\u09a4\u09c1\u09a8 \u099a\u09cd\u09af\u09be\u099f", + "dialog": { + "title": "\u09a8\u09a4\u09c1\u09a8 \u099a\u09cd\u09af\u09be\u099f \u09a4\u09c8\u09b0\u09bf \u0995\u09b0\u09c1\u09a8", + "description": "\u098f\u099f\u09bf \u0986\u09aa\u09a8\u09be\u09b0 \u09ac\u09b0\u09cd\u09a4\u09ae\u09be\u09a8 \u099a\u09cd\u09af\u09be\u099f \u0987\u09a4\u09bf\u09b9\u09be\u09b8 \u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09ac\u09c7\u0964 \u0986\u09aa\u09a8\u09bf \u0995\u09bf \u099a\u09be\u09b2\u09bf\u09af\u09bc\u09c7 \u09af\u09c7\u09a4\u09c7 \u099a\u09be\u09a8?", + "tooltip": "\u09a8\u09a4\u09c1\u09a8 \u099a\u09cd\u09af\u09be\u099f" + } + }, + "user": { + "menu": { + "settings": "\u09b8\u09c7\u099f\u09bf\u0982\u09b8", + "settingsKey": "S", + "apiKeys": "\u098f\u09aa\u09bf\u0986\u0987 \u0995\u09c0", + "logout": "\u09b2\u0997\u0986\u0989\u099f" + } + } + }, + "apiKeys": { + "title": "\u09aa\u09cd\u09b0\u09af\u09bc\u09cb\u099c\u09a8\u09c0\u09af\u09bc \u098f\u09aa\u09bf\u0986\u0987 \u0995\u09c0", + "description": "\u098f\u0987 \u0985\u09cd\u09af\u09be\u09aa\u09cd\u09b2\u09bf\u0995\u09c7\u09b6\u09a8 \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09a4\u09c7 \u09a8\u09bf\u09ae\u09cd\u09a8\u09b2\u09bf\u0996\u09bf\u09a4 \u098f\u09aa\u09bf\u0986\u0987 \u0995\u09c0 \u09aa\u09cd\u09b0\u09af\u09bc\u09cb\u099c\u09a8\u0964 \u0995\u09c0\u0997\u09c1\u09b2\u09bf \u0986\u09aa\u09a8\u09be\u09b0 \u09a1\u09bf\u09ad\u09be\u0987\u09b8\u09c7\u09b0 \u09b2\u09cb\u0995\u09be\u09b2 \u09b8\u09cd\u099f\u09cb\u09b0\u09c7\u099c\u09c7 \u09b8\u0982\u09b0\u0995\u09cd\u09b7\u09bf\u09a4 \u09a5\u09be\u0995\u09c7\u0964", + "success": { + "saved": "\u09b8\u09ab\u09b2\u09ad\u09be\u09ac\u09c7 \u09b8\u0982\u09b0\u0995\u09cd\u09b7\u09bf\u09a4 \u09b9\u09af\u09bc\u09c7\u099b\u09c7" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/examples/hf_demo_space/.chainlit/translations/en-US.json b/examples/hf_demo_space/.chainlit/translations/en-US.json new file mode 100644 index 0000000..87b8d74 --- /dev/null +++ b/examples/hf_demo_space/.chainlit/translations/en-US.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "Cancel", + "confirm": "Confirm", + "continue": "Continue", + "goBack": "Go Back", + "reset": "Reset", + "submit": "Submit" + }, + "status": { + "loading": "Loading...", + "error": { + "default": "An error occurred", + "serverConnection": "Could not reach the server" + } + } + }, + "auth": { + "login": { + "title": "Login to access the app", + "form": { + "email": { + "label": "Email address", + "required": "email is a required field" + }, + "password": { + "label": "Password", + "required": "password is a required field" + }, + "actions": { + "signin": "Sign In" + }, + "alternativeText": { + "or": "OR" + } + }, + "errors": { + "default": "Unable to sign in", + "signin": "Try signing in with a different account", + "oauthSignin": "Try signing in with a different account", + "redirectUriMismatch": "The redirect URI is not matching the oauth app configuration", + "oauthCallback": "Try signing in with a different account", + "oauthCreateAccount": "Try signing in with a different account", + "emailCreateAccount": "Try signing in with a different account", + "callback": "Try signing in with a different account", + "oauthAccountNotLinked": "To confirm your identity, sign in with the same account you used originally", + "emailSignin": "The e-mail could not be sent", + "emailVerify": "Please verify your email, a new email has been sent", + "credentialsSignin": "Sign in failed. Check the details you provided are correct", + "sessionRequired": "Please sign in to access this page" + } + }, + "provider": { + "continue": "Continue with {{provider}}" + } + }, + "chat": { + "input": { + "placeholder": "Type your message here...", + "actions": { + "send": "Send message", + "stop": "Stop Task", + "attachFiles": "Attach files" + } + }, + "speech": { + "start": "Start recording", + "stop": "Stop recording", + "connecting": "Connecting" + }, + "fileUpload": { + "dragDrop": "Drag and drop files here", + "browse": "Browse Files", + "sizeLimit": "Limit:", + "errors": { + "failed": "Failed to upload", + "cancelled": "Cancelled upload of" + } + }, + "messages": { + "status": { + "using": "Using", + "used": "Used" + }, + "actions": { + "copy": { + "button": "Copy to clipboard", + "success": "Copied!" + } + }, + "feedback": { + "positive": "Helpful", + "negative": "Not helpful", + "edit": "Edit feedback", + "dialog": { + "title": "Add a comment", + "submit": "Submit feedback" + }, + "status": { + "updating": "Updating", + "updated": "Feedback updated" + } + } + }, + "history": { + "title": "Last Inputs", + "empty": "Such empty...", + "show": "Show history" + }, + "settings": { + "title": "Settings panel" + }, + "watermark": "Built with" + }, + "threadHistory": { + "sidebar": { + "title": "Past Chats", + "filters": { + "search": "Search", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "Today", + "yesterday": "Yesterday", + "previous7days": "Previous 7 days", + "previous30days": "Previous 30 days" + }, + "empty": "No threads found", + "actions": { + "close": "Close sidebar", + "open": "Open sidebar" + } + }, + "thread": { + "untitled": "Untitled Conversation", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "Confirm deletion", + "description": "This will delete the thread as well as its messages and elements. This action cannot be undone", + "success": "Chat deleted", + "inProgress": "Deleting chat" + }, + "rename": { + "title": "Rename Thread", + "description": "Enter a new name for this thread", + "form": { + "name": { + "label": "Name", + "placeholder": "Enter new name" + } + }, + "success": "Thread renamed!", + "inProgress": "Renaming thread" + } + } + } + }, + "navigation": { + "header": { + "chat": "Chat", + "readme": "Readme", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "New Chat", + "dialog": { + "title": "Create New Chat", + "description": "This will clear your current chat history. Are you sure you want to continue?", + "tooltip": "New Chat" + } + }, + "user": { + "menu": { + "settings": "Settings", + "settingsKey": "S", + "apiKeys": "API Keys", + "logout": "Logout" + } + } + }, + "apiKeys": { + "title": "Required API Keys", + "description": "To use this app, the following API keys are required. The keys are stored on your device's local storage.", + "success": { + "saved": "Saved successfully" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/examples/hf_demo_space/.chainlit/translations/gu.json b/examples/hf_demo_space/.chainlit/translations/gu.json new file mode 100644 index 0000000..6292b95 --- /dev/null +++ b/examples/hf_demo_space/.chainlit/translations/gu.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "\u0ab0\u0aa6 \u0a95\u0ab0\u0acb", + "confirm": "\u0aaa\u0ac1\u0ab7\u0acd\u0a9f\u0abf \u0a95\u0ab0\u0acb", + "continue": "\u0a9a\u0abe\u0ab2\u0ac1 \u0ab0\u0abe\u0a96\u0acb", + "goBack": "\u0aaa\u0abe\u0a9b\u0abe \u0a9c\u0abe\u0a93", + "reset": "\u0ab0\u0ac0\u0ab8\u0ac7\u0a9f \u0a95\u0ab0\u0acb", + "submit": "\u0ab8\u0aac\u0aae\u0abf\u0a9f \u0a95\u0ab0\u0acb" + }, + "status": { + "loading": "\u0ab2\u0acb\u0aa1 \u0aa5\u0a88 \u0ab0\u0ab9\u0acd\u0aaf\u0ac1\u0a82 \u0a9b\u0ac7...", + "error": { + "default": "\u0a8f\u0a95 \u0aad\u0ac2\u0ab2 \u0aa5\u0a88", + "serverConnection": "\u0ab8\u0ab0\u0acd\u0ab5\u0ab0 \u0ab8\u0ac1\u0aa7\u0ac0 \u0aaa\u0ab9\u0acb\u0a82\u0a9a\u0ac0 \u0ab6\u0a95\u0abe\u0aaf\u0ac1\u0a82 \u0aa8\u0aa5\u0ac0" + } + } + }, + "auth": { + "login": { + "title": "\u0a8f\u0aaa\u0acd\u0ab2\u0abf\u0a95\u0ac7\u0ab6\u0aa8 \u0a8d\u0a95\u0acd\u0ab8\u0ac7\u0ab8 \u0a95\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7 \u0ab2\u0ac9\u0a97\u0abf\u0aa8 \u0a95\u0ab0\u0acb", + "form": { + "email": { + "label": "\u0a88\u0aae\u0ac7\u0ab2 \u0a8f\u0aa1\u0acd\u0ab0\u0ac7\u0ab8", + "required": "\u0a88\u0aae\u0ac7\u0ab2 \u0a86\u0ab5\u0ab6\u0acd\u0aaf\u0a95 \u0a9b\u0ac7" + }, + "password": { + "label": "\u0aaa\u0abe\u0ab8\u0ab5\u0ab0\u0acd\u0aa1", + "required": "\u0aaa\u0abe\u0ab8\u0ab5\u0ab0\u0acd\u0aa1 \u0a86\u0ab5\u0ab6\u0acd\u0aaf\u0a95 \u0a9b\u0ac7" + }, + "actions": { + "signin": "\u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0acb" + }, + "alternativeText": { + "or": "\u0a85\u0aa5\u0ab5\u0abe" + } + }, + "errors": { + "default": "\u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ac0 \u0ab6\u0a95\u0abe\u0aaf\u0ac1\u0a82 \u0aa8\u0aa5\u0ac0", + "signin": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb", + "oauthSignin": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb", + "redirectUriMismatch": "\u0ab0\u0ac0\u0aa1\u0abe\u0aaf\u0ab0\u0ac7\u0a95\u0acd\u0a9f URI oauth \u0a8d\u0aaa \u0a95\u0aa8\u0acd\u0aab\u0abf\u0a97\u0ab0\u0ac7\u0ab6\u0aa8 \u0ab8\u0abe\u0aa5\u0ac7 \u0aae\u0ac7\u0ab3 \u0a96\u0abe\u0aa4\u0acb \u0aa8\u0aa5\u0ac0", + "oauthCallback": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb", + "oauthCreateAccount": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb", + "emailCreateAccount": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb", + "callback": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb", + "oauthAccountNotLinked": "\u0aa4\u0aae\u0abe\u0ab0\u0ac0 \u0a93\u0ab3\u0a96\u0aa8\u0ac0 \u0aaa\u0ac1\u0ab7\u0acd\u0a9f\u0abf \u0a95\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7, \u0aae\u0ac2\u0ab3 \u0ab0\u0ac2\u0aaa\u0ac7 \u0ab5\u0abe\u0aaa\u0ab0\u0ac7\u0ab2\u0abe \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0acb", + "emailSignin": "\u0a88\u0aae\u0ac7\u0ab2 \u0aae\u0acb\u0a95\u0ab2\u0ac0 \u0ab6\u0a95\u0abe\u0aaf\u0acb \u0aa8\u0aa5\u0ac0", + "emailVerify": "\u0a95\u0ac3\u0aaa\u0abe \u0a95\u0ab0\u0ac0 \u0aa4\u0aae\u0abe\u0ab0\u0acb \u0a88\u0aae\u0ac7\u0ab2 \u0a9a\u0a95\u0abe\u0ab8\u0acb, \u0aa8\u0ab5\u0acb \u0a88\u0aae\u0ac7\u0ab2 \u0aae\u0acb\u0a95\u0ab2\u0ab5\u0abe\u0aae\u0abe\u0a82 \u0a86\u0ab5\u0acd\u0aaf\u0acb \u0a9b\u0ac7", + "credentialsSignin": "\u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0aa8\u0abf\u0ab7\u0acd\u0aab\u0ab3. \u0a86\u0aaa\u0ac7\u0ab2\u0ac0 \u0ab5\u0abf\u0a97\u0aa4\u0acb \u0ab8\u0abe\u0a9a\u0ac0 \u0a9b\u0ac7 \u0a95\u0ac7 \u0aa8\u0ab9\u0ac0\u0a82 \u0aa4\u0ac7 \u0a9a\u0a95\u0abe\u0ab8\u0acb", + "sessionRequired": "\u0a86 \u0aaa\u0ac7\u0a9c\u0aa8\u0ac7 \u0a8d\u0a95\u0acd\u0ab8\u0ac7\u0ab8 \u0a95\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7 \u0a95\u0ac3\u0aaa\u0abe \u0a95\u0ab0\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0acb" + } + }, + "provider": { + "continue": "{{provider}} \u0ab8\u0abe\u0aa5\u0ac7 \u0a9a\u0abe\u0ab2\u0ac1 \u0ab0\u0abe\u0a96\u0acb" + } + }, + "chat": { + "input": { + "placeholder": "\u0a85\u0ab9\u0ac0\u0a82 \u0aa4\u0aae\u0abe\u0ab0\u0acb \u0ab8\u0a82\u0aa6\u0ac7\u0ab6 \u0ab2\u0a96\u0acb...", + "actions": { + "send": "\u0ab8\u0a82\u0aa6\u0ac7\u0ab6 \u0aae\u0acb\u0a95\u0ab2\u0acb", + "stop": "\u0a95\u0abe\u0ab0\u0acd\u0aaf \u0ab0\u0acb\u0a95\u0acb", + "attachFiles": "\u0aab\u0abe\u0a87\u0ab2\u0acd\u0ab8 \u0a9c\u0acb\u0aa1\u0acb" + } + }, + "speech": { + "start": "\u0ab0\u0ac7\u0a95\u0acb\u0ab0\u0acd\u0aa1\u0abf\u0a82\u0a97 \u0ab6\u0ab0\u0ac2 \u0a95\u0ab0\u0acb", + "stop": "\u0ab0\u0ac7\u0a95\u0acb\u0ab0\u0acd\u0aa1\u0abf\u0a82\u0a97 \u0aac\u0a82\u0aa7 \u0a95\u0ab0\u0acb", + "connecting": "\u0a95\u0aa8\u0ac7\u0a95\u0acd\u0a9f \u0aa5\u0a88 \u0ab0\u0ab9\u0acd\u0aaf\u0ac1\u0a82 \u0a9b\u0ac7" + }, + "fileUpload": { + "dragDrop": "\u0a85\u0ab9\u0ac0\u0a82 \u0aab\u0abe\u0a87\u0ab2\u0acd\u0ab8 \u0a96\u0ac7\u0a82\u0a9a\u0acb \u0a85\u0aa8\u0ac7 \u0a9b\u0acb\u0aa1\u0acb", + "browse": "\u0aab\u0abe\u0a87\u0ab2\u0acd\u0ab8 \u0aac\u0acd\u0ab0\u0abe\u0a89\u0a9d \u0a95\u0ab0\u0acb", + "sizeLimit": "\u0aae\u0ab0\u0acd\u0aaf\u0abe\u0aa6\u0abe:", + "errors": { + "failed": "\u0a85\u0aaa\u0ab2\u0acb\u0aa1 \u0a95\u0ab0\u0ab5\u0abe\u0aae\u0abe\u0a82 \u0aa8\u0abf\u0ab7\u0acd\u0aab\u0ab3", + "cancelled": "\u0a85\u0aaa\u0ab2\u0acb\u0aa1 \u0ab0\u0aa6 \u0a95\u0ab0\u0acd\u0aaf\u0ac1\u0a82" + } + }, + "messages": { + "status": { + "using": "\u0ab5\u0abe\u0aaa\u0ab0\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0abe \u0a9b\u0ac7", + "used": "\u0ab5\u0aaa\u0ab0\u0abe\u0aaf\u0ac7\u0ab2" + }, + "actions": { + "copy": { + "button": "\u0a95\u0acd\u0ab2\u0abf\u0aaa\u0aac\u0acb\u0ab0\u0acd\u0aa1 \u0aaa\u0ab0 \u0a95\u0ac9\u0aaa\u0abf \u0a95\u0ab0\u0acb", + "success": "\u0a95\u0ac9\u0aaa\u0abf \u0aa5\u0aaf\u0ac1\u0a82!" + } + }, + "feedback": { + "positive": "\u0a89\u0aaa\u0aaf\u0acb\u0a97\u0ac0", + "negative": "\u0aac\u0abf\u0aa8\u0a89\u0aaa\u0aaf\u0acb\u0a97\u0ac0", + "edit": "\u0aaa\u0acd\u0ab0\u0aa4\u0abf\u0ab8\u0abe\u0aa6 \u0ab8\u0a82\u0aaa\u0abe\u0aa6\u0abf\u0aa4 \u0a95\u0ab0\u0acb", + "dialog": { + "title": "\u0a9f\u0abf\u0aaa\u0acd\u0aaa\u0aa3\u0ac0 \u0a89\u0aae\u0ac7\u0ab0\u0acb", + "submit": "\u0aaa\u0acd\u0ab0\u0aa4\u0abf\u0ab8\u0abe\u0aa6 \u0ab8\u0aac\u0aae\u0abf\u0a9f \u0a95\u0ab0\u0acb" + }, + "status": { + "updating": "\u0a85\u0aaa\u0aa1\u0ac7\u0a9f \u0aa5\u0a88 \u0ab0\u0ab9\u0acd\u0aaf\u0ac1\u0a82 \u0a9b\u0ac7", + "updated": "\u0aaa\u0acd\u0ab0\u0aa4\u0abf\u0ab8\u0abe\u0aa6 \u0a85\u0aaa\u0aa1\u0ac7\u0a9f \u0aa5\u0aaf\u0acb" + } + } + }, + "history": { + "title": "\u0a9b\u0ac7\u0ab2\u0acd\u0ab2\u0abe \u0a87\u0aa8\u0aaa\u0ac1\u0a9f\u0acd\u0ab8", + "empty": "\u0a96\u0abe\u0ab2\u0ac0 \u0a9b\u0ac7...", + "show": "\u0a87\u0aa4\u0abf\u0ab9\u0abe\u0ab8 \u0aac\u0aa4\u0abe\u0ab5\u0acb" + }, + "settings": { + "title": "\u0ab8\u0ac7\u0a9f\u0abf\u0a82\u0a97\u0acd\u0ab8 \u0aaa\u0ac7\u0aa8\u0ab2" + }, + "watermark": "\u0ab8\u0abe\u0aa5\u0ac7 \u0aac\u0aa8\u0abe\u0ab5\u0ac7\u0ab2" + }, + "threadHistory": { + "sidebar": { + "title": "\u0aaa\u0abe\u0a9b\u0ab2\u0ac0 \u0a9a\u0ac7\u0a9f\u0acd\u0ab8", + "filters": { + "search": "\u0ab6\u0acb\u0aa7\u0acb", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "\u0a86\u0a9c\u0ac7", + "yesterday": "\u0a97\u0a88\u0a95\u0abe\u0ab2\u0ac7", + "previous7days": "\u0aaa\u0abe\u0a9b\u0ab2\u0abe 7 \u0aa6\u0abf\u0ab5\u0ab8", + "previous30days": "\u0aaa\u0abe\u0a9b\u0ab2\u0abe 30 \u0aa6\u0abf\u0ab5\u0ab8" + }, + "empty": "\u0a95\u0acb\u0a88 \u0aa5\u0acd\u0ab0\u0ac7\u0aa1\u0acd\u0ab8 \u0aae\u0ab3\u0acd\u0aaf\u0abe \u0aa8\u0aa5\u0ac0", + "actions": { + "close": "\u0ab8\u0abe\u0a87\u0aa1\u0aac\u0abe\u0ab0 \u0aac\u0a82\u0aa7 \u0a95\u0ab0\u0acb", + "open": "\u0ab8\u0abe\u0a87\u0aa1\u0aac\u0abe\u0ab0 \u0a96\u0acb\u0ab2\u0acb" + } + }, + "thread": { + "untitled": "\u0ab6\u0ac0\u0ab0\u0acd\u0ab7\u0a95 \u0ab5\u0a97\u0ab0\u0aa8\u0ac0 \u0ab5\u0abe\u0aa4\u0a9a\u0ac0\u0aa4", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "\u0a95\u0abe\u0aa2\u0ac0 \u0aa8\u0abe\u0a96\u0ab5\u0abe\u0aa8\u0ac0 \u0aaa\u0ac1\u0ab7\u0acd\u0a9f\u0abf \u0a95\u0ab0\u0acb", + "description": "\u0a86 \u0aa5\u0acd\u0ab0\u0ac7\u0aa1 \u0a85\u0aa8\u0ac7 \u0aa4\u0ac7\u0aa8\u0abe \u0ab8\u0a82\u0aa6\u0ac7\u0ab6\u0abe\u0a93 \u0a85\u0aa8\u0ac7 \u0aa4\u0aa4\u0acd\u0ab5\u0acb\u0aa8\u0ac7 \u0a95\u0abe\u0aa2\u0ac0 \u0aa8\u0abe\u0a96\u0ab6\u0ac7. \u0a86 \u0a95\u0acd\u0ab0\u0abf\u0aaf\u0abe \u0aaa\u0abe\u0a9b\u0ac0 \u0aab\u0ac7\u0ab0\u0ab5\u0ac0 \u0ab6\u0a95\u0abe\u0ab6\u0ac7 \u0aa8\u0ab9\u0ac0\u0a82", + "success": "\u0a9a\u0ac7\u0a9f \u0a95\u0abe\u0aa2\u0ac0 \u0aa8\u0abe\u0a96\u0ac0", + "inProgress": "\u0a9a\u0ac7\u0a9f \u0a95\u0abe\u0aa2\u0ac0 \u0aa8\u0abe\u0a96\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0abe \u0a9b\u0ac0\u0a8f" + }, + "rename": { + "title": "\u0aa5\u0acd\u0ab0\u0ac7\u0aa1\u0aa8\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aac\u0aa6\u0ab2\u0acb", + "description": "\u0a86 \u0aa5\u0acd\u0ab0\u0ac7\u0aa1 \u0aae\u0abe\u0a9f\u0ac7 \u0aa8\u0ab5\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aa6\u0abe\u0a96\u0ab2 \u0a95\u0ab0\u0acb", + "form": { + "name": { + "label": "\u0aa8\u0abe\u0aae", + "placeholder": "\u0aa8\u0ab5\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aa6\u0abe\u0a96\u0ab2 \u0a95\u0ab0\u0acb" + } + }, + "success": "\u0aa5\u0acd\u0ab0\u0ac7\u0aa1\u0aa8\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aac\u0aa6\u0ab2\u0abe\u0aaf\u0ac1\u0a82!", + "inProgress": "\u0aa5\u0acd\u0ab0\u0ac7\u0aa1\u0aa8\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aac\u0aa6\u0ab2\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0abe \u0a9b\u0ac0\u0a8f" + } + } + } + }, + "navigation": { + "header": { + "chat": "\u0a9a\u0ac7\u0a9f", + "readme": "\u0ab5\u0abe\u0a82\u0a9a\u0acb", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "\u0aa8\u0ab5\u0ac0 \u0a9a\u0ac7\u0a9f", + "dialog": { + "title": "\u0aa8\u0ab5\u0ac0 \u0a9a\u0ac7\u0a9f \u0aac\u0aa8\u0abe\u0ab5\u0acb", + "description": "\u0a86 \u0aa4\u0aae\u0abe\u0ab0\u0acb \u0ab5\u0ab0\u0acd\u0aa4\u0aae\u0abe\u0aa8 \u0a9a\u0ac7\u0a9f \u0a87\u0aa4\u0abf\u0ab9\u0abe\u0ab8 \u0ab8\u0abe\u0aab \u0a95\u0ab0\u0ab6\u0ac7. \u0ab6\u0ac1\u0a82 \u0aa4\u0aae\u0ac7 \u0a9a\u0abe\u0ab2\u0ac1 \u0ab0\u0abe\u0a96\u0ab5\u0abe \u0aae\u0abe\u0a82\u0a97\u0acb \u0a9b\u0acb?", + "tooltip": "\u0aa8\u0ab5\u0ac0 \u0a9a\u0ac7\u0a9f" + } + }, + "user": { + "menu": { + "settings": "\u0ab8\u0ac7\u0a9f\u0abf\u0a82\u0a97\u0acd\u0ab8", + "settingsKey": "S", + "apiKeys": "API \u0a95\u0ac0", + "logout": "\u0ab2\u0ac9\u0a97\u0a86\u0a89\u0a9f" + } + } + }, + "apiKeys": { + "title": "\u0a9c\u0ab0\u0ac2\u0ab0\u0ac0 API \u0a95\u0ac0", + "description": "\u0a86 \u0a8f\u0aaa\u0acd\u0ab2\u0abf\u0a95\u0ac7\u0ab6\u0aa8 \u0ab5\u0abe\u0aaa\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7, \u0aa8\u0ac0\u0a9a\u0ac7\u0aa8\u0ac0 API \u0a95\u0ac0 \u0a9c\u0ab0\u0ac2\u0ab0\u0ac0 \u0a9b\u0ac7. \u0a95\u0ac0 \u0aa4\u0aae\u0abe\u0ab0\u0abe \u0aa1\u0abf\u0ab5\u0abe\u0a87\u0ab8\u0aa8\u0abe \u0ab2\u0acb\u0a95\u0ab2 \u0ab8\u0acd\u0a9f\u0acb\u0ab0\u0ac7\u0a9c\u0aae\u0abe\u0a82 \u0ab8\u0a82\u0a97\u0acd\u0ab0\u0ab9\u0abf\u0aa4 \u0aa5\u0ab6\u0ac7.", + "success": { + "saved": "\u0ab8\u0aab\u0ab3\u0aa4\u0abe\u0aaa\u0ac2\u0ab0\u0acd\u0ab5\u0a95 \u0ab8\u0abe\u0a9a\u0ab5\u0acd\u0aaf\u0ac1\u0a82" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/examples/hf_demo_space/.chainlit/translations/he-IL.json b/examples/hf_demo_space/.chainlit/translations/he-IL.json new file mode 100644 index 0000000..fc07678 --- /dev/null +++ b/examples/hf_demo_space/.chainlit/translations/he-IL.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "\u05d1\u05d9\u05d8\u05d5\u05dc", + "confirm": "\u05d0\u05d9\u05e9\u05d5\u05e8", + "continue": "\u05d4\u05de\u05e9\u05da", + "goBack": "\u05d7\u05d6\u05d5\u05e8", + "reset": "\u05d0\u05d9\u05e4\u05d5\u05e1", + "submit": "\u05e9\u05dc\u05d7" + }, + "status": { + "loading": "\u05d8\u05d5\u05e2\u05df...", + "error": { + "default": "\u05d0\u05d9\u05e8\u05e2\u05d4 \u05e9\u05d2\u05d9\u05d0\u05d4", + "serverConnection": "\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05dc\u05e9\u05e8\u05ea" + } + } + }, + "auth": { + "login": { + "title": "\u05d4\u05ea\u05d7\u05d1\u05e8 \u05db\u05d3\u05d9 \u05dc\u05d2\u05e9\u05ea \u05dc\u05d0\u05e4\u05dc\u05d9\u05e7\u05e6\u05d9\u05d4", + "form": { + "email": { + "label": "\u05db\u05ea\u05d5\u05d1\u05ea \u05d0\u05d9\u05de\u05d9\u05d9\u05dc", + "required": "\u05e9\u05d3\u05d4 \u05d4\u05d0\u05d9\u05de\u05d9\u05d9\u05dc \u05d4\u05d5\u05d0 \u05e9\u05d3\u05d4 \u05d7\u05d5\u05d1\u05d4" + }, + "password": { + "label": "\u05e1\u05d9\u05e1\u05de\u05d4", + "required": "\u05e9\u05d3\u05d4 \u05d4\u05e1\u05d9\u05e1\u05de\u05d4 \u05d4\u05d5\u05d0 \u05e9\u05d3\u05d4 \u05d7\u05d5\u05d1\u05d4" + }, + "actions": { + "signin": "\u05d4\u05ea\u05d7\u05d1\u05e8" + }, + "alternativeText": { + "or": "\u05d0\u05d5" + } + }, + "errors": { + "default": "\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8", + "signin": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8", + "oauthSignin": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8", + "redirectUriMismatch": "\u05db\u05ea\u05d5\u05d1\u05ea \u05d4\u05d4\u05e4\u05e0\u05d9\u05d4 \u05d0\u05d9\u05e0\u05d4 \u05ea\u05d5\u05d0\u05de\u05ea \u05d0\u05ea \u05ea\u05e6\u05d5\u05e8\u05ea \u05d0\u05e4\u05dc\u05d9\u05e7\u05e6\u05d9\u05d9\u05ea OAuth", + "oauthCallback": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8", + "oauthCreateAccount": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8", + "emailCreateAccount": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8", + "callback": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8", + "oauthAccountNotLinked": "\u05db\u05d3\u05d9 \u05dc\u05d0\u05de\u05ea \u05d0\u05ea \u05d6\u05d4\u05d5\u05ea\u05da, \u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d0\u05d5\u05ea\u05d5 \u05d7\u05e9\u05d1\u05d5\u05df \u05d1\u05d5 \u05d4\u05e9\u05ea\u05de\u05e9\u05ea \u05d1\u05de\u05e7\u05d5\u05e8", + "emailSignin": "\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05d4\u05d9\u05d4 \u05dc\u05e9\u05dc\u05d5\u05d7 \u05d0\u05ea \u05d4\u05d0\u05d9\u05de\u05d9\u05d9\u05dc", + "emailVerify": "\u05d0\u05e0\u05d0 \u05d0\u05de\u05ea \u05d0\u05ea \u05d4\u05d0\u05d9\u05de\u05d9\u05d9\u05dc \u05e9\u05dc\u05da, \u05e0\u05e9\u05dc\u05d7 \u05d0\u05d9\u05de\u05d9\u05d9\u05dc \u05d7\u05d3\u05e9", + "credentialsSignin": "\u05d4\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05e0\u05db\u05e9\u05dc\u05d4. \u05d1\u05d3\u05d5\u05e7 \u05e9\u05d4\u05e4\u05e8\u05d8\u05d9\u05dd \u05e9\u05d4\u05d6\u05e0\u05ea \u05e0\u05db\u05d5\u05e0\u05d9\u05dd", + "sessionRequired": "\u05d0\u05e0\u05d0 \u05d4\u05ea\u05d7\u05d1\u05e8 \u05db\u05d3\u05d9 \u05dc\u05d2\u05e9\u05ea \u05dc\u05d3\u05e3 \u05d6\u05d4" + } + }, + "provider": { + "continue": "\u05d4\u05de\u05e9\u05da \u05e2\u05dd {{provider}}" + } + }, + "chat": { + "input": { + "placeholder": "\u05d4\u05e7\u05dc\u05d3 \u05d0\u05ea \u05d4\u05d4\u05d5\u05d3\u05e2\u05d4 \u05e9\u05dc\u05da \u05db\u05d0\u05df...", + "actions": { + "send": "\u05e9\u05dc\u05d7 \u05d4\u05d5\u05d3\u05e2\u05d4", + "stop": "\u05e2\u05e6\u05d5\u05e8 \u05de\u05e9\u05d9\u05de\u05d4", + "attachFiles": "\u05e6\u05e8\u05e3 \u05e7\u05d1\u05e6\u05d9\u05dd" + } + }, + "speech": { + "start": "\u05d4\u05ea\u05d7\u05dc \u05d4\u05e7\u05dc\u05d8\u05d4", + "stop": "\u05e2\u05e6\u05d5\u05e8 \u05d4\u05e7\u05dc\u05d8\u05d4", + "connecting": "\u05de\u05ea\u05d7\u05d1\u05e8" + }, + "fileUpload": { + "dragDrop": "\u05d2\u05e8\u05d5\u05e8 \u05d5\u05e9\u05d7\u05e8\u05e8 \u05e7\u05d1\u05e6\u05d9\u05dd \u05db\u05d0\u05df", + "browse": "\u05e2\u05d9\u05d9\u05df \u05d1\u05e7\u05d1\u05e6\u05d9\u05dd", + "sizeLimit": "\u05de\u05d2\u05d1\u05dc\u05d4:", + "errors": { + "failed": "\u05d4\u05e2\u05dc\u05d0\u05d4 \u05e0\u05db\u05e9\u05dc\u05d4", + "cancelled": "\u05d4\u05e2\u05dc\u05d0\u05d4 \u05d1\u05d5\u05d8\u05dc\u05d4 \u05e9\u05dc" + } + }, + "messages": { + "status": { + "using": "\u05de\u05e9\u05ea\u05de\u05e9 \u05d1", + "used": "\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1" + }, + "actions": { + "copy": { + "button": "\u05d4\u05e2\u05ea\u05e7 \u05dc\u05dc\u05d5\u05d7", + "success": "\u05d4\u05d5\u05e2\u05ea\u05e7!" + } + }, + "feedback": { + "positive": "\u05de\u05d5\u05e2\u05d9\u05dc", + "negative": "\u05dc\u05d0 \u05de\u05d5\u05e2\u05d9\u05dc", + "edit": "\u05e2\u05e8\u05d5\u05da \u05de\u05e9\u05d5\u05d1", + "dialog": { + "title": "\u05d4\u05d5\u05e1\u05e3 \u05ea\u05d2\u05d5\u05d1\u05d4", + "submit": "\u05e9\u05dc\u05d7 \u05de\u05e9\u05d5\u05d1" + }, + "status": { + "updating": "\u05de\u05e2\u05d3\u05db\u05df", + "updated": "\u05d4\u05de\u05e9\u05d5\u05d1 \u05e2\u05d5\u05d3\u05db\u05df" + } + } + }, + "history": { + "title": "\u05e7\u05dc\u05d8\u05d9\u05dd \u05d0\u05d7\u05e8\u05d5\u05e0\u05d9\u05dd", + "empty": "\u05db\u05dc \u05db\u05da \u05e8\u05d9\u05e7...", + "show": "\u05d4\u05e6\u05d2 \u05d4\u05d9\u05e1\u05d8\u05d5\u05e8\u05d9\u05d4" + }, + "settings": { + "title": "\u05e4\u05d0\u05e0\u05dc \u05d4\u05d2\u05d3\u05e8\u05d5\u05ea" + }, + "watermark": "\u05e0\u05d1\u05e0\u05d4 \u05d1\u05d0\u05de\u05e6\u05e2\u05d5\u05ea" + }, + "threadHistory": { + "sidebar": { + "title": "\u05e6'\u05d0\u05d8\u05d9\u05dd \u05e7\u05d5\u05d3\u05de\u05d9\u05dd", + "filters": { + "search": "\u05d7\u05d9\u05e4\u05d5\u05e9", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "\u05d4\u05d9\u05d5\u05dd", + "yesterday": "\u05d0\u05ea\u05de\u05d5\u05dc", + "previous7days": "7 \u05d9\u05de\u05d9\u05dd \u05d0\u05d7\u05e8\u05d5\u05e0\u05d9\u05dd", + "previous30days": "30 \u05d9\u05de\u05d9\u05dd \u05d0\u05d7\u05e8\u05d5\u05e0\u05d9\u05dd" + }, + "empty": "\u05dc\u05d0 \u05e0\u05de\u05e6\u05d0\u05d5 \u05e9\u05d9\u05d7\u05d5\u05ea", + "actions": { + "close": "\u05e1\u05d2\u05d5\u05e8 \u05e1\u05e8\u05d2\u05dc \u05e6\u05d3", + "open": "\u05e4\u05ea\u05d7 \u05e1\u05e8\u05d2\u05dc \u05e6\u05d3" + } + }, + "thread": { + "untitled": "\u05e9\u05d9\u05d7\u05d4 \u05dc\u05dc\u05d0 \u05db\u05d5\u05ea\u05e8\u05ea", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "\u05d0\u05e9\u05e8 \u05de\u05d7\u05d9\u05e7\u05d4", + "description": "\u05e4\u05e2\u05d5\u05dc\u05d4 \u05d6\u05d5 \u05ea\u05de\u05d7\u05e7 \u05d0\u05ea \u05d4\u05e9\u05d9\u05d7\u05d4 \u05d5\u05db\u05df \u05d0\u05ea \u05d4\u05d4\u05d5\u05d3\u05e2\u05d5\u05ea \u05d5\u05d4\u05d0\u05dc\u05de\u05e0\u05d8\u05d9\u05dd \u05e9\u05dc\u05d4. \u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d1\u05d8\u05dc \u05e4\u05e2\u05d5\u05dc\u05d4 \u05d6\u05d5", + "success": "\u05d4\u05e6'\u05d0\u05d8 \u05e0\u05de\u05d7\u05e7", + "inProgress": "\u05de\u05d5\u05d7\u05e7 \u05e6'\u05d0\u05d8" + }, + "rename": { + "title": "\u05e9\u05e0\u05d4 \u05e9\u05dd \u05e9\u05d9\u05d7\u05d4", + "description": "\u05d4\u05d6\u05df \u05e9\u05dd \u05d7\u05d3\u05e9 \u05dc\u05e9\u05d9\u05d7\u05d4 \u05d6\u05d5", + "form": { + "name": { + "label": "\u05e9\u05dd", + "placeholder": "\u05d4\u05d6\u05df \u05e9\u05dd \u05d7\u05d3\u05e9" + } + }, + "success": "\u05e9\u05dd \u05d4\u05e9\u05d9\u05d7\u05d4 \u05e9\u05d5\u05e0\u05d4!", + "inProgress": "\u05de\u05e9\u05e0\u05d4 \u05e9\u05dd \u05e9\u05d9\u05d7\u05d4" + } + } + } + }, + "navigation": { + "header": { + "chat": "\u05e6'\u05d0\u05d8", + "readme": "\u05e7\u05e8\u05d0 \u05d0\u05d5\u05ea\u05d9", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "\u05e6'\u05d0\u05d8 \u05d7\u05d3\u05e9", + "dialog": { + "title": "\u05e6\u05d5\u05e8 \u05e6'\u05d0\u05d8 \u05d7\u05d3\u05e9", + "description": "\u05e4\u05e2\u05d5\u05dc\u05d4 \u05d6\u05d5 \u05ea\u05e0\u05e7\u05d4 \u05d0\u05ea \u05d4\u05d9\u05e1\u05d8\u05d5\u05e8\u05d9\u05d9\u05ea \u05d4\u05e6'\u05d0\u05d8 \u05d4\u05e0\u05d5\u05db\u05d7\u05d9\u05ea \u05e9\u05dc\u05da. \u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05d1\u05d8\u05d5\u05d7 \u05e9\u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05de\u05e9\u05d9\u05da?", + "tooltip": "\u05e6'\u05d0\u05d8 \u05d7\u05d3\u05e9" + } + }, + "user": { + "menu": { + "settings": "\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea", + "settingsKey": "\u05d4", + "apiKeys": "\u05de\u05e4\u05ea\u05d7\u05d5\u05ea API", + "logout": "\u05d4\u05ea\u05e0\u05ea\u05e7" + } + } + }, + "apiKeys": { + "title": "\u05de\u05e4\u05ea\u05d7\u05d5\u05ea API \u05e0\u05d3\u05e8\u05e9\u05d9\u05dd", + "description": "\u05db\u05d3\u05d9 \u05dc\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05d0\u05e4\u05dc\u05d9\u05e7\u05e6\u05d9\u05d4 \u05d6\u05d5, \u05e0\u05d3\u05e8\u05e9\u05d9\u05dd \u05de\u05e4\u05ea\u05d7\u05d5\u05ea API \u05d4\u05d1\u05d0\u05d9\u05dd. \u05d4\u05de\u05e4\u05ea\u05d7\u05d5\u05ea \u05de\u05d0\u05d5\u05d7\u05e1\u05e0\u05d9\u05dd \u05d1\u05d0\u05d7\u05e1\u05d5\u05df \u05d4\u05de\u05e7\u05d5\u05de\u05d9 \u05e9\u05dc \u05d4\u05de\u05db\u05e9\u05d9\u05e8 \u05e9\u05dc\u05da.", + "success": { + "saved": "\u05e0\u05e9\u05de\u05e8 \u05d1\u05d4\u05e6\u05dc\u05d7\u05d4" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/examples/hf_demo_space/.chainlit/translations/hi.json b/examples/hf_demo_space/.chainlit/translations/hi.json new file mode 100644 index 0000000..d6acccb --- /dev/null +++ b/examples/hf_demo_space/.chainlit/translations/hi.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "\u0930\u0926\u094d\u0926 \u0915\u0930\u0947\u0902", + "confirm": "\u092a\u0941\u0937\u094d\u091f\u093f \u0915\u0930\u0947\u0902", + "continue": "\u091c\u093e\u0930\u0940 \u0930\u0916\u0947\u0902", + "goBack": "\u0935\u093e\u092a\u0938 \u091c\u093e\u090f\u0902", + "reset": "\u0930\u0940\u0938\u0947\u091f \u0915\u0930\u0947\u0902", + "submit": "\u091c\u092e\u093e \u0915\u0930\u0947\u0902" + }, + "status": { + "loading": "\u0932\u094b\u0921 \u0939\u094b \u0930\u0939\u093e \u0939\u0948...", + "error": { + "default": "\u090f\u0915 \u0924\u094d\u0930\u0941\u091f\u093f \u0939\u0941\u0908", + "serverConnection": "\u0938\u0930\u094d\u0935\u0930 \u0938\u0947 \u0938\u0902\u092a\u0930\u094d\u0915 \u0928\u0939\u0940\u0902 \u0939\u094b \u092a\u093e \u0930\u0939\u093e" + } + } + }, + "auth": { + "login": { + "title": "\u0910\u092a \u0915\u093e \u0909\u092a\u092f\u094b\u0917 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f \u0932\u0949\u0917\u093f\u0928 \u0915\u0930\u0947\u0902", + "form": { + "email": { + "label": "\u0908\u092e\u0947\u0932 \u092a\u0924\u093e", + "required": "\u0908\u092e\u0947\u0932 \u090f\u0915 \u0906\u0935\u0936\u094d\u092f\u0915 \u092b\u093c\u0940\u0932\u094d\u0921 \u0939\u0948" + }, + "password": { + "label": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921", + "required": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u090f\u0915 \u0906\u0935\u0936\u094d\u092f\u0915 \u092b\u093c\u0940\u0932\u094d\u0921 \u0939\u0948" + }, + "actions": { + "signin": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0947\u0902" + }, + "alternativeText": { + "or": "\u092f\u093e" + } + }, + "errors": { + "default": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u092e\u0947\u0902 \u0905\u0938\u092e\u0930\u094d\u0925", + "signin": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u093e \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902", + "oauthSignin": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u093e \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902", + "redirectUriMismatch": "\u0930\u0940\u0921\u093e\u092f\u0930\u0947\u0915\u094d\u091f URI oauth \u0910\u092a \u0915\u0949\u0928\u094d\u092b\u093c\u093f\u0917\u0930\u0947\u0936\u0928 \u0938\u0947 \u092e\u0947\u0932 \u0928\u0939\u0940\u0902 \u0916\u093e \u0930\u0939\u093e", + "oauthCallback": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u093e \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902", + "oauthCreateAccount": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u093e \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902", + "emailCreateAccount": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u093e \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902", + "callback": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u093e \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902", + "oauthAccountNotLinked": "\u0905\u092a\u0928\u0940 \u092a\u0939\u091a\u093e\u0928 \u0915\u0940 \u092a\u0941\u0937\u094d\u091f\u093f \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f, \u0909\u0938\u0940 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0947\u0902 \u091c\u093f\u0938\u0915\u093e \u0909\u092a\u092f\u094b\u0917 \u0906\u092a\u0928\u0947 \u092e\u0942\u0932 \u0930\u0942\u092a \u0938\u0947 \u0915\u093f\u092f\u093e \u0925\u093e", + "emailSignin": "\u0908\u092e\u0947\u0932 \u0928\u0939\u0940\u0902 \u092d\u0947\u091c\u093e \u091c\u093e \u0938\u0915\u093e", + "emailVerify": "\u0915\u0943\u092a\u092f\u093e \u0905\u092a\u0928\u093e \u0908\u092e\u0947\u0932 \u0938\u0924\u094d\u092f\u093e\u092a\u093f\u0924 \u0915\u0930\u0947\u0902, \u090f\u0915 \u0928\u092f\u093e \u0908\u092e\u0947\u0932 \u092d\u0947\u091c\u093e \u0917\u092f\u093e \u0939\u0948", + "credentialsSignin": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0935\u093f\u092b\u0932\u0964 \u0906\u092a\u0915\u0947 \u0926\u094d\u0935\u093e\u0930\u093e \u092a\u094d\u0930\u0926\u093e\u0928 \u0915\u093f\u090f \u0917\u090f \u0935\u093f\u0935\u0930\u0923 \u0915\u0940 \u091c\u093e\u0902\u091a \u0915\u0930\u0947\u0902", + "sessionRequired": "\u0907\u0938 \u092a\u0943\u0937\u094d\u0920 \u0924\u0915 \u092a\u0939\u0941\u0902\u091a\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f \u0915\u0943\u092a\u092f\u093e \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0947\u0902" + } + }, + "provider": { + "continue": "{{provider}} \u0915\u0947 \u0938\u093e\u0925 \u091c\u093e\u0930\u0940 \u0930\u0916\u0947\u0902" + } + }, + "chat": { + "input": { + "placeholder": "\u0905\u092a\u0928\u093e \u0938\u0902\u0926\u0947\u0936 \u092f\u0939\u093e\u0902 \u091f\u093e\u0907\u092a \u0915\u0930\u0947\u0902...", + "actions": { + "send": "\u0938\u0902\u0926\u0947\u0936 \u092d\u0947\u091c\u0947\u0902", + "stop": "\u0915\u093e\u0930\u094d\u092f \u0930\u094b\u0915\u0947\u0902", + "attachFiles": "\u092b\u093c\u093e\u0907\u0932\u0947\u0902 \u0938\u0902\u0932\u0917\u094d\u0928 \u0915\u0930\u0947\u0902" + } + }, + "speech": { + "start": "\u0930\u093f\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902", + "stop": "\u0930\u093f\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u0930\u094b\u0915\u0947\u0902", + "connecting": "\u0915\u0928\u0947\u0915\u094d\u091f \u0939\u094b \u0930\u0939\u093e \u0939\u0948" + }, + "fileUpload": { + "dragDrop": "\u092b\u093c\u093e\u0907\u0932\u094b\u0902 \u0915\u094b \u092f\u0939\u093e\u0902 \u0916\u0940\u0902\u091a\u0947\u0902 \u0914\u0930 \u091b\u094b\u0921\u093c\u0947\u0902", + "browse": "\u092b\u093c\u093e\u0907\u0932\u0947\u0902 \u092c\u094d\u0930\u093e\u0909\u091c\u093c \u0915\u0930\u0947\u0902", + "sizeLimit": "\u0938\u0940\u092e\u093e:", + "errors": { + "failed": "\u0905\u092a\u0932\u094b\u0921 \u0915\u0930\u0928\u0947 \u092e\u0947\u0902 \u0935\u093f\u092b\u0932", + "cancelled": "\u0915\u093e \u0905\u092a\u0932\u094b\u0921 \u0930\u0926\u094d\u0926 \u0915\u093f\u092f\u093e \u0917\u092f\u093e" + } + }, + "messages": { + "status": { + "using": "\u0909\u092a\u092f\u094b\u0917 \u0915\u0930 \u0930\u0939\u0947 \u0939\u0948\u0902", + "used": "\u0909\u092a\u092f\u094b\u0917 \u0915\u093f\u092f\u093e" + }, + "actions": { + "copy": { + "button": "\u0915\u094d\u0932\u093f\u092a\u092c\u094b\u0930\u094d\u0921 \u092a\u0930 \u0915\u0949\u092a\u0940 \u0915\u0930\u0947\u0902", + "success": "\u0915\u0949\u092a\u0940 \u0915\u093f\u092f\u093e \u0917\u092f\u093e!" + } + }, + "feedback": { + "positive": "\u0938\u0939\u093e\u092f\u0915", + "negative": "\u0938\u0939\u093e\u092f\u0915 \u0928\u0939\u0940\u0902", + "edit": "\u092a\u094d\u0930\u0924\u093f\u0915\u094d\u0930\u093f\u092f\u093e \u0938\u0902\u092a\u093e\u0926\u093f\u0924 \u0915\u0930\u0947\u0902", + "dialog": { + "title": "\u091f\u093f\u092a\u094d\u092a\u0923\u0940 \u091c\u094b\u0921\u093c\u0947\u0902", + "submit": "\u092a\u094d\u0930\u0924\u093f\u0915\u094d\u0930\u093f\u092f\u093e \u091c\u092e\u093e \u0915\u0930\u0947\u0902" + }, + "status": { + "updating": "\u0905\u092a\u0921\u0947\u091f \u0939\u094b \u0930\u0939\u093e \u0939\u0948", + "updated": "\u092a\u094d\u0930\u0924\u093f\u0915\u094d\u0930\u093f\u092f\u093e \u0905\u092a\u0921\u0947\u091f \u0915\u0940 \u0917\u0908" + } + } + }, + "history": { + "title": "\u092a\u093f\u091b\u0932\u0947 \u0907\u0928\u092a\u0941\u091f", + "empty": "\u0915\u0941\u091b \u092d\u0940 \u0928\u0939\u0940\u0902 \u0939\u0948...", + "show": "\u0907\u0924\u093f\u0939\u093e\u0938 \u0926\u093f\u0916\u093e\u090f\u0902" + }, + "settings": { + "title": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u0938 \u092a\u0948\u0928\u0932" + }, + "watermark": "\u0915\u0947 \u0938\u093e\u0925 \u092c\u0928\u093e\u092f\u093e \u0917\u092f\u093e" + }, + "threadHistory": { + "sidebar": { + "title": "\u092a\u093f\u091b\u0932\u0940 \u091a\u0948\u091f", + "filters": { + "search": "\u0916\u094b\u091c\u0947\u0902", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "\u0906\u091c", + "yesterday": "\u0915\u0932", + "previous7days": "\u092a\u093f\u091b\u0932\u0947 7 \u0926\u093f\u0928", + "previous30days": "\u092a\u093f\u091b\u0932\u0947 30 \u0926\u093f\u0928" + }, + "empty": "\u0915\u094b\u0908 \u0925\u094d\u0930\u0947\u0921 \u0928\u0939\u0940\u0902 \u092e\u093f\u0932\u093e", + "actions": { + "close": "\u0938\u093e\u0907\u0921\u092c\u093e\u0930 \u092c\u0902\u0926 \u0915\u0930\u0947\u0902", + "open": "\u0938\u093e\u0907\u0921\u092c\u093e\u0930 \u0916\u094b\u0932\u0947\u0902" + } + }, + "thread": { + "untitled": "\u0936\u0940\u0930\u094d\u0937\u0915\u0939\u0940\u0928 \u0935\u093e\u0930\u094d\u0924\u093e\u0932\u093e\u092a", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "\u0939\u091f\u093e\u0928\u0947 \u0915\u0940 \u092a\u0941\u0937\u094d\u091f\u093f \u0915\u0930\u0947\u0902", + "description": "\u092f\u0939 \u0925\u094d\u0930\u0947\u0921 \u0914\u0930 \u0907\u0938\u0915\u0947 \u0938\u0902\u0926\u0947\u0936\u094b\u0902 \u0914\u0930 \u0924\u0924\u094d\u0935\u094b\u0902 \u0915\u094b \u0939\u091f\u093e \u0926\u0947\u0917\u093e\u0964 \u092f\u0939 \u0915\u094d\u0930\u093f\u092f\u093e \u0935\u093e\u092a\u0938 \u0928\u0939\u0940\u0902 \u0915\u0940 \u091c\u093e \u0938\u0915\u0924\u0940", + "success": "\u091a\u0948\u091f \u0939\u091f\u093e \u0926\u0940 \u0917\u0908", + "inProgress": "\u091a\u0948\u091f \u0939\u091f\u093e\u0908 \u091c\u093e \u0930\u0939\u0940 \u0939\u0948" + }, + "rename": { + "title": "\u0925\u094d\u0930\u0947\u0921 \u0915\u093e \u0928\u093e\u092e \u092c\u0926\u0932\u0947\u0902", + "description": "\u0907\u0938 \u0925\u094d\u0930\u0947\u0921 \u0915\u0947 \u0932\u093f\u090f \u090f\u0915 \u0928\u092f\u093e \u0928\u093e\u092e \u0926\u0930\u094d\u091c \u0915\u0930\u0947\u0902", + "form": { + "name": { + "label": "\u0928\u093e\u092e", + "placeholder": "\u0928\u092f\u093e \u0928\u093e\u092e \u0926\u0930\u094d\u091c \u0915\u0930\u0947\u0902" + } + }, + "success": "\u0925\u094d\u0930\u0947\u0921 \u0915\u093e \u0928\u093e\u092e \u092c\u0926\u0932 \u0926\u093f\u092f\u093e \u0917\u092f\u093e!", + "inProgress": "\u0925\u094d\u0930\u0947\u0921 \u0915\u093e \u0928\u093e\u092e \u092c\u0926\u0932\u093e \u091c\u093e \u0930\u0939\u093e \u0939\u0948" + } + } + } + }, + "navigation": { + "header": { + "chat": "\u091a\u0948\u091f", + "readme": "\u0930\u0940\u0921\u092e\u0940", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "\u0928\u0908 \u091a\u0948\u091f", + "dialog": { + "title": "\u0928\u0908 \u091a\u0948\u091f \u092c\u0928\u093e\u090f\u0902", + "description": "\u092f\u0939 \u0906\u092a\u0915\u093e \u0935\u0930\u094d\u0924\u092e\u093e\u0928 \u091a\u0948\u091f \u0907\u0924\u093f\u0939\u093e\u0938 \u0938\u093e\u092b\u093c \u0915\u0930 \u0926\u0947\u0917\u093e\u0964 \u0915\u094d\u092f\u093e \u0906\u092a \u091c\u093e\u0930\u0940 \u0930\u0916\u0928\u093e \u091a\u093e\u0939\u0924\u0947 \u0939\u0948\u0902?", + "tooltip": "\u0928\u0908 \u091a\u0948\u091f" + } + }, + "user": { + "menu": { + "settings": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u0938", + "settingsKey": "S", + "apiKeys": "API \u0915\u0941\u0902\u091c\u093f\u092f\u093e\u0902", + "logout": "\u0932\u0949\u0917\u0906\u0909\u091f" + } + } + }, + "apiKeys": { + "title": "\u0906\u0935\u0936\u094d\u092f\u0915 API \u0915\u0941\u0902\u091c\u093f\u092f\u093e\u0902", + "description": "\u0907\u0938 \u0910\u092a \u0915\u093e \u0909\u092a\u092f\u094b\u0917 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f, \u0928\u093f\u092e\u094d\u0928\u0932\u093f\u0916\u093f\u0924 API \u0915\u0941\u0902\u091c\u093f\u092f\u093e\u0902 \u0906\u0935\u0936\u094d\u092f\u0915 \u0939\u0948\u0902\u0964 \u0915\u0941\u0902\u091c\u093f\u092f\u093e\u0902 \u0906\u092a\u0915\u0947 \u0921\u093f\u0935\u093e\u0907\u0938 \u0915\u0947 \u0938\u094d\u0925\u093e\u0928\u0940\u092f \u0938\u0902\u0917\u094d\u0930\u0939\u0923 \u092e\u0947\u0902 \u0938\u0902\u0917\u094d\u0930\u0939\u0940\u0924 \u0915\u0940 \u091c\u093e\u0924\u0940 \u0939\u0948\u0902\u0964", + "success": { + "saved": "\u0938\u092b\u0932\u0924\u093e\u092a\u0942\u0930\u094d\u0935\u0915 \u0938\u0939\u0947\u091c\u093e \u0917\u092f\u093e" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/examples/hf_demo_space/.chainlit/translations/ja.json b/examples/hf_demo_space/.chainlit/translations/ja.json new file mode 100644 index 0000000..343ee37 --- /dev/null +++ b/examples/hf_demo_space/.chainlit/translations/ja.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "\u30ad\u30e3\u30f3\u30bb\u30eb", + "confirm": "\u78ba\u8a8d", + "continue": "\u7d9a\u3051\u308b", + "goBack": "\u623b\u308b", + "reset": "\u30ea\u30bb\u30c3\u30c8", + "submit": "\u9001\u4fe1" + }, + "status": { + "loading": "\u8aad\u307f\u8fbc\u307f\u4e2d...", + "error": { + "default": "\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f", + "serverConnection": "\u30b5\u30fc\u30d0\u30fc\u306b\u63a5\u7d9a\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f" + } + } + }, + "auth": { + "login": { + "title": "\u30a2\u30d7\u30ea\u306b\u30ed\u30b0\u30a4\u30f3", + "form": { + "email": { + "label": "\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9", + "required": "\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306f\u5fc5\u9808\u9805\u76ee\u3067\u3059" + }, + "password": { + "label": "\u30d1\u30b9\u30ef\u30fc\u30c9", + "required": "\u30d1\u30b9\u30ef\u30fc\u30c9\u306f\u5fc5\u9808\u9805\u76ee\u3067\u3059" + }, + "actions": { + "signin": "\u30b5\u30a4\u30f3\u30a4\u30f3" + }, + "alternativeText": { + "or": "\u307e\u305f\u306f" + } + }, + "errors": { + "default": "\u30b5\u30a4\u30f3\u30a4\u30f3\u3067\u304d\u307e\u305b\u3093", + "signin": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044", + "oauthSignin": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044", + "redirectUriMismatch": "\u30ea\u30c0\u30a4\u30ec\u30af\u30c8URI\u304cOAuth\u30a2\u30d7\u30ea\u306e\u8a2d\u5b9a\u3068\u4e00\u81f4\u3057\u307e\u305b\u3093", + "oauthCallback": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044", + "oauthCreateAccount": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044", + "emailCreateAccount": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044", + "callback": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044", + "oauthAccountNotLinked": "\u672c\u4eba\u78ba\u8a8d\u306e\u305f\u3081\u3001\u6700\u521d\u306b\u4f7f\u7528\u3057\u305f\u306e\u3068\u540c\u3058\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044", + "emailSignin": "\u30e1\u30fc\u30eb\u3092\u9001\u4fe1\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f", + "emailVerify": "\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u65b0\u3057\u3044\u30e1\u30fc\u30eb\u304c\u9001\u4fe1\u3055\u308c\u307e\u3057\u305f", + "credentialsSignin": "\u30b5\u30a4\u30f3\u30a4\u30f3\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u5165\u529b\u3057\u305f\u60c5\u5831\u304c\u6b63\u3057\u3044\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044", + "sessionRequired": "\u3053\u306e\u30da\u30fc\u30b8\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u306b\u306f\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044" + } + }, + "provider": { + "continue": "{{provider}}\u3067\u7d9a\u3051\u308b" + } + }, + "chat": { + "input": { + "placeholder": "\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044...", + "actions": { + "send": "\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u4fe1", + "stop": "\u30bf\u30b9\u30af\u3092\u505c\u6b62", + "attachFiles": "\u30d5\u30a1\u30a4\u30eb\u3092\u6dfb\u4ed8" + } + }, + "speech": { + "start": "\u9332\u97f3\u958b\u59cb", + "stop": "\u9332\u97f3\u505c\u6b62", + "connecting": "\u63a5\u7d9a\u4e2d" + }, + "fileUpload": { + "dragDrop": "\u3053\u3053\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u30c9\u30e9\u30c3\u30b0\uff06\u30c9\u30ed\u30c3\u30d7", + "browse": "\u30d5\u30a1\u30a4\u30eb\u3092\u53c2\u7167", + "sizeLimit": "\u5236\u9650\uff1a", + "errors": { + "failed": "\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u306b\u5931\u6557\u3057\u307e\u3057\u305f", + "cancelled": "\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3092\u30ad\u30e3\u30f3\u30bb\u30eb\u3057\u307e\u3057\u305f\uff1a" + } + }, + "messages": { + "status": { + "using": "\u4f7f\u7528\u4e2d", + "used": "\u4f7f\u7528\u6e08\u307f" + }, + "actions": { + "copy": { + "button": "\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc", + "success": "\u30b3\u30d4\u30fc\u3057\u307e\u3057\u305f\uff01" + } + }, + "feedback": { + "positive": "\u5f79\u306b\u7acb\u3063\u305f", + "negative": "\u5f79\u306b\u7acb\u305f\u306a\u304b\u3063\u305f", + "edit": "\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3092\u7de8\u96c6", + "dialog": { + "title": "\u30b3\u30e1\u30f3\u30c8\u3092\u8ffd\u52a0", + "submit": "\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3092\u9001\u4fe1" + }, + "status": { + "updating": "\u66f4\u65b0\u4e2d", + "updated": "\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3092\u66f4\u65b0\u3057\u307e\u3057\u305f" + } + } + }, + "history": { + "title": "\u6700\u8fd1\u306e\u5165\u529b", + "empty": "\u4f55\u3082\u3042\u308a\u307e\u305b\u3093...", + "show": "\u5c65\u6b74\u3092\u8868\u793a" + }, + "settings": { + "title": "\u8a2d\u5b9a\u30d1\u30cd\u30eb" + }, + "watermark": "\u958b\u767a\u5143\uff1a" + }, + "threadHistory": { + "sidebar": { + "title": "\u904e\u53bb\u306e\u30c1\u30e3\u30c3\u30c8", + "filters": { + "search": "\u691c\u7d22", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "\u4eca\u65e5", + "yesterday": "\u6628\u65e5", + "previous7days": "\u904e\u53bb7\u65e5\u9593", + "previous30days": "\u904e\u53bb30\u65e5\u9593" + }, + "empty": "\u30b9\u30ec\u30c3\u30c9\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093", + "actions": { + "close": "\u30b5\u30a4\u30c9\u30d0\u30fc\u3092\u9589\u3058\u308b", + "open": "\u30b5\u30a4\u30c9\u30d0\u30fc\u3092\u958b\u304f" + } + }, + "thread": { + "untitled": "\u7121\u984c\u306e\u4f1a\u8a71", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "\u524a\u9664\u306e\u78ba\u8a8d", + "description": "\u3053\u306e\u30b9\u30ec\u30c3\u30c9\u3068\u305d\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u3001\u8981\u7d20\u304c\u524a\u9664\u3055\u308c\u307e\u3059\u3002\u3053\u306e\u64cd\u4f5c\u306f\u53d6\u308a\u6d88\u305b\u307e\u305b\u3093", + "success": "\u30c1\u30e3\u30c3\u30c8\u3092\u524a\u9664\u3057\u307e\u3057\u305f", + "inProgress": "\u30c1\u30e3\u30c3\u30c8\u3092\u524a\u9664\u4e2d" + }, + "rename": { + "title": "\u30b9\u30ec\u30c3\u30c9\u306e\u540d\u524d\u3092\u5909\u66f4", + "description": "\u3053\u306e\u30b9\u30ec\u30c3\u30c9\u306e\u65b0\u3057\u3044\u540d\u524d\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044", + "form": { + "name": { + "label": "\u540d\u524d", + "placeholder": "\u65b0\u3057\u3044\u540d\u524d\u3092\u5165\u529b" + } + }, + "success": "\u30b9\u30ec\u30c3\u30c9\u540d\u3092\u5909\u66f4\u3057\u307e\u3057\u305f\uff01", + "inProgress": "\u30b9\u30ec\u30c3\u30c9\u540d\u3092\u5909\u66f4\u4e2d" + } + } + } + }, + "navigation": { + "header": { + "chat": "\u30c1\u30e3\u30c3\u30c8", + "readme": "\u8aac\u660e\u66f8", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "\u65b0\u898f\u30c1\u30e3\u30c3\u30c8", + "dialog": { + "title": "\u65b0\u898f\u30c1\u30e3\u30c3\u30c8\u306e\u4f5c\u6210", + "description": "\u73fe\u5728\u306e\u30c1\u30e3\u30c3\u30c8\u5c65\u6b74\u304c\u30af\u30ea\u30a2\u3055\u308c\u307e\u3059\u3002\u7d9a\u884c\u3057\u307e\u3059\u304b\uff1f", + "tooltip": "\u65b0\u898f\u30c1\u30e3\u30c3\u30c8" + } + }, + "user": { + "menu": { + "settings": "\u8a2d\u5b9a", + "settingsKey": "S", + "apiKeys": "API\u30ad\u30fc", + "logout": "\u30ed\u30b0\u30a2\u30a6\u30c8" + } + } + }, + "apiKeys": { + "title": "\u5fc5\u8981\u306aAPI\u30ad\u30fc", + "description": "\u3053\u306e\u30a2\u30d7\u30ea\u3092\u4f7f\u7528\u3059\u308b\u306b\u306f\u3001\u4ee5\u4e0b\u306eAPI\u30ad\u30fc\u304c\u5fc5\u8981\u3067\u3059\u3002\u30ad\u30fc\u306f\u304a\u4f7f\u3044\u306e\u30c7\u30d0\u30a4\u30b9\u306e\u30ed\u30fc\u30ab\u30eb\u30b9\u30c8\u30ec\u30fc\u30b8\u306b\u4fdd\u5b58\u3055\u308c\u307e\u3059\u3002", + "success": { + "saved": "\u4fdd\u5b58\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/examples/hf_demo_space/.chainlit/translations/kn.json b/examples/hf_demo_space/.chainlit/translations/kn.json new file mode 100644 index 0000000..c8ffabc --- /dev/null +++ b/examples/hf_demo_space/.chainlit/translations/kn.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "\u0cb0\u0ca6\u0ccd\u0ca6\u0cc1\u0cae\u0cbe\u0ca1\u0cbf", + "confirm": "\u0ca6\u0cc3\u0ca2\u0cc0\u0c95\u0cb0\u0cbf\u0cb8\u0cbf", + "continue": "\u0cae\u0cc1\u0c82\u0ca6\u0cc1\u0cb5\u0cb0\u0cbf\u0cb8\u0cbf", + "goBack": "\u0cb9\u0cbf\u0c82\u0ca6\u0cc6 \u0cb9\u0ccb\u0c97\u0cbf", + "reset": "\u0cae\u0cb0\u0cc1\u0cb9\u0cca\u0c82\u0ca6\u0cbf\u0cb8\u0cbf", + "submit": "\u0cb8\u0cb2\u0ccd\u0cb2\u0cbf\u0cb8\u0cbf" + }, + "status": { + "loading": "\u0cb2\u0ccb\u0ca1\u0ccd \u0c86\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0ca6\u0cc6...", + "error": { + "default": "\u0ca6\u0ccb\u0cb7 \u0cb8\u0c82\u0cad\u0cb5\u0cbf\u0cb8\u0cbf\u0ca6\u0cc6", + "serverConnection": "\u0cb8\u0cb0\u0ccd\u0cb5\u0cb0\u0ccd\u200c \u0c85\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca4\u0cb2\u0cc1\u0caa\u0cb2\u0cc1 \u0cb8\u0cbe\u0ca7\u0ccd\u0caf\u0cb5\u0cbe\u0c97\u0cb2\u0cbf\u0cb2\u0ccd\u0cb2" + } + } + }, + "auth": { + "login": { + "title": "\u0c85\u0caa\u0ccd\u0cb2\u0cbf\u0c95\u0cc7\u0cb6\u0ca8\u0ccd\u200c\u0c97\u0cc6 \u0caa\u0ccd\u0cb0\u0cb5\u0cc7\u0cb6\u0cbf\u0cb8\u0cb2\u0cc1 \u0cb2\u0cbe\u0c97\u0cbf\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cbf", + "form": { + "email": { + "label": "\u0c87\u0cae\u0cc7\u0cb2\u0ccd \u0cb5\u0cbf\u0cb3\u0cbe\u0cb8", + "required": "\u0c87\u0cae\u0cc7\u0cb2\u0ccd \u0c85\u0c97\u0ca4\u0ccd\u0caf\u0cb5\u0cbf\u0cb0\u0cc1\u0cb5 \u0c95\u0ccd\u0cb7\u0cc7\u0ca4\u0ccd\u0cb0" + }, + "password": { + "label": "\u0caa\u0cbe\u0cb8\u0ccd\u200c\u0cb5\u0cb0\u0ccd\u0ca1\u0ccd", + "required": "\u0caa\u0cbe\u0cb8\u0ccd\u200c\u0cb5\u0cb0\u0ccd\u0ca1\u0ccd \u0c85\u0c97\u0ca4\u0ccd\u0caf\u0cb5\u0cbf\u0cb0\u0cc1\u0cb5 \u0c95\u0ccd\u0cb7\u0cc7\u0ca4\u0ccd\u0cb0" + }, + "actions": { + "signin": "\u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cbf" + }, + "alternativeText": { + "or": "\u0c85\u0ca5\u0cb5\u0cbe" + } + }, + "errors": { + "default": "\u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0cb8\u0cbe\u0ca7\u0ccd\u0caf\u0cb5\u0cbe\u0c97\u0cb2\u0cbf\u0cb2\u0ccd\u0cb2", + "signin": "\u0cac\u0cc7\u0cb0\u0cc6 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0caa\u0ccd\u0cb0\u0caf\u0ca4\u0ccd\u0ca8\u0cbf\u0cb8\u0cbf", + "oauthSignin": "\u0cac\u0cc7\u0cb0\u0cc6 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0caa\u0ccd\u0cb0\u0caf\u0ca4\u0ccd\u0ca8\u0cbf\u0cb8\u0cbf", + "redirectUriMismatch": "\u0cb0\u0cc0\u0ca1\u0cc8\u0cb0\u0cc6\u0c95\u0ccd\u0c9f\u0ccd URI \u0c93\u0ca5\u0ccd \u0c85\u0caa\u0ccd\u0cb2\u0cbf\u0c95\u0cc7\u0cb6\u0ca8\u0ccd \u0c95\u0cbe\u0ca8\u0ccd\u0cab\u0cbf\u0c97\u0cb0\u0cc7\u0cb6\u0ca8\u0ccd\u200c\u0c97\u0cc6 \u0cb9\u0cca\u0c82\u0ca6\u0cbf\u0c95\u0cc6\u0caf\u0cbe\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0cb2\u0ccd\u0cb2", + "oauthCallback": "\u0cac\u0cc7\u0cb0\u0cc6 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0caa\u0ccd\u0cb0\u0caf\u0ca4\u0ccd\u0ca8\u0cbf\u0cb8\u0cbf", + "oauthCreateAccount": "\u0cac\u0cc7\u0cb0\u0cc6 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0caa\u0ccd\u0cb0\u0caf\u0ca4\u0ccd\u0ca8\u0cbf\u0cb8\u0cbf", + "emailCreateAccount": "\u0cac\u0cc7\u0cb0\u0cc6 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0caa\u0ccd\u0cb0\u0caf\u0ca4\u0ccd\u0ca8\u0cbf\u0cb8\u0cbf", + "callback": "\u0cac\u0cc7\u0cb0\u0cc6 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0caa\u0ccd\u0cb0\u0caf\u0ca4\u0ccd\u0ca8\u0cbf\u0cb8\u0cbf", + "oauthAccountNotLinked": "\u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0c97\u0cc1\u0cb0\u0cc1\u0ca4\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca6\u0cc3\u0ca2\u0cc0\u0c95\u0cb0\u0cbf\u0cb8\u0cb2\u0cc1, \u0ca8\u0cc0\u0cb5\u0cc1 \u0cae\u0cca\u0ca6\u0cb2\u0cc1 \u0cac\u0cb3\u0cb8\u0cbf\u0ca6 \u0c85\u0ca6\u0cc7 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cbf", + "emailSignin": "\u0c87\u0cae\u0cc7\u0cb2\u0ccd \u0c95\u0cb3\u0cc1\u0cb9\u0cbf\u0cb8\u0cb2\u0cc1 \u0cb8\u0cbe\u0ca7\u0ccd\u0caf\u0cb5\u0cbe\u0c97\u0cb2\u0cbf\u0cb2\u0ccd\u0cb2", + "emailVerify": "\u0ca6\u0caf\u0cb5\u0cbf\u0c9f\u0ccd\u0c9f\u0cc1 \u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0c87\u0cae\u0cc7\u0cb2\u0ccd \u0caa\u0cb0\u0cbf\u0cb6\u0cc0\u0cb2\u0cbf\u0cb8\u0cbf, \u0cb9\u0cca\u0cb8 \u0c87\u0cae\u0cc7\u0cb2\u0ccd \u0c95\u0cb3\u0cc1\u0cb9\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6", + "credentialsSignin": "\u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cb5\u0cbf\u0cab\u0cb2\u0cb5\u0cbe\u0c97\u0cbf\u0ca6\u0cc6. \u0ca8\u0cc0\u0cb5\u0cc1 \u0c92\u0ca6\u0c97\u0cbf\u0cb8\u0cbf\u0ca6 \u0cb5\u0cbf\u0cb5\u0cb0\u0c97\u0cb3\u0cc1 \u0cb8\u0cb0\u0cbf\u0caf\u0cbe\u0c97\u0cbf\u0cb5\u0cc6\u0caf\u0cc7 \u0c8e\u0c82\u0ca6\u0cc1 \u0caa\u0cb0\u0cbf\u0cb6\u0cc0\u0cb2\u0cbf\u0cb8\u0cbf", + "sessionRequired": "\u0c88 \u0caa\u0cc1\u0c9f\u0cb5\u0ca8\u0ccd\u0ca8\u0cc1 \u0caa\u0ccd\u0cb0\u0cb5\u0cc7\u0cb6\u0cbf\u0cb8\u0cb2\u0cc1 \u0ca6\u0caf\u0cb5\u0cbf\u0c9f\u0ccd\u0c9f\u0cc1 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cbf" + } + }, + "provider": { + "continue": "{{provider}} \u0ca8\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cae\u0cc1\u0c82\u0ca6\u0cc1\u0cb5\u0cb0\u0cbf\u0cb8\u0cbf" + } + }, + "chat": { + "input": { + "placeholder": "\u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0cb8\u0c82\u0ca6\u0cc7\u0cb6\u0cb5\u0ca8\u0ccd\u0ca8\u0cc1 \u0c87\u0cb2\u0ccd\u0cb2\u0cbf \u0c9f\u0cc8\u0caa\u0ccd \u0cae\u0cbe\u0ca1\u0cbf...", + "actions": { + "send": "\u0cb8\u0c82\u0ca6\u0cc7\u0cb6 \u0c95\u0cb3\u0cc1\u0cb9\u0cbf\u0cb8\u0cbf", + "stop": "\u0c95\u0cbe\u0cb0\u0ccd\u0caf \u0ca8\u0cbf\u0cb2\u0ccd\u0cb2\u0cbf\u0cb8\u0cbf", + "attachFiles": "\u0cab\u0cc8\u0cb2\u0ccd\u200c\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0cb2\u0c97\u0ca4\u0ccd\u0ca4\u0cbf\u0cb8\u0cbf" + } + }, + "speech": { + "start": "\u0cb0\u0cc6\u0c95\u0cbe\u0cb0\u0ccd\u0ca1\u0cbf\u0c82\u0c97\u0ccd \u0caa\u0ccd\u0cb0\u0cbe\u0cb0\u0c82\u0cad\u0cbf\u0cb8\u0cbf", + "stop": "\u0cb0\u0cc6\u0c95\u0cbe\u0cb0\u0ccd\u0ca1\u0cbf\u0c82\u0c97\u0ccd \u0ca8\u0cbf\u0cb2\u0ccd\u0cb2\u0cbf\u0cb8\u0cbf", + "connecting": "\u0cb8\u0c82\u0caa\u0cb0\u0ccd\u0c95\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0ca6\u0cc6" + }, + "fileUpload": { + "dragDrop": "\u0cab\u0cc8\u0cb2\u0ccd\u200c\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0c87\u0cb2\u0ccd\u0cb2\u0cbf \u0c8e\u0cb3\u0cc6\u0ca6\u0cc1 \u0cac\u0cbf\u0ca1\u0cbf", + "browse": "\u0cab\u0cc8\u0cb2\u0ccd\u200c\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0cac\u0ccd\u0cb0\u0ccc\u0cb8\u0ccd \u0cae\u0cbe\u0ca1\u0cbf", + "sizeLimit": "\u0cae\u0cbf\u0ca4\u0cbf:", + "errors": { + "failed": "\u0c85\u0caa\u0ccd\u200c\u0cb2\u0ccb\u0ca1\u0ccd \u0cb5\u0cbf\u0cab\u0cb2\u0cb5\u0cbe\u0c97\u0cbf\u0ca6\u0cc6", + "cancelled": "\u0c85\u0caa\u0ccd\u200c\u0cb2\u0ccb\u0ca1\u0ccd \u0cb0\u0ca6\u0ccd\u0ca6\u0cc1\u0c97\u0cca\u0cb3\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6" + } + }, + "messages": { + "status": { + "using": "\u0cac\u0cb3\u0cb8\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0cb0\u0cc1\u0cb5\u0cc1\u0ca6\u0cc1", + "used": "\u0cac\u0cb3\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6" + }, + "actions": { + "copy": { + "button": "\u0c95\u0ccd\u0cb2\u0cbf\u0caa\u0ccd\u200c\u0cac\u0ccb\u0cb0\u0ccd\u0ca1\u0ccd\u200c\u0c97\u0cc6 \u0ca8\u0c95\u0cb2\u0cbf\u0cb8\u0cbf", + "success": "\u0ca8\u0c95\u0cb2\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6!" + } + }, + "feedback": { + "positive": "\u0cb8\u0cb9\u0cbe\u0caf\u0c95\u0cb5\u0cbe\u0c97\u0cbf\u0ca6\u0cc6", + "negative": "\u0cb8\u0cb9\u0cbe\u0caf\u0c95\u0cb5\u0cbe\u0c97\u0cbf\u0cb2\u0ccd\u0cb2", + "edit": "\u0caa\u0ccd\u0cb0\u0ca4\u0cbf\u0c95\u0ccd\u0cb0\u0cbf\u0caf\u0cc6 \u0cb8\u0c82\u0caa\u0cbe\u0ca6\u0cbf\u0cb8\u0cbf", + "dialog": { + "title": "\u0c95\u0cbe\u0cae\u0cc6\u0c82\u0c9f\u0ccd \u0cb8\u0cc7\u0cb0\u0cbf\u0cb8\u0cbf", + "submit": "\u0caa\u0ccd\u0cb0\u0ca4\u0cbf\u0c95\u0ccd\u0cb0\u0cbf\u0caf\u0cc6 \u0cb8\u0cb2\u0ccd\u0cb2\u0cbf\u0cb8\u0cbf" + }, + "status": { + "updating": "\u0ca8\u0cb5\u0cc0\u0c95\u0cb0\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0ca6\u0cc6", + "updated": "\u0caa\u0ccd\u0cb0\u0ca4\u0cbf\u0c95\u0ccd\u0cb0\u0cbf\u0caf\u0cc6 \u0ca8\u0cb5\u0cc0\u0c95\u0cb0\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6" + } + } + }, + "history": { + "title": "\u0c95\u0cca\u0ca8\u0cc6\u0caf \u0c87\u0ca8\u0ccd\u200c\u0caa\u0cc1\u0c9f\u0ccd\u200c\u0c97\u0cb3\u0cc1", + "empty": "\u0c96\u0cbe\u0cb2\u0cbf\u0caf\u0cbe\u0c97\u0cbf\u0ca6\u0cc6...", + "show": "\u0c87\u0ca4\u0cbf\u0cb9\u0cbe\u0cb8 \u0ca4\u0ccb\u0cb0\u0cbf\u0cb8\u0cbf" + }, + "settings": { + "title": "\u0cb8\u0cc6\u0c9f\u0ccd\u0c9f\u0cbf\u0c82\u0c97\u0ccd\u200c\u0c97\u0cb3 \u0caa\u0ccd\u0caf\u0cbe\u0ca8\u0cc6\u0cb2\u0ccd" + }, + "watermark": "\u0c87\u0ca6\u0cb0\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0ca8\u0cbf\u0cb0\u0ccd\u0cae\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6" + }, + "threadHistory": { + "sidebar": { + "title": "\u0cb9\u0cbf\u0c82\u0ca6\u0cbf\u0ca8 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0c97\u0cb3\u0cc1", + "filters": { + "search": "\u0cb9\u0cc1\u0ca1\u0cc1\u0c95\u0cbf", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "\u0c87\u0c82\u0ca6\u0cc1", + "yesterday": "\u0ca8\u0cbf\u0ca8\u0ccd\u0ca8\u0cc6", + "previous7days": "\u0cb9\u0cbf\u0c82\u0ca6\u0cbf\u0ca8 7 \u0ca6\u0cbf\u0ca8\u0c97\u0cb3\u0cc1", + "previous30days": "\u0cb9\u0cbf\u0c82\u0ca6\u0cbf\u0ca8 30 \u0ca6\u0cbf\u0ca8\u0c97\u0cb3\u0cc1" + }, + "empty": "\u0caf\u0cbe\u0cb5\u0cc1\u0ca6\u0cc7 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0c97\u0cb3\u0cc1 \u0c95\u0c82\u0ca1\u0cc1\u0cac\u0c82\u0ca6\u0cbf\u0cb2\u0ccd\u0cb2", + "actions": { + "close": "\u0caa\u0c95\u0ccd\u0c95\u0ca6 \u0caa\u0c9f\u0ccd\u0c9f\u0cbf \u0cae\u0cc1\u0c9a\u0ccd\u0c9a\u0cbf", + "open": "\u0caa\u0c95\u0ccd\u0c95\u0ca6 \u0caa\u0c9f\u0ccd\u0c9f\u0cbf \u0ca4\u0cc6\u0cb0\u0cc6\u0caf\u0cbf\u0cb0\u0cbf" + } + }, + "thread": { + "untitled": "\u0cb6\u0cc0\u0cb0\u0ccd\u0cb7\u0cbf\u0c95\u0cc6\u0cb0\u0cb9\u0cbf\u0ca4 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "\u0c85\u0cb3\u0cbf\u0cb8\u0cc1\u0cb5\u0cbf\u0c95\u0cc6\u0caf\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca6\u0cc3\u0ca2\u0cc0\u0c95\u0cb0\u0cbf\u0cb8\u0cbf", + "description": "\u0c87\u0ca6\u0cc1 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0caf\u0ca8\u0ccd\u0ca8\u0cc1 \u0cb9\u0cbe\u0c97\u0cc2 \u0c85\u0ca6\u0cb0 \u0cb8\u0c82\u0ca6\u0cc7\u0cb6\u0c97\u0cb3\u0cc1 \u0cae\u0ca4\u0ccd\u0ca4\u0cc1 \u0c85\u0c82\u0cb6\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0c85\u0cb3\u0cbf\u0cb8\u0cc1\u0ca4\u0ccd\u0ca4\u0ca6\u0cc6. \u0c88 \u0c95\u0ccd\u0cb0\u0cbf\u0caf\u0cc6\u0caf\u0ca8\u0ccd\u0ca8\u0cc1 \u0cb0\u0ca6\u0ccd\u0ca6\u0cc1\u0c97\u0cca\u0cb3\u0cbf\u0cb8\u0cb2\u0cc1 \u0cb8\u0cbe\u0ca7\u0ccd\u0caf\u0cb5\u0cbf\u0cb2\u0ccd\u0cb2", + "success": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6 \u0c85\u0cb3\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6", + "inProgress": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6 \u0c85\u0cb3\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0ca6\u0cc6" + }, + "rename": { + "title": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0caf \u0cb9\u0cc6\u0cb8\u0cb0\u0cc1 \u0cac\u0ca6\u0cb2\u0cbe\u0caf\u0cbf\u0cb8\u0cbf", + "description": "\u0c88 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0c97\u0cc6 \u0cb9\u0cca\u0cb8 \u0cb9\u0cc6\u0cb8\u0cb0\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca8\u0cae\u0cc2\u0ca6\u0cbf\u0cb8\u0cbf", + "form": { + "name": { + "label": "\u0cb9\u0cc6\u0cb8\u0cb0\u0cc1", + "placeholder": "\u0cb9\u0cca\u0cb8 \u0cb9\u0cc6\u0cb8\u0cb0\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca8\u0cae\u0cc2\u0ca6\u0cbf\u0cb8\u0cbf" + } + }, + "success": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0caf \u0cb9\u0cc6\u0cb8\u0cb0\u0cc1 \u0cac\u0ca6\u0cb2\u0cbe\u0caf\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6!", + "inProgress": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0caf \u0cb9\u0cc6\u0cb8\u0cb0\u0cc1 \u0cac\u0ca6\u0cb2\u0cbe\u0caf\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0ca6\u0cc6" + } + } + } + }, + "navigation": { + "header": { + "chat": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6", + "readme": "\u0c93\u0ca6\u0cbf", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "\u0cb9\u0cca\u0cb8 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6", + "dialog": { + "title": "\u0cb9\u0cca\u0cb8 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6 \u0cb0\u0c9a\u0cbf\u0cb8\u0cbf", + "description": "\u0c87\u0ca6\u0cc1 \u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0caa\u0ccd\u0cb0\u0cb8\u0ccd\u0ca4\u0cc1\u0ca4 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0caf \u0c87\u0ca4\u0cbf\u0cb9\u0cbe\u0cb8\u0cb5\u0ca8\u0ccd\u0ca8\u0cc1 \u0c85\u0cb3\u0cbf\u0cb8\u0cc1\u0ca4\u0ccd\u0ca4\u0ca6\u0cc6. \u0ca8\u0cc0\u0cb5\u0cc1 \u0cae\u0cc1\u0c82\u0ca6\u0cc1\u0cb5\u0cb0\u0cc6\u0caf\u0cb2\u0cc1 \u0cac\u0caf\u0cb8\u0cc1\u0cb5\u0cbf\u0cb0\u0cbe?", + "tooltip": "\u0cb9\u0cca\u0cb8 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6" + } + }, + "user": { + "menu": { + "settings": "\u0cb8\u0cc6\u0c9f\u0ccd\u0c9f\u0cbf\u0c82\u0c97\u0ccd\u200c\u0c97\u0cb3\u0cc1", + "settingsKey": "S", + "apiKeys": "API \u0c95\u0cc0\u0c97\u0cb3\u0cc1", + "logout": "\u0cb2\u0cbe\u0c97\u0ccd \u0c94\u0c9f\u0ccd" + } + } + }, + "apiKeys": { + "title": "\u0c85\u0c97\u0ca4\u0ccd\u0caf\u0cb5\u0cbf\u0cb0\u0cc1\u0cb5 API \u0c95\u0cc0\u0c97\u0cb3\u0cc1", + "description": "\u0c88 \u0c85\u0caa\u0ccd\u0cb2\u0cbf\u0c95\u0cc7\u0cb6\u0ca8\u0ccd \u0cac\u0cb3\u0cb8\u0cb2\u0cc1, \u0c88 \u0c95\u0cc6\u0cb3\u0c97\u0cbf\u0ca8 API \u0c95\u0cc0\u0c97\u0cb3\u0cc1 \u0c85\u0c97\u0ca4\u0ccd\u0caf\u0cb5\u0cbf\u0cb0\u0cc1\u0ca4\u0ccd\u0ca4\u0cb5\u0cc6. \u0c95\u0cc0\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0cb8\u0cbe\u0ca7\u0ca8\u0ca6 \u0cb8\u0ccd\u0ca5\u0cb3\u0cc0\u0caf \u0cb8\u0c82\u0c97\u0ccd\u0cb0\u0cb9\u0ca3\u0cc6\u0caf\u0cb2\u0ccd\u0cb2\u0cbf \u0cb8\u0c82\u0c97\u0ccd\u0cb0\u0cb9\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0ca6\u0cc6.", + "success": { + "saved": "\u0caf\u0cb6\u0cb8\u0ccd\u0cb5\u0cbf\u0caf\u0cbe\u0c97\u0cbf \u0c89\u0cb3\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/examples/hf_demo_space/.chainlit/translations/ml.json b/examples/hf_demo_space/.chainlit/translations/ml.json new file mode 100644 index 0000000..f932bd3 --- /dev/null +++ b/examples/hf_demo_space/.chainlit/translations/ml.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "\u0d31\u0d26\u0d4d\u0d26\u0d3e\u0d15\u0d4d\u0d15\u0d41\u0d15", + "confirm": "\u0d38\u0d4d\u0d25\u0d3f\u0d30\u0d40\u0d15\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "continue": "\u0d24\u0d41\u0d1f\u0d30\u0d41\u0d15", + "goBack": "\u0d24\u0d3f\u0d30\u0d3f\u0d15\u0d46 \u0d2a\u0d4b\u0d15\u0d41\u0d15", + "reset": "\u0d2a\u0d41\u0d28\u0d03\u0d38\u0d1c\u0d4d\u0d1c\u0d2e\u0d3e\u0d15\u0d4d\u0d15\u0d41\u0d15", + "submit": "\u0d38\u0d2e\u0d7c\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15" + }, + "status": { + "loading": "\u0d32\u0d4b\u0d21\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d41...", + "error": { + "default": "\u0d12\u0d30\u0d41 \u0d2a\u0d3f\u0d36\u0d15\u0d4d \u0d38\u0d02\u0d2d\u0d35\u0d3f\u0d1a\u0d4d\u0d1a\u0d41", + "serverConnection": "\u0d38\u0d46\u0d7c\u0d35\u0d31\u0d41\u0d2e\u0d3e\u0d2f\u0d3f \u0d2c\u0d28\u0d4d\u0d27\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d3e\u0d7b \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d3f\u0d32\u0d4d\u0d32" + } + } + }, + "auth": { + "login": { + "title": "\u0d06\u0d2a\u0d4d\u0d2a\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d15\u0d4d\u0d15\u0d3e\u0d7b \u0d32\u0d4b\u0d17\u0d3f\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", + "form": { + "email": { + "label": "\u0d07\u0d2e\u0d46\u0d2f\u0d3f\u0d7d \u0d35\u0d3f\u0d32\u0d3e\u0d38\u0d02", + "required": "\u0d07\u0d2e\u0d46\u0d2f\u0d3f\u0d7d \u0d12\u0d30\u0d41 \u0d06\u0d35\u0d36\u0d4d\u0d2f\u0d2e\u0d3e\u0d2f \u0d2b\u0d40\u0d7d\u0d21\u0d4d \u0d06\u0d23\u0d4d" + }, + "password": { + "label": "\u0d2a\u0d3e\u0d38\u0d4d\u200c\u0d35\u0d47\u0d21\u0d4d", + "required": "\u0d2a\u0d3e\u0d38\u0d4d\u200c\u0d35\u0d47\u0d21\u0d4d \u0d12\u0d30\u0d41 \u0d06\u0d35\u0d36\u0d4d\u0d2f\u0d2e\u0d3e\u0d2f \u0d2b\u0d40\u0d7d\u0d21\u0d4d \u0d06\u0d23\u0d4d" + }, + "actions": { + "signin": "\u0d38\u0d48\u0d7b \u0d07\u0d7b" + }, + "alternativeText": { + "or": "\u0d05\u0d32\u0d4d\u0d32\u0d46\u0d19\u0d4d\u0d15\u0d3f\u0d7d" + } + }, + "errors": { + "default": "\u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d15\u0d34\u0d3f\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d3f\u0d32\u0d4d\u0d32", + "signin": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "oauthSignin": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "redirectUriMismatch": "\u0d31\u0d40\u0d21\u0d2f\u0d31\u0d15\u0d4d\u0d1f\u0d4d URI oauth \u0d06\u0d2a\u0d4d\u0d2a\u0d4d \u0d15\u0d4b\u0d7a\u0d2b\u0d3f\u0d17\u0d31\u0d47\u0d37\u0d28\u0d41\u0d2e\u0d3e\u0d2f\u0d3f \u0d2a\u0d4a\u0d30\u0d41\u0d24\u0d4d\u0d24\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d41\u0d28\u0d4d\u0d28\u0d3f\u0d32\u0d4d\u0d32", + "oauthCallback": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "oauthCreateAccount": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "emailCreateAccount": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "callback": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "oauthAccountNotLinked": "\u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d35\u0d4d\u0d2f\u0d15\u0d4d\u0d24\u0d3f\u0d24\u0d4d\u0d35\u0d02 \u0d38\u0d4d\u0d25\u0d3f\u0d30\u0d40\u0d15\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d3e\u0d7b, \u0d06\u0d26\u0d4d\u0d2f\u0d02 \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a \u0d05\u0d24\u0d47 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", + "emailSignin": "\u0d07\u0d2e\u0d46\u0d2f\u0d3f\u0d7d \u0d05\u0d2f\u0d2f\u0d4d\u0d15\u0d4d\u0d15\u0d3e\u0d7b \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d3f\u0d32\u0d4d\u0d32", + "emailVerify": "\u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d07\u0d2e\u0d46\u0d2f\u0d3f\u0d7d \u0d2a\u0d30\u0d3f\u0d36\u0d4b\u0d27\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15, \u0d12\u0d30\u0d41 \u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d07\u0d2e\u0d46\u0d2f\u0d3f\u0d7d \u0d05\u0d2f\u0d1a\u0d4d\u0d1a\u0d3f\u0d1f\u0d4d\u0d1f\u0d41\u0d23\u0d4d\u0d1f\u0d4d", + "credentialsSignin": "\u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d2a\u0d30\u0d3e\u0d1c\u0d2f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41. \u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d7e \u0d28\u0d7d\u0d15\u0d3f\u0d2f \u0d35\u0d3f\u0d35\u0d30\u0d19\u0d4d\u0d19\u0d7e \u0d36\u0d30\u0d3f\u0d2f\u0d3e\u0d23\u0d46\u0d28\u0d4d\u0d28\u0d4d \u0d2a\u0d30\u0d3f\u0d36\u0d4b\u0d27\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "sessionRequired": "\u0d08 \u0d2a\u0d47\u0d1c\u0d4d \u0d06\u0d15\u0d4d\u0d38\u0d38\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d26\u0d2f\u0d35\u0d3e\u0d2f\u0d3f \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15" + } + }, + "provider": { + "continue": "{{provider}} \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d24\u0d41\u0d1f\u0d30\u0d41\u0d15" + } + }, + "chat": { + "input": { + "placeholder": "\u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d38\u0d28\u0d4d\u0d26\u0d47\u0d36\u0d02 \u0d07\u0d35\u0d3f\u0d1f\u0d46 \u0d1f\u0d48\u0d2a\u0d4d\u0d2a\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15...", + "actions": { + "send": "\u0d38\u0d28\u0d4d\u0d26\u0d47\u0d36\u0d02 \u0d05\u0d2f\u0d2f\u0d4d\u0d15\u0d4d\u0d15\u0d41\u0d15", + "stop": "\u0d1f\u0d3e\u0d38\u0d4d\u0d15\u0d4d \u0d28\u0d3f\u0d7c\u0d24\u0d4d\u0d24\u0d41\u0d15", + "attachFiles": "\u0d2b\u0d2f\u0d32\u0d41\u0d15\u0d7e \u0d05\u0d31\u0d4d\u0d31\u0d3e\u0d1a\u0d4d\u0d1a\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15" + } + }, + "speech": { + "start": "\u0d31\u0d46\u0d15\u0d4d\u0d15\u0d4b\u0d7c\u0d21\u0d3f\u0d02\u0d17\u0d4d \u0d06\u0d30\u0d02\u0d2d\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "stop": "\u0d31\u0d46\u0d15\u0d4d\u0d15\u0d4b\u0d7c\u0d21\u0d3f\u0d02\u0d17\u0d4d \u0d28\u0d3f\u0d7c\u0d24\u0d4d\u0d24\u0d41\u0d15", + "connecting": "\u0d2c\u0d28\u0d4d\u0d27\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41" + }, + "fileUpload": { + "dragDrop": "\u0d2b\u0d2f\u0d32\u0d41\u0d15\u0d7e \u0d07\u0d35\u0d3f\u0d1f\u0d46 \u0d35\u0d32\u0d3f\u0d1a\u0d4d\u0d1a\u0d3f\u0d1f\u0d41\u0d15", + "browse": "\u0d2b\u0d2f\u0d32\u0d41\u0d15\u0d7e \u0d24\u0d3f\u0d30\u0d2f\u0d41\u0d15", + "sizeLimit": "\u0d2a\u0d30\u0d3f\u0d27\u0d3f:", + "errors": { + "failed": "\u0d05\u0d2a\u0d4d\u200c\u0d32\u0d4b\u0d21\u0d4d \u0d2a\u0d30\u0d3e\u0d1c\u0d2f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41", + "cancelled": "\u0d05\u0d2a\u0d4d\u200c\u0d32\u0d4b\u0d21\u0d4d \u0d31\u0d26\u0d4d\u0d26\u0d3e\u0d15\u0d4d\u0d15\u0d3f" + } + }, + "messages": { + "status": { + "using": "\u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41", + "used": "\u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d41" + }, + "actions": { + "copy": { + "button": "\u0d15\u0d4d\u0d32\u0d3f\u0d2a\u0d4d\u0d2a\u0d4d\u0d2c\u0d4b\u0d7c\u0d21\u0d3f\u0d32\u0d47\u0d15\u0d4d\u0d15\u0d4d \u0d2a\u0d15\u0d7c\u0d24\u0d4d\u0d24\u0d41\u0d15", + "success": "\u0d2a\u0d15\u0d7c\u0d24\u0d4d\u0d24\u0d3f!" + } + }, + "feedback": { + "positive": "\u0d38\u0d39\u0d3e\u0d2f\u0d15\u0d30\u0d02", + "negative": "\u0d38\u0d39\u0d3e\u0d2f\u0d15\u0d30\u0d2e\u0d32\u0d4d\u0d32", + "edit": "\u0d2b\u0d40\u0d21\u0d4d\u0d2c\u0d3e\u0d15\u0d4d\u0d15\u0d4d \u0d0e\u0d21\u0d3f\u0d31\u0d4d\u0d31\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", + "dialog": { + "title": "\u0d12\u0d30\u0d41 \u0d15\u0d2e\u0d28\u0d4d\u0d31\u0d4d \u0d1a\u0d47\u0d7c\u0d15\u0d4d\u0d15\u0d41\u0d15", + "submit": "\u0d2b\u0d40\u0d21\u0d4d\u0d2c\u0d3e\u0d15\u0d4d\u0d15\u0d4d \u0d38\u0d2e\u0d7c\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15" + }, + "status": { + "updating": "\u0d05\u0d2a\u0d4d\u0d21\u0d47\u0d31\u0d4d\u0d31\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d41", + "updated": "\u0d2b\u0d40\u0d21\u0d4d\u0d2c\u0d3e\u0d15\u0d4d\u0d15\u0d4d \u0d05\u0d2a\u0d4d\u0d21\u0d47\u0d31\u0d4d\u0d31\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d41" + } + } + }, + "history": { + "title": "\u0d05\u0d35\u0d38\u0d3e\u0d28 \u0d07\u0d7b\u0d2a\u0d41\u0d1f\u0d4d\u0d1f\u0d41\u0d15\u0d7e", + "empty": "\u0d12\u0d28\u0d4d\u0d28\u0d41\u0d2e\u0d3f\u0d32\u0d4d\u0d32...", + "show": "\u0d39\u0d3f\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d31\u0d3f \u0d15\u0d3e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15" + }, + "settings": { + "title": "\u0d15\u0d4d\u0d30\u0d2e\u0d40\u0d15\u0d30\u0d23\u0d19\u0d4d\u0d19\u0d7e \u0d2a\u0d3e\u0d28\u0d7d" + }, + "watermark": "\u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d28\u0d3f\u0d7c\u0d2e\u0d4d\u0d2e\u0d3f\u0d1a\u0d4d\u0d1a\u0d24\u0d4d" + }, + "threadHistory": { + "sidebar": { + "title": "\u0d2e\u0d41\u0d7b \u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d41\u0d15\u0d7e", + "filters": { + "search": "\u0d24\u0d3f\u0d30\u0d2f\u0d41\u0d15", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "\u0d07\u0d28\u0d4d\u0d28\u0d4d", + "yesterday": "\u0d07\u0d28\u0d4d\u0d28\u0d32\u0d46", + "previous7days": "\u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e 7 \u0d26\u0d3f\u0d35\u0d38\u0d02", + "previous30days": "\u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e 30 \u0d26\u0d3f\u0d35\u0d38\u0d02" + }, + "empty": "\u0d24\u0d4d\u0d30\u0d46\u0d21\u0d41\u0d15\u0d7e \u0d15\u0d23\u0d4d\u0d1f\u0d46\u0d24\u0d4d\u0d24\u0d3f\u0d2f\u0d3f\u0d32\u0d4d\u0d32", + "actions": { + "close": "\u0d38\u0d48\u0d21\u0d4d\u0d2c\u0d3e\u0d7c \u0d05\u0d1f\u0d2f\u0d4d\u0d15\u0d4d\u0d15\u0d41\u0d15", + "open": "\u0d38\u0d48\u0d21\u0d4d\u0d2c\u0d3e\u0d7c \u0d24\u0d41\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d15" + } + }, + "thread": { + "untitled": "\u0d2a\u0d47\u0d30\u0d3f\u0d32\u0d4d\u0d32\u0d3e\u0d24\u0d4d\u0d24 \u0d38\u0d02\u0d2d\u0d3e\u0d37\u0d23\u0d02", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "\u0d21\u0d3f\u0d32\u0d40\u0d31\u0d4d\u0d31\u0d4d \u0d38\u0d4d\u0d25\u0d3f\u0d30\u0d40\u0d15\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "description": "\u0d07\u0d24\u0d4d \u0d24\u0d4d\u0d30\u0d46\u0d21\u0d41\u0d02 \u0d05\u0d24\u0d3f\u0d28\u0d4d\u0d31\u0d46 \u0d38\u0d28\u0d4d\u0d26\u0d47\u0d36\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d02 \u0d18\u0d1f\u0d15\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d02 \u0d21\u0d3f\u0d32\u0d40\u0d31\u0d4d\u0d31\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d02. \u0d08 \u0d2a\u0d4d\u0d30\u0d35\u0d7c\u0d24\u0d4d\u0d24\u0d3f \u0d2a\u0d34\u0d2f\u0d2a\u0d1f\u0d3f\u0d2f\u0d3e\u0d15\u0d4d\u0d15\u0d3e\u0d7b \u0d15\u0d34\u0d3f\u0d2f\u0d3f\u0d32\u0d4d\u0d32", + "success": "\u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d \u0d21\u0d3f\u0d32\u0d40\u0d31\u0d4d\u0d31\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d41", + "inProgress": "\u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d \u0d21\u0d3f\u0d32\u0d40\u0d31\u0d4d\u0d31\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d41" + }, + "rename": { + "title": "\u0d24\u0d4d\u0d30\u0d46\u0d21\u0d4d \u0d2a\u0d41\u0d28\u0d7c\u0d28\u0d3e\u0d2e\u0d15\u0d30\u0d23\u0d02 \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15", + "description": "\u0d08 \u0d24\u0d4d\u0d30\u0d46\u0d21\u0d3f\u0d28\u0d4d \u0d12\u0d30\u0d41 \u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d2a\u0d47\u0d30\u0d4d \u0d28\u0d7d\u0d15\u0d41\u0d15", + "form": { + "name": { + "label": "\u0d2a\u0d47\u0d30\u0d4d", + "placeholder": "\u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d2a\u0d47\u0d30\u0d4d \u0d28\u0d7d\u0d15\u0d41\u0d15" + } + }, + "success": "\u0d24\u0d4d\u0d30\u0d46\u0d21\u0d4d \u0d2a\u0d41\u0d28\u0d7c\u0d28\u0d3e\u0d2e\u0d15\u0d30\u0d23\u0d02 \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d41!", + "inProgress": "\u0d24\u0d4d\u0d30\u0d46\u0d21\u0d4d \u0d2a\u0d41\u0d28\u0d7c\u0d28\u0d3e\u0d2e\u0d15\u0d30\u0d23\u0d02 \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d41" + } + } + } + }, + "navigation": { + "header": { + "chat": "\u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d", + "readme": "\u0d35\u0d3e\u0d2f\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "\u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d", + "dialog": { + "title": "\u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d \u0d38\u0d43\u0d37\u0d4d\u0d1f\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15", + "description": "\u0d07\u0d24\u0d4d \u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d28\u0d3f\u0d32\u0d35\u0d3f\u0d32\u0d46 \u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d \u0d39\u0d3f\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d31\u0d3f \u0d2e\u0d3e\u0d2f\u0d4d\u0d15\u0d4d\u0d15\u0d41\u0d02. \u0d24\u0d41\u0d1f\u0d30\u0d3e\u0d7b \u0d24\u0d3e\u0d7d\u0d2a\u0d4d\u0d2a\u0d30\u0d4d\u0d2f\u0d2e\u0d41\u0d23\u0d4d\u0d1f\u0d4b?", + "tooltip": "\u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d" + } + }, + "user": { + "menu": { + "settings": "\u0d15\u0d4d\u0d30\u0d2e\u0d40\u0d15\u0d30\u0d23\u0d19\u0d4d\u0d19\u0d7e", + "settingsKey": "S", + "apiKeys": "API \u0d15\u0d40\u0d15\u0d7e", + "logout": "\u0d32\u0d4b\u0d17\u0d4d\u0d14\u0d1f\u0d4d\u0d1f\u0d4d" + } + } + }, + "apiKeys": { + "title": "\u0d06\u0d35\u0d36\u0d4d\u0d2f\u0d2e\u0d3e\u0d2f API \u0d15\u0d40\u0d15\u0d7e", + "description": "\u0d08 \u0d06\u0d2a\u0d4d\u0d2a\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d15\u0d4d\u0d15\u0d3e\u0d7b, \u0d24\u0d3e\u0d34\u0d46\u0d2a\u0d4d\u0d2a\u0d31\u0d2f\u0d41\u0d28\u0d4d\u0d28 API \u0d15\u0d40\u0d15\u0d7e \u0d06\u0d35\u0d36\u0d4d\u0d2f\u0d2e\u0d3e\u0d23\u0d4d. \u0d15\u0d40\u0d15\u0d7e \u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d09\u0d2a\u0d15\u0d30\u0d23\u0d24\u0d4d\u0d24\u0d3f\u0d28\u0d4d\u0d31\u0d46 \u0d32\u0d4b\u0d15\u0d4d\u0d15\u0d7d \u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4b\u0d31\u0d47\u0d1c\u0d3f\u0d7d \u0d38\u0d02\u0d2d\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d41\u0d28\u0d4d\u0d28\u0d41.", + "success": { + "saved": "\u0d35\u0d3f\u0d1c\u0d2f\u0d15\u0d30\u0d2e\u0d3e\u0d2f\u0d3f \u0d38\u0d02\u0d30\u0d15\u0d4d\u0d37\u0d3f\u0d1a\u0d4d\u0d1a\u0d41" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/examples/hf_demo_space/.chainlit/translations/mr.json b/examples/hf_demo_space/.chainlit/translations/mr.json new file mode 100644 index 0000000..04a990b --- /dev/null +++ b/examples/hf_demo_space/.chainlit/translations/mr.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "\u0930\u0926\u094d\u0926 \u0915\u0930\u093e", + "confirm": "\u092a\u0941\u0937\u094d\u091f\u0940 \u0915\u0930\u093e", + "continue": "\u092a\u0941\u0922\u0947 \u091c\u093e", + "goBack": "\u092e\u093e\u0917\u0947 \u091c\u093e", + "reset": "\u0930\u0940\u0938\u0947\u091f \u0915\u0930\u093e", + "submit": "\u0938\u092c\u092e\u093f\u091f \u0915\u0930\u093e" + }, + "status": { + "loading": "\u0932\u094b\u0921 \u0915\u0930\u0924 \u0906\u0939\u0947...", + "error": { + "default": "\u090f\u0915 \u0924\u094d\u0930\u0941\u091f\u0940 \u0906\u0932\u0940", + "serverConnection": "\u0938\u0930\u094d\u0935\u094d\u0939\u0930\u0936\u0940 \u0915\u0928\u0947\u0915\u094d\u091f \u0939\u094b\u090a \u0936\u0915\u0932\u0947 \u0928\u093e\u0939\u0940" + } + } + }, + "auth": { + "login": { + "title": "\u0905\u0945\u092a \u0935\u093e\u092a\u0930\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940 \u0932\u0949\u0917\u093f\u0928 \u0915\u0930\u093e", + "form": { + "email": { + "label": "\u0908\u092e\u0947\u0932 \u092a\u0924\u094d\u0924\u093e", + "required": "\u0908\u092e\u0947\u0932 \u0906\u0935\u0936\u094d\u092f\u0915 \u0906\u0939\u0947" + }, + "password": { + "label": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921", + "required": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u0906\u0935\u0936\u094d\u092f\u0915 \u0906\u0939\u0947" + }, + "actions": { + "signin": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u093e" + }, + "alternativeText": { + "or": "\u0915\u093f\u0902\u0935\u093e" + } + }, + "errors": { + "default": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0942 \u0936\u0915\u0924 \u0928\u093e\u0939\u0940", + "signin": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e", + "oauthSignin": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e", + "redirectUriMismatch": "\u0930\u0940\u0921\u093e\u092f\u0930\u0947\u0915\u094d\u091f URI \u0913\u0925 \u0905\u0945\u092a \u0915\u0949\u0928\u094d\u092b\u093f\u0917\u0930\u0947\u0936\u0928\u0936\u0940 \u091c\u0941\u0933\u0924 \u0928\u093e\u0939\u0940", + "oauthCallback": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e", + "oauthCreateAccount": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e", + "emailCreateAccount": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e", + "callback": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e", + "oauthAccountNotLinked": "\u0924\u0941\u092e\u091a\u0940 \u0913\u0933\u0916 \u092a\u091f\u0935\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940, \u092e\u0942\u0933 \u0935\u093e\u092a\u0930\u0932\u0947\u0932\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947\u091a \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u093e", + "emailSignin": "\u0908\u092e\u0947\u0932 \u092a\u093e\u0920\u0935\u0942 \u0936\u0915\u0932\u0947 \u0928\u093e\u0939\u0940", + "emailVerify": "\u0915\u0943\u092a\u092f\u093e \u0924\u0941\u092e\u091a\u093e \u0908\u092e\u0947\u0932 \u0924\u092a\u093e\u0938\u093e, \u0928\u0935\u0940\u0928 \u0908\u092e\u0947\u0932 \u092a\u093e\u0920\u0935\u0932\u093e \u0917\u0947\u0932\u093e \u0906\u0939\u0947", + "credentialsSignin": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0905\u092f\u0936\u0938\u094d\u0935\u0940. \u0924\u0941\u092e\u094d\u0939\u0940 \u0926\u093f\u0932\u0947\u0932\u0940 \u092e\u093e\u0939\u093f\u0924\u0940 \u092f\u094b\u0917\u094d\u092f \u0906\u0939\u0947 \u0915\u093e \u0924\u0947 \u0924\u092a\u093e\u0938\u093e", + "sessionRequired": "\u092f\u093e \u092a\u0943\u0937\u094d\u0920\u093e\u0935\u0930 \u092a\u094d\u0930\u0935\u0947\u0936 \u0915\u0930\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940 \u0915\u0943\u092a\u092f\u093e \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u093e" + } + }, + "provider": { + "continue": "{{provider}} \u0938\u0939 \u092a\u0941\u0922\u0947 \u091c\u093e" + } + }, + "chat": { + "input": { + "placeholder": "\u0924\u0941\u092e\u091a\u093e \u0938\u0902\u0926\u0947\u0936 \u092f\u0947\u0925\u0947 \u091f\u093e\u0907\u092a \u0915\u0930\u093e...", + "actions": { + "send": "\u0938\u0902\u0926\u0947\u0936 \u092a\u093e\u0920\u0935\u093e", + "stop": "\u0915\u093e\u0930\u094d\u092f \u0925\u093e\u0902\u092c\u0935\u093e", + "attachFiles": "\u092b\u093e\u0907\u0932\u094d\u0938 \u091c\u094b\u0921\u093e" + } + }, + "speech": { + "start": "\u0930\u0947\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u0938\u0941\u0930\u0942 \u0915\u0930\u093e", + "stop": "\u0930\u0947\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u0925\u093e\u0902\u092c\u0935\u093e", + "connecting": "\u0915\u0928\u0947\u0915\u094d\u091f \u0915\u0930\u0924 \u0906\u0939\u0947" + }, + "fileUpload": { + "dragDrop": "\u092b\u093e\u0907\u0932\u094d\u0938 \u092f\u0947\u0925\u0947 \u0921\u094d\u0930\u0945\u0917 \u0906\u0923\u093f \u0921\u094d\u0930\u0949\u092a \u0915\u0930\u093e", + "browse": "\u092b\u093e\u0907\u0932\u094d\u0938 \u092c\u094d\u0930\u093e\u0909\u091d \u0915\u0930\u093e", + "sizeLimit": "\u092e\u0930\u094d\u092f\u093e\u0926\u093e:", + "errors": { + "failed": "\u0905\u092a\u0932\u094b\u0921 \u0905\u092f\u0936\u0938\u094d\u0935\u0940", + "cancelled": "\u092f\u093e\u0902\u091a\u0947 \u0905\u092a\u0932\u094b\u0921 \u0930\u0926\u094d\u0926 \u0915\u0947\u0932\u0947" + } + }, + "messages": { + "status": { + "using": "\u0935\u093e\u092a\u0930\u0924 \u0906\u0939\u0947", + "used": "\u0935\u093e\u092a\u0930\u0932\u0947" + }, + "actions": { + "copy": { + "button": "\u0915\u094d\u0932\u093f\u092a\u092c\u094b\u0930\u094d\u0921\u0935\u0930 \u0915\u0949\u092a\u0940 \u0915\u0930\u093e", + "success": "\u0915\u0949\u092a\u0940 \u0915\u0947\u0932\u0947!" + } + }, + "feedback": { + "positive": "\u0909\u092a\u092f\u0941\u0915\u094d\u0924", + "negative": "\u0909\u092a\u092f\u0941\u0915\u094d\u0924 \u0928\u093e\u0939\u0940", + "edit": "\u092b\u0940\u0921\u092c\u0945\u0915 \u0938\u0902\u092a\u093e\u0926\u093f\u0924 \u0915\u0930\u093e", + "dialog": { + "title": "\u091f\u093f\u092a\u094d\u092a\u0923\u0940 \u091c\u094b\u0921\u093e", + "submit": "\u092b\u0940\u0921\u092c\u0945\u0915 \u0938\u092c\u092e\u093f\u091f \u0915\u0930\u093e" + }, + "status": { + "updating": "\u0905\u092a\u0921\u0947\u091f \u0915\u0930\u0924 \u0906\u0939\u0947", + "updated": "\u092b\u0940\u0921\u092c\u0945\u0915 \u0905\u092a\u0921\u0947\u091f \u0915\u0947\u0932\u0947" + } + } + }, + "history": { + "title": "\u0936\u0947\u0935\u091f\u091a\u0947 \u0907\u0928\u092a\u0941\u091f", + "empty": "\u0930\u093f\u0915\u093e\u092e\u0947 \u0906\u0939\u0947...", + "show": "\u0907\u0924\u093f\u0939\u093e\u0938 \u0926\u093e\u0916\u0935\u093e" + }, + "settings": { + "title": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u091c \u092a\u0945\u0928\u0932" + }, + "watermark": "\u0938\u0939 \u092c\u0928\u0935\u0932\u0947" + }, + "threadHistory": { + "sidebar": { + "title": "\u092e\u093e\u0917\u0940\u0932 \u091a\u0945\u091f\u094d\u0938", + "filters": { + "search": "\u0936\u094b\u0927\u093e", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "\u0906\u091c", + "yesterday": "\u0915\u093e\u0932", + "previous7days": "\u092e\u093e\u0917\u0940\u0932 7 \u0926\u093f\u0935\u0938", + "previous30days": "\u092e\u093e\u0917\u0940\u0932 30 \u0926\u093f\u0935\u0938" + }, + "empty": "\u0915\u094b\u0923\u0924\u0947\u0939\u0940 \u0925\u094d\u0930\u0947\u0921 \u0938\u093e\u092a\u0921\u0932\u0947 \u0928\u093e\u0939\u0940\u0924", + "actions": { + "close": "\u0938\u093e\u0907\u0921\u092c\u093e\u0930 \u092c\u0902\u0926 \u0915\u0930\u093e", + "open": "\u0938\u093e\u0907\u0921\u092c\u093e\u0930 \u0909\u0918\u0921\u093e" + } + }, + "thread": { + "untitled": "\u0936\u0940\u0930\u094d\u0937\u0915\u0935\u093f\u0930\u0939\u093f\u0924 \u0938\u0902\u092d\u093e\u0937\u0923", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "\u0939\u091f\u0935\u093f\u0923\u094d\u092f\u093e\u091a\u0940 \u092a\u0941\u0937\u094d\u091f\u0940 \u0915\u0930\u093e", + "description": "\u0939\u0947 \u0925\u094d\u0930\u0947\u0921 \u0906\u0923\u093f \u0924\u094d\u092f\u093e\u091a\u0947 \u0938\u0902\u0926\u0947\u0936 \u0935 \u0918\u091f\u0915 \u0939\u091f\u0935\u0947\u0932. \u0939\u0940 \u0915\u094d\u0930\u093f\u092f\u093e \u092a\u0942\u0930\u094d\u0935\u0935\u0924 \u0915\u0947\u0932\u0940 \u091c\u093e\u090a \u0936\u0915\u0924 \u0928\u093e\u0939\u0940", + "success": "\u091a\u0945\u091f \u0939\u091f\u0935\u0932\u093e", + "inProgress": "\u091a\u0945\u091f \u0939\u091f\u0935\u0924 \u0906\u0939\u0947" + }, + "rename": { + "title": "\u0925\u094d\u0930\u0947\u0921\u091a\u0947 \u0928\u093e\u0935 \u092c\u0926\u0932\u093e", + "description": "\u092f\u093e \u0925\u094d\u0930\u0947\u0921\u0938\u093e\u0920\u0940 \u0928\u0935\u0940\u0928 \u0928\u093e\u0935 \u092a\u094d\u0930\u0935\u093f\u0937\u094d\u091f \u0915\u0930\u093e", + "form": { + "name": { + "label": "\u0928\u093e\u0935", + "placeholder": "\u0928\u0935\u0940\u0928 \u0928\u093e\u0935 \u092a\u094d\u0930\u0935\u093f\u0937\u094d\u091f \u0915\u0930\u093e" + } + }, + "success": "\u0925\u094d\u0930\u0947\u0921\u091a\u0947 \u0928\u093e\u0935 \u092c\u0926\u0932\u0932\u0947!", + "inProgress": "\u0925\u094d\u0930\u0947\u0921\u091a\u0947 \u0928\u093e\u0935 \u092c\u0926\u0932\u0924 \u0906\u0939\u0947" + } + } + } + }, + "navigation": { + "header": { + "chat": "\u091a\u0945\u091f", + "readme": "\u0935\u093e\u091a\u093e", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "\u0928\u0935\u0940\u0928 \u091a\u0945\u091f", + "dialog": { + "title": "\u0928\u0935\u0940\u0928 \u091a\u0945\u091f \u0924\u092f\u093e\u0930 \u0915\u0930\u093e", + "description": "\u0939\u0947 \u0924\u0941\u092e\u091a\u093e \u0938\u0927\u094d\u092f\u093e\u091a\u093e \u091a\u0945\u091f \u0907\u0924\u093f\u0939\u093e\u0938 \u0938\u093e\u092b \u0915\u0930\u0947\u0932. \u0924\u0941\u092e\u094d\u0939\u093e\u0932\u093e \u0916\u093e\u0924\u094d\u0930\u0940 \u0906\u0939\u0947 \u0915\u0940 \u0924\u0941\u092e\u094d\u0939\u0940 \u092a\u0941\u0922\u0947 \u091c\u093e\u090a \u0907\u091a\u094d\u091b\u093f\u0924\u093e?", + "tooltip": "\u0928\u0935\u0940\u0928 \u091a\u0945\u091f" + } + }, + "user": { + "menu": { + "settings": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u091c", + "settingsKey": "S", + "apiKeys": "API \u0915\u0940\u091c", + "logout": "\u0932\u0949\u0917\u0906\u0909\u091f" + } + } + }, + "apiKeys": { + "title": "\u0906\u0935\u0936\u094d\u092f\u0915 API \u0915\u0940\u091c", + "description": "\u0939\u0947 \u0905\u0945\u092a \u0935\u093e\u092a\u0930\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940 \u0916\u093e\u0932\u0940\u0932 API \u0915\u0940\u091c \u0906\u0935\u0936\u094d\u092f\u0915 \u0906\u0939\u0947\u0924. \u0915\u0940\u091c \u0924\u0941\u092e\u091a\u094d\u092f\u093e \u0921\u093f\u0935\u094d\u0939\u093e\u0907\u0938\u091a\u094d\u092f\u093e \u0932\u094b\u0915\u0932 \u0938\u094d\u091f\u094b\u0930\u0947\u091c\u092e\u0927\u094d\u092f\u0947 \u0938\u093e\u0920\u0935\u0932\u094d\u092f\u093e \u091c\u093e\u0924\u093e\u0924.", + "success": { + "saved": "\u092f\u0936\u0938\u094d\u0935\u0940\u0930\u093f\u0924\u094d\u092f\u093e \u091c\u0924\u0928 \u0915\u0947\u0932\u0947" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/examples/hf_demo_space/.chainlit/translations/nl-NL.json b/examples/hf_demo_space/.chainlit/translations/nl-NL.json new file mode 100644 index 0000000..ed33115 --- /dev/null +++ b/examples/hf_demo_space/.chainlit/translations/nl-NL.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "Annuleren", + "confirm": "Bevestigen", + "continue": "Doorgaan", + "goBack": "Terug", + "reset": "Herstellen", + "submit": "Versturen" + }, + "status": { + "loading": "Laden...", + "error": { + "default": "Er is een fout opgetreden", + "serverConnection": "Kon geen verbinding maken met de server" + } + } + }, + "auth": { + "login": { + "title": "Inloggen om toegang te krijgen tot de app", + "form": { + "email": { + "label": "E-mailadres", + "required": "e-mail is een verplicht veld" + }, + "password": { + "label": "Wachtwoord", + "required": "wachtwoord is een verplicht veld" + }, + "actions": { + "signin": "Inloggen" + }, + "alternativeText": { + "or": "OF" + } + }, + "errors": { + "default": "Kan niet inloggen", + "signin": "Probeer in te loggen met een ander account", + "oauthSignin": "Probeer in te loggen met een ander account", + "redirectUriMismatch": "De redirect URI komt niet overeen met de oauth app configuratie", + "oauthCallback": "Probeer in te loggen met een ander account", + "oauthCreateAccount": "Probeer in te loggen met een ander account", + "emailCreateAccount": "Probeer in te loggen met een ander account", + "callback": "Probeer in te loggen met een ander account", + "oauthAccountNotLinked": "Om je identiteit te bevestigen, log in met hetzelfde account dat je oorspronkelijk hebt gebruikt", + "emailSignin": "De e-mail kon niet worden verzonden", + "emailVerify": "Verifieer je e-mail, er is een nieuwe e-mail verzonden", + "credentialsSignin": "Inloggen mislukt. Controleer of de ingevoerde gegevens correct zijn", + "sessionRequired": "Log in om toegang te krijgen tot deze pagina" + } + }, + "provider": { + "continue": "Doorgaan met {{provider}}" + } + }, + "chat": { + "input": { + "placeholder": "Typ hier je bericht...", + "actions": { + "send": "Bericht versturen", + "stop": "Taak stoppen", + "attachFiles": "Bestanden bijvoegen" + } + }, + "speech": { + "start": "Start opname", + "stop": "Stop opname", + "connecting": "Verbinden" + }, + "fileUpload": { + "dragDrop": "Sleep bestanden hierheen", + "browse": "Bestanden zoeken", + "sizeLimit": "Limiet:", + "errors": { + "failed": "Uploaden mislukt", + "cancelled": "Upload geannuleerd van" + } + }, + "messages": { + "status": { + "using": "In gebruik", + "used": "Gebruikt" + }, + "actions": { + "copy": { + "button": "Kopi\u00ebren naar klembord", + "success": "Gekopieerd!" + } + }, + "feedback": { + "positive": "Nuttig", + "negative": "Niet nuttig", + "edit": "Feedback bewerken", + "dialog": { + "title": "Voeg een opmerking toe", + "submit": "Feedback versturen" + }, + "status": { + "updating": "Bijwerken", + "updated": "Feedback bijgewerkt" + } + } + }, + "history": { + "title": "Laatste invoer", + "empty": "Zo leeg...", + "show": "Toon geschiedenis" + }, + "settings": { + "title": "Instellingenpaneel" + }, + "watermark": "Gebouwd met" + }, + "threadHistory": { + "sidebar": { + "title": "Eerdere chats", + "filters": { + "search": "Zoeken", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "Vandaag", + "yesterday": "Gisteren", + "previous7days": "Afgelopen 7 dagen", + "previous30days": "Afgelopen 30 dagen" + }, + "empty": "Geen gesprekken gevonden", + "actions": { + "close": "Zijbalk sluiten", + "open": "Zijbalk openen" + } + }, + "thread": { + "untitled": "Naamloos gesprek", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "Verwijdering bevestigen", + "description": "Dit zal het gesprek en bijbehorende berichten en elementen verwijderen. Deze actie kan niet ongedaan worden gemaakt", + "success": "Chat verwijderd", + "inProgress": "Chat verwijderen" + }, + "rename": { + "title": "Gesprek hernoemen", + "description": "Voer een nieuwe naam in voor dit gesprek", + "form": { + "name": { + "label": "Naam", + "placeholder": "Voer nieuwe naam in" + } + }, + "success": "Gesprek hernoemd!", + "inProgress": "Gesprek hernoemen" + } + } + } + }, + "navigation": { + "header": { + "chat": "Chat", + "readme": "Leesmij", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "Nieuwe chat", + "dialog": { + "title": "Nieuwe chat aanmaken", + "description": "Dit zal je huidige chatgeschiedenis wissen. Weet je zeker dat je door wilt gaan?", + "tooltip": "Nieuwe chat" + } + }, + "user": { + "menu": { + "settings": "Instellingen", + "settingsKey": "I", + "apiKeys": "API-sleutels", + "logout": "Uitloggen" + } + } + }, + "apiKeys": { + "title": "Vereiste API-sleutels", + "description": "Om deze app te gebruiken zijn de volgende API-sleutels vereist. De sleutels worden opgeslagen in de lokale opslag van je apparaat.", + "success": { + "saved": "Succesvol opgeslagen" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/examples/hf_demo_space/.chainlit/translations/nl.json b/examples/hf_demo_space/.chainlit/translations/nl.json new file mode 100644 index 0000000..3b24f98 --- /dev/null +++ b/examples/hf_demo_space/.chainlit/translations/nl.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "Annuleren", + "confirm": "Bevestigen", + "continue": "Doorgaan", + "goBack": "Terug", + "reset": "Herstellen", + "submit": "Versturen" + }, + "status": { + "loading": "Laden...", + "error": { + "default": "Er is een fout opgetreden", + "serverConnection": "Kon geen verbinding maken met de server" + } + } + }, + "auth": { + "login": { + "title": "Inloggen om toegang te krijgen tot de app", + "form": { + "email": { + "label": "E-mailadres", + "required": "e-mail is een verplicht veld" + }, + "password": { + "label": "Wachtwoord", + "required": "wachtwoord is een verplicht veld" + }, + "actions": { + "signin": "Inloggen" + }, + "alternativeText": { + "or": "OF" + } + }, + "errors": { + "default": "Kan niet inloggen", + "signin": "Probeer in te loggen met een ander account", + "oauthSignin": "Probeer in te loggen met een ander account", + "redirectUriMismatch": "De redirect URI komt niet overeen met de oauth app configuratie", + "oauthCallback": "Probeer in te loggen met een ander account", + "oauthCreateAccount": "Probeer in te loggen met een ander account", + "emailCreateAccount": "Probeer in te loggen met een ander account", + "callback": "Probeer in te loggen met een ander account", + "oauthAccountNotLinked": "Om je identiteit te bevestigen, log in met hetzelfde account dat je oorspronkelijk hebt gebruikt", + "emailSignin": "De e-mail kon niet worden verzonden", + "emailVerify": "Verifieer je e-mail, er is een nieuwe e-mail verzonden", + "credentialsSignin": "Inloggen mislukt. Controleer of de ingevoerde gegevens correct zijn", + "sessionRequired": "Log in om toegang te krijgen tot deze pagina" + } + }, + "provider": { + "continue": "Doorgaan met {{provider}}" + } + }, + "chat": { + "input": { + "placeholder": "Typ hier je bericht...", + "actions": { + "send": "Bericht versturen", + "stop": "Taak stoppen", + "attachFiles": "Bestanden bijvoegen" + } + }, + "speech": { + "start": "Start opname", + "stop": "Stop opname", + "connecting": "Verbinden" + }, + "fileUpload": { + "dragDrop": "Sleep bestanden hierheen", + "browse": "Bestanden zoeken", + "sizeLimit": "Limiet:", + "errors": { + "failed": "Uploaden mislukt", + "cancelled": "Upload geannuleerd van" + } + }, + "messages": { + "status": { + "using": "In gebruik", + "used": "Gebruikt" + }, + "actions": { + "copy": { + "button": "Kopi\u00ebren naar klembord", + "success": "Gekopieerd!" + } + }, + "feedback": { + "positive": "Nuttig", + "negative": "Niet nuttig", + "edit": "Feedback bewerken", + "dialog": { + "title": "Voeg een opmerking toe", + "submit": "Feedback versturen" + }, + "status": { + "updating": "Bijwerken", + "updated": "Feedback bijgewerkt" + } + } + }, + "history": { + "title": "Laatste invoer", + "empty": "Zo leeg...", + "show": "Toon geschiedenis" + }, + "settings": { + "title": "Instellingenpaneel" + }, + "watermark": "LLM's kunnen fouten maken. Overweeg het controleren van belangrijke informatie." + }, + "threadHistory": { + "sidebar": { + "title": "Eerdere chats", + "filters": { + "search": "Zoeken", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "Vandaag", + "yesterday": "Gisteren", + "previous7days": "Afgelopen 7 dagen", + "previous30days": "Afgelopen 30 dagen" + }, + "empty": "Geen gesprekken gevonden", + "actions": { + "close": "Zijbalk sluiten", + "open": "Zijbalk openen" + } + }, + "thread": { + "untitled": "Naamloos gesprek", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "Verwijdering bevestigen", + "description": "Dit zal het gesprek en bijbehorende berichten en elementen verwijderen. Deze actie kan niet ongedaan worden gemaakt", + "success": "Chat verwijderd", + "inProgress": "Chat verwijderen" + }, + "rename": { + "title": "Gesprek hernoemen", + "description": "Voer een nieuwe naam in voor dit gesprek", + "form": { + "name": { + "label": "Naam", + "placeholder": "Voer nieuwe naam in" + } + }, + "success": "Gesprek hernoemd!", + "inProgress": "Gesprek hernoemen" + } + } + } + }, + "navigation": { + "header": { + "chat": "Chat", + "readme": "Leesmij", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "Nieuwe chat", + "dialog": { + "title": "Nieuwe chat aanmaken", + "description": "Dit zal je huidige chatgeschiedenis wissen. Weet je zeker dat je door wilt gaan?", + "tooltip": "Nieuwe chat" + } + }, + "user": { + "menu": { + "settings": "Instellingen", + "settingsKey": "I", + "apiKeys": "API-sleutels", + "logout": "Uitloggen" + } + } + }, + "apiKeys": { + "title": "Vereiste API-sleutels", + "description": "Om deze app te gebruiken zijn de volgende API-sleutels vereist. De sleutels worden opgeslagen in de lokale opslag van je apparaat.", + "success": { + "saved": "Succesvol opgeslagen" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/examples/hf_demo_space/.chainlit/translations/ta.json b/examples/hf_demo_space/.chainlit/translations/ta.json new file mode 100644 index 0000000..6990072 --- /dev/null +++ b/examples/hf_demo_space/.chainlit/translations/ta.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "\u0bb0\u0ba4\u0bcd\u0ba4\u0bc1 \u0b9a\u0bc6\u0baf\u0bcd", + "confirm": "\u0b89\u0bb1\u0bc1\u0ba4\u0bbf\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1", + "continue": "\u0ba4\u0bca\u0b9f\u0bb0\u0bcd\u0b95", + "goBack": "\u0ba4\u0bbf\u0bb0\u0bc1\u0bae\u0bcd\u0baa\u0bbf\u0b9a\u0bcd \u0b9a\u0bc6\u0bb2\u0bcd", + "reset": "\u0bae\u0bc0\u0b9f\u0bcd\u0b9f\u0bae\u0bc8", + "submit": "\u0b9a\u0bae\u0bb0\u0bcd\u0baa\u0bcd\u0baa\u0bbf" + }, + "status": { + "loading": "\u0b8f\u0bb1\u0bcd\u0bb1\u0bc1\u0b95\u0bbf\u0bb1\u0ba4\u0bc1...", + "error": { + "default": "\u0baa\u0bbf\u0bb4\u0bc8 \u0b8f\u0bb1\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1", + "serverConnection": "\u0b9a\u0bc7\u0bb5\u0bc8\u0baf\u0b95\u0ba4\u0bcd\u0ba4\u0bc8 \u0b85\u0b9f\u0bc8\u0baf \u0bae\u0bc1\u0b9f\u0bbf\u0baf\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8" + } + } + }, + "auth": { + "login": { + "title": "\u0baa\u0baf\u0ba9\u0bcd\u0baa\u0bbe\u0b9f\u0bcd\u0b9f\u0bc8 \u0b85\u0ba3\u0bc1\u0b95 \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf\u0bb5\u0bc1\u0bae\u0bcd", + "form": { + "email": { + "label": "\u0bae\u0bbf\u0ba9\u0bcd\u0ba9\u0b9e\u0bcd\u0b9a\u0bb2\u0bcd \u0bae\u0bc1\u0b95\u0bb5\u0bb0\u0bbf", + "required": "\u0bae\u0bbf\u0ba9\u0bcd\u0ba9\u0b9e\u0bcd\u0b9a\u0bb2\u0bcd \u0ba4\u0bc7\u0bb5\u0bc8\u0baf\u0bbe\u0ba9 \u0baa\u0bc1\u0bb2\u0bae\u0bcd" + }, + "password": { + "label": "\u0b95\u0b9f\u0bb5\u0bc1\u0b9a\u0bcd\u0b9a\u0bca\u0bb2\u0bcd", + "required": "\u0b95\u0b9f\u0bb5\u0bc1\u0b9a\u0bcd\u0b9a\u0bca\u0bb2\u0bcd \u0ba4\u0bc7\u0bb5\u0bc8\u0baf\u0bbe\u0ba9 \u0baa\u0bc1\u0bb2\u0bae\u0bcd" + }, + "actions": { + "signin": "\u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0b95" + }, + "alternativeText": { + "or": "\u0b85\u0bb2\u0bcd\u0bb2\u0ba4\u0bc1" + } + }, + "errors": { + "default": "\u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0b9f\u0bbf\u0baf\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8", + "signin": "\u0bb5\u0bc7\u0bb1\u0bc1 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0baf\u0bb1\u0bcd\u0b9a\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd", + "oauthSignin": "\u0bb5\u0bc7\u0bb1\u0bc1 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0baf\u0bb1\u0bcd\u0b9a\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd", + "redirectUriMismatch": "\u0ba4\u0bbf\u0b9a\u0bc8\u0ba4\u0bbf\u0bb0\u0bc1\u0baa\u0bcd\u0baa\u0bb2\u0bcd URI \u0b93\u0b86\u0ba4\u0bcd \u0baa\u0baf\u0ba9\u0bcd\u0baa\u0bbe\u0b9f\u0bcd\u0b9f\u0bc1 \u0b95\u0b9f\u0bcd\u0b9f\u0bae\u0bc8\u0baa\u0bcd\u0baa\u0bc1\u0b9f\u0ba9\u0bcd \u0baa\u0bca\u0bb0\u0bc1\u0ba8\u0bcd\u0ba4\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8", + "oauthCallback": "\u0bb5\u0bc7\u0bb1\u0bc1 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0baf\u0bb1\u0bcd\u0b9a\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd", + "oauthCreateAccount": "\u0bb5\u0bc7\u0bb1\u0bc1 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0baf\u0bb1\u0bcd\u0b9a\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd", + "emailCreateAccount": "\u0bb5\u0bc7\u0bb1\u0bc1 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0baf\u0bb1\u0bcd\u0b9a\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd", + "callback": "\u0bb5\u0bc7\u0bb1\u0bc1 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0baf\u0bb1\u0bcd\u0b9a\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd", + "oauthAccountNotLinked": "\u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b85\u0b9f\u0bc8\u0baf\u0bbe\u0bb3\u0ba4\u0bcd\u0ba4\u0bc8 \u0b89\u0bb1\u0bc1\u0ba4\u0bbf\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4, \u0bae\u0bc1\u0ba4\u0bb2\u0bbf\u0bb2\u0bcd \u0baa\u0baf\u0ba9\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bbf\u0baf \u0b85\u0ba4\u0bc7 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf\u0bb5\u0bc1\u0bae\u0bcd", + "emailSignin": "\u0bae\u0bbf\u0ba9\u0bcd\u0ba9\u0b9e\u0bcd\u0b9a\u0bb2\u0bc8 \u0b85\u0ba9\u0bc1\u0baa\u0bcd\u0baa \u0bae\u0bc1\u0b9f\u0bbf\u0baf\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8", + "emailVerify": "\u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0bae\u0bbf\u0ba9\u0bcd\u0ba9\u0b9e\u0bcd\u0b9a\u0bb2\u0bc8 \u0b9a\u0bb0\u0bbf\u0baa\u0bbe\u0bb0\u0bcd\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd, \u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0bae\u0bbf\u0ba9\u0bcd\u0ba9\u0b9e\u0bcd\u0b9a\u0bb2\u0bcd \u0b85\u0ba9\u0bc1\u0baa\u0bcd\u0baa\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0bc1\u0bb3\u0bcd\u0bb3\u0ba4\u0bc1", + "credentialsSignin": "\u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0bb5\u0bc1 \u0ba4\u0bcb\u0bb2\u0bcd\u0bb5\u0bbf\u0baf\u0b9f\u0bc8\u0ba8\u0bcd\u0ba4\u0ba4\u0bc1. \u0ba8\u0bc0\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0bb5\u0bb4\u0b99\u0bcd\u0b95\u0bbf\u0baf \u0bb5\u0bbf\u0bb5\u0bb0\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b9a\u0bb0\u0bbf\u0baf\u0bbe\u0ba9\u0bb5\u0bc8 \u0b8e\u0ba9 \u0b9a\u0bb0\u0bbf\u0baa\u0bbe\u0bb0\u0bcd\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd", + "sessionRequired": "\u0b87\u0ba8\u0bcd\u0ba4\u0baa\u0bcd \u0baa\u0b95\u0bcd\u0b95\u0ba4\u0bcd\u0ba4\u0bc8 \u0b85\u0ba3\u0bc1\u0b95 \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf\u0bb5\u0bc1\u0bae\u0bcd" + } + }, + "provider": { + "continue": "{{provider}} \u0bae\u0bc2\u0bb2\u0bae\u0bcd \u0ba4\u0bca\u0b9f\u0bb0\u0bb5\u0bc1\u0bae\u0bcd" + } + }, + "chat": { + "input": { + "placeholder": "\u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b9a\u0bc6\u0baf\u0bcd\u0ba4\u0bbf\u0baf\u0bc8 \u0b87\u0b99\u0bcd\u0b95\u0bc7 \u0ba4\u0b9f\u0bcd\u0b9f\u0b9a\u0bcd\u0b9a\u0bc1 \u0b9a\u0bc6\u0baf\u0bcd\u0baf\u0bb5\u0bc1\u0bae\u0bcd...", + "actions": { + "send": "\u0b9a\u0bc6\u0baf\u0bcd\u0ba4\u0bbf \u0b85\u0ba9\u0bc1\u0baa\u0bcd\u0baa\u0bc1", + "stop": "\u0baa\u0ba3\u0bbf\u0baf\u0bc8 \u0ba8\u0bbf\u0bb1\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1", + "attachFiles": "\u0b95\u0bcb\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bc8 \u0b87\u0ba3\u0bc8" + } + }, + "speech": { + "start": "\u0baa\u0ba4\u0bbf\u0bb5\u0bc1 \u0ba4\u0bca\u0b9f\u0b99\u0bcd\u0b95\u0bc1", + "stop": "\u0baa\u0ba4\u0bbf\u0bb5\u0bc8 \u0ba8\u0bbf\u0bb1\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1", + "connecting": "\u0b87\u0ba3\u0bc8\u0b95\u0bcd\u0b95\u0bbf\u0bb1\u0ba4\u0bc1" + }, + "fileUpload": { + "dragDrop": "\u0b95\u0bcb\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bc8 \u0b87\u0b99\u0bcd\u0b95\u0bc7 \u0b87\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1 \u0bb5\u0bbf\u0b9f\u0bb5\u0bc1\u0bae\u0bcd", + "browse": "\u0b95\u0bcb\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bc8 \u0b89\u0bb2\u0bbe\u0bb5\u0bc1", + "sizeLimit": "\u0bb5\u0bb0\u0bae\u0bcd\u0baa\u0bc1:", + "errors": { + "failed": "\u0baa\u0ba4\u0bbf\u0bb5\u0bc7\u0bb1\u0bcd\u0bb1\u0bae\u0bcd \u0ba4\u0bcb\u0bb2\u0bcd\u0bb5\u0bbf\u0baf\u0b9f\u0bc8\u0ba8\u0bcd\u0ba4\u0ba4\u0bc1", + "cancelled": "\u0baa\u0ba4\u0bbf\u0bb5\u0bc7\u0bb1\u0bcd\u0bb1\u0bae\u0bcd \u0bb0\u0ba4\u0bcd\u0ba4\u0bc1 \u0b9a\u0bc6\u0baf\u0bcd\u0baf\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1" + } + }, + "messages": { + "status": { + "using": "\u0baa\u0baf\u0ba9\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0b95\u0bbf\u0bb1\u0ba4\u0bc1", + "used": "\u0baa\u0baf\u0ba9\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1" + }, + "actions": { + "copy": { + "button": "\u0b95\u0bbf\u0bb3\u0bbf\u0baa\u0bcd\u0baa\u0bcb\u0bb0\u0bcd\u0b9f\u0bc1\u0b95\u0bcd\u0b95\u0bc1 \u0ba8\u0b95\u0bb2\u0bc6\u0b9f\u0bc1", + "success": "\u0ba8\u0b95\u0bb2\u0bc6\u0b9f\u0bc1\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1!" + } + }, + "feedback": { + "positive": "\u0baa\u0baf\u0ba9\u0bc1\u0bb3\u0bcd\u0bb3\u0ba4\u0bbe\u0b95 \u0b87\u0bb0\u0bc1\u0ba8\u0bcd\u0ba4\u0ba4\u0bc1", + "negative": "\u0baa\u0baf\u0ba9\u0bc1\u0bb3\u0bcd\u0bb3\u0ba4\u0bbe\u0b95 \u0b87\u0bb2\u0bcd\u0bb2\u0bc8", + "edit": "\u0b95\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc8 \u0ba4\u0bbf\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1", + "dialog": { + "title": "\u0b95\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc8\u0b9a\u0bcd \u0b9a\u0bc7\u0bb0\u0bcd", + "submit": "\u0b95\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc8 \u0b9a\u0bae\u0bb0\u0bcd\u0baa\u0bcd\u0baa\u0bbf" + }, + "status": { + "updating": "\u0baa\u0bc1\u0ba4\u0bc1\u0baa\u0bcd\u0baa\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb1\u0ba4\u0bc1", + "updated": "\u0b95\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1 \u0baa\u0bc1\u0ba4\u0bc1\u0baa\u0bcd\u0baa\u0bbf\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1" + } + } + }, + "history": { + "title": "\u0b95\u0b9f\u0bc8\u0b9a\u0bbf \u0b89\u0bb3\u0bcd\u0bb3\u0bc0\u0b9f\u0bc1\u0b95\u0bb3\u0bcd", + "empty": "\u0b95\u0bbe\u0bb2\u0bbf\u0baf\u0bbe\u0b95 \u0b89\u0bb3\u0bcd\u0bb3\u0ba4\u0bc1...", + "show": "\u0bb5\u0bb0\u0bb2\u0bbe\u0bb1\u0bcd\u0bb1\u0bc8\u0b95\u0bcd \u0b95\u0bbe\u0b9f\u0bcd\u0b9f\u0bc1" + }, + "settings": { + "title": "\u0b85\u0bae\u0bc8\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd \u0baa\u0bb2\u0b95\u0bae\u0bcd" + }, + "watermark": "\u0b89\u0b9f\u0ba9\u0bcd \u0b89\u0bb0\u0bc1\u0bb5\u0bbe\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1" + }, + "threadHistory": { + "sidebar": { + "title": "\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd\u0b95\u0bb3\u0bcd", + "filters": { + "search": "\u0ba4\u0bc7\u0b9f\u0bc1", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "\u0b87\u0ba9\u0bcd\u0bb1\u0bc1", + "yesterday": "\u0ba8\u0bc7\u0bb1\u0bcd\u0bb1\u0bc1", + "previous7days": "\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 7 \u0ba8\u0bbe\u0b9f\u0bcd\u0b95\u0bb3\u0bcd", + "previous30days": "\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 30 \u0ba8\u0bbe\u0b9f\u0bcd\u0b95\u0bb3\u0bcd" + }, + "empty": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd\u0b95\u0bb3\u0bcd \u0b8e\u0ba4\u0bc1\u0bb5\u0bc1\u0bae\u0bcd \u0b87\u0bb2\u0bcd\u0bb2\u0bc8", + "actions": { + "close": "\u0baa\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0bbf\u0baf\u0bc8 \u0bae\u0bc2\u0b9f\u0bc1", + "open": "\u0baa\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0bbf\u0baf\u0bc8 \u0ba4\u0bbf\u0bb1" + } + }, + "thread": { + "untitled": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bbf\u0b9f\u0bbe\u0ba4 \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "\u0ba8\u0bc0\u0b95\u0bcd\u0b95\u0bc1\u0bb5\u0ba4\u0bc8 \u0b89\u0bb1\u0bc1\u0ba4\u0bbf\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1", + "description": "\u0b87\u0ba4\u0bc1 \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd \u0bae\u0bb1\u0bcd\u0bb1\u0bc1\u0bae\u0bcd \u0b85\u0ba4\u0ba9\u0bcd \u0b9a\u0bc6\u0baf\u0bcd\u0ba4\u0bbf\u0b95\u0bb3\u0bcd, \u0b89\u0bb1\u0bc1\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bc8 \u0ba8\u0bc0\u0b95\u0bcd\u0b95\u0bc1\u0bae\u0bcd. \u0b87\u0ba8\u0bcd\u0ba4 \u0b9a\u0bc6\u0baf\u0bb2\u0bc8 \u0bae\u0bc0\u0b9f\u0bcd\u0b9f\u0bc6\u0b9f\u0bc1\u0b95\u0bcd\u0b95 \u0bae\u0bc1\u0b9f\u0bbf\u0baf\u0bbe\u0ba4\u0bc1", + "success": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd \u0ba8\u0bc0\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1", + "inProgress": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bc8 \u0ba8\u0bc0\u0b95\u0bcd\u0b95\u0bc1\u0b95\u0bbf\u0bb1\u0ba4\u0bc1" + }, + "rename": { + "title": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bc8 \u0bae\u0bb1\u0bc1\u0baa\u0bc6\u0baf\u0bb0\u0bbf\u0b9f\u0bc1", + "description": "\u0b87\u0ba8\u0bcd\u0ba4 \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bc1\u0b95\u0bcd\u0b95\u0bc1 \u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0baa\u0bc6\u0baf\u0bb0\u0bc8 \u0b89\u0bb3\u0bcd\u0bb3\u0bbf\u0b9f\u0bb5\u0bc1\u0bae\u0bcd", + "form": { + "name": { + "label": "\u0baa\u0bc6\u0baf\u0bb0\u0bcd", + "placeholder": "\u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0baa\u0bc6\u0baf\u0bb0\u0bc8 \u0b89\u0bb3\u0bcd\u0bb3\u0bbf\u0b9f\u0bb5\u0bc1\u0bae\u0bcd" + } + }, + "success": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd \u0bae\u0bb1\u0bc1\u0baa\u0bc6\u0baf\u0bb0\u0bbf\u0b9f\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1!", + "inProgress": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bc8 \u0bae\u0bb1\u0bc1\u0baa\u0bc6\u0baf\u0bb0\u0bbf\u0b9f\u0bc1\u0b95\u0bbf\u0bb1\u0ba4\u0bc1" + } + } + } + }, + "navigation": { + "header": { + "chat": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd", + "readme": "\u0baa\u0b9f\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "\u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd", + "dialog": { + "title": "\u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bc8 \u0b89\u0bb0\u0bc1\u0bb5\u0bbe\u0b95\u0bcd\u0b95\u0bc1", + "description": "\u0b87\u0ba4\u0bc1 \u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0ba4\u0bb1\u0bcd\u0baa\u0bcb\u0ba4\u0bc8\u0baf \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd \u0bb5\u0bb0\u0bb2\u0bbe\u0bb1\u0bcd\u0bb1\u0bc8 \u0b85\u0bb4\u0bbf\u0b95\u0bcd\u0b95\u0bc1\u0bae\u0bcd. \u0ba4\u0bca\u0b9f\u0bb0 \u0bb5\u0bbf\u0bb0\u0bc1\u0bae\u0bcd\u0baa\u0bc1\u0b95\u0bbf\u0bb1\u0bc0\u0bb0\u0bcd\u0b95\u0bb3\u0bbe?", + "tooltip": "\u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd" + } + }, + "user": { + "menu": { + "settings": "\u0b85\u0bae\u0bc8\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd", + "settingsKey": "S", + "apiKeys": "API \u0bb5\u0bbf\u0b9a\u0bc8\u0b95\u0bb3\u0bcd", + "logout": "\u0bb5\u0bc6\u0bb3\u0bbf\u0baf\u0bc7\u0bb1\u0bc1" + } + } + }, + "apiKeys": { + "title": "\u0ba4\u0bc7\u0bb5\u0bc8\u0baf\u0bbe\u0ba9 API \u0bb5\u0bbf\u0b9a\u0bc8\u0b95\u0bb3\u0bcd", + "description": "\u0b87\u0ba8\u0bcd\u0ba4 \u0baa\u0baf\u0ba9\u0bcd\u0baa\u0bbe\u0b9f\u0bcd\u0b9f\u0bc8\u0baa\u0bcd \u0baa\u0baf\u0ba9\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4, \u0baa\u0bbf\u0ba9\u0bcd\u0bb5\u0bb0\u0bc1\u0bae\u0bcd API \u0bb5\u0bbf\u0b9a\u0bc8\u0b95\u0bb3\u0bcd \u0ba4\u0bc7\u0bb5\u0bc8. \u0bb5\u0bbf\u0b9a\u0bc8\u0b95\u0bb3\u0bcd \u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b9a\u0bbe\u0ba4\u0ba9\u0ba4\u0bcd\u0ba4\u0bbf\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0bb3\u0bc2\u0bb0\u0bcd \u0b9a\u0bc7\u0bae\u0bbf\u0baa\u0bcd\u0baa\u0b95\u0ba4\u0bcd\u0ba4\u0bbf\u0bb2\u0bcd \u0b9a\u0bc7\u0bae\u0bbf\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0bae\u0bcd.", + "success": { + "saved": "\u0bb5\u0bc6\u0bb1\u0bcd\u0bb1\u0bbf\u0b95\u0bb0\u0bae\u0bbe\u0b95 \u0b9a\u0bc7\u0bae\u0bbf\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/examples/hf_demo_space/.chainlit/translations/te.json b/examples/hf_demo_space/.chainlit/translations/te.json new file mode 100644 index 0000000..ac92371 --- /dev/null +++ b/examples/hf_demo_space/.chainlit/translations/te.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "\u0c30\u0c26\u0c4d\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f", + "confirm": "\u0c28\u0c3f\u0c30\u0c4d\u0c27\u0c3e\u0c30\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "continue": "\u0c15\u0c4a\u0c28\u0c38\u0c3e\u0c17\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "goBack": "\u0c35\u0c46\u0c28\u0c15\u0c4d\u0c15\u0c3f \u0c35\u0c46\u0c33\u0c4d\u0c33\u0c02\u0c21\u0c3f", + "reset": "\u0c30\u0c40\u0c38\u0c46\u0c1f\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f", + "submit": "\u0c38\u0c2e\u0c30\u0c4d\u0c2a\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f" + }, + "status": { + "loading": "\u0c32\u0c4b\u0c21\u0c4d \u0c05\u0c35\u0c41\u0c24\u0c4b\u0c02\u0c26\u0c3f...", + "error": { + "default": "\u0c32\u0c4b\u0c2a\u0c02 \u0c38\u0c02\u0c2d\u0c35\u0c3f\u0c02\u0c1a\u0c3f\u0c02\u0c26\u0c3f", + "serverConnection": "\u0c38\u0c30\u0c4d\u0c35\u0c30\u0c4d\u200c\u0c28\u0c3f \u0c1a\u0c47\u0c30\u0c41\u0c15\u0c4b\u0c32\u0c47\u0c15\u0c2a\u0c4b\u0c2f\u0c3e\u0c2e\u0c41" + } + } + }, + "auth": { + "login": { + "title": "\u0c2f\u0c3e\u0c2a\u0c4d\u200c\u0c28\u0c3f \u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c02\u0c1a\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c32\u0c3e\u0c17\u0c3f\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f", + "form": { + "email": { + "label": "\u0c07\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d \u0c1a\u0c3f\u0c30\u0c41\u0c28\u0c3e\u0c2e\u0c3e", + "required": "\u0c07\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d \u0c24\u0c2a\u0c4d\u0c2a\u0c28\u0c3f\u0c38\u0c30\u0c3f" + }, + "password": { + "label": "\u0c2a\u0c3e\u0c38\u0c4d\u200c\u0c35\u0c30\u0c4d\u0c21\u0c4d", + "required": "\u0c2a\u0c3e\u0c38\u0c4d\u200c\u0c35\u0c30\u0c4d\u0c21\u0c4d \u0c24\u0c2a\u0c4d\u0c2a\u0c28\u0c3f\u0c38\u0c30\u0c3f" + }, + "actions": { + "signin": "\u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f" + }, + "alternativeText": { + "or": "\u0c32\u0c47\u0c26\u0c3e" + } + }, + "errors": { + "default": "\u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c32\u0c47\u0c15\u0c2a\u0c4b\u0c2f\u0c3e\u0c2e\u0c41", + "signin": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "oauthSignin": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "redirectUriMismatch": "\u0c30\u0c40\u0c21\u0c48\u0c30\u0c46\u0c15\u0c4d\u0c1f\u0c4d URI oauth \u0c2f\u0c3e\u0c2a\u0c4d \u0c15\u0c3e\u0c28\u0c4d\u0c2b\u0c3f\u0c17\u0c30\u0c47\u0c37\u0c28\u0c4d\u200c\u0c24\u0c4b \u0c38\u0c30\u0c3f\u0c2a\u0c4b\u0c32\u0c21\u0c02 \u0c32\u0c47\u0c26\u0c41", + "oauthCallback": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "oauthCreateAccount": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "emailCreateAccount": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "callback": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "oauthAccountNotLinked": "\u0c2e\u0c40 \u0c17\u0c41\u0c30\u0c4d\u0c24\u0c3f\u0c02\u0c2a\u0c41\u0c28\u0c41 \u0c28\u0c3f\u0c30\u0c4d\u0c27\u0c3e\u0c30\u0c3f\u0c02\u0c1a\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f, \u0c2e\u0c40\u0c30\u0c41 \u0c2e\u0c4a\u0c26\u0c1f \u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c02\u0c1a\u0c3f\u0c28 \u0c05\u0c26\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f", + "emailSignin": "\u0c07\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d \u0c2a\u0c02\u0c2a\u0c21\u0c02 \u0c38\u0c3e\u0c27\u0c4d\u0c2f\u0c02 \u0c15\u0c3e\u0c32\u0c47\u0c26\u0c41", + "emailVerify": "\u0c26\u0c2f\u0c1a\u0c47\u0c38\u0c3f \u0c2e\u0c40 \u0c07\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d\u200c\u0c28\u0c3f \u0c27\u0c43\u0c35\u0c40\u0c15\u0c30\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f, \u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c07\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d \u0c2a\u0c02\u0c2a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f", + "credentialsSignin": "\u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c35\u0c3f\u0c2b\u0c32\u0c2e\u0c48\u0c02\u0c26\u0c3f. \u0c2e\u0c40\u0c30\u0c41 \u0c05\u0c02\u0c26\u0c3f\u0c02\u0c1a\u0c3f\u0c28 \u0c35\u0c3f\u0c35\u0c30\u0c3e\u0c32\u0c41 \u0c38\u0c30\u0c48\u0c28\u0c35\u0c47\u0c28\u0c3e \u0c05\u0c28\u0c3f \u0c24\u0c28\u0c3f\u0c16\u0c40 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f", + "sessionRequired": "\u0c08 \u0c2a\u0c47\u0c1c\u0c40\u0c28\u0c3f \u0c2f\u0c3e\u0c15\u0c4d\u0c38\u0c46\u0c38\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c26\u0c2f\u0c1a\u0c47\u0c38\u0c3f \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f" + } + }, + "provider": { + "continue": "{{provider}}\u0c24\u0c4b \u0c15\u0c4a\u0c28\u0c38\u0c3e\u0c17\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f" + } + }, + "chat": { + "input": { + "placeholder": "\u0c2e\u0c40 \u0c38\u0c02\u0c26\u0c47\u0c36\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c07\u0c15\u0c4d\u0c15\u0c21 \u0c1f\u0c48\u0c2a\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f...", + "actions": { + "send": "\u0c38\u0c02\u0c26\u0c47\u0c36\u0c02 \u0c2a\u0c02\u0c2a\u0c02\u0c21\u0c3f", + "stop": "\u0c2a\u0c28\u0c3f \u0c06\u0c2a\u0c02\u0c21\u0c3f", + "attachFiles": "\u0c2b\u0c48\u0c32\u0c4d\u0c38\u0c4d \u0c1c\u0c4b\u0c21\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f" + } + }, + "speech": { + "start": "\u0c30\u0c3f\u0c15\u0c3e\u0c30\u0c4d\u0c21\u0c3f\u0c02\u0c17\u0c4d \u0c2a\u0c4d\u0c30\u0c3e\u0c30\u0c02\u0c2d\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "stop": "\u0c30\u0c3f\u0c15\u0c3e\u0c30\u0c4d\u0c21\u0c3f\u0c02\u0c17\u0c4d \u0c06\u0c2a\u0c02\u0c21\u0c3f", + "connecting": "\u0c05\u0c28\u0c41\u0c38\u0c02\u0c27\u0c3e\u0c28\u0c3f\u0c38\u0c4d\u0c24\u0c4b\u0c02\u0c26\u0c3f" + }, + "fileUpload": { + "dragDrop": "\u0c2b\u0c48\u0c32\u0c4d\u0c38\u0c4d\u200c\u0c28\u0c3f \u0c07\u0c15\u0c4d\u0c15\u0c21 \u0c21\u0c4d\u0c30\u0c3e\u0c17\u0c4d \u0c1a\u0c47\u0c38\u0c3f \u0c21\u0c4d\u0c30\u0c3e\u0c2a\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f", + "browse": "\u0c2b\u0c48\u0c32\u0c4d\u0c38\u0c4d \u0c2c\u0c4d\u0c30\u0c4c\u0c1c\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f", + "sizeLimit": "\u0c2a\u0c30\u0c3f\u0c2e\u0c3f\u0c24\u0c3f:", + "errors": { + "failed": "\u0c05\u0c2a\u0c4d\u200c\u0c32\u0c4b\u0c21\u0c4d \u0c35\u0c3f\u0c2b\u0c32\u0c2e\u0c48\u0c02\u0c26\u0c3f", + "cancelled": "\u0c05\u0c2a\u0c4d\u200c\u0c32\u0c4b\u0c21\u0c4d \u0c30\u0c26\u0c4d\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f" + } + }, + "messages": { + "status": { + "using": "\u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c38\u0c4d\u0c24\u0c4b\u0c02\u0c26\u0c3f", + "used": "\u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c02\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f" + }, + "actions": { + "copy": { + "button": "\u0c15\u0c4d\u0c32\u0c3f\u0c2a\u0c4d\u200c\u0c2c\u0c4b\u0c30\u0c4d\u0c21\u0c4d\u200c\u0c15\u0c3f \u0c15\u0c3e\u0c2a\u0c40 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f", + "success": "\u0c15\u0c3e\u0c2a\u0c40 \u0c1a\u0c47\u0c2f\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f!" + } + }, + "feedback": { + "positive": "\u0c38\u0c39\u0c3e\u0c2f\u0c15\u0c30\u0c02", + "negative": "\u0c38\u0c39\u0c3e\u0c2f\u0c15\u0c30\u0c02 \u0c15\u0c3e\u0c26\u0c41", + "edit": "\u0c05\u0c2d\u0c3f\u0c2a\u0c4d\u0c30\u0c3e\u0c2f\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c38\u0c35\u0c30\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "dialog": { + "title": "\u0c35\u0c4d\u0c2f\u0c3e\u0c16\u0c4d\u0c2f \u0c1c\u0c4b\u0c21\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "submit": "\u0c05\u0c2d\u0c3f\u0c2a\u0c4d\u0c30\u0c3e\u0c2f\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c38\u0c2e\u0c30\u0c4d\u0c2a\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f" + }, + "status": { + "updating": "\u0c28\u0c35\u0c40\u0c15\u0c30\u0c3f\u0c38\u0c4d\u0c24\u0c4b\u0c02\u0c26\u0c3f", + "updated": "\u0c05\u0c2d\u0c3f\u0c2a\u0c4d\u0c30\u0c3e\u0c2f\u0c02 \u0c28\u0c35\u0c40\u0c15\u0c30\u0c3f\u0c02\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f" + } + } + }, + "history": { + "title": "\u0c1a\u0c3f\u0c35\u0c30\u0c3f \u0c07\u0c28\u0c4d\u200c\u0c2a\u0c41\u0c1f\u0c4d\u200c\u0c32\u0c41", + "empty": "\u0c16\u0c3e\u0c33\u0c40\u0c17\u0c3e \u0c09\u0c02\u0c26\u0c3f...", + "show": "\u0c1a\u0c30\u0c3f\u0c24\u0c4d\u0c30\u0c28\u0c41 \u0c1a\u0c42\u0c2a\u0c3f\u0c02\u0c1a\u0c41" + }, + "settings": { + "title": "\u0c38\u0c46\u0c1f\u0c4d\u0c1f\u0c3f\u0c02\u0c17\u0c4d\u200c\u0c32 \u0c2a\u0c4d\u0c2f\u0c3e\u0c28\u0c46\u0c32\u0c4d" + }, + "watermark": "\u0c24\u0c4b \u0c28\u0c3f\u0c30\u0c4d\u0c2e\u0c3f\u0c02\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f" + }, + "threadHistory": { + "sidebar": { + "title": "\u0c17\u0c24 \u0c1a\u0c3e\u0c1f\u0c4d\u200c\u0c32\u0c41", + "filters": { + "search": "\u0c35\u0c46\u0c24\u0c15\u0c02\u0c21\u0c3f", + "placeholder": "Search conversations..." + }, + "timeframes": { + "today": "\u0c08\u0c30\u0c4b\u0c1c\u0c41", + "yesterday": "\u0c28\u0c3f\u0c28\u0c4d\u0c28", + "previous7days": "\u0c17\u0c24 7 \u0c30\u0c4b\u0c1c\u0c41\u0c32\u0c41", + "previous30days": "\u0c17\u0c24 30 \u0c30\u0c4b\u0c1c\u0c41\u0c32\u0c41" + }, + "empty": "\u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d\u200c\u0c32\u0c41 \u0c15\u0c28\u0c41\u0c17\u0c4a\u0c28\u0c2c\u0c21\u0c32\u0c47\u0c26\u0c41", + "actions": { + "close": "\u0c38\u0c48\u0c21\u0c4d\u200c\u0c2c\u0c3e\u0c30\u0c4d \u0c2e\u0c42\u0c38\u0c3f\u0c35\u0c47\u0c2f\u0c02\u0c21\u0c3f", + "open": "\u0c38\u0c48\u0c21\u0c4d\u200c\u0c2c\u0c3e\u0c30\u0c4d \u0c24\u0c46\u0c30\u0c35\u0c02\u0c21\u0c3f" + } + }, + "thread": { + "untitled": "\u0c2a\u0c47\u0c30\u0c41 \u0c32\u0c47\u0c28\u0c3f \u0c38\u0c02\u0c2d\u0c3e\u0c37\u0c23", + "menu": { + "rename": "Rename", + "delete": "Delete" + }, + "actions": { + "delete": { + "title": "\u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c02\u0c2a\u0c41\u0c28\u0c41 \u0c28\u0c3f\u0c30\u0c4d\u0c27\u0c3e\u0c30\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "description": "\u0c07\u0c26\u0c3f \u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d\u200c\u0c24\u0c4b \u0c2a\u0c3e\u0c1f\u0c41 \u0c26\u0c3e\u0c28\u0c3f \u0c38\u0c02\u0c26\u0c47\u0c36\u0c3e\u0c32\u0c28\u0c41 \u0c2e\u0c30\u0c3f\u0c2f\u0c41 \u0c05\u0c02\u0c36\u0c3e\u0c32\u0c28\u0c41 \u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c38\u0c4d\u0c24\u0c41\u0c02\u0c26\u0c3f. \u0c08 \u0c1a\u0c30\u0c4d\u0c2f\u0c28\u0c41 \u0c30\u0c26\u0c4d\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c32\u0c47\u0c30\u0c41", + "success": "\u0c1a\u0c3e\u0c1f\u0c4d \u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c02\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f", + "inProgress": "\u0c1a\u0c3e\u0c1f\u0c4d\u200c\u0c28\u0c3f \u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c38\u0c4d\u0c24\u0c4b\u0c02\u0c26\u0c3f" + }, + "rename": { + "title": "\u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d \u0c2a\u0c47\u0c30\u0c41 \u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c02\u0c21\u0c3f", + "description": "\u0c08 \u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d \u0c15\u0c4b\u0c38\u0c02 \u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c2a\u0c47\u0c30\u0c41\u0c28\u0c41 \u0c28\u0c2e\u0c4b\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f", + "form": { + "name": { + "label": "\u0c2a\u0c47\u0c30\u0c41", + "placeholder": "\u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c2a\u0c47\u0c30\u0c41\u0c28\u0c41 \u0c28\u0c2e\u0c4b\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f" + } + }, + "success": "\u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d \u0c2a\u0c47\u0c30\u0c41 \u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f!", + "inProgress": "\u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d \u0c2a\u0c47\u0c30\u0c41 \u0c2e\u0c3e\u0c30\u0c41\u0c38\u0c4d\u0c24\u0c4b\u0c02\u0c26\u0c3f" + } + } + } + }, + "navigation": { + "header": { + "chat": "\u0c1a\u0c3e\u0c1f\u0c4d", + "readme": "\u0c1a\u0c26\u0c35\u0c02\u0c21\u0c3f", + "theme": { + "light": "Light Theme", + "dark": "Dark Theme", + "system": "Follow System" + } + }, + "newChat": { + "button": "\u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c1a\u0c3e\u0c1f\u0c4d", + "dialog": { + "title": "\u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c1a\u0c3e\u0c1f\u0c4d \u0c38\u0c43\u0c37\u0c4d\u0c1f\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f", + "description": "\u0c07\u0c26\u0c3f \u0c2e\u0c40 \u0c2a\u0c4d\u0c30\u0c38\u0c4d\u0c24\u0c41\u0c24 \u0c1a\u0c3e\u0c1f\u0c4d \u0c1a\u0c30\u0c3f\u0c24\u0c4d\u0c30\u0c28\u0c41 \u0c24\u0c41\u0c21\u0c3f\u0c1a\u0c3f\u0c35\u0c47\u0c38\u0c4d\u0c24\u0c41\u0c02\u0c26\u0c3f. \u0c2e\u0c40\u0c30\u0c41 \u0c15\u0c4a\u0c28\u0c38\u0c3e\u0c17\u0c3f\u0c02\u0c1a\u0c3e\u0c32\u0c28\u0c41\u0c15\u0c41\u0c02\u0c1f\u0c41\u0c28\u0c4d\u0c28\u0c3e\u0c30\u0c3e?", + "tooltip": "\u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c1a\u0c3e\u0c1f\u0c4d" + } + }, + "user": { + "menu": { + "settings": "\u0c38\u0c46\u0c1f\u0c4d\u0c1f\u0c3f\u0c02\u0c17\u0c4d\u200c\u0c32\u0c41", + "settingsKey": "S", + "apiKeys": "API \u0c15\u0c40\u0c32\u0c41", + "logout": "\u0c32\u0c3e\u0c17\u0c4d \u0c05\u0c35\u0c41\u0c1f\u0c4d" + } + } + }, + "apiKeys": { + "title": "\u0c05\u0c35\u0c38\u0c30\u0c2e\u0c48\u0c28 API \u0c15\u0c40\u0c32\u0c41", + "description": "\u0c08 \u0c2f\u0c3e\u0c2a\u0c4d\u200c\u0c28\u0c3f \u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c02\u0c1a\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f, \u0c15\u0c3f\u0c02\u0c26\u0c3f API \u0c15\u0c40\u0c32\u0c41 \u0c05\u0c35\u0c38\u0c30\u0c02. \u0c15\u0c40\u0c32\u0c41 \u0c2e\u0c40 \u0c2a\u0c30\u0c3f\u0c15\u0c30\u0c02 \u0c2f\u0c4a\u0c15\u0c4d\u0c15 \u0c38\u0c4d\u0c25\u0c3e\u0c28\u0c3f\u0c15 \u0c28\u0c3f\u0c32\u0c4d\u0c35\u0c32\u0c4b \u0c28\u0c3f\u0c32\u0c4d\u0c35 \u0c1a\u0c47\u0c2f\u0c2c\u0c21\u0c24\u0c3e\u0c2f\u0c3f.", + "success": { + "saved": "\u0c35\u0c3f\u0c1c\u0c2f\u0c35\u0c02\u0c24\u0c02\u0c17\u0c3e \u0c38\u0c47\u0c35\u0c4d \u0c1a\u0c47\u0c2f\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f" + } + }, + "alerts": { + "info": "Info", + "note": "Note", + "tip": "Tip", + "important": "Important", + "warning": "Warning", + "caution": "Caution", + "debug": "Debug", + "example": "Example", + "success": "Success", + "help": "Help", + "idea": "Idea", + "pending": "Pending", + "security": "Security", + "beta": "Beta", + "best-practice": "Best Practice" + } +} \ No newline at end of file diff --git a/examples/hf_demo_space/.chainlit/translations/zh-CN.json b/examples/hf_demo_space/.chainlit/translations/zh-CN.json new file mode 100644 index 0000000..ae336fc --- /dev/null +++ b/examples/hf_demo_space/.chainlit/translations/zh-CN.json @@ -0,0 +1,214 @@ +{ + "common": { + "actions": { + "cancel": "\u53d6\u6d88", + "confirm": "\u786e\u8ba4", + "continue": "\u7ee7\u7eed", + "goBack": "\u8fd4\u56de", + "reset": "\u91cd\u7f6e", + "submit": "\u63d0\u4ea4" + }, + "status": { + "loading": "\u52a0\u8f7d\u4e2d...", + "error": { + "default": "\u53d1\u751f\u9519\u8bef", + "serverConnection": "\u65e0\u6cd5\u8fde\u63a5\u5230\u670d\u52a1\u5668" + } + } + }, + "auth": { + "login": { + "title": "\u767b\u5f55\u4ee5\u8bbf\u95ee\u5e94\u7528", + "form": { + "email": { + "label": "\u7535\u5b50\u90ae\u7bb1", + "required": "\u90ae\u7bb1\u662f\u5fc5\u586b\u9879" + }, + "password": { + "label": "\u5bc6\u7801", + "required": "\u5bc6\u7801\u662f\u5fc5\u586b\u9879" + }, + "actions": { + "signin": "\u767b\u5f55" + }, + "alternativeText": { + "or": "\u6216" + } + }, + "errors": { + "default": "\u65e0\u6cd5\u767b\u5f55", + "signin": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55", + "oauthSignin": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55", + "redirectUriMismatch": "\u91cd\u5b9a\u5411URI\u4e0eOAuth\u5e94\u7528\u914d\u7f6e\u4e0d\u5339\u914d", + "oauthCallback": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55", + "oauthCreateAccount": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55", + "emailCreateAccount": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55", + "callback": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55", + "oauthAccountNotLinked": "\u4e3a\u786e\u8ba4\u60a8\u7684\u8eab\u4efd\uff0c\u8bf7\u4f7f\u7528\u539f\u59cb\u8d26\u53f7\u767b\u5f55", + "emailSignin": "\u90ae\u4ef6\u53d1\u9001\u5931\u8d25", + "emailVerify": "\u8bf7\u9a8c\u8bc1\u60a8\u7684\u90ae\u7bb1\uff0c\u65b0\u7684\u9a8c\u8bc1\u90ae\u4ef6\u5df2\u53d1\u9001", + "credentialsSignin": "\u767b\u5f55\u5931\u8d25\u3002\u8bf7\u68c0\u67e5\u60a8\u63d0\u4f9b\u7684\u4fe1\u606f\u662f\u5426\u6b63\u786e", + "sessionRequired": "\u8bf7\u767b\u5f55\u4ee5\u8bbf\u95ee\u6b64\u9875\u9762" + } + }, + "provider": { + "continue": "\u7ee7\u7eed\u4f7f\u7528{{provider}}" + } + }, + "chat": { + "input": { + "placeholder": "\u5728\u6b64\u8f93\u5165\u60a8\u7684\u6d88\u606f...", + "actions": { + "send": "\u53d1\u9001\u6d88\u606f", + "stop": "\u505c\u6b62\u4efb\u52a1", + "attachFiles": "\u9644\u52a0\u6587\u4ef6" + } + }, + "speech": { + "start": "\u5f00\u59cb\u5f55\u97f3", + "stop": "\u505c\u6b62\u5f55\u97f3", + "connecting": "\u8fde\u63a5\u4e2d" + }, + "fileUpload": { + "dragDrop": "\u5c06\u6587\u4ef6\u62d6\u653e\u5230\u8fd9\u91cc", + "browse": "\u6d4f\u89c8\u6587\u4ef6", + "sizeLimit": "\u9650\u5236\uff1a", + "errors": { + "failed": "\u4e0a\u4f20\u5931\u8d25", + "cancelled": "\u5df2\u53d6\u6d88\u4e0a\u4f20" + } + }, + "messages": { + "status": { + "using": "\u4f7f\u7528\u4e2d", + "used": "\u5df2\u4f7f\u7528" + }, + "actions": { + "copy": { + "button": "\u590d\u5236\u5230\u526a\u8d34\u677f", + "success": "\u5df2\u590d\u5236\uff01" + } + }, + "feedback": { + "positive": "\u6709\u5e2e\u52a9", + "negative": "\u6ca1\u6709\u5e2e\u52a9", + "edit": "\u7f16\u8f91\u53cd\u9988", + "dialog": { + "title": "\u6dfb\u52a0\u8bc4\u8bba", + "submit": "\u63d0\u4ea4\u53cd\u9988" + }, + "status": { + "updating": "\u66f4\u65b0\u4e2d", + "updated": "\u53cd\u9988\u5df2\u66f4\u65b0" + } + } + }, + "history": { + "title": "\u6700\u8fd1\u8f93\u5165", + "empty": "\u7a7a\u7a7a\u5982\u4e5f...", + "show": "\u663e\u793a\u5386\u53f2" + }, + "settings": { + "title": "\u8bbe\u7f6e\u9762\u677f" + }, + "watermark": "\u6280\u672f\u652f\u6301" + }, + "threadHistory": { + "sidebar": { + "title": "\u5386\u53f2\u5bf9\u8bdd", + "filters": { + "search": "\u641c\u7d22", + "placeholder": "\u641c\u7d22\u4f1a\u8bdd..." + }, + "timeframes": { + "today": "\u4eca\u5929", + "yesterday": "\u6628\u5929", + "previous7days": "\u8fc7\u53bb7\u5929", + "previous30days": "\u8fc7\u53bb30\u5929" + }, + "empty": "\u672a\u627e\u5230\u5bf9\u8bdd", + "actions": { + "close": "\u5173\u95ed\u4fa7\u8fb9\u680f", + "open": "\u6253\u5f00\u4fa7\u8fb9\u680f" + } + }, + "thread": { + "untitled": "\u672a\u547d\u540d\u5bf9\u8bdd", + "menu": { + "rename": "\u91cd\u547d\u540d", + "delete": "\u5220\u9664" + }, + "actions": { + "delete": { + "title": "\u786e\u8ba4\u5220\u9664", + "description": "\u8fd9\u5c06\u5220\u9664\u8be5\u5bf9\u8bdd\u53ca\u5176\u6240\u6709\u6d88\u606f\u548c\u5143\u7d20\u3002\u6b64\u64cd\u4f5c\u65e0\u6cd5\u64a4\u9500", + "success": "\u5bf9\u8bdd\u5df2\u5220\u9664", + "inProgress": "\u6b63\u5728\u5220\u9664\u5bf9\u8bdd" + }, + "rename": { + "title": "\u91cd\u547d\u540d\u5bf9\u8bdd", + "description": "\u4e3a\u6b64\u5bf9\u8bdd\u8f93\u5165\u65b0\u540d\u79f0", + "form": { + "name": { + "label": "\u540d\u79f0", + "placeholder": "\u8f93\u5165\u65b0\u540d\u79f0" + } + }, + "success": "\u5bf9\u8bdd\u5df2\u91cd\u547d\u540d\uff01", + "inProgress": "\u6b63\u5728\u91cd\u547d\u540d\u5bf9\u8bdd" + } + } + } + }, + "navigation": { + "header": { + "chat": "\u804a\u5929", + "readme": "\u8bf4\u660e", + "theme": { + "light": "\u6d45\u8272\u4e3b\u9898", + "dark": "\u6df1\u8272\u4e3b\u9898", + "system": "\u8ddf\u968f\u7cfb\u7edf" + } + }, + "newChat": { + "button": "\u65b0\u5efa\u5bf9\u8bdd", + "dialog": { + "title": "\u521b\u5efa\u65b0\u5bf9\u8bdd", + "description": "\u8fd9\u5c06\u6e05\u9664\u60a8\u5f53\u524d\u7684\u804a\u5929\u8bb0\u5f55\u3002\u786e\u5b9a\u8981\u7ee7\u7eed\u5417\uff1f", + "tooltip": "\u65b0\u5efa\u5bf9\u8bdd" + } + }, + "user": { + "menu": { + "settings": "\u8bbe\u7f6e", + "settingsKey": "S", + "apiKeys": "API\u5bc6\u94a5", + "logout": "\u9000\u51fa\u767b\u5f55" + } + } + }, + "apiKeys": { + "title": "\u6240\u9700API\u5bc6\u94a5", + "description": "\u4f7f\u7528\u6b64\u5e94\u7528\u9700\u8981\u4ee5\u4e0bAPI\u5bc6\u94a5\u3002\u8fd9\u4e9b\u5bc6\u94a5\u5b58\u50a8\u5728\u60a8\u8bbe\u5907\u7684\u672c\u5730\u5b58\u50a8\u4e2d\u3002", + "success": { + "saved": "\u4fdd\u5b58\u6210\u529f" + } + }, + "alerts": { + "info": "\u4fe1\u606f", + "note": "\u6ce8\u91ca", + "tip": "\u63d0\u793a", + "important": "\u91cd\u8981", + "warning": "\u8b66\u544a", + "caution": "\u6ce8\u610f", + "debug": "\u8c03\u8bd5", + "example": "\u793a\u4f8b", + "success": "\u6210\u529f", + "help": "\u5e2e\u52a9", + "idea": "\u60f3\u6cd5", + "pending": "\u5f85\u5904\u7406", + "security": "\u5b89\u5168", + "beta": "\u6d4b\u8bd5", + "best-practice": "\u6700\u4f73\u5b9e\u8df5" + } +} \ No newline at end of file diff --git a/examples/hf_demo_space/Dockerfile b/examples/hf_demo_space/Dockerfile new file mode 100644 index 0000000..19f8190 --- /dev/null +++ b/examples/hf_demo_space/Dockerfile @@ -0,0 +1,29 @@ +# Use the official Python 3.12 image +FROM python:3.12-slim + +# Set the working directory +WORKDIR /app + +# Install required system dependencies +RUN apt-get update && apt-get install -y \ + curl \ + git \ + libpq-dev \ + gcc \ + && rm -rf /var/lib/apt/lists/* + +# Create the /app/files directory and set full permissions +RUN mkdir -p /app/.files && chmod 777 /app/.files +RUN mkdir -p /app/logs && chmod 777 /app/logs +RUN mkdir -p /app/observability_data && chmod 777 /app/observability_data + +# Copy the current repository into the container +COPY . /app + +# Upgrade pip and install dependencies +RUN pip install --upgrade pip && \ + pip install -r requirements.txt + +EXPOSE 7860 + +CMD python -m chainlit run app.py -w --host 0.0.0.0 --port 7860 \ No newline at end of file diff --git a/examples/hf_demo_space/README.md b/examples/hf_demo_space/README.md new file mode 100644 index 0000000..807cdb4 --- /dev/null +++ b/examples/hf_demo_space/README.md @@ -0,0 +1,8 @@ +title: Agent Tide Demo +emoji: 🌊 +colorFrom: indigo +colorTo: blue +sdk: docker +pinned: true +license: apache-2.0 +short_description: **Agent Tide** is a next-generation, precision-driven software engineering agent built on top of [CodeTide](https://github.com/BrunoV21/CodeTide) \ No newline at end of file diff --git a/examples/hf_demo_space/app.py b/examples/hf_demo_space/app.py new file mode 100644 index 0000000..00cf415 --- /dev/null +++ b/examples/hf_demo_space/app.py @@ -0,0 +1,329 @@ +### chainlit app without data persistance enabled +# ruff: noqa: E402 +from pathlib import Path +import os + +os.environ.setdefault("CHAINLIT_APP_ROOT", str(Path(os.path.abspath(__file__)).parent)) + +from codetide.agents.tide.ui.defaults import AICORE_CONFIG_EXAMPLE, EXCEPTION_MESSAGE, MISSING_CONFIG_MESSAGE, STARTERS +from codetide.agents.tide.ui.stream_processor import StreamProcessor, MarkerConfig +from codetide.agents.tide.ui.utils import run_concurrent_tasks +from codetide.agents.tide.ui.agent_tide_ui import AgentTideUi +from codetide.core.defaults import DEFAULT_ENCODING +from codetide.agents.tide.models import Step + +from aicore.const import STREAM_END_TOKEN, STREAM_START_TOKEN +from aicore.models import AuthenticationError, ModelError +from aicore.config import Config +from aicore.llm import Llm + +from typing import Optional +from chainlit.cli import run_chainlit +from pathlib import Path +from ulid import ulid +import chainlit as cl +import subprocess +import shutil +import yaml +import json +import os +import re + +DEFAULT_SESSIONS_WORKSPACE = Path(os.getcwd()) / "sessions" + +GIT_URL_PATTERN = re.compile( + r'^(?:http|https|git|ssh)://' # Protocol + r'(?:\S+@)?' # Optional username + r'([^/]+)' # Domain + r'(?:[:/])([^/]+/[^/]+?)(?:\.git)?$' # Repo path +) + +def validate_git_url(url) -> None: + """Validate the Git repository URL using git ls-remote.""" + if not GIT_URL_PATTERN.match(url): + raise ValueError(f"Invalid Git repository URL format: {url}") + + try: + result = subprocess.run( + ["git", "ls-remote", url], + capture_output=True, + text=True, + check=True, + timeout=10 # Add timeout to prevent hanging + ) + if not result.stdout.strip(): + raise ValueError(f"URL {url} points to an empty repository") + except subprocess.TimeoutExpired: + raise ValueError(f"Timeout while validating URL {url}") + except subprocess.CalledProcessError as e: + raise ValueError(f"Invalid Git repository URL: {url}. Error: {e.stderr}") from e + +async def validate_llm_config_hf(agent_tide_ui: AgentTideUi): + exception = True + session_id = cl.user_session.get("session_id") + while exception: + try: + agent_tide_ui.agent_tide.llm.provider.validate_config(force_check_against_provider=True) + exception = None + + except (AuthenticationError, ModelError) as e: + exception = e + await cl.Message( + content=MISSING_CONFIG_MESSAGE.format( + agent_tide_config_path="because-we-dont-actually-store-it-it-only-exists-while-this-session-is-alive", + config_file="config-file-in-yaml", + example_config=AICORE_CONFIG_EXAMPLE + ), + elements=[ + cl.File( + name="config.yml", + display="inline", + content=AICORE_CONFIG_EXAMPLE, + size="small" + ), + ] + ).send() + + _config_files = None + while _config_files is None: + _config_files = await cl.AskFileMessage( + content=EXCEPTION_MESSAGE.format(exception=json.dumps(exception.__dict__, indent=4)), + accept=[".yml", ".yaml"], + timeout=3600 + ).send() + + if _config_files: + _config_file = _config_files[0] + + try: + with open(_config_file.path, "r", encoding=DEFAULT_ENCODING) as _file: + config_raw = _file.read() + config_dict = yaml.safe_load(config_raw) + config = Config(**config_dict) + + agent_tide_ui.agent_tide.llm = Llm.from_config(config.llm) + agent_tide_ui.agent_tide.llm.provider.session_id = agent_tide_ui.agent_tide.session_id + + session_dir_path = DEFAULT_SESSIONS_WORKSPACE / session_id + if not os.path.exists(session_dir_path): + os.makedirs(session_dir_path, exist_ok=True) + + except Exception as e: + exception = e + +async def loadAgentTideUi()->AgentTideUi: + agent_tide_ui: AgentTideUi = cl.user_session.get("AgentTideUi") + session_id = cl.user_session.get("session_id") + if agent_tide_ui is None: + await clone_repo(session_id) + + try: + agent_tide_ui = AgentTideUi( + DEFAULT_SESSIONS_WORKSPACE / session_id, + history=cl.user_session.get("chat_history"), + llm_config=cl.user_session.get("settings"), + session_id=session_id + ) + await agent_tide_ui.load() + + except FileNotFoundError: + ... + + await validate_llm_config_hf(agent_tide_ui) + + cl.user_session.set("AgentTideUi", agent_tide_ui) + + return agent_tide_ui + +async def clone_repo(session_id): + # TODO ask user actions to get PAT and attempt to clone git repo contents + exception = True + + while exception: + try: + url = await cl.AskUserMessage( + content="Provide a valid github url to give AgentTide some context!" + ).send() + validate_git_url(url) + exception = None + except Exception as e: + await cl.Message(f"Invalid url found, please provide only the url, if it is a private repo you can inlucde a PAT in the url: {e}").send() + exception = e + + subprocess.run( + ["git", "clone", "--no-checkout", url, DEFAULT_SESSIONS_WORKSPACE / session_id], + check=True, + capture_output=True, + text=True, + timeout=300 + ) + + +@cl.on_chat_start +async def start_chatr(): + ### create new dir to clone repo + ### and yeah force agentTide llm_config to be zreo + cl.user_session.set("session_id", ulid()) + await cl.context.emitter.set_commands(AgentTideUi.commands) + cl.user_session.set("chat_history", []) + +@cl.set_starters +async def set_starters(): + return [cl.Starter(**kwargs) for kwargs in STARTERS] + +@cl.on_chat_end +async def empty_current_session(): + session_id = cl.user_session.get("session_id") + session_path = DEFAULT_SESSIONS_WORKSPACE / session_id + if os.path.exists(session_path): + shutil.rmtree(session_path) + +@cl.on_app_shutdown +async def empty_all_sessions(): + if os.path.exists(DEFAULT_SESSIONS_WORKSPACE): + shutil.rmtree(DEFAULT_SESSIONS_WORKSPACE) + +@cl.action_callback("execute_steps") +async def on_execute_steps(action :cl.Action): + agent_tide_ui: AgentTideUi = cl.user_session.get("AgentTideUi") + + latest_step_message :cl.Message = cl.user_session.get("latest_step_message") + if latest_step_message and latest_step_message.id == action.payload.get("msg_id"): + await latest_step_message.remove_actions() + + if agent_tide_ui.current_step is None: + task_list = cl.TaskList("Steps") + for step in agent_tide_ui.agent_tide.steps.root: + task = cl.Task(title=step.description)#, forId=message.id) + await task_list.add_task(task) + + # Update the task list in the interface + await task_list.send() + cl.user_session.set("StepsTaskList", task_list) + + else: + task_list = cl.user_session.get("StepsTaskList") + + is_done = agent_tide_ui.increment_step() + # Optionally remove the action button from the chatbot user interface + + if is_done: + task_list.tasks[-1].status = cl.TaskStatus.DONE + await cl.sleep(3) + await task_list.remove() + await action.remove() + + # await cl.send_window_message("Finished implementing Steps") + + else: + current_task_idx = agent_tide_ui.current_step + if current_task_idx >= 1: + task_list.tasks[current_task_idx-1].status = cl.TaskStatus.DONE + + step :Step = agent_tide_ui.agent_tide.steps.root[agent_tide_ui.current_step] + + task_list.status = f"Executing step {current_task_idx}" + await task_list.send() + await action.remove() + + step_instructions_msg = await cl.Message( + content=step.as_instruction(), + author="Agent Tide" + ).send() + + await agent_loop(step_instructions_msg, codeIdentifiers=step.context_identifiers) + + task_list.status = f"Waiting feedback on step {current_task_idx}" + await task_list.send() + +@cl.action_callback("stop_steps") +async def on_stop_steps(action :cl.Action): + agent_tide_ui: AgentTideUi = cl.user_session.get("AgentTideUi") + + latest_step_message :cl.Message = cl.user_session.get("latest_step_message") + if latest_step_message and latest_step_message.id == action.payload.get("msg_id"): + await latest_step_message.remove_actions() + + task_list = cl.user_session.get("StepsTaskList") + if task_list: + agent_tide_ui.current_step = None + await task_list.remove() + +@cl.on_message +async def agent_loop(message: cl.Message, codeIdentifiers: Optional[list] = None): + agent_tide_ui = await loadAgentTideUi() + + chat_history = cl.user_session.get("chat_history") + + if message.command: + command_prompt = agent_tide_ui.get_command_prompt(message.command) + if command_prompt: + message.content = "\n\n---\n\n".join([command_prompt, message.content]) + + chat_history.append({"role": "user", "content": message.content}) + await agent_tide_ui.add_to_history(message.content) + + msg = cl.Message(content="", author="Agent Tide") + + async with cl.Step("ApplyPatch", type="tool") as diff_step: + await diff_step.remove() + + # Initialize the stream processor + stream_processor = StreamProcessor( + marker_configs=[ + MarkerConfig( + begin_marker="*** Begin Patch", + end_marker="*** End Patch", + start_wrapper="\n```shell\n", + end_wrapper="\n```\n", + target_step=diff_step + ), + MarkerConfig( + begin_marker="*** Begin Steps", + end_marker="*** End Steps", + start_wrapper="\n```shell\n", + end_wrapper="\n```\n", + target_step=msg + ) + ], + global_fallback_msg=msg + ) + + async for chunk in run_concurrent_tasks(agent_tide_ui, codeIdentifiers): + if chunk == STREAM_START_TOKEN: + continue + + if chunk == STREAM_END_TOKEN: + # Handle any remaining content + await stream_processor.finalize() + break + + await stream_processor.process_chunk(chunk) + + if agent_tide_ui.agent_tide.steps: + cl.user_session.set("latest_step_message", msg) + msg.actions = [ + cl.Action( + name="stop_steps", + tooltip="stop", + icon="octagon-x", + payload={"msg_id": msg.id} + ), + cl.Action( + name="execute_steps", + tooltip="Next step", + icon="fast-forward", + payload={"msg_id": msg.id} + ) + ] + + # # Send the final message + await msg.send() + + chat_history.append({"role": "assistant", "content": msg.content}) + await agent_tide_ui.add_to_history(msg.content) + +if __name__ == "__main__": + + # TODO add button button to ckeckout and push + run_chainlit(os.path.abspath(__file__)) \ No newline at end of file diff --git a/examples/hf_demo_space/chainlit.md b/examples/hf_demo_space/chainlit.md new file mode 100644 index 0000000..9619f3b --- /dev/null +++ b/examples/hf_demo_space/chainlit.md @@ -0,0 +1,177 @@ +# ![Agent Tide Logo](public/logo_dark.png) + +--- + +# Welcome to Agent Tide! πŸš€πŸ€– + +``` +β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— +β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β•β•β• β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ•‘β•šβ•β•β–ˆβ–ˆβ•”β•β•β• β•šβ•β•β–ˆβ–ˆβ•”β•β•β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β•β•β• +β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ•”β–ˆβ–ˆβ•— β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— +β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β• β–ˆβ–ˆβ•‘β•šβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β• +β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘ β•šβ–ˆβ–ˆβ–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— +β•šβ•β• β•šβ•β• β•šβ•β•β•β•β•β• β•šβ•β•β•β•β•β•β•β•šβ•β• β•šβ•β•β•β• β•šβ•β• β•šβ•β• β•šβ•β•β•šβ•β•β•β•β•β• β•šβ•β•β•β•β•β•β• +``` + +--- + +## What is Agent Tide? + +**Agent Tide** is a next-generation, precision-driven software engineering agent built on top of [CodeTide](https://github.com/BrunoV21/CodeTide). It enables you to interact directly with your local codebaseβ€”**everything is local and stays local**. No code, context, or metadata ever leaves your machine. + +Unlike most agent frameworks that rely on hidden inner logic, opaque planning, or LLMs doing everything in a single pass, Agent Tide offers a transparent, stepwise, and human-in-the-loop workflow. Think of it as "ChatGPT, but connected to your codebase"β€”with full visibility and control over every change. + +--- + +## How Does Agent Tide Work? + +1. **Direct Codebase Connection & Context Loading** + - Agent Tide uses CodeTide's fast, symbolic codebase parser to build a tree of all code identifiers (functions, classes, methods, etc.). + - When you make a request, Agent Tide analyzes it and loads only the relevant identifiers and their dependenciesβ€”retrieving just the code snippets needed for your task. + - This context loading is fast, deterministic, and fully local. + +2. **Three Modes of Operation** + - **Clarification:** If your request is ambiguous, Agent Tide will ask for more information before proceeding. + - **Direct Implementation:** For simple, clear requests, Agent Tide will immediately generate a patch to fulfill your request. + - **Planning Mode:** For complex tasks, Agent Tide enters a planning modeβ€”decomposing your request into a step-by-step plan. You can review, edit, or reorder steps before execution. + +3. **Human-in-the-Loop, Stepwise Execution** + - You always see the plan before any code is changed. You can modify steps, request clarifications, or approve the plan. + - When ready, click "Proceed to next step" to have Agent Tide implement each step sequentially. + - After each step, you can review the patch, provide feedback, or continue to the next stepβ€”**keeping you in control at all times**. + +4. **Patch-Based, Token-Efficient Editing** + - All code changes are generated as atomic, high-precision diffs (patches), not full file rewrites. + - This means you see exactly what will change, and can stop or correct the agent at any pointβ€”no waiting for a huge batch of changes to finish before intervening. + - This approach is also highly efficient for LLM token usage and latency. + +5. **Privacy & Local-First Philosophy** + - No code, context, or metadata is sent to any external service other than the selected LLM provider. + - All code analysis, context building, and patching is performed locally. + +6. **Model Compatibility** + - Agent Tide works best with GPT-4.1, Claude Sonnet 4, and Opus 4.1. + - Some models (e.g., DeepSeek Chat) may struggle with patch/diff generation. + +7. **Terminal & MCP Integration** + - Terminal access is not available yet. + - MCP (Multi-Component Patch) integration via aicore is deactivated by default in this demo, but can be enabled for more advanced use cases. + +--- + +## Why Agent Tide? + +- **Transparency:** Every step, plan, and patch is visible and editable before execution. +- **Control:** You decide when and how changes are appliedβ€”no "black box" agent behavior. +- **Precision:** Code changes are atomic, minimal, and always shown as diffs. +- **Speed:** Context loading and patching are fast, thanks to CodeTide's symbolic engine. +- **Privacy:** Your code never leaves your machine. + +--- + +## Example Things to Ask Agent Tide + +You can ask Agent Tide to perform a wide variety of code-related tasks. Here are some example prompts to get you started: + +- **Add new functionality** + - "Add a function to calculate the factorial of a number in `utils.py`." + - "Implement a REST API endpoint for user registration." + +- **Refactor or improve code** + - "Refactor the `process_data` function to improve readability and performance." + - "Rename the variable `x` to `user_id` throughout `models/user.py`." + +- **Fix bugs** + - "Fix the bug where the login form crashes on empty input." + - "Resolve the off-by-one error in the `get_page` method." + +- **Write or update tests** + - "Add unit tests for the `EmailSender` class." + - "Increase test coverage for `api/views.py`." + +- **Documentation** + - "Generate a docstring for the `parse_config` function." + - "Update the README with installation instructions." + +- **Code analysis and suggestions** + - "List all functions in `main.py` that are missing type annotations." + - "Suggest performance improvements for the `data_loader` module." + +- **Other codebase tasks** + - "Delete the deprecated `old_utils.py` file." + - "Move the `helpers` directory into `core/`." + +Feel free to be specific or general in your requests. Agent Tide will analyze your codebase and generate precise, production-ready patches to fulfill your needs! + +--- + +## Usage Tips & Advanced Workflows + +- **Direct Context Control:** + If you already know the exact code context you want Agent Tide to use, you can specify identifiers directly in your request. + Use the format: + ``` + module.submodule.file_withoutextension.object + ``` + For example: + ``` + Please update codetide.agents.tide.ui.app.agent_loop to support async. + ``` + This helps Agent Tide load only the relevant code blocks, making the process faster and more precise. + +- **Planning and Human-in-the-Loop:** + Agent Tide allows you to interact directly with your local codebaseβ€”everything is local and will stay local. + Most agent frameworks are filled with hidden logic, letting the LLM do all the planning and execution at once. + Agent Tide offers a more direct perspective: + - The first thing Agent Tide does is use the CodeTide repo tree to load identifiers related to your request, then builds context blocks with the relevant code snippets (and their dependencies). + - Once context is loaded, Agent Tide can: + 1. Ask for more information or clarification if your request is ambiguous. + 2. Start implementing changes right away if the request is simple. + 3. Enter planning mode and present you with a step-by-step plan (you can also request this explicitly: "create me a plan to do X"). + - You can edit the plan, reorder steps, or request changes until you are satisfied. + - Click "Start implementing steps" and Agent Tide will go step by step, letting you review, correct, or continue after each one. + - This keeps you in the loop and gives you direct control and visualization of every change. + - Code is generated as diffs for optimized token usage and latencyβ€”so you can intervene at any point, even if the agent is working on many files. + +- **Model and Integration Notes:** + - Agent Tide works best with GPT-4.1, Claude Sonnet 4, and Opus 4.1. + - Models like DeepSeek Chat may struggle with patch generation. + - Terminal access is available for advanced workflows. + - MCP integration (via aicore) is deactivated by default in this demo. + +--- + +## Available Slash Commands + +Agent Tide supports special commands that can be invoked directly from the chat input using a `/command` syntax. These commands provide quick access to advanced features and workflows. + +### How to Use + +Type `/command` (replace `command` with the actual command name) in the text input box and press Enter. Agent Tide will recognize and execute the command. + +### Available Commands + +1. **/test** + - **Description:** Request test implmentations for a specific element. + - **Usage:** + `/test` add coverage for apply_patch tool. + +2. **/review** + - **Description:** Request a code review for a specific file, function, or recent patch. + - **Usage:** + `/review` codetide/agents/tide/ui/app.py + +3. **/commit** + - **Description:** Generate a concise, production-ready commit message for the most recent patch or set of changes. + - **Usage:** + `/commit` the changes we just made + +You can use these commands at any time to guide Agent Tide's workflow, request reviews, or generate commit messages. More commands may be added in the futureβ€”refer to this section for updates. + +--- + +**Original repository:** [https://github.com/BrunoV21/CodeTide](https://github.com/BrunoV21/CodeTide) + +--- + +_This README was written by AgentTide!_ diff --git a/examples/hf_demo_space/docker-compose.yaml b/examples/hf_demo_space/docker-compose.yaml new file mode 100644 index 0000000..824d25e --- /dev/null +++ b/examples/hf_demo_space/docker-compose.yaml @@ -0,0 +1,11 @@ +version: "3.8" + +services: + app: + build: + context: . + dockerfile: Dockerfile + ports: + - "7860:7860" + restart: unless-stopped + command: python -m chainlit run app.py -w --host 0.0.0.0 --port 7860 \ No newline at end of file diff --git a/examples/hf_demo_space/requirements.txt b/examples/hf_demo_space/requirements.txt new file mode 100644 index 0000000..902524a --- /dev/null +++ b/examples/hf_demo_space/requirements.txt @@ -0,0 +1 @@ +codetide @ git+https://github.com/BrunoV21/codetide.git#egg=codetide[agent-tide-ui] \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index d3abf78..03fddab 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,19 +39,28 @@ dependencies = [ agents = [ "core-for-ai>=0.1.98", "prompt_toolkit==3.0.50", - # Required for the agent-tide-step CLI entry point + # Required for the agent-tide CLI entry point ] visualization = [ "networkx==3.4.2", "numpy==2.2.0", "plotly==5.24.1", ] +agents-ui = [ + "core-for-ai>=0.1.98", + "prompt_toolkit==3.0.50", + # Required for the agent-tide CLI entry point + "chainlit==2.6.3", + "aiosqlite==0.21.0", + "SQLAlchemy==2.0.36" +] [project.scripts] codetide-mcp-server = "codetide.mcp.server:serve" codetide-cli = "codetide.cli:main" agent-tide-step = "codetide.agents.tide.cli_step:main" agent-tide = "codetide.agents.tide.cli:main" +agent-tide-ui = "codetide.agents.tide.ui:main" # agent-tide-step and agent-tide require the [agents] extra: pip install codetide[agents] or to execute uvx --from codetide[agents] agent-tide-step -h [project.urls] diff --git a/requirements-agents-ui.txt b/requirements-agents-ui.txt new file mode 100644 index 0000000..e3c7f85 --- /dev/null +++ b/requirements-agents-ui.txt @@ -0,0 +1,3 @@ +chainlit==2.6.3 +SQLAlchemy==2.0.36 +aiosqlite==0.21.0 \ No newline at end of file diff --git a/requirements-agents.txt b/requirements-agents.txt index 2cd8bbe..c66b82a 100644 --- a/requirements-agents.txt +++ b/requirements-agents.txt @@ -1,2 +1,3 @@ +aiofiles==23.2.1 core-for-ai>=0.1.98 prompt_toolkit==3.0.50 \ No newline at end of file diff --git a/setup.py b/setup.py index 04fedb0..8df4a6d 100644 --- a/setup.py +++ b/setup.py @@ -6,6 +6,8 @@ requirements = (here / "requirements.txt").read_text(encoding="utf-8").splitlines() requirements_visualization = (here / "requirements-visualization.txt").read_text(encoding="utf-8").splitlines() requirements_agents = (here / "requirements-agents.txt").read_text(encoding="utf-8").splitlines() +requirements_agents_ui = (here / "requirements-agents-ui.txt").read_text(encoding="utf-8").splitlines() +requirements_agents_ui.extend(requirements_agents) setup( name="codetide", @@ -21,7 +23,8 @@ include_package_data=True, extras_require={ "visualization": requirements_visualization, - "agents": requirements_agents + "agents": requirements_agents, + "agents-ui": requirements_agents_ui }, entry_points={ "console_scripts": [ @@ -29,7 +32,8 @@ "codetide-cli=codetide.cli:main", # agent-tide-step requires the [agents] extra: pip install codetide[agents] or to execute uvx --from codetide[agents] agent-tide-step -h "agent-tide-step=codetide.agents.tide.cli_step:main", - "agent-tide=codetide.agents.tide.cli:main" + "agent-tide=codetide.agents.tide.cli:main", + "agent-tide-ui=codetide.agents.tide.ui:main" ] }, classifiers=[ diff --git a/tests/agents/tide/test_utils_parse_patch_blocks.py b/tests/agents/tide/test_utils_parse_patch_blocks.py index d9308f0..dd9c70c 100644 --- a/tests/agents/tide/test_utils_parse_patch_blocks.py +++ b/tests/agents/tide/test_utils_parse_patch_blocks.py @@ -1,71 +1,478 @@ -from codetide.agents.tide.utils import parse_patch_blocks - -def test_single_patch_block(): - text = ( - "Some intro\n" - "*** Begin Patch\n" - "patch content 1\n" - "*** End Patch\n" - "Some outro" - ) - result = parse_patch_blocks(text, multiple=False) - assert result == "*** Begin Patch\npatch content 1\n*** End Patch" - -def test_multiple_patch_blocks(): - text = ( - "*** Begin Patch\n" - "patch content 1\n" - "*** End Patch\n" - "irrelevant\n" - "*** Begin Patch\n" - "patch content 2\n" - "*** End Patch\n" - ) - result = parse_patch_blocks(text, multiple=True) - assert isinstance(result, list) - assert len(result) == 2 - assert result[0] == "*** Begin Patch\npatch content 1\n*** End Patch" - assert result[1] == "*** Begin Patch\npatch content 2\n*** End Patch" - -def test_no_patch_block_returns_none(): - text = "No patch markers here" - assert parse_patch_blocks(text, multiple=True) is None - assert parse_patch_blocks(text, multiple=False) is None - -def test_patch_block_with_indentation_is_ignored(): - text = ( - " *** Begin Patch\n" - "indented patch\n" - "*** End Patch\n" - "*** Begin Patch\n" - "valid patch\n" - "*** End Patch\n" - ) - result = parse_patch_blocks(text, multiple=True) - assert len(result) == 1 - assert result[0] == "*** Begin Patch\nvalid patch\n*** End Patch" - -def test_patch_block_at_start_and_end(): - text = ( - "*** Begin Patch\n" - "start patch\n" - "*** End Patch\n" - "middle\n" - "*** Begin Patch\n" - "end patch\n" - "*** End Patch" - ) - result = parse_patch_blocks(text, multiple=True) - assert len(result) == 2 - assert result[0] == "*** Begin Patch\nstart patch\n*** End Patch" - assert result[1] == "*** Begin Patch\nend patch\n*** End Patch" - -def test_patch_block_with_extra_content_inside(): - text = ( - "*** Begin Patch\n" - "line1\n" - "line2\n" - "*** End Patch\n" +from codetide.mcp.tools.patch_code.parser import peek_next_section +from codetide.mcp.tools.apply_patch import ( + DiffError, + process_patch +) + +from pathlib import Path +import tempfile +import pytest +import re + +class MockFileSystem: + """Mock filesystem for testing with temporary files.""" + + def __init__(self): + # Create a temporary directory for our test files + self.temp_dir = tempfile.mkdtemp() + self.base_path = Path(self.temp_dir) + + # Pre-populate with some files + self._create_file('main.py', ( + "def hello():\n" + " print('Hello, world!')\n" + "\n" + "def goodbye():\n" + " print('Goodbye, world!')\n" + "\n" + "if __name__ == '__main__':\n" + " hello()\n" + )) + + self._create_file('data/old_data.txt', "line1\nline2\nline3\n") + self._create_file('empty.txt', "") + self._create_file('utils.py', "# A utility file.\n") + self._create_file('fuzzy.py', " def my_func( a, b ): \n return a+b\n") + + def _create_file(self, relative_path: str, content: str): + """Create a file with the given content.""" + file_path = self.base_path / relative_path + file_path.parent.mkdir(parents=True, exist_ok=True) + file_path.write_text(content) + + def mock_open(self, path: str) -> str: + """Mock open function that reads files relative to base_path.""" + file_path = Path(path) + if not file_path.is_absolute(): + file_path = self.base_path / path + + if not file_path.exists(): + raise FileNotFoundError(f"File not found: {path}") + return file_path.read_text() + + def mock_write(self, path: str, content: str) -> None: + """Mock write function that writes files relative to base_path.""" + file_path = Path(path) + if not file_path.is_absolute(): + file_path = self.base_path / path + + file_path.parent.mkdir(parents=True, exist_ok=True) + file_path.write_text(content) + + def mock_remove(self, path: str) -> None: + """Mock remove function that deletes files relative to base_path.""" + file_path = Path(path) + if not file_path.is_absolute(): + file_path = self.base_path / path + + if file_path.exists(): + file_path.unlink() + + def mock_exists(self, path: str) -> bool: + """Mock exists function that checks files relative to base_path.""" + file_path = Path(path) + if not file_path.is_absolute(): + file_path = self.base_path / path + + return file_path.exists() + + def file_exists(self, relative_path: str) -> bool: + """Check if a file exists.""" + return (self.base_path / relative_path).exists() + + def read_file(self, relative_path: str) -> str: + """Read file content.""" + return (self.base_path / relative_path).read_text() + + def apply_patch(self, patch_text: str): + """Helper to run the whole process against the temp filesystem.""" + # Write patch content to a temporary patch file + patch_file = self.base_path / "temp_patch.patch" + patch_file.write_text(patch_text) + + return process_patch( + str(patch_file), + self.mock_open, + self.mock_write, + self.mock_remove, + self.mock_exists, + ) + + def cleanup(self): + """Clean up the temporary directory.""" + import shutil + shutil.rmtree(self.temp_dir) + + def __del__(self): + """Cleanup on deletion.""" + try: + self.cleanup() + except Exception: + pass # Ignore cleanup errors + + +@pytest.fixture +def mock_fs(): + """Fixture providing a fresh mock filesystem for each test.""" + fs = MockFileSystem() + yield fs + fs.cleanup() + + +def test_add_file(mock_fs): + patch = """*** Begin Patch +*** Add File: new_module.py ++import os ++ ++def new_function(): ++ return os.getcwd() +*** End Patch +""" + mock_fs.apply_patch(patch) + assert mock_fs.file_exists('new_module.py') + expected_content = "import os\n\ndef new_function():\n return os.getcwd()\n" + assert mock_fs.read_file('new_module.py') == expected_content + + +def test_delete_file(mock_fs): + assert mock_fs.file_exists('utils.py') + patch = """*** Begin Patch +*** Delete File: utils.py +*** End Patch +""" + mock_fs.apply_patch(patch) + assert not mock_fs.file_exists('utils.py') + + +def test_update_middle_of_file(mock_fs): + patch = """*** Begin Patch +*** Update File: main.py +@@ def goodbye(): +- print('Goodbye, world!') ++ # A new and improved goodbye ++ print('Farewell, cruel world!') +*** End Patch +""" + mock_fs.apply_patch(patch) + content = mock_fs.read_file('main.py') + assert "Farewell, cruel world!" in content + assert "Goodbye, world!" not in content + + +def test_update_start_of_file(mock_fs): + patch = """*** Begin Patch +*** Update File: main.py +@@ def hello(): +-def hello(): +- print('Hello, world!') ++def new_hello(): ++ print('Greetings, planet!') +*** End Patch +""" + mock_fs.apply_patch(patch) + content = mock_fs.read_file('main.py') + assert "Greetings, planet!" in content + assert "Hello, world!" not in content + expected = ( + "def new_hello():\n" + " print('Greetings, planet!')\n" + "\n" + "def goodbye():\n" + " print('Goodbye, world!')\n" + "\n" + "if __name__ == '__main__':\n" + " hello()\n" ) - result = parse_patch_blocks(text, multiple=False) - assert result == "*** Begin Patch\nline1\nline2\n*** End Patch" + assert content == expected + + +def test_update_end_of_file_marker(mock_fs): + patch = """*** Begin Patch +*** Update File: main.py +@@ if __name__ == '__main__': +- hello() ++ # A new entrypoint ++ goodbye() +*** End of File +*** End Patch +""" + mock_fs.apply_patch(patch) + content = mock_fs.read_file('main.py') + assert "goodbye()" in content + assert " hello()" not in content + assert content.endswith("goodbye()\n") + + +def test_rename_file(mock_fs): + # The original file has "line1\nline2\nline3\n" + # We need to match this content exactly + patch = """*** Begin Patch +*** Update File: data/old_data.txt +*** Move to: data/new_data.txt +@@ line1 + line1 +-line2 ++line_two +*** End of File +*** End Patch +""" + mock_fs.apply_patch(patch) + assert not mock_fs.file_exists('data/old_data.txt') + assert mock_fs.file_exists('data/new_data.txt') + assert mock_fs.read_file('data/new_data.txt') == "line1\nline_two\nline3\n" + + +def test_crlf_handling(mock_fs): + mock_fs._create_file('crlf.txt', """line one\nline two\nline three\n""") + patch = """*** Begin Patch +*** Update File: crlf.txt +@@ line one + line one +-line two ++line 2 +*** End of File +*** End Patch +""" + mock_fs.apply_patch(patch) + assert mock_fs.read_file('crlf.txt') == "line one\nline 2\nline three\n" + +def test_peek_next_section_basic(): + """Test the basic functionality of peek_next_section""" + lines = [ + " line1", # keep (note: single space prefix) + "-line2", # delete + "+line_two", # add + " line3", # keep + "*** End of File" + ] + + context_lines, chunks, index, is_eof = peek_next_section(lines, 0) + + # context_lines should contain the original content (keep + delete lines) + # The content is the part after the prefix character + assert context_lines == ["line1", "line2"] + + # Should have one chunk with the change + assert len(chunks) == 1 + chunk = chunks[0] + assert chunk.del_lines == ["line2"] + assert chunk.ins_lines == ["line_two"] + assert chunk.orig_index == 1 # Position where the change occurs + + assert is_eof is True + assert index == 5 # Should point past the "*** End of File" line + + +def test_peek_next_section_multiple_changes(): + """Test peek_next_section with multiple change blocks""" + lines = [ + " line1", # keep + "-line2", # delete + "+line_two", # add + " line3", # keep + "-line4", # delete + "+line_four", # add + " line5", # keep + "*** End of File" + ] + + context_lines, chunks, index, is_eof = peek_next_section(lines, 0) + + # context_lines should contain original content (keep + delete lines) + assert context_lines == ["line1", "line2", "line3", "line4"] + + # Should have two chunks + assert len(chunks) == 2 + + # First chunk + assert chunks[0].del_lines == ["line2"] + assert chunks[0].ins_lines == ["line_two"] + assert chunks[0].orig_index == 1 + + # Second chunk + assert chunks[1].del_lines == ["line4"] + assert chunks[1].ins_lines == ["line_four"] + assert chunks[1].orig_index == 3 # Position in original content + + +def test_peek_next_section_trailing_keep_lines(): + """Test that trailing keep lines are handled correctly""" + lines = [ + "-line1", # delete + "+line_one", # add + " line2", # keep + " line3", # keep - these are trailing + " line4", # keep - these are trailing + "*** End of File" + ] + + context_lines, chunks, index, is_eof = peek_next_section(lines, 0) + + # All lines should be in context_lines (original content) + assert context_lines == ["line1"] + + # Should have one chunk + assert len(chunks) == 1 + assert chunks[0].del_lines == ["line1"] + assert chunks[0].ins_lines == ["line_one"] + assert chunks[0].orig_index == 0 + + +def test_peek_next_section_only_keep_lines(): + """Test what happens with only keep lines (no changes)""" + lines = [ + " line1", # keep + " line2", # keep + " line3", # keep + "*** End of File" + ] + + context_lines, chunks, index, is_eof = peek_next_section(lines, 0) + + # All lines should be in context_lines + assert context_lines == ["line1", "line2", "line3"] + + # Should have no chunks since there are no changes + assert len(chunks) == 0 + + assert is_eof is True + + +def test_peek_next_section_empty(): + """Test with empty input""" + lines = [ + "*** End of File" + ] + + context_lines, chunks, index, is_eof = peek_next_section(lines, 0) + + assert context_lines == [] + assert len(chunks) == 0 + assert is_eof is True + +def test_fuzzy_matching_whitespace(mock_fs): + # The patch context has different surrounding whitespace than the original file + patch = """*** Begin Patch +*** Update File: fuzzy.py +@@ def my_func( a, b ): +- return a+b ++ return a * b # Now we multiply +*** End of File +*** End Patch +""" + mock_fs.apply_patch(patch) + content = mock_fs.read_file('fuzzy.py') + assert "return a * b" in content + + +def test_full_add_update_delete_patch(mock_fs): + patch = """*** Begin Patch +*** Add File: new_feature.py ++def feature(): ++ print("New!") + +*** Update File: main.py +@@ if __name__ == '__main__': + if __name__ == '__main__': +- hello() ++ print("Running main") +*** Delete File: utils.py +*** End Patch +""" + mock_fs.apply_patch(patch) + assert mock_fs.file_exists('new_feature.py') + assert not mock_fs.file_exists('utils.py') + content = mock_fs.read_file('main.py') + assert 'Running main' in content + # FIX: Make assertion more specific. Check that the *call* was removed, + # not that the substring 'hello()' is gone from the entire file. + assert ' hello()' not in content + + +# --- Error Condition Tests --- + +def test_error_missing_sentinels(mock_fs): + with pytest.raises(DiffError, match=r"must start with '\*\*\* Begin Patch'"): + mock_fs.apply_patch("just some text\n*** End Patch\n") + + with pytest.raises(DiffError, match=r"must end with '\*\*\* End Patch'"): + mock_fs.apply_patch("*** Begin Patch\n*** Add File: a.txt") + + +def test_error_update_nonexistent_file(mock_fs): + patch = """*** Begin Patch +*** Update File: no_such_file.py +*** End Patch +""" + with pytest.raises(FileNotFoundError): + mock_fs.apply_patch(patch) + + +def test_error_delete_nonexistent_file(mock_fs): + patch = """*** Begin Patch +*** Delete File: no_such_file.py +*** End Patch +""" + with pytest.raises(FileNotFoundError): + mock_fs.apply_patch(patch) + + +def test_error_add_existing_file(mock_fs): + patch = """*** Begin Patch +*** Add File: main.py ++print("overwrite!") +*** End Patch +""" + with pytest.raises(DiffError, match="file already exists: main.py"): + mock_fs.apply_patch(patch) + + +def test_error_duplicate_action(mock_fs): + patch = """*** Begin Patch +*** Delete File: utils.py +*** Delete File: utils.py +*** End Patch +""" + with pytest.raises(DiffError, match="Duplicate delete for file: utils.py"): + mock_fs.apply_patch(patch) + + +def test_error_context_not_found(mock_fs): + patch = """*** Begin Patch +*** Update File: main.py +@@ some nonexistent context +-foo ++bar +*** End Patch +""" + with pytest.raises(DiffError, match="could not find initial context line"): + mock_fs.apply_patch(patch) + + +def test_error_second_context_not_found(mock_fs): + patch = """*** Begin Patch +*** Update File: main.py +@@ def hello(): +- print('Hello, world!') ++ print('Hello, new world!') +@@ this context does not exist +-goodbye ++farewell +*** End Patch +""" + with pytest.raises(DiffError, match=re.escape("could not find context block")): + mock_fs.apply_patch(patch) + + +def test_error_move_to_existing_file(mock_fs): + patch = """*** Begin Patch +*** Update File: utils.py +*** Move to: main.py +@@ # A utility file. +-# A utility file. ++# Overwrite main! +*** End of File +*** End Patch +""" + with pytest.raises(DiffError, match="Cannot move 'utils.py' to 'main.py' because the target file already exists"): + mock_fs.apply_patch(patch) \ No newline at end of file diff --git a/tests/agents/tide/test_utils_parse_steps_markdown.py b/tests/agents/tide/test_utils_parse_steps_markdown.py new file mode 100644 index 0000000..2da869d --- /dev/null +++ b/tests/agents/tide/test_utils_parse_steps_markdown.py @@ -0,0 +1,118 @@ +from codetide.agents.tide.utils import parse_steps_markdown +import pytest + +def generate_steps_md(n): + """ + Generate markdown with n well-formed steps. + """ + steps_md = ["*** Begin Steps"] + for i in range(n): + steps_md.append(f"""{i}. **Step {i} description** + **instructions**: Perform task {i} with detailed steps + **context_identifiers**: + - module.{i} + - path/to/file_{i}.py +---""") + steps_md.append("*** End Steps") + return "\n".join(steps_md) + + +def test_parse_multiple_steps(): + md = """ + *** Begin Steps + 0. **Initialize database** + **instructions**: Set up a new SQLite database and define schema + **context_identifiers**: + - db.init_schema + - config/db.yaml + --- + 1. **Load seed data** + **instructions**: Populate tables with initial records from seed_data.json + **context_identifiers**: + - db.load_seed + - data/seed_data.json + --- + *** End Steps + """ + steps = parse_steps_markdown(md) + assert len(steps) == 2 + assert steps[0]["step"] == 0 + assert steps[0]["description"] == "Initialize database" + assert "SQLite database" in steps[0]["instructions"] + assert steps[0]["context_identifiers"] == ["db.init_schema", "config/db.yaml"] + assert steps[1]["step"] == 1 + assert steps[1]["context_identifiers"][1] == "data/seed_data.json" + +def test_single_step(): + md = """ + *** Begin Steps + 0. **Do everything** + **instructions**: Perform all required tasks in a single step. + **context_identifiers**: + - utils.main_handler + --- + *** End Steps + """ + steps = parse_steps_markdown(md) + assert len(steps) == 1 + assert steps[0]["step"] == 0 + assert steps[0]["description"] == "Do everything" + assert "single step" in steps[0]["instructions"] + assert steps[0]["context_identifiers"] == ["utils.main_handler"] + +def test_missing_context_identifiers(): + md = """ + *** Begin Steps + 0. **No context** + **instructions**: Just explain something here + **context_identifiers**: + --- + *** End Steps + """ + steps = parse_steps_markdown(md) + assert len(steps) == 1 + assert steps[0]["context_identifiers"] == [] + +def test_malformed_but_parsable_step(): + md = """ + *** Begin Steps + 0. **Incomplete step** + **instructions**: This has no context identifiers + **context_identifiers**: + - + --- + *** End Steps + """ + steps = parse_steps_markdown(md) + assert len(steps) == 1 + assert steps[0]["description"] == "Incomplete step" + assert steps[0]["context_identifiers"] == [] + +def test_multiple_hyphen_indented_contexts(): + md = """ + *** Begin Steps + 0. **Handle multi-line** + **instructions**: Implement complex logic here + **context_identifiers**: + - module.first + - module.second + - module.third + --- + *** End Steps + """ + steps = parse_steps_markdown(md) + assert len(steps) == 1 + assert steps[0]["context_identifiers"] == ["module.first", "module.second", "module.third"] + +@pytest.mark.parametrize("count", [5, 10, 50]) +def test_large_number_of_steps(count): + md = generate_steps_md(count) + steps = parse_steps_markdown(md) + + assert len(steps) == count + + for i, step in enumerate(steps): + assert step["step"] == i + assert step["description"] == f"Step {i} description" + assert f"task {i}" in step["instructions"] + assert step["context_identifiers"] == [f"module.{i}", f"path/to/file_{i}.py"] diff --git a/tests/mcp/tools/test_apply_patch.py b/tests/mcp/tools/test_apply_patch.py index 613cec0..01ec503 100644 --- a/tests/mcp/tools/test_apply_patch.py +++ b/tests/mcp/tools/test_apply_patch.py @@ -3,19 +3,24 @@ process_patch ) -from typing import Dict import pytest import re +import tempfile +import os +from pathlib import Path from codetide.mcp.tools.patch_code.parser import peek_next_section class MockFileSystem: - """Mock filesystem for testing.""" + """Mock filesystem for testing with temporary files.""" def __init__(self): - self.fs: Dict[str, str] = {} + # Create a temporary directory for our test files + self.temp_dir = tempfile.mkdtemp() + self.base_path = Path(self.temp_dir) + # Pre-populate with some files - self.fs['main.py'] = ( + self._create_file('main.py', ( "def hello():\n" " print('Hello, world!')\n" "\n" @@ -24,42 +29,106 @@ def __init__(self): "\n" "if __name__ == '__main__':\n" " hello()\n" - ) - self.fs['data/old_data.txt'] = "line1\nline2\nline3\n" - self.fs['empty.txt'] = "" - self.fs['utils.py'] = "# A utility file.\n" - self.fs['fuzzy.py'] = " def my_func( a, b ): \n return a+b\n" + )) + + self._create_file('data/old_data.txt', "line1\nline2\nline3\n") + self._create_file('empty.txt', "") + self._create_file('utils.py', "# A utility file.\n") + self._create_file('fuzzy.py', " def my_func( a, b ): \n return a+b\n") + + def _create_file(self, relative_path: str, content: str): + """Create a file with the given content.""" + file_path = self.base_path / relative_path + file_path.parent.mkdir(parents=True, exist_ok=True) + file_path.write_text(content) def mock_open(self, path: str) -> str: - if path not in self.fs: - raise FileNotFoundError(f"File not found in mock filesystem: {path}") - return self.fs[path] + """Mock open function that reads files relative to base_path.""" + file_path = Path(path) + if not file_path.is_absolute(): + file_path = self.base_path / path + + if not file_path.exists(): + raise FileNotFoundError(f"File not found: {path}") + return file_path.read_text() def mock_write(self, path: str, content: str) -> None: - self.fs[path] = content + """Mock write function that writes files relative to base_path.""" + file_path = Path(path) + if not file_path.is_absolute(): + file_path = self.base_path / path + + file_path.parent.mkdir(parents=True, exist_ok=True) + file_path.write_text(content) def mock_remove(self, path: str) -> None: - if path in self.fs: - del self.fs[path] + """Mock remove function that deletes files relative to base_path.""" + file_path = Path(path) + if not file_path.is_absolute(): + file_path = self.base_path / path + + if file_path.exists(): + file_path.unlink() def mock_exists(self, path: str) -> bool: - return path in self.fs + """Mock exists function that checks files relative to base_path.""" + file_path = Path(path) + if not file_path.is_absolute(): + file_path = self.base_path / path + + return file_path.exists() + + def file_exists(self, relative_path: str) -> bool: + """Check if a file exists.""" + return (self.base_path / relative_path).exists() + + def read_file(self, relative_path: str) -> str: + """Read file content.""" + return (self.base_path / relative_path).read_text() def apply_patch(self, patch_text: str): - """Helper to run the whole process against the mock fs.""" - return process_patch( - patch_text, - self.mock_open, - self.mock_write, - self.mock_remove, - self.mock_exists, - ) + """Helper to run the whole process against the temp filesystem.""" + # Write patch content to a temporary patch file in the system temp directory + # This ensures os.path.exists() will find it + import tempfile + with tempfile.NamedTemporaryFile(mode='w', suffix='.patch', delete=False) as f: + f.write(patch_text) + patch_file_path = f.name + + try: + return process_patch( + patch_file_path, + self.mock_open, + self.mock_write, + self.mock_remove, + self.mock_exists, + ) + finally: + # Clean up the temporary patch file + try: + os.unlink(patch_file_path) + except Exception: + pass # Ignore cleanup errors + + def cleanup(self): + """Clean up the temporary directory.""" + import shutil + shutil.rmtree(self.temp_dir) + + def __del__(self): + """Cleanup on deletion.""" + try: + self.cleanup() + except Exception: + pass # Ignore cleanup errors @pytest.fixture def mock_fs(): """Fixture providing a fresh mock filesystem for each test.""" - return MockFileSystem() + fs = MockFileSystem() + yield fs + fs.cleanup() def test_add_file(mock_fs): @@ -72,19 +141,19 @@ def test_add_file(mock_fs): *** End Patch """ mock_fs.apply_patch(patch) - assert 'new_module.py' in mock_fs.fs + assert mock_fs.file_exists('new_module.py') expected_content = "import os\n\ndef new_function():\n return os.getcwd()\n" - assert mock_fs.fs['new_module.py'] == expected_content + assert mock_fs.read_file('new_module.py') == expected_content def test_delete_file(mock_fs): - assert 'utils.py' in mock_fs.fs + assert mock_fs.file_exists('utils.py') patch = """*** Begin Patch *** Delete File: utils.py *** End Patch """ mock_fs.apply_patch(patch) - assert 'utils.py' not in mock_fs.fs + assert not mock_fs.file_exists('utils.py') def test_update_middle_of_file(mock_fs): @@ -94,13 +163,12 @@ def test_update_middle_of_file(mock_fs): - print('Goodbye, world!') + # A new and improved goodbye + print('Farewell, cruel world!') - - if __name__ == '__main__': *** End Patch """ mock_fs.apply_patch(patch) - assert "Farewell, cruel world!" in mock_fs.fs['main.py'] - assert "Goodbye, world!" not in mock_fs.fs['main.py'] + content = mock_fs.read_file('main.py') + assert "Farewell, cruel world!" in content + assert "Goodbye, world!" not in content def test_update_start_of_file(mock_fs): @@ -111,13 +179,12 @@ def test_update_start_of_file(mock_fs): - print('Hello, world!') +def new_hello(): + print('Greetings, planet!') - - def goodbye(): *** End Patch """ mock_fs.apply_patch(patch) - assert "Greetings, planet!" in mock_fs.fs['main.py'] - assert "Hello, world!" not in mock_fs.fs['main.py'] + content = mock_fs.read_file('main.py') + assert "Greetings, planet!" in content + assert "Hello, world!" not in content expected = ( "def new_hello():\n" " print('Greetings, planet!')\n" @@ -128,7 +195,7 @@ def goodbye(): "if __name__ == '__main__':\n" " hello()\n" ) - assert mock_fs.fs['main.py'] == expected + assert content == expected def test_update_end_of_file_marker(mock_fs): @@ -142,9 +209,10 @@ def test_update_end_of_file_marker(mock_fs): *** End Patch """ mock_fs.apply_patch(patch) - assert "goodbye()" in mock_fs.fs['main.py'] - assert " hello()" not in mock_fs.fs['main.py'] - assert mock_fs.fs['main.py'].endswith("goodbye()\n") + content = mock_fs.read_file('main.py') + assert "goodbye()" in content + assert " hello()" not in content + assert content.endswith("goodbye()\n") def test_rename_file(mock_fs): @@ -157,30 +225,28 @@ def test_rename_file(mock_fs): line1 -line2 +line_two - line3 *** End of File *** End Patch """ mock_fs.apply_patch(patch) - assert 'data/old_data.txt' not in mock_fs.fs - assert 'data/new_data.txt' in mock_fs.fs - assert mock_fs.fs['data/new_data.txt'] == "line1\nline_two\nline3\n" + assert not mock_fs.file_exists('data/old_data.txt') + assert mock_fs.file_exists('data/new_data.txt') + assert mock_fs.read_file('data/new_data.txt') == "line1\nline_two\nline3\n" def test_crlf_handling(mock_fs): - mock_fs.fs['crlf.txt'] = "line one\r\nline two\r\nline three\r\n" + mock_fs._create_file('crlf.txt', """line one\nline two\nline three\n""") patch = """*** Begin Patch *** Update File: crlf.txt @@ line one line one -line two +line 2 - line three *** End of File *** End Patch """ mock_fs.apply_patch(patch) - assert mock_fs.fs['crlf.txt'] == "line one\nline 2\nline three\n" + assert mock_fs.read_file('crlf.txt') == "line one\nline 2\nline three\n" def test_peek_next_section_basic(): """Test the basic functionality of peek_next_section""" @@ -307,7 +373,8 @@ def test_fuzzy_matching_whitespace(mock_fs): *** End Patch """ mock_fs.apply_patch(patch) - assert "return a * b" in mock_fs.fs['fuzzy.py'] + content = mock_fs.read_file('fuzzy.py') + assert "return a * b" in content def test_full_add_update_delete_patch(mock_fs): @@ -325,12 +392,13 @@ def test_full_add_update_delete_patch(mock_fs): *** End Patch """ mock_fs.apply_patch(patch) - assert 'new_feature.py' in mock_fs.fs - assert 'utils.py' not in mock_fs.fs - assert 'Running main' in mock_fs.fs['main.py'] + assert mock_fs.file_exists('new_feature.py') + assert not mock_fs.file_exists('utils.py') + content = mock_fs.read_file('main.py') + assert 'Running main' in content # FIX: Make assertion more specific. Check that the *call* was removed, # not that the substring 'hello()' is gone from the entire file. - assert ' hello()' not in mock_fs.fs['main.py'] + assert ' hello()' not in content # --- Error Condition Tests --- @@ -419,15 +487,4 @@ def test_error_move_to_existing_file(mock_fs): *** End Patch """ with pytest.raises(DiffError, match="Cannot move 'utils.py' to 'main.py' because the target file already exists"): - mock_fs.apply_patch(patch) - - -def test_error_invalid_line_in_add(mock_fs): - patch = """*** Begin Patch -*** Add File: a.txt - this line is invalid -+but this one is ok -*** End Patch -""" - with pytest.raises(DiffError, match=r"Unknown or malformed action line"): mock_fs.apply_patch(patch) \ No newline at end of file diff --git a/tests/mcp/tools/test_replace_newline_in_quotes.py b/tests/mcp/tools/test_replace_newline_in_quotes.py deleted file mode 100644 index e475d7b..0000000 --- a/tests/mcp/tools/test_replace_newline_in_quotes.py +++ /dev/null @@ -1,189 +0,0 @@ -from codetide.mcp.tools.patch_code import BREAKLINE_TOKEN, replace_newline_in_quotes - -class TestReplaceNewlineInQuotes: - """Test suite for replace_newline_in_quotes function""" - - def test_single_quoted_string_with_newline(self): - """Test replacement in single-quoted strings with actual newlines""" - text = "'Hello\nWorld'" - expected = f"'Hello{BREAKLINE_TOKEN}World'" - result = replace_newline_in_quotes(text) - assert result == expected - - def test_double_quoted_string_with_newline(self): - """Test replacement in double-quoted strings with actual newlines""" - text = '"Hello\nWorld"' - expected = f'"Hello{BREAKLINE_TOKEN}World"' - result = replace_newline_in_quotes(text) - assert result == expected - - def test_single_quoted_string_with_literal_backslash_n(self): - """Test replacement of literal \\n in single-quoted strings""" - text = r"'Hello\nWorld'" - expected = f"'Hello{BREAKLINE_TOKEN}World'" - result = replace_newline_in_quotes(text) - assert result == expected - - def test_double_quoted_string_with_literal_backslash_n(self): - """Test replacement of literal \\n in double-quoted strings""" - text = r'"Hello\nWorld"' - expected = f'"Hello{BREAKLINE_TOKEN}World"' - result = replace_newline_in_quotes(text) - assert result == expected - - def test_triple_quoted_strings_unchanged(self): - """Test that triple-quoted strings are not modified""" - text = '''"""This has a -newline that should NOT change"""''' - result = replace_newline_in_quotes(text) - assert result == text - - def test_triple_single_quoted_strings_unchanged(self): - """Test that triple single-quoted strings are not modified""" - text = """'''This has a -newline that should NOT change'''""" - result = replace_newline_in_quotes(text) - assert result == text - - def test_mixed_quote_types(self): - """Test handling of mixed single and double quotes""" - text = '''single = 'Hello\\nWorld' -double = "Goodbye\\nMoon"''' - expected = f'''single = 'Hello{BREAKLINE_TOKEN}World' -double = "Goodbye{BREAKLINE_TOKEN}Moon"''' - result = replace_newline_in_quotes(text) - assert result == expected - - def test_escaped_quotes_in_strings(self): - """Test strings containing escaped quotes""" - text = r"'He said \"Hello\nWorld\"'" - expected = f"'He said \\\"Hello{BREAKLINE_TOKEN}World\\\"'" - result = replace_newline_in_quotes(text) - assert result == expected - - def test_nested_quotes_scenario(self): - """Test complex nested quote scenarios""" - text = '''"She said 'Hello\\nWorld' to me"''' - expected = f'''"She said 'Hello{BREAKLINE_TOKEN}World' to me"''' - result = replace_newline_in_quotes(text) - assert result == expected - - def test_multiple_newlines_in_single_string(self): - """Test multiple newlines within a single quoted string""" - text = "'First\\nSecond\\nThird'" - expected = f"'First{BREAKLINE_TOKEN}Second{BREAKLINE_TOKEN}Third'" - result = replace_newline_in_quotes(text) - assert result == expected - - def test_empty_quoted_strings(self): - """Test empty quoted strings""" - text = "''" - result = replace_newline_in_quotes(text) - assert result == text - - text = '""' - result = replace_newline_in_quotes(text) - assert result == text - - def test_no_quotes_in_text(self): - """Test text with no quotes at all""" - text = "This is plain text with\nnewlines" - result = replace_newline_in_quotes(text) - assert result == text - - def test_unmatched_quotes(self): - """Test text with unmatched quotes (should not be processed)""" - text = "This has an unmatched ' quote" - result = replace_newline_in_quotes(text) - assert result == text - - def test_custom_token(self): - """Test using a custom replacement token""" - text = "'Hello\\nWorld'" - custom_token = "<>" - expected = f"'Hello{custom_token}World'" - result = replace_newline_in_quotes(text, token=custom_token) - assert result == expected - - def test_function_definition_scenario(self): - """Test the original failing scenario from your example""" - text = '''def example(): - single = 'This has a -newline' - double = "This also has a -newline" - triple = """This is a triple quote -with multiple -lines that should NOT be changed""" - another_triple = \'\'\'Another triple -with newlines -that should stay\'\'\' - return single, double, triple''' - - result = replace_newline_in_quotes(text) - - # Check that single and double quoted strings are modified - assert f"'This has a{BREAKLINE_TOKEN}newline'" in result - assert f'"This also has a{BREAKLINE_TOKEN}newline"' in result - - # Check that triple quoted strings remain unchanged - assert '''"""This is a triple quote -with multiple -lines that should NOT be changed"""''' in result - assert '''\'\'\'Another triple -with newlines -that should stay\'\'\'''' in result - - def test_consecutive_quoted_strings(self): - """Test consecutive quoted strings""" - text = "'First\\nString' 'Second\\nString'" - expected = f"'First{BREAKLINE_TOKEN}String' 'Second{BREAKLINE_TOKEN}String'" - result = replace_newline_in_quotes(text) - assert result == expected - - def test_mixed_actual_and_literal_newlines(self): - """Test strings with both actual newlines and literal \\n""" - text = """'Hello\\nWorld -Real newline here'""" - expected = f"""'Hello{BREAKLINE_TOKEN}World{BREAKLINE_TOKEN}Real newline here'""" - result = replace_newline_in_quotes(text) - assert result == expected - - def test_quotes_within_triple_quotes(self): - """Test single/double quotes within triple quotes (should not be processed)""" - text = '''"""This contains 'single quotes' and "double quotes" -with newlines that should NOT change"""''' - result = replace_newline_in_quotes(text) - assert result == text - - def test_complex_python_code(self): - """Test a complex Python code snippet""" - text = '''def process_data(): - query = "SELECT * FROM users WHERE name = 'John\\nDoe'" - error_msg = 'Database connection failed\\nRetrying...' - docstring = """ - This function processes data from the database. - It handles errors gracefully and logs appropriate messages. - No changes should be made to this docstring. - """ - return query, error_msg''' - - result = replace_newline_in_quotes(text) - - # Check replacements in single/double quotes - assert f'"SELECT * FROM users WHERE name = \'John{BREAKLINE_TOKEN}Doe\'"' in result - assert f"'Database connection failed{BREAKLINE_TOKEN}Retrying...'" in result - - # Check triple quotes unchanged - assert '''""" - This function processes data from the database. - It handles errors gracefully and logs appropriate messages. - No changes should be made to this docstring. - """''' in result - - def test_edge_case_almost_triple_quotes(self): - """Test strings that look almost like triple quotes but aren't""" - text = "'' + '\\ntest'" # Two single quotes followed by another string - expected = f"'' + '{BREAKLINE_TOKEN}test'" - result = replace_newline_in_quotes(text) - assert result == expected \ No newline at end of file