iatoolkit 2.53.1__tar.gz → 2.54.1__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.53.1/src/iatoolkit.egg-info → iatoolkit-2.54.1}/PKG-INFO +1 -1
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/__init__.py +1 -1
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/locales/en.yaml +43 -54
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/locales/es.yaml +42 -53
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/models.py +2 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/dispatcher_service.py +45 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/language_service.py +25 -4
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/profile_service.py +63 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/tool_service.py +49 -0
- iatoolkit-2.54.1/src/iatoolkit/static/js/chat_header_navigation.js +72 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/js/chat_main.js +4 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/js/chat_model_selector.js +9 -8
- iatoolkit-2.54.1/src/iatoolkit/static/styles/account.css +62 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/styles/chat_iatoolkit.css +8 -0
- iatoolkit-2.54.1/src/iatoolkit/templates/_chat_header.html +144 -0
- iatoolkit-2.54.1/src/iatoolkit/templates/account.html +84 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/chat.html +2 -142
- iatoolkit-2.54.1/src/iatoolkit/views/account_view.py +89 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1/src/iatoolkit.egg-info}/PKG-INFO +1 -1
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit.egg-info/SOURCES.txt +3 -0
- iatoolkit-2.53.1/src/iatoolkit/templates/account.html +0 -617
- iatoolkit-2.53.1/src/iatoolkit/views/account_view.py +0 -162
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/LICENSE +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/LICENSE_COMMUNITY.md +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/pyproject.toml +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/readme.md +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/setup.cfg +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/base_company.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/cli_commands.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/__init__.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/bridge_validation.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/exceptions.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/interfaces/__init__.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/model_registry.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/routes.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/secret_resolver.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/session_manager.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/text_splitter.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/url_safety.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/common/util.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/company_registry.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/__init__.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/core.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/__init__.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/call_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/connectors/__init__.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/google_auth_client.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/google_chat_app.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/inference_handler.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/llm_proxy.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/llm_response.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/infra/redis_session_manager.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/__init__.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/api_key_repo.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/bridge_repo.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/database_manager.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/document_repo.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/knowledge_wiki_repo.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/memory_repo.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/profile_repo.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/repositories/vs_repo.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/runtime_logging.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/__init__.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/api_key_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/attachment_policy_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/auth_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/branding_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/company_context_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/configuration_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/context_builder_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/embedding_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/excel_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/file_processor_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/history_manager_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/http_tool_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/i18n_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/inference_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/jwt_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/knowledge_base_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/license_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/llm_client_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/mail_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/markdown_wiki_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/mcp_token_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/memory_compiler_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/memory_lint_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/memory_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/memory_wiki_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/operator_identity_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/parsers/__init__.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/parsers/contracts.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/parsers/validator.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/pdf_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/prompt_resource_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/prompt_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/query_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/sql_dataset_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/sql_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/sql_source_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/storage_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/structured_output_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/system_tools.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/telemetry_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/tenant_wiki_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/tool_output_contract.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/user_feedback_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/user_session_context_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/visual_kb_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/visual_tool_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/warmup_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/web_search/__init__.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/services/web_search_service.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/images/fernando.jpeg +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/js/chat_filepond.js +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/js/chat_help_content.js +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/js/chat_history_button.js +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/styles/chat_modal.css +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/styles/chat_public.css +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/styles/documents.css +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/styles/landing_page.css +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/styles/llm_output.css +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/static/styles/onboarding.css +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/_company_header.html +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/_login_widget.html +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/base.html +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/change_password.html +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/chat_modals.html +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/error.html +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/forgot_password.html +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/home_hosted_default.html +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/onboarding_shell.html +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/pdf/base.html +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/pdf/letter.html +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/pdf/report.html +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/pdf/simple.html +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/templates/signup.html +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/__init__.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/api_key_api_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/base_login_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/categories_api_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/change_password_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/chat_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/configuration_api_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/connectors_api_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/embedding_api_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/forgot_password_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/help_content_api_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/history_api_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/home_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/init_context_api_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/llmquery_api_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/load_document_api_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/login_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/logout_api_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/memory_api_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/profile_api_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/prompt_api_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/rag_api_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/root_redirect_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/signup_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/static_page_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/tool_api_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/users_api_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit/views/verify_user_view.py +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/src/iatoolkit.egg-info/requires.txt +0 -0
- {iatoolkit-2.53.1 → iatoolkit-2.54.1}/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"
|
|
@@ -360,6 +360,7 @@ class Tool(Base):
|
|
|
360
360
|
TYPE_NATIVE = 'NATIVE' # executed by company class in Python
|
|
361
361
|
TYPE_INFERENCE = 'INFERENCE' # executed by InferenceService
|
|
362
362
|
TYPE_HTTP = 'HTTP' # executed by HttpToolService
|
|
363
|
+
TYPE_MCP = 'MCP' # executed by the handler an extension registers (Dispatcher.register_tool_type_handler)
|
|
363
364
|
|
|
364
365
|
# source of the definition (Source of Truth)
|
|
365
366
|
SOURCE_SYSTEM = 'SYSTEM'
|
|
@@ -367,6 +368,7 @@ class Tool(Base):
|
|
|
367
368
|
SOURCE_YAML = 'YAML' # defined in company.yaml
|
|
368
369
|
SOURCE_USER = 'USER' # defined via GUI/API
|
|
369
370
|
SOURCE_PACK = 'PACK' # materialized by enterprise control-plane
|
|
371
|
+
SOURCE_MCP = 'MCP' # imported from an external MCP server
|
|
370
372
|
|
|
371
373
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
372
374
|
company_id = Column(Integer,
|
|
@@ -31,6 +31,11 @@ class Dispatcher:
|
|
|
31
31
|
"iat_wiki_get_page",
|
|
32
32
|
}
|
|
33
33
|
_tool_execution_hook = None
|
|
34
|
+
# Tool types this module executes itself; an extension cannot take them over.
|
|
35
|
+
BUILTIN_TOOL_TYPES = frozenset({"SYSTEM", "INFERENCE", "HTTP", "NATIVE"})
|
|
36
|
+
# Executors for tool types an extension owns (e.g. Enterprise's MCP client
|
|
37
|
+
# for tool_type='MCP'). This module knows nothing about what they do.
|
|
38
|
+
_tool_type_handlers: dict = {}
|
|
34
39
|
|
|
35
40
|
@inject
|
|
36
41
|
def __init__(self,
|
|
@@ -80,6 +85,33 @@ class Dispatcher:
|
|
|
80
85
|
def clear_tool_execution_hook(cls):
|
|
81
86
|
cls._tool_execution_hook = None
|
|
82
87
|
|
|
88
|
+
@classmethod
|
|
89
|
+
def register_tool_type_handler(cls, tool_type: str, handler):
|
|
90
|
+
"""
|
|
91
|
+
Registers the executor for tools whose tool_type is not built in.
|
|
92
|
+
handler is called as:
|
|
93
|
+
|
|
94
|
+
handler(company_short_name=..., function_name=..., tool_def=...,
|
|
95
|
+
user_identifier=..., runtime_source=..., arguments={...})
|
|
96
|
+
|
|
97
|
+
and returns the tool result, exactly like a native tool would.
|
|
98
|
+
"""
|
|
99
|
+
normalized = str(tool_type or "").strip().upper()
|
|
100
|
+
if not normalized:
|
|
101
|
+
raise ValueError("tool_type is required")
|
|
102
|
+
if normalized in cls.BUILTIN_TOOL_TYPES:
|
|
103
|
+
raise ValueError(f"Tool type '{normalized}' is built in and cannot be overridden")
|
|
104
|
+
if not callable(handler):
|
|
105
|
+
raise ValueError("handler must be callable")
|
|
106
|
+
cls._tool_type_handlers = {**cls._tool_type_handlers, normalized: handler}
|
|
107
|
+
|
|
108
|
+
@classmethod
|
|
109
|
+
def clear_tool_type_handler(cls, tool_type: str):
|
|
110
|
+
normalized = str(tool_type or "").strip().upper()
|
|
111
|
+
cls._tool_type_handlers = {
|
|
112
|
+
key: value for key, value in cls._tool_type_handlers.items() if key != normalized
|
|
113
|
+
}
|
|
114
|
+
|
|
83
115
|
def _notify_tool_execution_hook(self, event: str, **payload) -> None:
|
|
84
116
|
hook = type(self)._tool_execution_hook
|
|
85
117
|
if not callable(hook):
|
|
@@ -184,6 +216,7 @@ class Dispatcher:
|
|
|
184
216
|
function_name=function_name,
|
|
185
217
|
user_identifier=user_identifier,
|
|
186
218
|
tool_def=tool_def,
|
|
219
|
+
runtime_source=_iat_runtime_source,
|
|
187
220
|
**kwargs,
|
|
188
221
|
)
|
|
189
222
|
self._notify_tool_execution_hook(
|
|
@@ -241,6 +274,7 @@ class Dispatcher:
|
|
|
241
274
|
function_name: str,
|
|
242
275
|
user_identifier: str | None,
|
|
243
276
|
tool_def,
|
|
277
|
+
runtime_source: str | None = None,
|
|
244
278
|
**kwargs,
|
|
245
279
|
) -> dict:
|
|
246
280
|
# 2. Dispatch based on Tool Type
|
|
@@ -320,6 +354,17 @@ class Dispatcher:
|
|
|
320
354
|
f"Error executing native tool '{method_name}': {str(e)}") from e
|
|
321
355
|
|
|
322
356
|
else:
|
|
357
|
+
handler = type(self)._tool_type_handlers.get(str(tool_def.tool_type or "").strip().upper())
|
|
358
|
+
if handler:
|
|
359
|
+
logging.debug(f"Dispatching {tool_def.tool_type} tool: {function_name}")
|
|
360
|
+
return handler(
|
|
361
|
+
company_short_name=company_short_name,
|
|
362
|
+
function_name=function_name,
|
|
363
|
+
tool_def=tool_def,
|
|
364
|
+
user_identifier=user_identifier,
|
|
365
|
+
runtime_source=runtime_source,
|
|
366
|
+
arguments=dict(kwargs),
|
|
367
|
+
)
|
|
323
368
|
raise IAToolkitException(
|
|
324
369
|
IAToolkitException.ErrorType.EXTERNAL_SOURCE_ERROR,
|
|
325
370
|
f"Unknown tool type '{tool_def.tool_type}'"
|
|
@@ -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.
|
|
@@ -1191,6 +1191,11 @@ class ToolService:
|
|
|
1191
1191
|
raise IAToolkitException(IAToolkitException.ErrorType.MISSING_PARAMETER, "Name and Description are required")
|
|
1192
1192
|
|
|
1193
1193
|
tool_type = tool_data.get('tool_type', Tool.TYPE_NATIVE)
|
|
1194
|
+
if str(tool_type or '').strip().upper() == Tool.TYPE_MCP:
|
|
1195
|
+
raise IAToolkitException(
|
|
1196
|
+
IAToolkitException.ErrorType.INVALID_OPERATION,
|
|
1197
|
+
"MCP tools are imported from a registered MCP server, not created by hand",
|
|
1198
|
+
)
|
|
1194
1199
|
execution_config = tool_data.get('execution_config')
|
|
1195
1200
|
output_contract = normalize_output_contract(tool_data.get('output_contract'))
|
|
1196
1201
|
self._validate_tool_contract(tool_type, execution_config, output_contract, company=company)
|
|
@@ -1243,6 +1248,13 @@ class ToolService:
|
|
|
1243
1248
|
raise IAToolkitException(IAToolkitException.ErrorType.INVALID_OPERATION, "Cannot modify System Tools")
|
|
1244
1249
|
if tool.source == Tool.SOURCE_PACK:
|
|
1245
1250
|
raise IAToolkitException(IAToolkitException.ErrorType.INVALID_OPERATION, "Cannot modify PACK tools")
|
|
1251
|
+
if tool.source == Tool.SOURCE_MCP:
|
|
1252
|
+
return self._update_mcp_tool(company_short_name, tool, tool_data, actor_identifier)
|
|
1253
|
+
if str(tool_data.get('tool_type') or '').strip().upper() == Tool.TYPE_MCP:
|
|
1254
|
+
raise IAToolkitException(
|
|
1255
|
+
IAToolkitException.ErrorType.INVALID_OPERATION,
|
|
1256
|
+
"A tool cannot be turned into an MCP tool; import it from its MCP server",
|
|
1257
|
+
)
|
|
1246
1258
|
|
|
1247
1259
|
normalized_name = None
|
|
1248
1260
|
if 'name' in tool_data or 'key' in tool_data:
|
|
@@ -1286,6 +1298,43 @@ class ToolService:
|
|
|
1286
1298
|
)
|
|
1287
1299
|
return tool.to_dict()
|
|
1288
1300
|
|
|
1301
|
+
MCP_TOOL_EDITABLE_FIELDS = ('description', 'is_active')
|
|
1302
|
+
|
|
1303
|
+
def _update_mcp_tool(self, company_short_name: str, tool, tool_data: dict,
|
|
1304
|
+
actor_identifier: str | None) -> dict:
|
|
1305
|
+
"""
|
|
1306
|
+
An imported MCP tool mirrors a tool on its server: its name, schema and
|
|
1307
|
+
execution config come from there (and agents reference the name), so
|
|
1308
|
+
only what stays local can change here.
|
|
1309
|
+
"""
|
|
1310
|
+
unsupported = sorted(
|
|
1311
|
+
key for key in tool_data.keys()
|
|
1312
|
+
if key not in self.MCP_TOOL_EDITABLE_FIELDS
|
|
1313
|
+
)
|
|
1314
|
+
if unsupported:
|
|
1315
|
+
raise IAToolkitException(
|
|
1316
|
+
IAToolkitException.ErrorType.INVALID_OPERATION,
|
|
1317
|
+
f"MCP tools only allow editing {list(self.MCP_TOOL_EDITABLE_FIELDS)}; "
|
|
1318
|
+
f"{unsupported} come from the MCP server",
|
|
1319
|
+
)
|
|
1320
|
+
|
|
1321
|
+
if 'description' in tool_data:
|
|
1322
|
+
description = str(tool_data.get('description') or '').strip()
|
|
1323
|
+
if not description:
|
|
1324
|
+
raise IAToolkitException(IAToolkitException.ErrorType.MISSING_PARAMETER, "Description is required")
|
|
1325
|
+
tool.description = description
|
|
1326
|
+
if 'is_active' in tool_data:
|
|
1327
|
+
tool.is_active = bool(tool_data['is_active'])
|
|
1328
|
+
|
|
1329
|
+
self.llm_query_repo.commit()
|
|
1330
|
+
self._notify_tool_lifecycle_hook(
|
|
1331
|
+
event=self.TOOL_EVENT_UPDATED,
|
|
1332
|
+
company_short_name=company_short_name,
|
|
1333
|
+
tool_obj=tool,
|
|
1334
|
+
actor_identifier=actor_identifier,
|
|
1335
|
+
)
|
|
1336
|
+
return tool.to_dict()
|
|
1337
|
+
|
|
1289
1338
|
def delete_tool(
|
|
1290
1339
|
self,
|
|
1291
1340
|
company_short_name: str,
|
|
@@ -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
|
+
})();
|
|
@@ -53,6 +53,10 @@ function sanitizeHtmlFragment(html) {
|
|
|
53
53
|
}
|
|
54
54
|
});
|
|
55
55
|
if (tag === 'a') {
|
|
56
|
+
// A link in an answer never replaces the chat: following it in
|
|
57
|
+
// the same tab loses the conversation on screen (e.g. the link to
|
|
58
|
+
// connect an external MCP account).
|
|
59
|
+
el.setAttribute('target', '_blank');
|
|
56
60
|
el.setAttribute('rel', 'noopener noreferrer');
|
|
57
61
|
}
|
|
58
62
|
walk(el);
|