iatoolkit 2.54.0__tar.gz → 2.54.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {iatoolkit-2.54.0/src/iatoolkit.egg-info → iatoolkit-2.54.2}/PKG-INFO +1 -1
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/__init__.py +1 -1
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/locales/en.yaml +43 -54
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/locales/es.yaml +42 -53
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/language_service.py +25 -4
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/profile_service.py +63 -0
- iatoolkit-2.54.2/src/iatoolkit/static/js/chat_header_navigation.js +72 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/js/chat_model_selector.js +9 -8
- iatoolkit-2.54.2/src/iatoolkit/static/styles/account.css +62 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/styles/chat_iatoolkit.css +8 -0
- iatoolkit-2.54.2/src/iatoolkit/templates/_chat_header.html +144 -0
- iatoolkit-2.54.2/src/iatoolkit/templates/account.html +84 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/chat.html +2 -142
- iatoolkit-2.54.2/src/iatoolkit/views/account_view.py +89 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2/src/iatoolkit.egg-info}/PKG-INFO +1 -1
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit.egg-info/SOURCES.txt +3 -0
- iatoolkit-2.54.0/src/iatoolkit/templates/account.html +0 -617
- iatoolkit-2.54.0/src/iatoolkit/views/account_view.py +0 -162
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/LICENSE +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/LICENSE_COMMUNITY.md +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/pyproject.toml +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/readme.md +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/setup.cfg +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/base_company.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/cli_commands.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/__init__.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/bridge_validation.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/exceptions.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/interfaces/__init__.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/model_registry.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/routes.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/secret_resolver.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/session_manager.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/text_splitter.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/url_safety.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/common/util.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/company_registry.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/__init__.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/core.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/__init__.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/call_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/connectors/__init__.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/google_auth_client.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/google_chat_app.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/inference_handler.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/llm_proxy.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/llm_response.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/infra/redis_session_manager.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/__init__.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/api_key_repo.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/bridge_repo.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/database_manager.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/document_repo.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/knowledge_wiki_repo.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/memory_repo.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/models.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/profile_repo.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/repositories/vs_repo.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/runtime_logging.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/__init__.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/api_key_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/attachment_policy_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/auth_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/branding_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/company_context_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/configuration_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/context_builder_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/dispatcher_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/embedding_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/excel_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/file_processor_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/history_manager_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/http_tool_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/i18n_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/inference_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/jwt_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/knowledge_base_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/license_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/llm_client_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/mail_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/markdown_wiki_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/mcp_token_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/memory_compiler_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/memory_lint_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/memory_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/memory_wiki_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/operator_identity_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/parsers/__init__.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/parsers/contracts.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/parsers/validator.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/pdf_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/prompt_resource_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/prompt_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/query_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/sql_dataset_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/sql_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/sql_source_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/storage_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/structured_output_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/system_tools.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/telemetry_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/tenant_wiki_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/tool_output_contract.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/tool_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/user_feedback_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/user_session_context_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/visual_kb_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/visual_tool_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/warmup_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/web_search/__init__.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/services/web_search_service.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/images/fernando.jpeg +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/js/chat_filepond.js +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/js/chat_help_content.js +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/js/chat_history_button.js +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/js/chat_main.js +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/styles/chat_modal.css +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/styles/chat_public.css +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/styles/documents.css +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/styles/landing_page.css +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/styles/llm_output.css +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/static/styles/onboarding.css +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/_company_header.html +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/_login_widget.html +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/base.html +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/change_password.html +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/chat_modals.html +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/error.html +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/forgot_password.html +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/home_hosted_default.html +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/onboarding_shell.html +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/pdf/base.html +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/pdf/letter.html +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/pdf/report.html +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/pdf/simple.html +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/templates/signup.html +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/__init__.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/api_key_api_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/base_login_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/categories_api_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/change_password_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/chat_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/configuration_api_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/connectors_api_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/embedding_api_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/forgot_password_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/help_content_api_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/history_api_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/home_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/init_context_api_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/llmquery_api_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/load_document_api_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/login_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/logout_api_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/memory_api_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/profile_api_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/prompt_api_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/rag_api_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/root_redirect_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/signup_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/static_page_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/tool_api_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/users_api_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit/views/verify_user_view.py +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit.egg-info/requires.txt +0 -0
- {iatoolkit-2.54.0 → iatoolkit-2.54.2}/src/iatoolkit.egg-info/top_level.txt +0 -0
|
@@ -327,58 +327,47 @@ ui:
|
|
|
327
327
|
init_context: "Initializing the context ..."
|
|
328
328
|
|
|
329
329
|
account:
|
|
330
|
-
title: "My
|
|
330
|
+
title: "My account"
|
|
331
331
|
back_to_chat: "Back to chat"
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
mcp_token_copy_button: "Copy"
|
|
372
|
-
mcp_token_copy_success: "Token copied."
|
|
373
|
-
mcp_token_copy_error: "Could not copy the token."
|
|
374
|
-
mcp_token_revoke_button: "Revoke"
|
|
375
|
-
mcp_token_created_title: "Copy this token now"
|
|
376
|
-
mcp_token_created_help: "For security reasons, this token is shown only once."
|
|
377
|
-
mcp_token_created_token_label: "Bearer token"
|
|
378
|
-
mcp_token_created_json_label: "Ready-to-paste JSON config"
|
|
379
|
-
mcp_token_created_flash: "MCP token created."
|
|
380
|
-
mcp_token_revoked_flash: "MCP token revoked."
|
|
381
|
-
mcp_token_unknown_action: "Unknown account action."
|
|
332
|
+
profile: "Profile"
|
|
333
|
+
preferences: "Preferences"
|
|
334
|
+
connections: "Connections"
|
|
335
|
+
first_name: "First name"
|
|
336
|
+
last_name: "Last name"
|
|
337
|
+
full_name: "Full name"
|
|
338
|
+
email: "Email / identifier"
|
|
339
|
+
organization: "Organization"
|
|
340
|
+
role: "Role"
|
|
341
|
+
sign_in: "Sign-in method"
|
|
342
|
+
auth_local: "Email and password"
|
|
343
|
+
auth_google: "Google"
|
|
344
|
+
auth_corporate: "Corporate sign-in"
|
|
345
|
+
role_user: "User"
|
|
346
|
+
role_editor: "Editor"
|
|
347
|
+
role_admin: "Administrator"
|
|
348
|
+
role_owner: "Owner"
|
|
349
|
+
language: "Interface language"
|
|
350
|
+
browser_language: "This preference is kept in this browser for your account and organization."
|
|
351
|
+
save: "Save changes"
|
|
352
|
+
saved: "Changes saved."
|
|
353
|
+
managed_identity: "Your name is managed by your identity provider."
|
|
354
|
+
invalid_name: "Enter a first and last name, up to 100 characters each."
|
|
355
|
+
update_failed: "Could not save your changes. Please try again."
|
|
356
|
+
not_available: "Not available"
|
|
357
|
+
connected: "Connected"
|
|
358
|
+
expired: "Reconnect required"
|
|
359
|
+
not_connected: "Not connected"
|
|
360
|
+
connect: "Connect"
|
|
361
|
+
reconnect: "Reconnect"
|
|
362
|
+
disconnect: "Disconnect"
|
|
363
|
+
empty_connections: "No personal services are available in this organization."
|
|
364
|
+
confirm_disconnect: "Disconnect this account?"
|
|
365
|
+
loading: "Loading connections..."
|
|
366
|
+
load_error: "Could not load connections."
|
|
367
|
+
connection_error: "Could not complete the operation."
|
|
368
|
+
retry: "Retry"
|
|
369
|
+
last_used: "Last used"
|
|
370
|
+
never_used: "No recorded use"
|
|
382
371
|
|
|
383
372
|
memory:
|
|
384
373
|
title: "Memory"
|
|
@@ -2132,7 +2121,7 @@ ui:
|
|
|
2132
2121
|
mcp_service_tokens:
|
|
2133
2122
|
menu_label: "MCP Tokens"
|
|
2134
2123
|
title: "MCP Tokens"
|
|
2135
|
-
subtitle: "Manage
|
|
2124
|
+
subtitle: "Manage MCP service credentials for organization automations."
|
|
2136
2125
|
new_btn: "New MCP Token"
|
|
2137
2126
|
search_placeholder: "Filter MCP tokens..."
|
|
2138
2127
|
empty_state: "No MCP tokens registered yet."
|
|
@@ -2142,8 +2131,8 @@ ui:
|
|
|
2142
2131
|
subject_type: "Type"
|
|
2143
2132
|
subject_type_service: "Service"
|
|
2144
2133
|
subject_type_user: "User"
|
|
2145
|
-
subject_identifier: "
|
|
2146
|
-
subject_identifier_placeholder: "e.g. service:mcp
|
|
2134
|
+
subject_identifier: "Service identity"
|
|
2135
|
+
subject_identifier_placeholder: "e.g. service:mcp"
|
|
2147
2136
|
created_by_identifier: "Created by"
|
|
2148
2137
|
service_subject_placeholder: "e.g. service:mcp"
|
|
2149
2138
|
user_subject_placeholder: "e.g. user@company.com"
|
|
@@ -343,56 +343,45 @@ ui:
|
|
|
343
343
|
account:
|
|
344
344
|
title: "Mi cuenta"
|
|
345
345
|
back_to_chat: "Volver al chat"
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
mcp_token_copy_button: "Copiar"
|
|
386
|
-
mcp_token_copy_success: "Token copiado."
|
|
387
|
-
mcp_token_copy_error: "No se pudo copiar el token."
|
|
388
|
-
mcp_token_revoke_button: "Revocar"
|
|
389
|
-
mcp_token_created_title: "Copia este token ahora"
|
|
390
|
-
mcp_token_created_help: "Por seguridad, este token se muestra solo una vez."
|
|
391
|
-
mcp_token_created_token_label: "Bearer token"
|
|
392
|
-
mcp_token_created_json_label: "Configuración JSON lista para pegar"
|
|
393
|
-
mcp_token_created_flash: "Token MCP creado."
|
|
394
|
-
mcp_token_revoked_flash: "Token MCP revocado."
|
|
395
|
-
mcp_token_unknown_action: "Acción de cuenta desconocida."
|
|
346
|
+
profile: "Perfil"
|
|
347
|
+
preferences: "Preferencias"
|
|
348
|
+
connections: "Conexiones"
|
|
349
|
+
first_name: "Nombre"
|
|
350
|
+
last_name: "Apellido"
|
|
351
|
+
full_name: "Nombre completo"
|
|
352
|
+
email: "Correo / identificador"
|
|
353
|
+
organization: "Organización"
|
|
354
|
+
role: "Rol"
|
|
355
|
+
sign_in: "Método de acceso"
|
|
356
|
+
auth_local: "Correo y contraseña"
|
|
357
|
+
auth_google: "Google"
|
|
358
|
+
auth_corporate: "Acceso corporativo"
|
|
359
|
+
role_user: "Usuario"
|
|
360
|
+
role_editor: "Editor"
|
|
361
|
+
role_admin: "Administrador"
|
|
362
|
+
role_owner: "Propietario"
|
|
363
|
+
language: "Idioma de la interfaz"
|
|
364
|
+
browser_language: "Esta preferencia se conserva en este navegador para tu cuenta y organización."
|
|
365
|
+
save: "Guardar cambios"
|
|
366
|
+
saved: "Cambios guardados."
|
|
367
|
+
managed_identity: "Tu nombre está gestionado por tu proveedor de identidad."
|
|
368
|
+
invalid_name: "Completa nombre y apellido, con un máximo de 100 caracteres por campo."
|
|
369
|
+
update_failed: "No se pudieron guardar los cambios. Intenta nuevamente."
|
|
370
|
+
not_available: "No disponible"
|
|
371
|
+
connected: "Conectada"
|
|
372
|
+
expired: "Requiere reconexión"
|
|
373
|
+
not_connected: "No conectada"
|
|
374
|
+
connect: "Conectar"
|
|
375
|
+
reconnect: "Reconectar"
|
|
376
|
+
disconnect: "Desconectar"
|
|
377
|
+
empty_connections: "No hay servicios personales disponibles en esta organización."
|
|
378
|
+
confirm_disconnect: "¿Desconectar esta cuenta?"
|
|
379
|
+
loading: "Cargando conexiones..."
|
|
380
|
+
load_error: "No se pudieron cargar las conexiones."
|
|
381
|
+
connection_error: "No se pudo completar la operación."
|
|
382
|
+
retry: "Reintentar"
|
|
383
|
+
last_used: "Último uso"
|
|
384
|
+
never_used: "Sin uso registrado"
|
|
396
385
|
|
|
397
386
|
memory:
|
|
398
387
|
title: "Memoria"
|
|
@@ -2150,7 +2139,7 @@ ui:
|
|
|
2150
2139
|
mcp_service_tokens:
|
|
2151
2140
|
menu_label: "Tokens MCP"
|
|
2152
2141
|
title: "Tokens MCP"
|
|
2153
|
-
subtitle: "Administra
|
|
2142
|
+
subtitle: "Administra credenciales MCP de servicio para automatizaciones de la organización."
|
|
2154
2143
|
new_btn: "Nuevo token MCP"
|
|
2155
2144
|
search_placeholder: "Filtrar tokens MCP..."
|
|
2156
2145
|
empty_state: "Todavía no hay tokens MCP registrados."
|
|
@@ -2160,8 +2149,8 @@ ui:
|
|
|
2160
2149
|
subject_type: "Tipo"
|
|
2161
2150
|
subject_type_service: "Servicio"
|
|
2162
2151
|
subject_type_user: "Usuario"
|
|
2163
|
-
subject_identifier: "
|
|
2164
|
-
subject_identifier_placeholder: "ej. service:mcp
|
|
2152
|
+
subject_identifier: "Identidad de servicio"
|
|
2153
|
+
subject_identifier_placeholder: "ej. service:mcp"
|
|
2165
2154
|
created_by_identifier: "Creado por"
|
|
2166
2155
|
service_subject_placeholder: "ej. service:mcp"
|
|
2167
2156
|
user_subject_placeholder: "ej. usuario@empresa.com"
|
|
@@ -75,9 +75,10 @@ class LanguageService:
|
|
|
75
75
|
def get_current_language(self) -> str:
|
|
76
76
|
"""
|
|
77
77
|
Determines and caches the language for the current request using a priority order:
|
|
78
|
-
1.
|
|
79
|
-
2.
|
|
80
|
-
3.
|
|
78
|
+
1. The signed-in user's saved preference.
|
|
79
|
+
2. Company's default language from company.yaml ('locale').
|
|
80
|
+
3. Query parameter '?lang=<code>' (e.g., 'en', 'es').
|
|
81
|
+
4. System-wide fallback language ('es').
|
|
81
82
|
"""
|
|
82
83
|
if 'locale_ctx' in g:
|
|
83
84
|
return g.lang
|
|
@@ -111,8 +112,28 @@ class LanguageService:
|
|
|
111
112
|
return g.locale_ctx
|
|
112
113
|
|
|
113
114
|
def _resolve_locale_string(self) -> str:
|
|
114
|
-
#
|
|
115
|
+
# Personal preferences apply only to the signed-in identity in this tenant.
|
|
115
116
|
company_short_name = self._get_company_short_name()
|
|
117
|
+
sessions = SessionManager.get('company_sessions')
|
|
118
|
+
entry = sessions.get(company_short_name, {}) if isinstance(sessions, dict) else {}
|
|
119
|
+
identifier = entry.get('user_identifier')
|
|
120
|
+
if identifier:
|
|
121
|
+
preferences = SessionManager.get('account_languages')
|
|
122
|
+
selected = (preferences.get(company_short_name, {}).get(identifier)
|
|
123
|
+
if isinstance(preferences, dict) else None)
|
|
124
|
+
if selected in self.LOCALE_DEFINITIONS:
|
|
125
|
+
return selected
|
|
126
|
+
try:
|
|
127
|
+
user = self.profile_repo.get_user_by_email(identifier)
|
|
128
|
+
company = self.profile_repo.get_company_by_short_name(company_short_name)
|
|
129
|
+
if (user and company and user.preferred_language in self.LOCALE_DEFINITIONS
|
|
130
|
+
and self.profile_repo.get_user_role_in_company(company.id, user.id)):
|
|
131
|
+
return user.preferred_language
|
|
132
|
+
except Exception:
|
|
133
|
+
self._safe_rollback()
|
|
134
|
+
logging.warning('Could not load personal language preference')
|
|
135
|
+
|
|
136
|
+
# Company locale remains the default for visitors and unset preferences.
|
|
116
137
|
if company_short_name:
|
|
117
138
|
# cnfig returns something like 'es_ES' o 'en_US'
|
|
118
139
|
try:
|
|
@@ -295,6 +295,69 @@ class ProfileService:
|
|
|
295
295
|
"profile": profile
|
|
296
296
|
}
|
|
297
297
|
|
|
298
|
+
def _account_user(self, company_short_name: str, session_info: dict):
|
|
299
|
+
profile = session_info.get("profile") or {}
|
|
300
|
+
method = (profile.get("extras") or {}).get("auth_method")
|
|
301
|
+
if not profile.get("user_is_local") and method != "google":
|
|
302
|
+
return None
|
|
303
|
+
user = self.profile_repo.get_user_by_email(session_info["user_identifier"])
|
|
304
|
+
company = self.profile_repo.get_company_by_short_name(company_short_name)
|
|
305
|
+
if not user or not company or not self.profile_repo.get_user_role_in_company(company.id, user.id):
|
|
306
|
+
return None
|
|
307
|
+
return user
|
|
308
|
+
|
|
309
|
+
def get_account_profile(self, company_short_name: str, session_info: dict) -> dict:
|
|
310
|
+
profile = session_info.get("profile") or {}
|
|
311
|
+
user = self._account_user(company_short_name, session_info)
|
|
312
|
+
method = str(user.auth_method or "local") if user else "corporate"
|
|
313
|
+
return {
|
|
314
|
+
"first_name": user.first_name if user else "",
|
|
315
|
+
"last_name": user.last_name if user else "",
|
|
316
|
+
"full_name": f"{user.first_name} {user.last_name}" if user else profile.get("user_fullname", ""),
|
|
317
|
+
"email": profile.get("user_email") or session_info["user_identifier"],
|
|
318
|
+
"role": profile.get("user_role") or "user",
|
|
319
|
+
"auth_method": method,
|
|
320
|
+
"can_edit_name": bool(user and method == "local"),
|
|
321
|
+
"language": self.lang_service.get_current_language(),
|
|
322
|
+
"language_is_browser_only": user is None,
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
def update_account(self, company_short_name: str, session_info: dict, *, action: str,
|
|
326
|
+
first_name: str = "", last_name: str = "", language: str = "") -> dict:
|
|
327
|
+
if session_info.get("company_short_name") != company_short_name or not session_info.get("profile"):
|
|
328
|
+
return {"error": "ui.account.update_failed", "status_code": 403}
|
|
329
|
+
user = self._account_user(company_short_name, session_info)
|
|
330
|
+
profile = dict(session_info["profile"])
|
|
331
|
+
identifier = session_info["user_identifier"]
|
|
332
|
+
try:
|
|
333
|
+
if action == "update_profile":
|
|
334
|
+
if not user or str(user.auth_method or "local") != "local":
|
|
335
|
+
return {"error": "ui.account.managed_identity", "status_code": 403}
|
|
336
|
+
first_name, last_name = first_name.strip(), last_name.strip()
|
|
337
|
+
if not all(0 < len(value) <= 100 and not any(ord(c) < 32 for c in value)
|
|
338
|
+
for value in (first_name, last_name)):
|
|
339
|
+
return {"error": "ui.account.invalid_name"}
|
|
340
|
+
self.profile_repo.update_user(identifier, first_name=first_name, last_name=last_name)
|
|
341
|
+
profile["user_fullname"] = f"{first_name} {last_name}"
|
|
342
|
+
elif action == "update_preferences":
|
|
343
|
+
if language not in {"es", "en"}:
|
|
344
|
+
return {"error": "errors.general.unsupported_language"}
|
|
345
|
+
if user:
|
|
346
|
+
self.profile_repo.update_user(identifier, preferred_language=language)
|
|
347
|
+
else:
|
|
348
|
+
preferences = SessionManager.get("account_languages", {})
|
|
349
|
+
preferences.setdefault(company_short_name, {})[identifier] = language
|
|
350
|
+
SessionManager.set("account_languages", preferences)
|
|
351
|
+
profile["language"] = language
|
|
352
|
+
else:
|
|
353
|
+
return {"error": "ui.account.update_failed"}
|
|
354
|
+
self.session_context.save_profile_data(company_short_name, identifier, profile)
|
|
355
|
+
return {"success": True}
|
|
356
|
+
except Exception:
|
|
357
|
+
self._safe_rollback()
|
|
358
|
+
logging.exception("Failed to update account for %s/%s", company_short_name, identifier)
|
|
359
|
+
return {"error": "ui.account.update_failed", "status_code": 500}
|
|
360
|
+
|
|
298
361
|
def update_user_language(self, user_identifier: str, new_lang: str) -> dict:
|
|
299
362
|
"""
|
|
300
363
|
Business logic to update a user's preferred language.
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
(function () {
|
|
2
|
+
const actions = new Set([
|
|
3
|
+
'history-button', 'memory-button', 'force-reload-button',
|
|
4
|
+
'send-feedback-button', 'open-help-button', 'logout-button'
|
|
5
|
+
]);
|
|
6
|
+
const storageKey = 'iatoolkit.pending_chat_action';
|
|
7
|
+
const header = document.querySelector('[data-chat-header]');
|
|
8
|
+
if (!header) return;
|
|
9
|
+
const selectionKey = 'iatoolkit.chat_header_selection';
|
|
10
|
+
function isCurrent(value) {
|
|
11
|
+
return value && value.company === header.dataset.company && value.user === header.dataset.user &&
|
|
12
|
+
Number.isFinite(value.created) && Date.now() - value.created >= 0 && Date.now() - value.created < 30000;
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
const selection = JSON.parse(sessionStorage.getItem(selectionKey) || 'null');
|
|
16
|
+
sessionStorage.removeItem(selectionKey);
|
|
17
|
+
if (isCurrent(selection)) window.chatHeaderSelection = selection;
|
|
18
|
+
} catch (_) {}
|
|
19
|
+
|
|
20
|
+
// Carry the current selection only across navigation within this workspace.
|
|
21
|
+
const workspacePaths = ['chat', 'account', 'mcp-connections'].map(
|
|
22
|
+
page => '/' + encodeURIComponent(header.dataset.company) + '/' + page
|
|
23
|
+
);
|
|
24
|
+
function rememberSelection(url) {
|
|
25
|
+
if (url.origin !== location.origin || !workspacePaths.includes(url.pathname)) return;
|
|
26
|
+
try {
|
|
27
|
+
sessionStorage.setItem(selectionKey, JSON.stringify({
|
|
28
|
+
company: header.dataset.company, user: header.dataset.user, created: Date.now(),
|
|
29
|
+
model: window.currentLlmModel, reasoningEffort: window.currentLlmReasoningEffort
|
|
30
|
+
}));
|
|
31
|
+
} catch (_) {}
|
|
32
|
+
}
|
|
33
|
+
document.addEventListener('click', event => {
|
|
34
|
+
const link = event.target.closest('a[href]');
|
|
35
|
+
if (!link || link.target === '_blank' || event.button !== 0 ||
|
|
36
|
+
event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) return;
|
|
37
|
+
rememberSelection(new URL(link.href));
|
|
38
|
+
});
|
|
39
|
+
document.addEventListener('submit', event => {
|
|
40
|
+
if (event.target instanceof HTMLFormElement) {
|
|
41
|
+
rememberSelection(new URL(event.target.getAttribute('action') || location.href, location.href));
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
if (header.dataset.accountPage === 'true') {
|
|
46
|
+
header.addEventListener('click', event => {
|
|
47
|
+
const link = event.target.closest('[data-chat-action]');
|
|
48
|
+
if (!link || event.button !== 0 || event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) return;
|
|
49
|
+
try {
|
|
50
|
+
sessionStorage.setItem(storageKey, JSON.stringify({
|
|
51
|
+
company: header.dataset.company, user: header.dataset.user,
|
|
52
|
+
action: link.dataset.chatAction, created: Date.now()
|
|
53
|
+
}));
|
|
54
|
+
} catch (_) {
|
|
55
|
+
// The link still returns to the chat when browser storage is unavailable.
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Registered after the chat's handlers, including its jQuery ready callbacks.
|
|
62
|
+
$(function () {
|
|
63
|
+
try {
|
|
64
|
+
const pending = JSON.parse(sessionStorage.getItem(storageKey) || 'null');
|
|
65
|
+
sessionStorage.removeItem(storageKey);
|
|
66
|
+
if (!isCurrent(pending) || !actions.has(pending.action)) return;
|
|
67
|
+
document.getElementById(pending.action)?.click();
|
|
68
|
+
} catch (_) {
|
|
69
|
+
// A stale or invalid navigation intent must not prevent the chat from opening.
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
})();
|
|
@@ -127,12 +127,8 @@ window.currentLlmReasoningEffort = window.currentLlmReasoningEffort || null;
|
|
|
127
127
|
}
|
|
128
128
|
|
|
129
129
|
/**
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
* 2) si no existe o no está en la lista, usa el primer modelo disponible.
|
|
133
|
-
*
|
|
134
|
-
* No se lee nada de localStorage en este punto: cada apertura de chat
|
|
135
|
-
* arranca desde la configuración de la compañía.
|
|
130
|
+
* Internal navigation between chat and account preserves the selection.
|
|
131
|
+
* A fresh chat still starts from company.yaml, never from localStorage.
|
|
136
132
|
*/
|
|
137
133
|
function initCurrentModel() {
|
|
138
134
|
const models = getAvailableModels();
|
|
@@ -140,7 +136,10 @@ window.currentLlmReasoningEffort = window.currentLlmReasoningEffort || null;
|
|
|
140
136
|
|
|
141
137
|
let resolved = null;
|
|
142
138
|
|
|
143
|
-
|
|
139
|
+
const carriedId = window.chatHeaderSelection?.model;
|
|
140
|
+
if (carriedId && models.some(m => m.id === carriedId)) {
|
|
141
|
+
resolved = carriedId;
|
|
142
|
+
} else if (defaultId && models.some(m => m.id === defaultId)) {
|
|
144
143
|
resolved = defaultId;
|
|
145
144
|
} else if (models.length > 0) {
|
|
146
145
|
resolved = models[0].id;
|
|
@@ -151,7 +150,9 @@ window.currentLlmReasoningEffort = window.currentLlmReasoningEffort || null;
|
|
|
151
150
|
}
|
|
152
151
|
|
|
153
152
|
function initCurrentReasoningEffort() {
|
|
154
|
-
const
|
|
153
|
+
const effort = window.chatHeaderSelection?.model === window.currentLlmModel
|
|
154
|
+
? window.chatHeaderSelection.reasoningEffort : window.defaultLlmReasoningEffort;
|
|
155
|
+
const candidate = String(effort || '').trim().toLowerCase();
|
|
155
156
|
const allowed = getAllowedReasoningEfforts(getActiveModelMetadata());
|
|
156
157
|
window.currentLlmReasoningEffort = allowed.includes(candidate) ? candidate : null;
|
|
157
158
|
if (!modelSupportsReasoning(getActiveModelMetadata())) {
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
.account-page {
|
|
2
|
+
--account-line: #e2e5e8;
|
|
3
|
+
--account-muted: #60666d;
|
|
4
|
+
max-width: 1120px;
|
|
5
|
+
margin: 0 auto;
|
|
6
|
+
padding: 0 32px 48px;
|
|
7
|
+
color: #25292d;
|
|
8
|
+
font: 15px/1.5 system-ui, sans-serif;
|
|
9
|
+
letter-spacing: 0;
|
|
10
|
+
}
|
|
11
|
+
.account-page * { box-sizing: border-box; min-width: 0; }
|
|
12
|
+
.account-workspace { padding-top: 1rem; }
|
|
13
|
+
.account-page a { text-decoration: none; }
|
|
14
|
+
.account-layout { display: grid; grid-template-columns: 232px minmax(0, 1fr); gap: 40px; padding-top: 36px; }
|
|
15
|
+
.account-sidebar { padding-right: 24px; border-right: 1px solid var(--account-line); }
|
|
16
|
+
.account-sidebar h1 { font-size: 18px; line-height: 1.4; margin: 0 0 6px; padding: 0 12px; font-weight: 650; }
|
|
17
|
+
.account-identity { color: var(--account-muted); font-size: 13px; overflow-wrap: anywhere; padding: 0 12px 20px; margin-bottom: 16px; border-bottom: 1px solid var(--account-line); }
|
|
18
|
+
.account-sidebar nav { display: grid; gap: 4px; }
|
|
19
|
+
.account-sidebar nav a { display: grid; grid-template-columns: 20px minmax(0, 1fr); gap: 12px; align-items: center; min-height: 44px; padding: 10px 12px; font-size: 14px; color: #4b5158; border-radius: 4px; }
|
|
20
|
+
.account-sidebar nav a i { width: 20px; text-align: center; line-height: 20px; }
|
|
21
|
+
.account-sidebar nav a span { overflow-wrap: anywhere; }
|
|
22
|
+
.account-sidebar nav a:hover { background: #f5f6f7; }
|
|
23
|
+
.account-sidebar nav a[aria-current] { background: #edf3f1; color: #225548; font-weight: 600; box-shadow: inset 3px 0 #285e50; }
|
|
24
|
+
.account-main { max-width: 720px; }
|
|
25
|
+
.account-main h2 { font-size: 21px; line-height: 1.3; font-weight: 650; margin: 0 0 28px; }
|
|
26
|
+
.account-form label { display: block; font-size: 14px; font-weight: 550; margin-bottom: 8px; }
|
|
27
|
+
.account-fields { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px; }
|
|
28
|
+
.account-page .form-control, .account-page .form-select { border-radius: 6px; min-height: 42px; font-size: 15px; }
|
|
29
|
+
.account-save { display: inline-flex; gap: 8px; align-items: center; background: var(--brand-primary-color, #285e50); color: var(--brand-text-on-primary, #fff); border-radius: 6px; min-height: 40px; margin: 22px 0 28px; }
|
|
30
|
+
.account-save:hover, .account-save:focus { color: var(--brand-text-on-primary, #fff); background: color-mix(in srgb, var(--brand-primary-color, #285e50) 85%, black); }
|
|
31
|
+
.account-details { margin: 0; }
|
|
32
|
+
.account-details > div { display: grid; grid-template-columns: 180px minmax(0, 1fr); padding: 19px 0; border-top: 1px solid var(--account-line); gap: 16px; }
|
|
33
|
+
.account-details dt { font-weight: 450; color: var(--account-muted); }
|
|
34
|
+
.account-details dd { margin: 0; overflow-wrap: anywhere; }
|
|
35
|
+
.account-language { max-width: 320px; }
|
|
36
|
+
.account-muted { color: var(--account-muted); font-size: 13px; }
|
|
37
|
+
.account-notice { padding: 12px 16px; border-left: 3px solid #287153; background: #f0f7f3; margin-bottom: 24px; overflow-wrap: anywhere; }
|
|
38
|
+
.account-notice.is-error { border-color: #b43d41; background: #fdf2f2; }
|
|
39
|
+
.account-connection { display: flex; align-items: center; justify-content: space-between; gap: 20px; padding: 22px 0; border-top: 1px solid var(--account-line); }
|
|
40
|
+
.account-connection-name { font-size: 16px; font-weight: 600; overflow-wrap: anywhere; }
|
|
41
|
+
.account-connection-meta { font-size: 13px; color: var(--account-muted); margin-top: 5px; overflow-wrap: anywhere; }
|
|
42
|
+
.account-connection-state { font-size: 13px; margin-top: 5px; }
|
|
43
|
+
.account-connection-state.connected { color: #287153; }
|
|
44
|
+
.account-connection-state.expired { color: #975708; }
|
|
45
|
+
.account-connection-actions { display: flex; gap: 8px; flex-wrap: wrap; flex-shrink: 0; }
|
|
46
|
+
.account-connection-actions .btn { display: inline-flex; gap: 6px; align-items: center; border-radius: 6px; min-height: 38px; font-size: 13px; }
|
|
47
|
+
.account-empty { padding: 32px 0; border-top: 1px solid var(--account-line); color: var(--account-muted); }
|
|
48
|
+
.account-empty i { display: block; font-size: 28px; margin-bottom: 12px; }
|
|
49
|
+
.account-page :focus-visible { outline: 2px solid #287153; outline-offset: 3px; }
|
|
50
|
+
@media (max-width: 720px) {
|
|
51
|
+
.account-page { padding: 0 20px 32px; }
|
|
52
|
+
.account-layout { grid-template-columns: minmax(0, 1fr); gap: 28px; padding-top: 24px; }
|
|
53
|
+
.account-sidebar { padding: 0; border-right: 0; }
|
|
54
|
+
.account-sidebar h1 { padding: 0; }
|
|
55
|
+
.account-identity { padding: 0 0 16px; margin-bottom: 12px; }
|
|
56
|
+
.account-sidebar nav { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 4px; }
|
|
57
|
+
.account-sidebar nav a { display: flex; flex-direction: column; justify-content: center; text-align: center; min-height: 64px; font-size: 12px; gap: 6px; padding: 8px 4px; }
|
|
58
|
+
.account-sidebar nav a[aria-current] { box-shadow: inset 0 -2px #285e50; }
|
|
59
|
+
.account-fields { grid-template-columns: minmax(0, 1fr); gap: 16px; }
|
|
60
|
+
.account-details > div { grid-template-columns: minmax(0, 1fr); gap: 4px; padding: 16px 0; }
|
|
61
|
+
.account-connection { align-items: flex-start; flex-direction: column; gap: 12px; }
|
|
62
|
+
}
|
|
@@ -67,6 +67,14 @@ li {
|
|
|
67
67
|
color: var(--brand-header-text);
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
+
.chat-shared-header { gap: 8px 16px; flex-wrap: wrap; }
|
|
71
|
+
.chat-shared-header > div { min-width: 0; max-width: 100%; }
|
|
72
|
+
.chat-shared-header > div:last-child { flex-wrap: wrap; gap: 8px 0; }
|
|
73
|
+
.chat-shared-header > div:last-child > a { overflow-wrap: anywhere; }
|
|
74
|
+
.chat-shared-header > div:last-child > div:last-child { flex-wrap: wrap; justify-content: center; row-gap: 8px; max-width: 100%; }
|
|
75
|
+
.chat-brand-link, .chat-brand-link:hover { color: inherit; text-decoration: none; }
|
|
76
|
+
.chat-brand-link:focus-visible { outline: 2px solid currentColor; outline-offset: 4px; }
|
|
77
|
+
|
|
70
78
|
/* Estilos para el contenedor del chat y mensajes para que exista scroll */
|
|
71
79
|
#chat-container {
|
|
72
80
|
flex-grow: 1;
|