diff --git a/.gemini/config.yaml b/.gemini/config.yaml deleted file mode 100644 index 15c697730ad..00000000000 --- a/.gemini/config.yaml +++ /dev/null @@ -1,13 +0,0 @@ -have_fun: false -memory_config: - disabled: false -code_review: - disable: true - comment_severity_threshold: MEDIUM - max_review_comments: -1 - pull_request_opened: - help: false - summary: false - code_review: false - include_drafts: false -ignore_patterns: [] diff --git a/.github/actions/setup-web/action.yml b/.github/actions/setup-web/action.yml index 770fc8d3d53..68c330d0e2c 100644 --- a/.github/actions/setup-web/action.yml +++ b/.github/actions/setup-web/action.yml @@ -9,7 +9,7 @@ runs: with: run_install: false - name: Setup Vite+ - uses: voidzero-dev/setup-vp@313600b80b104eadebb9111787d37a2e83e014ca # v1.17.0 + uses: voidzero-dev/setup-vp@1b32467adbe183473499fd9d5d372c3ed9641754 # v1.18.0 with: node-version-file: .nvmrc cache: true diff --git a/.github/workflows/deploy-hitl-im-dev.yml b/.github/workflows/deploy-hitl-im-dev.yml new file mode 100644 index 00000000000..33f16782f15 --- /dev/null +++ b/.github/workflows/deploy-hitl-im-dev.yml @@ -0,0 +1,25 @@ +name: Deploy HITL IM Dev + +on: + workflow_run: + workflows: ['Build and Push API & Web'] + branches: + - 'build/feat/hitl-im-dev' + types: + - completed + +jobs: + deploy: + runs-on: depot-ubuntu-24.04 + if: | + github.event.workflow_run.conclusion == 'success' && + github.event.workflow_run.head_branch == 'build/feat/hitl-im-dev' + steps: + - name: Deploy to server + uses: appleboy/ssh-action@0ff4204d59e8e51228ff73bce53f80d53301dee2 # v1.2.5 + with: + host: ${{ secrets.HITL_SSH_HOST }} + username: ${{ secrets.SSH_USER }} + key: ${{ secrets.SSH_PRIVATE_KEY }} + script: | + ${{ vars.SSH_SCRIPT || secrets.SSH_SCRIPT }} diff --git a/README.md b/README.md index 285a7894d18..c3f68564c85 100644 --- a/README.md +++ b/README.md @@ -129,87 +129,35 @@ All of Dify's offerings come with corresponding APIs, so you could effortlessly Star Dify on GitHub and be instantly notified of new releases. -![star-us](https://github.com/langgenius/dify/assets/13230914/b823edc1-6388-4e25-ad45-2f6b187adbb4) +star ## Advanced Setup -### Custom configurations - -If you need to customize the configuration, edit `docker/.env`. The essential startup defaults live in [`docker/.env.example`](docker/.env.example), and optional advanced variables are split under `docker/envs/` by theme. After making any changes, re-run `docker compose up -d` from the `docker` directory. You can find the full list of available environment variables [here](https://docs.dify.ai/getting-started/install-self-hosted/environments). - -### Metrics Monitoring with Grafana - -Import the dashboard to Grafana, using Dify's PostgreSQL database as data source, to monitor metrics in granularity of apps, tenants, messages, and more. - -- [Grafana Dashboard by @bowenliang123](https://github.com/bowenliang123/dify-grafana-dashboard) - -### Deployment with Kubernetes - -If you'd like to configure a highly available setup, there are community-contributed [Helm Charts](https://helm.sh/) and YAML files which allow Dify to be deployed on Kubernetes. - -- [Helm Chart by @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) -- [Helm Chart by @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) -- [Helm Chart by @magicsong](https://github.com/magicsong/ai-charts) -- [YAML file by @Winson-030](https://github.com/Winson-030/dify-kubernetes) -- [YAML file by @wyy-holding](https://github.com/wyy-holding/dify-k8s) -- [🚀 NEW! YAML files (Supports Dify v1.6.0) by @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) - -#### Using Terraform for Deployment - -Deploy Dify to Cloud Platform with a single click using [terraform](https://www.terraform.io/) - -##### Azure Global - -- [Azure Terraform by @nikawang](https://github.com/nikawang/dify-azure-terraform) - -##### Google Cloud - -- [Google Cloud Terraform by @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) - -#### Using AWS CDK for Deployment - -Deploy Dify to AWS with [CDK](https://aws.amazon.com/cdk/) - -##### AWS - -- [AWS CDK by @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) -- [AWS CDK by @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) - -#### Using Alibaba Cloud Computing Nest - -Quickly deploy Dify to Alibaba cloud with [Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) - -#### Using Alibaba Cloud Data Management - -One-Click deploy Dify to Alibaba Cloud with [Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) - -#### Deploy to AKS with Azure Devops Pipeline - -One-Click deploy Dify to AKS with [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) - -#### Using Sealos for Deployment - -Deploy Dify with one click using the [Sealos App Store](https://sealos.io/products/app-store/dify/) +For custom configuration, observability, and deployment options, see [Advanced Setup](docs/ADVANCED_SETUP.md). ## Contributing -For those who'd like to contribute code, see our [Contribution Guide](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). -At the same time, please consider supporting Dify by sharing it on social media and at events and conferences. +Dify welcomes contributions of all kinds: -> We are looking for contributors to help translate Dify into languages other than Mandarin or English. If you are interested in helping, please see the [i18n README](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) for more information, and leave us a comment in the `global-users` channel of our [Discord Community Server](https://discord.gg/8Tpq4AcN9c). +- **Code**: Read the [Contribution Guide](CONTRIBUTING.md), then browse [good first issues](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22). +- **Ideas and feedback**: Start or join a [GitHub Discussion](https://github.com/langgenius/dify/discussions). +- **Translations**: Follow the [internationalization guide](web/i18n-config/README.md) to add or update a locale. +- **Community**: Share the apps you build, help other users, and spread the word about Dify. + +### Contributors + + + Dify contributors + ## Community & contact -- [GitHub Discussion](https://github.com/langgenius/dify/discussions). Best for: sharing feedback and asking questions. -- [GitHub Issues](https://github.com/langgenius/dify/issues). Best for: bugs you encounter using Dify.AI, and feature proposals. See our [Contribution Guide](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). -- [Discord](https://discord.gg/FngNHpbcY7). Best for: sharing your applications and hanging out with the community. -- [X(Twitter)](https://twitter.com/dify_ai). Best for: sharing your applications and hanging out with the community. +Choose the channel that best fits your question: -**Contributors** - - - - +- [GitHub Discussions](https://github.com/langgenius/dify/discussions): Get help, share feedback, and propose ideas. +- [GitHub Issues](https://github.com/langgenius/dify/issues): Report reproducible bugs and track engineering work. Read the [Contribution Guide](CONTRIBUTING.md) before opening one. +- [Discord](https://discord.gg/FngNHpbcY7): Chat in real time, share your apps, and connect with other Dify users. +- [X](https://x.com/dify_ai): Follow Dify for release news and project updates. ## Star History diff --git a/api/.importlinter b/api/.importlinter index 24be0d80966..d1798de3f37 100644 --- a/api/.importlinter +++ b/api/.importlinter @@ -15,6 +15,117 @@ root_packages = services include_external_packages = True +[importlinter:contract:backend-layers] +name = Backend modules follow the transport, application, domain, and shared-library layers +type = layers +layers = + controllers + services + core + libs +# Migration baseline: keep every exception exact. The default unmatched-import +# error makes this list shrink whenever a legacy dependency is removed. +unmatched_ignore_imports_alerting = error +ignore_imports = + core.app.app_config.easy_ui_based_app.dataset.manager -> services.dataset_service + core.app.apps.advanced_chat.app_generator -> controllers.console.app.workflow + core.app.apps.advanced_chat.app_generator -> services.conversation_service + core.app.apps.advanced_chat.app_generator -> services.errors.conversation + core.app.apps.advanced_chat.app_generator -> services.workflow_draft_variable_service + core.app.apps.advanced_chat.app_runner -> services.conversation_variable_updater + core.app.apps.agent_app.app_generator -> services.agent.composer_service + core.app.apps.agent_app.app_generator -> services.agent.workspace_service + core.app.apps.agent_app.app_generator -> services.conversation_service + core.app.apps.agent_app.runtime_request_builder -> services.agent.prompt_mentions + core.app.apps.agent_app.session_store -> services.agent.workspace_service + core.app.apps.agent_chat.app_generator -> services.conversation_service + core.app.apps.base_app_generator -> services.workflow_draft_variable_service + core.app.apps.chat.app_generator -> services.conversation_service + core.app.apps.common.workflow_response_converter -> services.variable_truncator + core.app.apps.completion.app_generator -> services.errors.app + core.app.apps.completion.app_generator -> services.errors.message + core.app.apps.message_based_app_generator -> services.errors.app_model_config + core.app.apps.message_based_app_generator -> services.errors.conversation + core.app.apps.message_based_app_generator -> services.errors.message + core.app.apps.pipeline.pipeline_generator -> services + core.app.apps.pipeline.pipeline_generator -> services.dataset_service + core.app.apps.pipeline.pipeline_generator -> services.datasource_provider_service + core.app.apps.pipeline.pipeline_generator -> services.feature_service + core.app.apps.pipeline.pipeline_generator -> services.workflow_draft_variable_service + core.app.apps.pipeline.pipeline_runner -> services.dataset_ref_service + core.app.apps.workflow.app_generator -> controllers.console.app.workflow + core.app.apps.workflow.app_generator -> services.snippet_generate_service + core.app.apps.workflow.app_generator -> services.workflow_draft_variable_service + core.app.apps.workflow_app_runner -> tasks.mail_human_input_delivery_task + core.app.features.annotation_reply.annotation_reply -> services.annotation_service + core.app.features.annotation_reply.annotation_reply -> services.dataset_service + core.app.llm.quota -> services.credit_pool_service + core.app.task_pipeline.message_cycle_manager -> services.account_service + core.app.task_pipeline.message_cycle_manager -> services.annotation_service + core.app.workflow.layers.persistence -> services.workflow.inspector_events + core.datasource.datasource_manager -> services.datasource_provider_service + core.helper.creators -> services.oauth_server + core.helper.credential_utils -> services.enterprise.plugin_manager_service + core.helper.credential_utils -> services.feature_service + core.indexing_runner -> services.vector_space_admission_service + core.mcp.auth_client -> services + core.provider_manager -> services.credential_permission_service + core.provider_manager -> services.credit_pool_service + core.provider_manager -> services.feature_service + core.rag.datasource.retrieval_service -> services.external_knowledge_service + core.rag.index_processor.index_processor -> services.vector_space_admission_service + core.rag.index_processor.index_processor_base -> services.file_service + core.rag.index_processor.processor.paragraph_index_processor -> services.account_service + core.rag.index_processor.processor.paragraph_index_processor -> services.summary_index_service + core.rag.index_processor.processor.parent_child_index_processor -> services.account_service + core.rag.index_processor.processor.parent_child_index_processor -> services.summary_index_service + core.rag.index_processor.processor.qa_index_processor -> services.summary_index_service + core.rag.retrieval.dataset_retrieval -> services.external_knowledge_service + core.rag.retrieval.dataset_retrieval -> services.feature_service + core.rag.summary_index.summary_index -> services.summary_index_service + core.rag.summary_index.summary_index -> tasks.generate_summary_index_task + core.repositories.sqlalchemy_workflow_node_execution_repository -> services.file_service + core.repositories.sqlalchemy_workflow_node_execution_repository -> services.variable_truncator + core.tools.tool_manager -> services + core.workflow.node_runtime -> services + core.workflow.nodes.agent.message_transformer -> services + core.workflow.nodes.agent_v2.agent_node -> services.agent.prompt_mentions + core.workflow.nodes.agent_v2.agent_node -> services.agent.workspace_service + core.workflow.nodes.agent_v2.dify_tools_builder -> services + core.workflow.nodes.agent_v2.runtime_feature_manifest -> services.agent.knowledge_datasets + core.workflow.nodes.agent_v2.runtime_request_builder -> services.agent.prompt_mentions + core.workflow.nodes.agent_v2.runtime_request_builder -> services.skill_management_service + core.workflow.nodes.agent_v2.session_store -> services.agent.workspace_service + core.workflow.nodes.agent_v2.validators -> services.agent.knowledge_datasets + core.workflow.nodes.agent_v2.workspace_retirement_layer -> tasks.collect_agent_resources_task + libs.device_flow_security -> controllers.openapi._models + libs.device_flow_security -> services.entities.feature_entities + libs.device_flow_security -> services.feature_service + libs.email_i18n -> services.entities.feature_entities + libs.email_i18n -> services.feature_service + libs.external_api -> core + libs.external_api -> core.errors.error + libs.external_api -> extensions.ext_logging + libs.flask_utils -> models + libs.helper -> core.app.features.rate_limiting.rate_limit + libs.helper -> models + libs.helper -> models.model + libs.json_in_md_parser -> core.llm_generator.output_parser.errors + libs.login -> extensions.ext_login + libs.login -> models + libs.login -> models.model + libs.oauth -> core.helper.http_client_pooling + libs.oauth_bearer -> models + libs.oauth_data_source -> core.db.session_factory + libs.oauth_data_source -> core.helper.http_client_pooling + libs.rsa -> extensions.ext_storage + libs.workspace_permission -> services.enterprise.enterprise_service + libs.workspace_permission -> services.feature_service + services.account_service -> controllers + services.account_service -> controllers.console.error + services.app_generate_service -> controllers.console.app.workflow + services.billing_service -> controllers.console.error + [importlinter:contract:no-direct-rsa-imports] # Note: `libs` itself is deliberately excluded from source_modules -- import-linter's # `forbidden` contract cannot check a package against its own descendant (libs.rsa lives diff --git a/api/controllers/console/feature.py b/api/controllers/console/feature.py index 41aa6513a63..edc9a9f19ab 100644 --- a/api/controllers/console/feature.py +++ b/api/controllers/console/feature.py @@ -75,18 +75,18 @@ class FeatureVectorSpaceApi(Resource): @console_ns.route("/trial-models") class TrialModelsApi(Resource): @console_ns.doc("get_trial_models") - @console_ns.doc(description="Get hosted trial model provider configuration") + @console_ns.doc(description="Get hosted credit model provider configuration for the current workspace") @console_ns.response( 200, "Success", console_ns.models[TrialModelsResponse.__name__], ) @console_account_admission() - def get(self, _request_context: RequestContext): - """Get hosted trial model provider configuration for model-provider pages.""" + def get(self, request_context: RequestContext): + """Get hosted credit provider configuration for the current workspace.""" return dump_response( TrialModelsResponse, - {"trial_models": application_services().feature_queries.get_trial_models()}, + {"trial_models": application_services().feature_queries.get_trial_models(request_context)}, ) diff --git a/api/controllers/console/workspace/account.py b/api/controllers/console/workspace/account.py index 21b28c58352..927b3b82899 100644 --- a/api/controllers/console/workspace/account.py +++ b/api/controllers/console/workspace/account.py @@ -31,6 +31,8 @@ from controllers.console.auth.error import ( from controllers.console.error import ( AccountInFreezeError, AccountNotFound, + EducationActivateLimitError, + EducationVerifyLimitError, EmailDomainSuspendedError, EmailSendIpLimitError, ) @@ -239,6 +241,10 @@ class EducationVerifyResponse(ResponseModel): token: str | None = None +class EducationActivateResponse(ResponseModel): + message: str + + class EducationStatusResponse(ResponseModel): result: bool | None = None is_student: bool | None = None @@ -263,6 +269,7 @@ register_response_schema_models( AccountIntegrateResponse, AccountIntegrateListResponse, AvatarUrlResponse, + EducationActivateResponse, EducationVerifyResponse, EducationStatusResponse, EducationAutocompleteResponse, @@ -528,29 +535,33 @@ class EducationVerifyApi(Resource): def get(self, request_context: RequestContext): try: verification = application_services().accounts.education.verify(request_context) - except account_errors.AccountNotFoundError: - raise AccountNotFound() from None + except account_errors.AccountNotFoundError as error: + raise AccountNotFound() from error + except account_errors.EducationRateLimitExceededError as error: + raise EducationVerifyLimitError() from error return dump_response(EducationVerifyResponse, verification) @console_ns.route("/account/education") class EducationApi(Resource): @console_ns.expect(console_ns.models[EducationActivatePayload.__name__]) - # response-contract:ignore billing-service activation payload; TODO: model education activation result. - @console_ns.response(HTTPStatus.OK, "Success") + @console_ns.response(HTTPStatus.OK, "Success", console_ns.models[EducationActivateResponse.__name__]) @console_account_admission(editions=frozenset({DeploymentEdition.CLOUD})) def post(self, request_context: RequestContext): payload = console_ns.payload or {} args = EducationActivatePayload.model_validate(payload) try: - return application_services().accounts.education.activate( + activation = application_services().accounts.education.activate( request_context, token=args.token, institution=args.institution, role=args.role, ) - except account_errors.AccountNotFoundError: - raise AccountNotFound() from None + except account_errors.AccountNotFoundError as error: + raise AccountNotFound() from error + except account_errors.EducationRateLimitExceededError as error: + raise EducationActivateLimitError() from error + return dump_response(EducationActivateResponse, activation) @console_ns.response(HTTPStatus.OK, "Success", console_ns.models[EducationStatusResponse.__name__]) @console_account_admission(editions=frozenset({DeploymentEdition.CLOUD})) diff --git a/api/controllers/console/workspace/model_providers.py b/api/controllers/console/workspace/model_providers.py index 11191d57ebf..ca0b536f85e 100644 --- a/api/controllers/console/workspace/model_providers.py +++ b/api/controllers/console/workspace/model_providers.py @@ -417,6 +417,7 @@ class ModelProviderPaymentCheckoutUrlApi(Resource): def get(self, current_tenant_id: str, current_user: Account, provider: str): if provider != "anthropic": raise ValueError(f"provider name {provider} is invalid") + # pyrefly: ignore [deprecated] data = BillingService.get_model_provider_payment_link( provider_name=provider, tenant_id=current_tenant_id, diff --git a/api/controllers/files/upload.py b/api/controllers/files/upload.py index aac1c3b20c8..1da0d720be3 100644 --- a/api/controllers/files/upload.py +++ b/api/controllers/files/upload.py @@ -8,7 +8,7 @@ from werkzeug.exceptions import Forbidden import services from core.db.session_factory import session_factory -from core.tools.signature import verify_plugin_file_signature +from core.tools.signature import sign_tool_file, verify_plugin_file_signature from core.tools.tool_file_manager import ToolFileManager, resolve_extension from core.workflow.file_reference import build_file_reference from fields.file_fields import FileResponse @@ -136,7 +136,7 @@ class PluginUploadFileApi(Resource): ) extension = resolve_extension(filename=tool_file.name, mimetype=tool_file.mimetype) - preview_url = ToolFileManager.sign_file(tool_file_id=tool_file.id, extension=extension) + preview_url = sign_tool_file(tool_file_id=tool_file.id, extension=extension, for_external=True) # Create a dictionary with all the necessary attributes result = FileResponse( diff --git a/api/core/llm_generator/llm_generator.py b/api/core/llm_generator/llm_generator.py index 32e16830f4f..e8b1b023687 100644 --- a/api/core/llm_generator/llm_generator.py +++ b/api/core/llm_generator/llm_generator.py @@ -945,7 +945,7 @@ class LLMGenerator: ) ), ] - model_parameters = {"temperature": 0.4} + model_parameters, stop = _normalize_completion_params(model_config.completion_params) response: LLMResult | None = None error: str | None = None @@ -954,7 +954,10 @@ class LLMGenerator: with measure_time() as timer: try: response = model_instance.invoke_llm( - prompt_messages=list(prompt_messages), model_parameters=model_parameters, stream=False + prompt_messages=list(prompt_messages), + model_parameters=model_parameters, + stop=stop, + stream=False, ) generated_raw = response.message.get_text_content() first_brace = generated_raw.find("{") diff --git a/api/core/workflow/nodes/agent_v2/validators.py b/api/core/workflow/nodes/agent_v2/validators.py index 03cdf70b78a..94666c1b59a 100644 --- a/api/core/workflow/nodes/agent_v2/validators.py +++ b/api/core/workflow/nodes/agent_v2/validators.py @@ -74,6 +74,7 @@ class WorkflowAgentNodeValidator: session=session, workflow=workflow, require_binding=False, + require_agent_model=False, validate_previous_node_topology=False, ) @@ -83,6 +84,7 @@ class WorkflowAgentNodeValidator: session=session, workflow=workflow, require_binding=True, + require_agent_model=True, validate_previous_node_topology=True, ) @@ -93,6 +95,7 @@ class WorkflowAgentNodeValidator: session: Session, workflow: Workflow, require_binding: bool, + require_agent_model: bool, validate_previous_node_topology: bool, ) -> None: graph = workflow.graph_dict @@ -112,7 +115,12 @@ class WorkflowAgentNodeValidator: f"Workflow Agent node {node_id} requires a binding before publishing." ) continue - cls.validate_binding(session=session, binding=binding, topology=topology) + cls.validate_binding( + session=session, + binding=binding, + topology=topology, + require_agent_model=require_agent_model, + ) if require_binding: for node_id, node_data in cls.iter_tool_nodes(graph): @@ -125,6 +133,7 @@ class WorkflowAgentNodeValidator: session: Session, binding: WorkflowAgentNodeBinding, topology: _WorkflowGraphTopology | None = None, + require_agent_model: bool = True, ) -> None: """Validate binding ownership, publication state, Agent Soul, and node-job references.""" @@ -174,7 +183,7 @@ class WorkflowAgentNodeValidator: ) agent_soul = AgentSoulConfig.model_validate(snapshot.config_snapshot_dict) - if agent_soul.model is None: + if require_agent_model and agent_soul.model is None: raise WorkflowAgentNodeValidationError( f"Workflow Agent node {binding.node_id} requires Agent Soul model config." ) diff --git a/api/enums/__init__.py b/api/enums/__init__.py index a56af59be25..fdcc5e94795 100644 --- a/api/enums/__init__.py +++ b/api/enums/__init__.py @@ -14,6 +14,10 @@ class CloudPlan(StrEnum): PROFESSIONAL = auto() TEAM = auto() + @property + def is_paid(self) -> bool: + return self in (CloudPlan.PROFESSIONAL, CloudPlan.TEAM) + class DeploymentEdition(StrEnum): """Enum representing the deployment edition of the platform.""" diff --git a/api/extensions/ext_application_services.py b/api/extensions/ext_application_services.py index dc4015767ca..abea7e3ce5f 100644 --- a/api/extensions/ext_application_services.py +++ b/api/extensions/ext_application_services.py @@ -233,6 +233,18 @@ def build_application_services( education=AccountEducationService( accounts=accounts, education=BillingAccountEducationGateway(), + verification_rate_limiter=RateLimiter( + prefix="edu_verification_rate_limit", + max_attempts=10, + time_window=60, + redis_client=redis, + ), + activation_rate_limiter=RateLimiter( + prefix="edu_activation_rate_limit", + max_attempts=10, + time_window=60, + redis_client=redis, + ), ), initialization=AccountInitializationService( accounts=accounts, @@ -298,7 +310,6 @@ def build_application_services( ), feature_queries=FeatureQueryService( features=feature_gateway, - trial_models=FeatureService.get_trial_models(), app_dsl_version=CURRENT_APP_DSL_VERSION, ), init_validation=InitValidationService( diff --git a/api/extensions/logstore/aliyun_logstore.py b/api/extensions/logstore/aliyun_logstore.py index 9869e1eaf76..898fa54a70a 100644 --- a/api/extensions/logstore/aliyun_logstore.py +++ b/api/extensions/logstore/aliyun_logstore.py @@ -280,9 +280,9 @@ class AliyunLogStore: else: logger.info("Using SDK mode for project %s", self.project_name) return False - except Exception as e: + except Exception: logger.info("Using SDK mode for project %s", self.project_name) - logger.debug("PG connection details: %s", str(e)) + logger.debug("PG connection details", exc_info=True) self._use_pg_protocol = False return False diff --git a/api/extensions/logstore/aliyun_logstore_pg.py b/api/extensions/logstore/aliyun_logstore_pg.py index 874c20d1447..f6bfd5623b3 100644 --- a/api/extensions/logstore/aliyun_logstore_pg.py +++ b/api/extensions/logstore/aliyun_logstore_pg.py @@ -42,8 +42,8 @@ class AliyunLogStorePG: result = sock.connect_ex((host, port)) sock.close() return result == 0 - except Exception as e: - logger.debug("Port connectivity check failed for %s:%d: %s", host, port, str(e)) + except Exception: + logger.debug("Port connectivity check failed for %s:%d", host, port, exc_info=True) return False def init_connection(self) -> bool: @@ -100,7 +100,7 @@ class AliyunLogStorePG: ) return True - except Exception as e: + except Exception: self._use_pg_protocol = False if self._engine: try: @@ -109,7 +109,7 @@ class AliyunLogStorePG: logger.debug("Failed to dispose engine during cleanup, ignoring") self._engine = None - logger.debug("Using SDK mode for region: %s", str(e)) + logger.debug("Using SDK mode for region", exc_info=True) return False @contextmanager diff --git a/api/models/model.py b/api/models/model.py index 5f43d1e8b50..be0f417660f 100644 --- a/api/models/model.py +++ b/api/models/model.py @@ -1662,16 +1662,28 @@ class Message(Base): if not self.answer: return self.answer - pattern = r"\[!?.*?\]\((((http|https):\/\/.+)?\/files\/(tools\/)?[\w-]+.*?timestamp=.*&nonce=.*&sign=.*)\)" - matches = re.findall(pattern, self.answer) - - if not matches: - return self.answer - - urls = [match[0] for match in matches] - - # remove duplicate urls - urls = list(set(urls)) + # Match file URLs in three shapes the agent runtime may produce: + # - Markdown link: [text](https://.../files/tools/.../timestamp=&nonce=&sign=) + # - Backticked link: `https://.../files/tools/.../timestamp=&nonce=&sign=` + # - Bare URL: https://.../files/tools/.../timestamp=&nonce=&sign= + # The original implementation only matched the markdown form, so + # bare and backticked tool file URLs kept the long-lived + # INTERNAL_FILES_URL host and 5xx-ed at serve time. Refs #40788. + # The host prefix is optional so relative `/files/...` URLs that + # the agent returns without a host are also covered. The + # `(?=[)\s`]|$)` at the end of the bare-URL pattern (and the + # closing backtick / paren on the wrapped forms) stops the + # greedy `.*?=.*?` after `&sign=` from running off the end of + # the answer. + url_core = r"(?:https?:\/\/.+?)?\/files\/(tools\/)?[\w-]+.*?timestamp=[^)\s]*?&nonce=[^)\s]*?&sign=[^)\s]*?" + patterns = [ + r"\[!?.*?\]\((" + url_core + r")\)", # [text](url) + r"`(" + url_core + r")`", # `url` + r"(?:^|\s|\()(" + url_core + r")(?:[\s)\].,;]|$)", # bare url + ] + urls: set[str] = set() + for pattern in patterns: + urls.update(m.group(1) for m in re.finditer(pattern, self.answer)) if not urls: return self.answer @@ -1718,6 +1730,7 @@ class Message(Base): result = re.search(upload_file_id_pattern, url) if not result: continue + upload_file_id = result.group(1) if not upload_file_id: continue diff --git a/api/providers/trace/trace-langfuse/src/dify_trace_langfuse/langfuse_trace.py b/api/providers/trace/trace-langfuse/src/dify_trace_langfuse/langfuse_trace.py index c1b0b0e9132..9e4faf47fb8 100644 --- a/api/providers/trace/trace-langfuse/src/dify_trace_langfuse/langfuse_trace.py +++ b/api/providers/trace/trace-langfuse/src/dify_trace_langfuse/langfuse_trace.py @@ -592,7 +592,7 @@ class LangFuseDataTrace(BaseTraceInstance): try: return self.langfuse_client.auth_check() except Exception as e: - logger.debug("LangFuse API check failed: %s", str(e)) + logger.debug("LangFuse API check failed", exc_info=True) raise ValueError(f"LangFuse API check failed: {str(e)}") def get_project_key(self): @@ -600,5 +600,5 @@ class LangFuseDataTrace(BaseTraceInstance): projects = self.langfuse_client.api.projects.get() return projects.data[0].id except Exception as e: - logger.debug("LangFuse get project key failed: %s", str(e)) + logger.debug("LangFuse get project key failed", exc_info=True) raise ValueError(f"LangFuse get project key failed: {str(e)}") diff --git a/api/providers/trace/trace-langsmith/src/dify_trace_langsmith/langsmith_trace.py b/api/providers/trace/trace-langsmith/src/dify_trace_langsmith/langsmith_trace.py index 8ce59dfcf13..c4470163e1f 100644 --- a/api/providers/trace/trace-langsmith/src/dify_trace_langsmith/langsmith_trace.py +++ b/api/providers/trace/trace-langsmith/src/dify_trace_langsmith/langsmith_trace.py @@ -509,7 +509,7 @@ class LangSmithDataTrace(BaseTraceInstance): self.langsmith_client.delete_project(project_name=random_project_name) return True except Exception as e: - logger.debug("LangSmith API check failed: %s", str(e)) + logger.debug("LangSmith API check failed", exc_info=True) raise ValueError(f"LangSmith API check failed: {str(e)}") def get_project_url(self): @@ -528,5 +528,5 @@ class LangSmithDataTrace(BaseTraceInstance): ) return project_url.split("/r/")[0] except Exception as e: - logger.debug("LangSmith get run url failed: %s", str(e)) + logger.debug("LangSmith get run url failed", exc_info=True) raise ValueError(f"LangSmith get run url failed: {str(e)}") diff --git a/api/providers/trace/trace-weave/src/dify_trace_weave/weave_trace.py b/api/providers/trace/trace-weave/src/dify_trace_weave/weave_trace.py index 1cd4e3b3b5b..1ff1ef1f189 100644 --- a/api/providers/trace/trace-weave/src/dify_trace_weave/weave_trace.py +++ b/api/providers/trace/trace-weave/src/dify_trace_weave/weave_trace.py @@ -75,7 +75,7 @@ class WeaveDataTrace(BaseTraceInstance): project_url = f"https://wandb.ai/{project_identifier}" return project_url except Exception as e: - logger.debug("Weave get run url failed: %s", str(e)) + logger.debug("Weave get run url failed", exc_info=True) raise ValueError(f"Weave get run url failed: {str(e)}") @override @@ -433,7 +433,7 @@ class WeaveDataTrace(BaseTraceInstance): logger.info("Weave login successful") return True except Exception as e: - logger.debug("Weave API check failed: %s", str(e)) + logger.debug("Weave API check failed", exc_info=True) raise ValueError(f"Weave API check failed: {str(e)}") def _normalize_time(self, dt: datetime | None) -> datetime: diff --git a/api/pyproject.toml b/api/pyproject.toml index 31587970f88..e68b817e291 100644 --- a/api/pyproject.toml +++ b/api/pyproject.toml @@ -6,7 +6,7 @@ requires-python = "~=3.12.0" dependencies = [ # Legacy: mature and widely deployed "bleach>=6.4.0,<7.0.0", - "boto3>=1.43.71,<2.0.0", + "boto3>=1.43.76,<2.0.0", "celery>=5.6.3,<6.0.0", "croniter>=6.2.2,<7.0.0", "dify-agent", diff --git a/api/repositories/tag_repository.py b/api/repositories/tag_repository.py index 9b949ebc6f0..9e019990005 100644 --- a/api/repositories/tag_repository.py +++ b/api/repositories/tag_repository.py @@ -11,6 +11,7 @@ from libs.helper import escape_like_pattern from models.dataset import Dataset from models.enums import TagType from models.model import App, Tag, TagBinding +from models.skill import Skill from models.snippet import CustomizedSnippet from services.tag_application_service import ( CreateTagInput, @@ -207,6 +208,8 @@ class TagRepository(TagStore): CustomizedSnippet.tenant_id == workspace_id, CustomizedSnippet.id == binding.target_id, ) + elif binding.type == "skill": + stmt = select(Skill.id).where(Skill.tenant_id == workspace_id, Skill.id == binding.target_id) else: raise InvalidTagBindingTypeError diff --git a/api/services/account_billing_adapters.py b/api/services/account_billing_adapters.py index c64b70f01ad..c8f22b09be6 100644 --- a/api/services/account_billing_adapters.py +++ b/api/services/account_billing_adapters.py @@ -1,33 +1,23 @@ """Billing adapters for account education and deletion-feedback use cases.""" -from dataclasses import dataclass from datetime import UTC, datetime -from typing import TYPE_CHECKING, Any, cast, override +from typing import override from services.account_deletion_feedback_service import AccountDeletionFeedbackGateway from services.account_education_service import AccountEducationGateway from services.billing_service import BillingService from services.entities.account_entities import ( + AccountEducationActivation, AccountEducationAutocomplete, AccountEducationStatus, AccountEducationVerification, ) -if TYPE_CHECKING: - from models.account import Account - - -@dataclass(frozen=True, slots=True) -class _EducationAccount: - id: str - email: str - current_tenant_id: str - class BillingAccountEducationGateway(AccountEducationGateway): @override - def verify(self, *, account_id: str, email: str) -> AccountEducationVerification: - result = BillingService.EducationIdentity.verify(account_id, email) or {} + def verify(self, *, account_id: str) -> AccountEducationVerification: + result = BillingService.EducationIdentity.verify(account_id=account_id) or {} return AccountEducationVerification(token=result.get("token")) @override @@ -35,18 +25,23 @@ class BillingAccountEducationGateway(AccountEducationGateway): self, *, account_id: str, - email: str, tenant_id: str, token: str, institution: str, role: str, - ) -> dict[str, Any] | None: - account = cast("Account", _EducationAccount(id=account_id, email=email, current_tenant_id=tenant_id)) - return BillingService.EducationIdentity.activate(account, token, institution, role) + ) -> AccountEducationActivation: + result = BillingService.EducationIdentity.activate( + account_id=account_id, + tenant_id=tenant_id, + token=token, + institution=institution, + role=role, + ) + return AccountEducationActivation(message=result["message"]) @override def status(self, account_id: str) -> AccountEducationStatus: - result: dict[str, Any] = BillingService.EducationIdentity.status(account_id) or {} + result = BillingService.EducationIdentity.status(account_id) or {} expire_at = result.get("expire_at") return AccountEducationStatus( result=result.get("result"), @@ -57,7 +52,7 @@ class BillingAccountEducationGateway(AccountEducationGateway): @override def autocomplete(self, *, keywords: str, page: int, limit: int) -> AccountEducationAutocomplete: - result: dict[str, Any] = BillingService.EducationIdentity.autocomplete(keywords, page, limit) or {} + result = BillingService.EducationIdentity.autocomplete(keywords, page, limit) or {} return AccountEducationAutocomplete( data=tuple(result.get("data") or ()), curr_page=result.get("curr_page"), diff --git a/api/services/account_education_service.py b/api/services/account_education_service.py index 1217802dba3..bfecad64c8a 100644 --- a/api/services/account_education_service.py +++ b/api/services/account_education_service.py @@ -1,31 +1,37 @@ """Application service for account education-discount use cases.""" -from typing import Any, Protocol +from typing import Protocol from machinery.context import RequestContext from machinery.errors import ActiveWorkspaceRequiredError -from services.account_errors import AccountNotFoundError +from services.account_errors import AccountNotFoundError, EducationRateLimitExceededError from services.account_ports import AccountRepository from services.entities.account_entities import ( + AccountEducationActivation, AccountEducationAutocomplete, AccountEducationStatus, AccountEducationVerification, ) +class AccountEducationRateLimiter(Protocol): + def is_rate_limited(self, key: str, /) -> bool: ... + + def increment_rate_limit(self, key: str, /) -> None: ... + + class AccountEducationGateway(Protocol): - def verify(self, *, account_id: str, email: str) -> AccountEducationVerification: ... + def verify(self, *, account_id: str) -> AccountEducationVerification: ... def activate( self, *, account_id: str, - email: str, tenant_id: str, token: str, institution: str, role: str, - ) -> dict[str, Any] | None: ... + ) -> AccountEducationActivation: ... def status(self, account_id: str) -> AccountEducationStatus: ... @@ -38,15 +44,22 @@ class AccountEducationService: *, accounts: AccountRepository, education: AccountEducationGateway, + verification_rate_limiter: AccountEducationRateLimiter, + activation_rate_limiter: AccountEducationRateLimiter, ) -> None: self._accounts = accounts self._education = education + self._verification_rate_limiter = verification_rate_limiter + self._activation_rate_limiter = activation_rate_limiter def verify(self, context: RequestContext) -> AccountEducationVerification: account = self._accounts.get(context.account_id) if account is None: raise AccountNotFoundError - return self._education.verify(account_id=account.id, email=account.email) + if self._verification_rate_limiter.is_rate_limited(account.email): + raise EducationRateLimitExceededError + self._verification_rate_limiter.increment_rate_limit(account.email) + return self._education.verify(account_id=account.id) def activate( self, @@ -55,15 +68,17 @@ class AccountEducationService: token: str, institution: str, role: str, - ) -> dict[str, Any] | None: + ) -> AccountEducationActivation: account = self._accounts.get(context.account_id) if account is None: raise AccountNotFoundError if context.active_workspace_id is None: raise ActiveWorkspaceRequiredError + if self._activation_rate_limiter.is_rate_limited(account.email): + raise EducationRateLimitExceededError + self._activation_rate_limiter.increment_rate_limit(account.email) return self._education.activate( account_id=account.id, - email=account.email, tenant_id=context.active_workspace_id, token=token, institution=institution, diff --git a/api/services/account_errors.py b/api/services/account_errors.py index 353de34188a..c902c7d331b 100644 --- a/api/services/account_errors.py +++ b/api/services/account_errors.py @@ -87,3 +87,7 @@ class AccountEmailAlreadyInUseError(AccountApplicationError): class EducationDiscountPausedError(AccountApplicationError): """Education discount activation is temporarily paused.""" + + +class EducationRateLimitExceededError(AccountApplicationError): + """Too many education verification or activation requests were made.""" diff --git a/api/services/agent/composer_service.py b/api/services/agent/composer_service.py index 813c6495cf2..ed66bff8339 100644 --- a/api/services/agent/composer_service.py +++ b/api/services/agent/composer_service.py @@ -64,6 +64,7 @@ from services.entities.agent_entities import ( ComposerVariant, WorkflowNodeJobConfig, ) +from services.skill_management_service import SkillManagementService from tasks.collect_agent_resources_task import enqueue_agent_resource_collection from tasks.new_agent_beta_task import register_new_agent_beta_publish_after_commit @@ -353,6 +354,14 @@ class AgentComposerService: icon=source_agent.icon, icon_background=source_agent.icon_background, ) + SkillManagementService(session=session).copy_agent_bindings( + tenant_id=tenant_id, + source_agent_id=source_agent.id, + source_snapshot_id=source_version.id, + target_agent_id=inline_agent.id, + target_snapshot_id=inline_agent.active_config_snapshot_id, + user_id=account_id, + ) binding.binding_type = WorkflowAgentBindingType.INLINE_AGENT binding.agent_id = inline_agent.id binding.current_snapshot_id = inline_agent.active_config_snapshot_id @@ -640,6 +649,13 @@ class AgentComposerService: agent.updated_by = account_id draft.base_snapshot_id = version.id draft.updated_by = account_id + + SkillManagementService(session=session).publish_agent_bindings( + tenant_id=tenant_id, + agent_id=agent.id, + snapshot_id=version.id, + user_id=account_id, + ) if not access_was_ready: if not agent.app_id: raise AgentNotFoundError() @@ -1488,6 +1504,12 @@ class AgentComposerService: agent.active_config_has_model = agent_soul_has_model(payload.agent_soul) agent.active_config_is_published = True agent.updated_by = account_id + SkillManagementService(session=session).publish_agent_bindings( + tenant_id=tenant_id, + agent_id=agent.id, + snapshot_id=version.id, + user_id=account_id, + ) binding.current_snapshot_id = version.id if payload.node_job is not None: binding.node_job_config = payload.node_job @@ -1528,6 +1550,12 @@ class AgentComposerService: agent.active_config_has_model = agent_soul_has_model(payload.agent_soul) agent.active_config_is_published = True agent.updated_by = account_id + SkillManagementService(session=session).publish_agent_bindings( + tenant_id=tenant_id, + agent_id=agent.id, + snapshot_id=version.id, + user_id=account_id, + ) binding.current_snapshot_id = version.id binding.updated_by = account_id if payload.node_job is not None: @@ -1564,6 +1592,17 @@ class AgentComposerService: operation=AgentConfigRevisionOperation.SAVE_NEW_AGENT, version_note=payload.version_note, ) + source_agent_id = binding.agent_id if binding else None + source_snapshot_id = binding.current_snapshot_id if binding else None + if source_agent_id and source_snapshot_id and agent.active_config_snapshot_id: + SkillManagementService(session=session).copy_agent_bindings( + tenant_id=tenant_id, + source_agent_id=source_agent_id, + source_snapshot_id=source_snapshot_id, + target_agent_id=agent.id, + target_snapshot_id=agent.active_config_snapshot_id, + user_id=account_id, + ) node_job = payload.node_job or WorkflowNodeJobConfig() if not binding: binding = WorkflowAgentNodeBinding( @@ -1619,6 +1658,15 @@ class AgentComposerService: operation=AgentConfigRevisionOperation.SAVE_TO_ROSTER, version_note=payload.version_note, ) + if source_agent.active_config_snapshot_id and roster_agent.active_config_snapshot_id: + SkillManagementService(session=session).copy_agent_bindings( + tenant_id=tenant_id, + source_agent_id=source_agent.id, + source_snapshot_id=source_version.id, + target_agent_id=roster_agent.id, + target_snapshot_id=roster_agent.active_config_snapshot_id, + user_id=account_id, + ) binding.binding_type = WorkflowAgentBindingType.ROSTER_AGENT binding.agent_id = roster_agent.id binding.current_snapshot_id = roster_agent.active_config_snapshot_id diff --git a/api/services/agent/dsl_entities.py b/api/services/agent/dsl_entities.py index 70dbf3a2967..5fda1cfd92b 100644 --- a/api/services/agent/dsl_entities.py +++ b/api/services/agent/dsl_entities.py @@ -36,6 +36,17 @@ class AgentPackageOmittedAsset(BaseModel): mime_type: str | None = None +class AgentPackageWorkspaceSkill(BaseModel): + """Workspace Skill binding represented without source-workspace identifiers.""" + + model_config = ConfigDict(extra="forbid") + + name: str = Field(min_length=1, max_length=64) + display_name: str = "" + description: str = "" + priority: int = Field(ge=0) + + class AgentPackage(BaseModel): """One portable Agent Soul with display metadata and omitted asset hints.""" @@ -45,6 +56,7 @@ class AgentPackage(BaseModel): metadata: AgentPackageMetadata soul: AgentSoulConfig omitted_assets: list[AgentPackageOmittedAsset] = Field(default_factory=list) + workspace_skills: list[AgentPackageWorkspaceSkill] = Field(default_factory=list) def portable_ref(prefix: str, value: str) -> str: @@ -75,7 +87,11 @@ def _strip_sensitive_values(value: Any) -> Any: return result -def make_portable_agent_package(agent: Agent, agent_soul: AgentSoulConfig) -> AgentPackage: +def make_portable_agent_package( + agent: Agent, + agent_soul: AgentSoulConfig, + workspace_skills: list[AgentPackageWorkspaceSkill] | None = None, +) -> AgentPackage: """Return a package safe to place in YAML or the system clipboard.""" soul_data = agent_soul.model_dump(mode="json") @@ -152,4 +168,5 @@ def make_portable_agent_package(agent: Agent, agent_soul: AgentSoulConfig) -> Ag ), soul=portable_soul, omitted_assets=omitted_assets, + workspace_skills=workspace_skills or [], ) diff --git a/api/services/agent/dsl_service.py b/api/services/agent/dsl_service.py index 87ce85ddd84..3c13ee0112b 100644 --- a/api/services/agent/dsl_service.py +++ b/api/services/agent/dsl_service.py @@ -38,6 +38,7 @@ from models.agent import ( ) from models.agent_config_entities import AgentSoulConfig, WorkflowNodeJobConfig from models.model import App, AppModelConfig +from models.skill import AgentSkillBinding, AgentSkillBindingSnapshot, Skill from models.workflow import Workflow from services.agent.agent_soul_state import agent_soul_has_model from services.agent.dsl_entities import ( @@ -45,6 +46,7 @@ from services.agent.dsl_entities import ( AGENT_PACKAGE_REF_KEY, AgentPackage, AgentPackageMetadata, + AgentPackageWorkspaceSkill, make_portable_agent_package, portable_ref, ) @@ -108,7 +110,13 @@ class AgentDslService: soul = AgentSoulConfig.model_validate(snapshot.config_snapshot_dict) package_ref = "agent_1" - return package_ref, {package_ref: make_portable_agent_package(agent, soul)} + workspace_skills = self._workspace_skills_for_export( + tenant_id=app.tenant_id, + agent_id=agent.id, + snapshot_id=agent.active_config_snapshot_id, + include_draft=draft is not None, + ) + return package_ref, {package_ref: make_portable_agent_package(agent, soul, workspace_skills=workspace_skills)} def export_workflow_packages( self, *, workflow: Workflow, graph: Mapping[str, Any] @@ -151,6 +159,12 @@ class AgentDslService: packages[package_ref] = make_portable_agent_package( agent, AgentSoulConfig.model_validate(snapshot.config_snapshot_dict), + workspace_skills=self._workspace_skills_for_export( + tenant_id=workflow.tenant_id, + agent_id=agent.id, + snapshot_id=snapshot.id, + include_draft=False, + ), ) node_data["agent_binding"] = { "binding_type": binding.binding_type.value, @@ -215,6 +229,14 @@ class AgentDslService: agent_id=agent.id, snapshot_id=agent.active_config_snapshot_id, ) + self._restore_workspace_skill_bindings( + tenant_id=app.tenant_id, + agent=agent, + snapshot=snapshot, + package=package, + warnings=warnings, + account_id=account.id, + ) self.session.add( AgentConfigDraft( tenant_id=app.tenant_id, @@ -378,6 +400,102 @@ class AgentDslService: ) return dependencies + def _workspace_skills_for_export( + self, + *, + tenant_id: str, + agent_id: str, + snapshot_id: str | None, + include_draft: bool, + ) -> list[AgentPackageWorkspaceSkill]: + if include_draft: + rows = list( + self.session.execute( + select(AgentSkillBinding, Skill) + .join(Skill, Skill.id == AgentSkillBinding.skill_id) + .where(AgentSkillBinding.tenant_id == tenant_id, AgentSkillBinding.agent_id == agent_id) + .order_by(AgentSkillBinding.priority) + ) + ) + if rows or not snapshot_id: + return [ + AgentPackageWorkspaceSkill( + name=skill.name, + display_name=skill.display_name, + description=skill.description, + priority=binding.priority, + ) + for binding, skill in rows + ] + if snapshot_id: + rows = list( + self.session.execute( + select(AgentSkillBindingSnapshot, Skill) + .join(Skill, Skill.id == AgentSkillBindingSnapshot.skill_id) + .where( + AgentSkillBindingSnapshot.tenant_id == tenant_id, + AgentSkillBindingSnapshot.agent_id == agent_id, + AgentSkillBindingSnapshot.config_snapshot_id == snapshot_id, + ) + .order_by(AgentSkillBindingSnapshot.priority) + ) + ) + else: + return [] + return [ + AgentPackageWorkspaceSkill( + name=skill.name, + display_name=skill.display_name, + description=skill.description, + priority=binding.priority, + ) + for binding, skill in rows + ] + + def _restore_workspace_skill_bindings( + self, + *, + tenant_id: str, + agent: Agent, + snapshot: AgentConfigSnapshot, + package: AgentPackage, + warnings: list[DslImportWarning], + account_id: str, + ) -> None: + for workspace_skill in sorted(package.workspace_skills, key=lambda item: item.priority): + skill = self.session.scalar( + select(Skill).where(Skill.tenant_id == tenant_id, Skill.name == workspace_skill.name).limit(1) + ) + if skill is None: + warnings.append( + DslImportWarning( + code="agent_workspace_skill_unresolved", + path="agent.workspace_skills", + message=f"Workspace Skill {workspace_skill.name!r} is unavailable in the target workspace.", + details={"name": workspace_skill.name}, + ) + ) + continue + self.session.add( + AgentSkillBinding( + tenant_id=tenant_id, + agent_id=agent.id, + skill_id=skill.id, + priority=workspace_skill.priority, + created_by=account_id, + ) + ) + self.session.add( + AgentSkillBindingSnapshot( + tenant_id=tenant_id, + agent_id=agent.id, + config_snapshot_id=snapshot.id, + skill_id=skill.id, + priority=workspace_skill.priority, + created_by=account_id, + ) + ) + def _create_imported_inline_agent( self, *, @@ -401,6 +519,14 @@ class AgentDslService: source=AgentSource.IMPORTED, operation=AgentConfigRevisionOperation.IMPORT_PACKAGE, ) + self._restore_workspace_skill_bindings( + tenant_id=workflow.tenant_id, + agent=agent, + snapshot=snapshot, + package=package, + warnings=warnings, + account_id=account.id, + ) return AgentPackageImportResult(agent=agent, snapshot=snapshot, warnings=warnings) def _create_workflow_only_agent( diff --git a/api/services/agent/roster_service.py b/api/services/agent/roster_service.py index d63056209ef..ccb79c65dca 100644 --- a/api/services/agent/roster_service.py +++ b/api/services/agent/roster_service.py @@ -1106,6 +1106,19 @@ class AgentRosterService: target_app_id=target_app.id, account_id=account.id, ) + from services.skill_management_service import SkillManagementService + + target_agent = self.get_app_backing_agent(tenant_id=tenant_id, app_id=target_app.id) + if target_agent is None: + raise AgentNotFoundError() + SkillManagementService(session=self._session).copy_agent_bindings( + tenant_id=tenant_id, + source_agent_id=source_agent.id, + source_snapshot_id=source_agent.active_config_snapshot_id or "", + target_agent_id=target_agent.id, + user_id=account.id, + source_include_draft=not source_agent.active_config_is_published, + ) self._session.commit() if FeatureService.get_system_features().webapp_auth.enabled: try: diff --git a/api/services/app_service.py b/api/services/app_service.py index c206eabfd0a..1a9f0497774 100644 --- a/api/services/app_service.py +++ b/api/services/app_service.py @@ -41,7 +41,6 @@ from models.agent import ( ) from models.model import App, AppMode, AppModelConfig, IconType, Site, load_annotation_reply_config from models.skill import AgentSkillBinding -from models.tools import ApiToolProvider from models.workflow import Workflow from services.agent.errors import AgentAccessNotReadyError, AgentNameConflictError from services.agent.home_snapshot_service import AgentHomeSnapshotService @@ -1042,9 +1041,9 @@ class AppService: WorkflowAgentNodeBinding.app_id == app.id, ) ) - agent_ids_to_unbind = [*workflow_agent_ids] + agent_ids_to_unbind = set(workflow_agent_ids) if backing_agent is not None: - agent_ids_to_unbind.append(backing_agent.id) + agent_ids_to_unbind.add(backing_agent.id) if agent_ids_to_unbind: session.execute( delete(AgentSkillBinding).where( diff --git a/api/services/billing_service.py b/api/services/billing_service.py index 414caf91eb8..a76bc148b00 100644 --- a/api/services/billing_service.py +++ b/api/services/billing_service.py @@ -2,18 +2,18 @@ import json import logging import os from collections.abc import Sequence -from typing import Literal, NotRequired, TypedDict +from typing import Any, Literal, NotRequired, TypedDict import httpx from pydantic import TypeAdapter, ValidationError from tenacity import retry, retry_if_exception_type, stop_before_delay, wait_fixed +from typing_extensions import deprecated from werkzeug.exceptions import InternalServerError from core.helper.http_client_pooling import get_pooled_http_client from enums import CloudPlan from extensions.ext_redis import redis_client from libs.helper import RateLimiter -from models import Account from services.billing_portal_service import BillingPortalLink from services.errors.billing import ( BillingUpstreamInvalidResponseError, @@ -35,7 +35,7 @@ EmailFreezeType = Literal["freeze", "email_domain_suspended"] class _BillingHTTPStatusError(ValueError): - def __init__(self, message: str, status_code: int): + def __init__(self, message: str, status_code: int) -> None: super().__init__(message) self.status_code = status_code @@ -47,6 +47,27 @@ class SubscriptionPlan(TypedDict): expiration_date: int +class MessageResponseDict(TypedDict): + message: str + + +class EducationVerifyResponseDict(TypedDict): + token: str + + +class EducationStatusResponseDict(TypedDict): + result: bool + is_student: bool + expire_at: str + allow_refresh: bool + + +class EducationAutocompleteResponseDict(TypedDict): + data: list[str] + curr_page: int + has_next: bool + + _billing_portal_link_adapter = TypeAdapter(BillingPortalLink) @@ -244,13 +265,6 @@ class BillingService: def invalidate_vector_space_cache(cls, tenant_id: str) -> None: cls.get_vector_space(tenant_id, bypass_cache=True) - @classmethod - def get_tenant_feature_plan_usage_info(cls, tenant_id: str): - """Deprecated: Use get_quota_info instead.""" - params = {"tenant_id": tenant_id} - usage_info = cls._send_request("GET", "/tenant-feature-usage/info", params=params) - return usage_info - @classmethod def get_quota_info(cls, tenant_id: str) -> TenantFeatureQuotaInfo: params = {"tenant_id": tenant_id} @@ -370,6 +384,7 @@ class BillingService: return cls._send_billing_portal_request("/subscription/payment-link", params=params) @classmethod + @deprecated("Only used by the deprecated model-provider checkout endpoint.") def get_model_provider_payment_link(cls, provider_name: str, tenant_id: str, account_id: str, prefilled_email: str): params = { "provider_name": provider_name, @@ -420,6 +435,7 @@ class BillingService: return cls._send_request("POST", "/tenant-feature-usage/refund", params={"quota_usage_history_id": history_id}) @classmethod + @deprecated("Legacy tenant feature-plan usage endpoint; use the quota APIs instead.") def get_tenant_feature_plan_usage(cls, tenant_id: str, feature_key: str): params = {"tenant_id": tenant_id, "feature_key": feature_key} return cls._send_request("GET", "/billing/tenant_feature_plan/usage", params=params) @@ -427,7 +443,7 @@ class BillingService: @classmethod def _send_quota_request( cls, method: Literal["GET", "POST", "DELETE", "PUT"], endpoint: str, json=None, params=None - ): + ) -> dict[str, Any]: return cls._send_request(method, endpoint, json=json, params=params, base_url=cls.quota_base_url) @classmethod @@ -444,7 +460,7 @@ class BillingService: json=None, params=None, base_url: str | None = None, - ): + ) -> Any: headers = {"Content-Type": "application/json", "Billing-Api-Secret-Key": cls.secret_key} url = f"{base_url or cls.base_url}{endpoint}" @@ -492,7 +508,7 @@ class BillingService: raise RuntimeError("Unexpected billing service value error") from error @classmethod - def delete_account(cls, account_id: str): + def delete_account(cls, account_id: str) -> MessageResponseDict: """Delete account.""" params = {"account_id": account_id} return cls._send_request("DELETE", "/account", params=params) @@ -520,41 +536,33 @@ class BillingService: return cls.get_email_freeze_type(email) is not None @classmethod - def update_account_deletion_feedback(cls, email: str, feedback: str): + def update_account_deletion_feedback(cls, email: str, feedback: str) -> MessageResponseDict: """Update account deletion feedback.""" json = {"email": email, "feedback": feedback} return cls._send_request("POST", "/account/delete-feedback", json=json) class EducationIdentity: - verification_rate_limit = RateLimiter(prefix="edu_verification_rate_limit", max_attempts=10, time_window=60) - activation_rate_limit = RateLimiter(prefix="edu_activation_rate_limit", max_attempts=10, time_window=60) - @classmethod - def verify(cls, account_id: str, account_email: str): - if cls.verification_rate_limit.is_rate_limited(account_email): - from controllers.console.error import EducationVerifyLimitError - - raise EducationVerifyLimitError() - - cls.verification_rate_limit.increment_rate_limit(account_email) - + def verify(cls, account_id: str) -> EducationVerifyResponseDict: params = {"account_id": account_id} return BillingService._send_request("GET", "/education/verify", params=params) @classmethod - def status(cls, account_id: str): + def status(cls, account_id: str) -> EducationStatusResponseDict: params = {"account_id": account_id} return BillingService._send_request("GET", "/education/status", params=params) @classmethod - def activate(cls, account: Account, token: str, institution: str, role: str): - if cls.activation_rate_limit.is_rate_limited(account.email): - from controllers.console.error import EducationActivateLimitError - - raise EducationActivateLimitError() - - cls.activation_rate_limit.increment_rate_limit(account.email) - params = {"account_id": account.id, "curr_tenant_id": account.current_tenant_id} + def activate( + cls, + *, + account_id: str, + tenant_id: str, + token: str, + institution: str, + role: str, + ) -> MessageResponseDict: + params = {"account_id": account_id, "curr_tenant_id": tenant_id} json = { "institution": institution, "token": token, @@ -563,7 +571,7 @@ class BillingService: return BillingService._send_request("POST", "/education/", json=json, params=params) @classmethod - def autocomplete(cls, keywords: str, page: int = 0, limit: int = 20): + def autocomplete(cls, keywords: str, page: int = 0, limit: int = 20) -> EducationAutocompleteResponseDict: params = {"keywords": keywords, "page": page, "limit": limit} return BillingService._send_request("GET", "/education/autocomplete", params=params) @@ -594,11 +602,11 @@ class BillingService: return res @classmethod - def clean_billing_info_cache(cls, tenant_id: str): + def clean_billing_info_cache(cls, tenant_id: str) -> None: redis_client.delete(f"tenant:{tenant_id}:billing_info") @classmethod - def sync_partner_tenants_bindings(cls, account_id: str, partner_key: str, click_id: str): + def sync_partner_tenants_bindings(cls, account_id: str, partner_key: str, click_id: str) -> dict[str, Any]: payload = {"account_id": account_id, "click_id": click_id} return cls._send_request("PUT", f"/partners/{partner_key}/tenants", json=payload) diff --git a/api/services/entities/account_entities.py b/api/services/entities/account_entities.py index fdf61e4c040..21cfc2df00d 100644 --- a/api/services/entities/account_entities.py +++ b/api/services/entities/account_entities.py @@ -183,6 +183,11 @@ class AccountEducationVerification: token: str | None +@dataclass(frozen=True, slots=True) +class AccountEducationActivation: + message: str + + @dataclass(frozen=True, slots=True) class AccountEducationStatus: result: bool | None diff --git a/api/services/feature_query_service.py b/api/services/feature_query_service.py index f24e387bb0f..8e0c82e6e25 100644 --- a/api/services/feature_query_service.py +++ b/api/services/feature_query_service.py @@ -1,6 +1,5 @@ """Application service for feature queries exposed by API adapters.""" -from collections.abc import Sequence from typing import Protocol from machinery.context import RequestContext @@ -17,6 +16,8 @@ class FeatureQueryGateway(Protocol): def get_workspace_features(self, workspace_id: str) -> FeatureModel: ... + def get_trial_models(self, workspace_id: str) -> list[str]: ... + def get_vector_space(self, workspace_id: str) -> VectorSpaceLimitationModel: ... def get_public_system_features(self) -> SystemFeatureModel: ... @@ -29,11 +30,9 @@ class FeatureQueryService: self, *, features: FeatureQueryGateway, - trial_models: Sequence[str], app_dsl_version: str, ) -> None: self._features = features - self._trial_models = tuple(trial_models) self._app_dsl_version = app_dsl_version def get_features(self, context: RequestContext) -> FeatureModel: @@ -42,8 +41,8 @@ class FeatureQueryService: def get_vector_space(self, context: RequestContext) -> VectorSpaceLimitationModel: return self._features.get_vector_space(self._require_active_workspace(context)) - def get_trial_models(self) -> list[str]: - return list(self._trial_models) + def get_trial_models(self, context: RequestContext) -> list[str]: + return self._features.get_trial_models(self._require_active_workspace(context)) def get_app_dsl_version(self) -> str: return self._app_dsl_version diff --git a/api/services/feature_service.py b/api/services/feature_service.py index 840aa4dda06..ad716a71f6e 100644 --- a/api/services/feature_service.py +++ b/api/services/feature_service.py @@ -20,6 +20,16 @@ class _EnterprisePluginInstallationPermission(BaseModel): class FeatureService: + @classmethod + def get_workspace_plan(cls, tenant_id: str) -> CloudPlan: + if dify_config.DEPLOYMENT_EDITION != DeploymentEdition.CLOUD: + return CloudPlan.SANDBOX + + billing_info = BillingService.get_info(tenant_id, exclude_vector_space=True) + if not billing_info["enabled"]: + return CloudPlan.SANDBOX + return CloudPlan(billing_info["subscription"]["plan"]) + @classmethod def get_features(cls, tenant_id: str, exclude_vector_space: bool = False) -> feature_entities.FeatureModel: features = feature_entities.FeatureModel() @@ -76,11 +86,8 @@ class FeatureService: if dify_config.DEPLOYMENT_EDITION != DeploymentEdition.CLOUD or not tenant_id: return default_limit - billing_info = BillingService.get_info(tenant_id, exclude_vector_space=True) - if billing_info["enabled"] and billing_info["subscription"]["plan"] in ( - CloudPlan.PROFESSIONAL, - CloudPlan.TEAM, - ): + subscription_plan = cls.get_workspace_plan(tenant_id) + if subscription_plan.is_paid: return max(default_limit, dify_config.KNOWLEDGE_UPLOAD_FILE_SIZE_LIMIT_FOR_PAID_PLAN) return default_limit @@ -93,10 +100,7 @@ class FeatureService: return True if not tenant_id: return False - return features.billing.enabled and features.billing.subscription.plan in ( - CloudPlan.PROFESSIONAL, - CloudPlan.TEAM, - ) + return features.billing.enabled and features.billing.subscription.plan.is_paid @classmethod def get_system_features(cls) -> feature_entities.SystemFeatureModel: @@ -183,20 +187,26 @@ class FeatureService: system_features.knowledge_fs_enabled = dify_config.KNOWLEDGE_FS_ENABLED @classmethod - def _fulfill_trial_models_from_env(cls) -> list[str]: + def _fulfill_trial_models_from_env(cls, quota_types: tuple[str, ...] | None = None) -> list[str]: + allowed_quota_types = quota_types or ("PAID", "TRIAL") return [ provider.value for provider in HostedTrialProvider - if ( - getattr(dify_config, f"HOSTED_{provider.config_key}_PAID_ENABLED", False) - and getattr(dify_config, f"HOSTED_{provider.config_key}_TRIAL_ENABLED", False) + if any( + getattr(dify_config, f"HOSTED_{provider.config_key}_{quota_type}_ENABLED", False) + for quota_type in allowed_quota_types ) ] @classmethod - def get_trial_models(cls) -> list[str]: - """Return hosted trial provider ids without requiring the full system-features payload.""" - return cls._fulfill_trial_models_from_env() + def get_trial_models(cls, tenant_id: str) -> list[str]: + """Return hosted credit providers filtered by the workspace subscription plan.""" + if dify_config.DEPLOYMENT_EDITION != DeploymentEdition.CLOUD: + return cls._fulfill_trial_models_from_env() + + subscription_plan = cls.get_workspace_plan(tenant_id) + quota_types = ("PAID", "TRIAL") if subscription_plan.is_paid else ("TRIAL",) + return cls._fulfill_trial_models_from_env(quota_types) @classmethod def _fulfill_params_from_env(cls, features: feature_entities.FeatureModel): diff --git a/api/services/feature_service_gateway.py b/api/services/feature_service_gateway.py index 3afa5096442..1a93b380dd5 100644 --- a/api/services/feature_service_gateway.py +++ b/api/services/feature_service_gateway.py @@ -19,6 +19,10 @@ class FeatureServiceGateway(FeatureQueryGateway): def get_workspace_features(self, workspace_id: str) -> FeatureModel: return FeatureService.get_features(workspace_id, exclude_vector_space=True) + @override + def get_trial_models(self, workspace_id: str) -> list[str]: + return FeatureService.get_trial_models(workspace_id) + @override def get_vector_space(self, workspace_id: str) -> VectorSpaceLimitationModel: return FeatureService.get_vector_space(workspace_id) diff --git a/api/services/tag_application_service.py b/api/services/tag_application_service.py index 04b4a931161..05488fda80a 100644 --- a/api/services/tag_application_service.py +++ b/api/services/tag_application_service.py @@ -5,7 +5,7 @@ from typing import Literal, NamedTuple, Protocol from machinery.context import RequestContext -type TagKind = Literal["knowledge", "app", "snippet"] +type TagKind = Literal["knowledge", "app", "snippet", "skill"] class TagSummary(NamedTuple): @@ -62,7 +62,7 @@ class TagNameConflictError(TagApplicationError): class TagBindingTargetNotFoundError(TagApplicationError): def __init__(self, target_type: TagKind) -> None: - target_name = {"knowledge": "Dataset", "app": "App", "snippet": "Snippet"}[target_type] + target_name = {"knowledge": "Dataset", "app": "App", "snippet": "Snippet", "skill": "Skill"}[target_type] super().__init__(f"{target_name} not found") diff --git a/api/tasks/annotation/enable_annotation_reply_task.py b/api/tasks/annotation/enable_annotation_reply_task.py index 237322f6b56..69aff9bbd11 100644 --- a/api/tasks/annotation/enable_annotation_reply_task.py +++ b/api/tasks/annotation/enable_annotation_reply_task.py @@ -80,8 +80,8 @@ def enable_annotation_reply_task( ) try: old_vector.delete() - except Exception as e: - logger.info(click.style(f"Delete annotation index error: {str(e)}", fg="red")) + except Exception: + logger.info("Delete annotation index error", exc_info=True) annotation_setting.score_threshold = score_threshold annotation_setting.collection_binding_id = dataset_collection_binding.id annotation_setting.updated_user_id = user_id @@ -116,8 +116,8 @@ def enable_annotation_reply_task( vector = Vector(dataset, attributes=["doc_id", "annotation_id", "app_id"], session=session) try: vector.delete_by_metadata_field("app_id", app_id) - except Exception as e: - logger.info(click.style(f"Delete annotation index error: {str(e)}", fg="red")) + except Exception: + logger.info("Delete annotation index error", exc_info=True) vector.create(documents) session.commit() redis_client.setex(enable_app_annotation_job_key, 600, "completed") diff --git a/api/tests/integration_tests/libs/broadcast_channel/redis/utils/__init__.py b/api/tests/integration_tests/libs/broadcast_channel/redis/utils/__init__.py deleted file mode 100644 index e3f0d8a96e4..00000000000 --- a/api/tests/integration_tests/libs/broadcast_channel/redis/utils/__init__.py +++ /dev/null @@ -1,36 +0,0 @@ -""" -Utilities and helpers for Redis broadcast channel integration tests. - -This module provides utility classes and functions for testing -Redis broadcast channel functionality. -""" - -from .test_data import ( - LARGE_MESSAGES, - SMALL_MESSAGES, - SPECIAL_MESSAGES, - BufferTestConfig, - ConcurrencyTestConfig, - ErrorTestConfig, -) -from .test_helpers import ( - ConcurrentPublisher, - SubscriptionMonitor, - assert_message_order, - measure_throughput, - wait_for_condition, -) - -__all__ = [ - "LARGE_MESSAGES", - "SMALL_MESSAGES", - "SPECIAL_MESSAGES", - "BufferTestConfig", - "ConcurrencyTestConfig", - "ConcurrentPublisher", - "ErrorTestConfig", - "SubscriptionMonitor", - "assert_message_order", - "measure_throughput", - "wait_for_condition", -] diff --git a/api/tests/integration_tests/libs/broadcast_channel/redis/utils/test_data.py b/api/tests/integration_tests/libs/broadcast_channel/redis/utils/test_data.py deleted file mode 100644 index 2cccb083042..00000000000 --- a/api/tests/integration_tests/libs/broadcast_channel/redis/utils/test_data.py +++ /dev/null @@ -1,315 +0,0 @@ -""" -Test data and configuration classes for Redis broadcast channel integration tests. - -This module provides dataclasses and constants for test configurations, -message sets, and test scenarios. -""" - -import dataclasses -from typing import Any - -from libs.broadcast_channel.channel import Overflow - - -@dataclasses.dataclass(frozen=True) -class BufferTestConfig: - """Configuration for buffer management tests.""" - - buffer_size: int - overflow_strategy: Overflow - message_count: int - expected_behavior: str - description: str - - -@dataclasses.dataclass(frozen=True) -class ConcurrencyTestConfig: - """Configuration for concurrency tests.""" - - publisher_count: int - subscriber_count: int - messages_per_publisher: int - test_duration: float - description: str - - -@dataclasses.dataclass(frozen=True) -class ErrorTestConfig: - """Configuration for error handling tests.""" - - error_type: str - test_input: Any - expected_exception: type[Exception] - description: str - - -# Test message sets for different scenarios -SMALL_MESSAGES = [ - b"msg_1", - b"msg_2", - b"msg_3", - b"msg_4", - b"msg_5", -] - -MEDIUM_MESSAGES = [ - b"medium_message_1_with_more_content", - b"medium_message_2_with_more_content", - b"medium_message_3_with_more_content", - b"medium_message_4_with_more_content", - b"medium_message_5_with_more_content", -] - -LARGE_MESSAGES = [ - b"large_message_" + b"x" * 1000, - b"large_message_" + b"y" * 1000, - b"large_message_" + b"z" * 1000, -] - -VERY_LARGE_MESSAGES = [ - b"very_large_message_" + b"x" * 10000, # ~10KB - b"very_large_message_" + b"y" * 50000, # ~50KB - b"very_large_message_" + b"z" * 100000, # ~100KB -] - -SPECIAL_MESSAGES = [ - b"", # Empty message - b"\x00\x01\x02", # Binary data with null bytes - "unicode_test_你好".encode(), # Unicode - b"special_chars_!@#$%^&*()_+-=[]{}|;':\",./<>?", # Special characters - b"newlines\n\r\t", # Control characters -] - -BINARY_MESSAGES = [ - bytes(range(256)), # All possible byte values - b"\xff\xfe\xfd\xfc\xfb\xfa\xf9\xf8", # High byte values - b"\x00\x01\x02\x03\x04\x05\x06\x07", # Low byte values -] - -# Buffer test configurations -BUFFER_TEST_CONFIGS = [ - BufferTestConfig( - buffer_size=3, - overflow_strategy=Overflow.DROP_OLDEST, - message_count=5, - expected_behavior="drop_oldest", - description="Drop oldest messages when buffer is full", - ), - BufferTestConfig( - buffer_size=3, - overflow_strategy=Overflow.DROP_NEWEST, - message_count=5, - expected_behavior="drop_newest", - description="Drop newest messages when buffer is full", - ), - BufferTestConfig( - buffer_size=3, - overflow_strategy=Overflow.BLOCK, - message_count=5, - expected_behavior="block", - description="Block when buffer is full", - ), -] - -# Concurrency test configurations -CONCURRENCY_TEST_CONFIGS = [ - ConcurrencyTestConfig( - publisher_count=1, - subscriber_count=1, - messages_per_publisher=10, - test_duration=5.0, - description="Single publisher, single subscriber", - ), - ConcurrencyTestConfig( - publisher_count=3, - subscriber_count=1, - messages_per_publisher=10, - test_duration=5.0, - description="Multiple publishers, single subscriber", - ), - ConcurrencyTestConfig( - publisher_count=1, - subscriber_count=3, - messages_per_publisher=10, - test_duration=5.0, - description="Single publisher, multiple subscribers", - ), - ConcurrencyTestConfig( - publisher_count=3, - subscriber_count=3, - messages_per_publisher=10, - test_duration=5.0, - description="Multiple publishers, multiple subscribers", - ), -] - -# Error test configurations -ERROR_TEST_CONFIGS = [ - ErrorTestConfig( - error_type="invalid_buffer_size", - test_input=0, - expected_exception=ValueError, - description="Zero buffer size should raise ValueError", - ), - ErrorTestConfig( - error_type="invalid_buffer_size", - test_input=-1, - expected_exception=ValueError, - description="Negative buffer size should raise ValueError", - ), - ErrorTestConfig( - error_type="invalid_buffer_size", - test_input=1.5, - expected_exception=TypeError, - description="Float buffer size should raise TypeError", - ), - ErrorTestConfig( - error_type="invalid_buffer_size", - test_input="invalid", - expected_exception=TypeError, - description="String buffer size should raise TypeError", - ), -] - -# Topic name test cases -TOPIC_NAME_TEST_CASES = [ - "simple_topic", - "topic_with_underscores", - "topic-with-dashes", - "topic.with.dots", - "topic_with_numbers_123", - "UPPERCASE_TOPIC", - "mixed_Case_Topic", - "topic_with_symbols_!@#$%", - "very_long_topic_name_" + "x" * 100, - "unicode_topic_你好", - "topic:with:colons", - "topic/with/slashes", - "topic\\with\\backslashes", -] - -# Performance test configurations -PERFORMANCE_TEST_CONFIGS = [ - { - "name": "small_messages_high_frequency", - "message_size": 50, - "message_count": 1000, - "description": "Many small messages", - }, - { - "name": "medium_messages_medium_frequency", - "message_size": 500, - "message_count": 100, - "description": "Medium messages", - }, - { - "name": "large_messages_low_frequency", - "message_size": 5000, - "message_count": 10, - "description": "Large messages", - }, -] - -# Stress test configurations -STRESS_TEST_CONFIGS = [ - { - "name": "high_frequency_publishing", - "publisher_count": 5, - "messages_per_publisher": 100, - "subscriber_count": 3, - "description": "High frequency publishing with multiple publishers", - }, - { - "name": "many_subscribers", - "publisher_count": 1, - "messages_per_publisher": 50, - "subscriber_count": 10, - "description": "Many subscribers to single publisher", - }, - { - "name": "mixed_load", - "publisher_count": 3, - "messages_per_publisher": 100, - "subscriber_count": 5, - "description": "Mixed load with multiple publishers and subscribers", - }, -] - -# Edge case test data -EDGE_CASE_MESSAGES = [ - b"", # Empty message - b"\x00", # Single null byte - b"\xff", # Single max byte value - b"a", # Single ASCII character - "ä".encode(), # Single unicode character (2 bytes) - "𐍈".encode(), # Unicode character outside BMP (4 bytes) - b"\x00" * 1000, # 1000 null bytes - b"\xff" * 1000, # 1000 max byte values -] - -# Message validation test data -MESSAGE_VALIDATION_TEST_CASES = [ - { - "name": "valid_bytes", - "input": b"valid_message", - "should_pass": True, - "description": "Valid bytes message", - }, - { - "name": "empty_bytes", - "input": b"", - "should_pass": True, - "description": "Empty bytes message", - }, - { - "name": "binary_data", - "input": bytes(range(256)), - "should_pass": True, - "description": "Binary data with all byte values", - }, - { - "name": "large_message", - "input": b"x" * 1000000, # 1MB - "should_pass": True, - "description": "Large message (1MB)", - }, -] - -# Redis connection test scenarios -REDIS_CONNECTION_TEST_SCENARIOS = [ - { - "name": "normal_connection", - "should_fail": False, - "description": "Normal Redis connection", - }, - { - "name": "connection_timeout", - "should_fail": True, - "description": "Connection timeout scenario", - }, - { - "name": "connection_refused", - "should_fail": True, - "description": "Connection refused scenario", - }, -] - -# Test constants -DEFAULT_TIMEOUT = 10.0 -SHORT_TIMEOUT = 2.0 -LONG_TIMEOUT = 30.0 - -# Message size limits for testing -MAX_SMALL_MESSAGE_SIZE = 100 -MAX_MEDIUM_MESSAGE_SIZE = 1000 -MAX_LARGE_MESSAGE_SIZE = 10000 - -# Thread counts for concurrency testing -MIN_THREAD_COUNT = 1 -MAX_THREAD_COUNT = 10 -DEFAULT_THREAD_COUNT = 3 - -# Buffer sizes for testing -MIN_BUFFER_SIZE = 1 -MAX_BUFFER_SIZE = 1000 -DEFAULT_BUFFER_SIZE = 10 diff --git a/api/tests/integration_tests/libs/broadcast_channel/redis/utils/test_helpers.py b/api/tests/integration_tests/libs/broadcast_channel/redis/utils/test_helpers.py deleted file mode 100644 index 65f3007b014..00000000000 --- a/api/tests/integration_tests/libs/broadcast_channel/redis/utils/test_helpers.py +++ /dev/null @@ -1,396 +0,0 @@ -""" -Test helper utilities for Redis broadcast channel integration tests. - -This module provides utility classes and functions for testing concurrent -operations, monitoring subscriptions, and measuring performance. -""" - -import logging -import threading -import time -from collections.abc import Callable -from typing import Any - -_logger = logging.getLogger(__name__) - - -class ConcurrentPublisher: - """ - Utility class for publishing messages concurrently from multiple threads. - - This class manages multiple publisher threads that can publish messages - to the same or different topics concurrently, useful for stress testing - and concurrency validation. - """ - - def __init__(self, producer, message_count: int = 10, delay: float = 0.0): - """ - Initialize the concurrent publisher. - - Args: - producer: The producer instance to publish with - message_count: Number of messages to publish per thread - delay: Delay between messages in seconds - """ - self.producer = producer - self.message_count = message_count - self.delay = delay - self.threads: list[threading.Thread] = [] - self.published_messages: list[list[bytes]] = [] - self._lock = threading.Lock() - self._started = False - - def start_publishers(self, thread_count: int = 3) -> None: - """ - Start multiple publisher threads. - - Args: - thread_count: Number of publisher threads to start - """ - if self._started: - raise RuntimeError("Publishers already started") - - self._started = True - - def _publisher(thread_id: int) -> None: - messages: list[bytes] = [] - for i in range(self.message_count): - message = f"thread_{thread_id}_msg_{i}".encode() - try: - self.producer.publish(message) - messages.append(message) - if self.delay > 0: - time.sleep(self.delay) - except Exception: - _logger.exception("Pubmsg=lisher %s", thread_id) - - with self._lock: - self.published_messages.append(messages) - - for thread_id in range(thread_count): - thread = threading.Thread( - target=_publisher, - args=(thread_id,), - name=f"publisher-{thread_id}", - daemon=True, - ) - thread.start() - self.threads.append(thread) - - def wait_for_completion(self, timeout: float = 30.0) -> bool: - """ - Wait for all publisher threads to complete. - - Args: - timeout: Maximum time to wait in seconds - - Returns: - bool: True if all threads completed successfully - """ - for thread in self.threads: - thread.join(timeout) - if thread.is_alive(): - return False - return True - - def get_all_messages(self) -> list[bytes]: - """ - Get all messages published by all threads. - - Returns: - list[bytes]: Flattened list of all published messages - """ - with self._lock: - all_messages = [] - for thread_messages in self.published_messages: - all_messages.extend(thread_messages) - return all_messages - - def get_thread_messages(self, thread_id: int) -> list[bytes]: - """ - Get messages published by a specific thread. - - Args: - thread_id: ID of the thread - - Returns: - list[bytes]: Messages published by the specified thread - """ - with self._lock: - if 0 <= thread_id < len(self.published_messages): - return self.published_messages[thread_id].copy() - return [] - - -class SubscriptionMonitor: - """ - Utility class for monitoring subscription activity in tests. - - This class monitors a subscription and tracks message reception, - errors, and completion status for testing purposes. - """ - - def __init__(self, subscription, timeout: float = 10.0): - """ - Initialize the subscription monitor. - - Args: - subscription: The subscription to monitor - timeout: Default timeout for operations - """ - self.subscription = subscription - self.timeout = timeout - self.messages: list[bytes] = [] - self.errors: list[Exception] = [] - self.completed = False - self._lock = threading.Lock() - self._condition = threading.Condition(self._lock) - self._monitor_thread: threading.Thread | None = None - self._start_time: float | None = None - - def start_monitoring(self) -> None: - """Start monitoring the subscription in a separate thread.""" - if self._monitor_thread is not None: - raise RuntimeError("Monitoring already started") - - self._start_time = time.time() - - def _monitor(): - try: - for message in self.subscription: - with self._lock: - self.messages.append(message) - self._condition.notify_all() - except Exception as e: - with self._lock: - self.errors.append(e) - self._condition.notify_all() - finally: - with self._lock: - self.completed = True - self._condition.notify_all() - - self._monitor_thread = threading.Thread( - target=_monitor, - name="subscription-monitor", - daemon=True, - ) - self._monitor_thread.start() - - def wait_for_messages(self, count: int, timeout: float | None = None) -> bool: - """ - Wait for a specific number of messages. - - Args: - count: Number of messages to wait for - timeout: Timeout in seconds (uses default if None) - - Returns: - bool: True if expected messages were received - """ - if timeout is None: - timeout = self.timeout - - deadline = time.time() + timeout - - with self._condition: - while len(self.messages) < count and not self.completed: - remaining = deadline - time.time() - if remaining <= 0: - return False - self._condition.wait(remaining) - - return len(self.messages) >= count - - def wait_for_completion(self, timeout: float | None = None) -> bool: - """ - Wait for monitoring to complete. - - Args: - timeout: Timeout in seconds (uses default if None) - - Returns: - bool: True if monitoring completed successfully - """ - if timeout is None: - timeout = self.timeout - - deadline = time.time() + timeout - - with self._condition: - while not self.completed: - remaining = deadline - time.time() - if remaining <= 0: - return False - self._condition.wait(remaining) - - return True - - def get_messages(self) -> list[bytes]: - """ - Get all received messages. - - Returns: - list[bytes]: Copy of received messages - """ - with self._lock: - return self.messages.copy() - - def get_error_count(self) -> int: - """ - Get the number of errors encountered. - - Returns: - int: Number of errors - """ - with self._lock: - return len(self.errors) - - def get_elapsed_time(self) -> float: - """ - Get the elapsed monitoring time. - - Returns: - float: Elapsed time in seconds - """ - if self._start_time is None: - return 0.0 - return time.time() - self._start_time - - def stop(self) -> None: - """Stop monitoring and close the subscription.""" - if self._monitor_thread is not None: - self.subscription.close() - self._monitor_thread.join(timeout=1.0) - - -def assert_message_order(received: list[bytes], expected: list[bytes]) -> bool: - """ - Assert that messages were received in the expected order. - - Args: - received: List of received messages - expected: List of expected messages in order - - Returns: - bool: True if order matches expected - """ - if len(received) != len(expected): - return False - - for i, (recv_msg, exp_msg) in enumerate(zip(received, expected)): - if recv_msg != exp_msg: - _logger.error("Message order mismatch at index %s: expected %s, got %s", i, exp_msg, recv_msg) - return False - - return True - - -def measure_throughput( - operation: Callable[[], Any], - duration: float = 1.0, -) -> tuple[float, int]: - """ - Measure the throughput of an operation over a specified duration. - - Args: - operation: The operation to measure - duration: Duration to run the operation in seconds - - Returns: - tuple[float, int]: (operations per second, total operations) - """ - start_time = time.time() - end_time = start_time + duration - count = 0 - - while time.time() < end_time: - try: - operation() - count += 1 - except Exception: - _logger.exception("Operation failed") - break - - elapsed = time.time() - start_time - ops_per_sec = count / elapsed if elapsed > 0 else 0.0 - - return ops_per_sec, count - - -def wait_for_condition( - condition: Callable[[], bool], - timeout: float = 10.0, - interval: float = 0.1, -) -> bool: - """ - Wait for a condition to become true. - - Args: - condition: Function that returns True when condition is met - timeout: Maximum time to wait in seconds - interval: Check interval in seconds - - Returns: - bool: True if condition was met within timeout - """ - deadline = time.time() + timeout - - while time.time() < deadline: - if condition(): - return True - time.sleep(interval) - - return False - - -def create_stress_test_messages( - count: int, - size: int = 100, -) -> list[bytes]: - """ - Create messages for stress testing. - - Args: - count: Number of messages to create - size: Size of each message in bytes - - Returns: - list[bytes]: List of test messages - """ - messages = [] - for i in range(count): - message = f"stress_test_msg_{i:06d}_".ljust(size, "x").encode() - messages.append(message) - return messages - - -def validate_message_integrity( - original_messages: list[bytes], - received_messages: list[bytes], -) -> dict[str, Any]: - """ - Validate the integrity of received messages. - - Args: - original_messages: Messages that were sent - received_messages: Messages that were received - - Returns: - dict[str, Any]: Validation results - """ - original_set = set(original_messages) - received_set = set(received_messages) - - missing_messages = original_set - received_set - extra_messages = received_set - original_set - - return { - "total_sent": len(original_messages), - "total_received": len(received_messages), - "missing_count": len(missing_messages), - "extra_count": len(extra_messages), - "missing_messages": list(missing_messages), - "extra_messages": list(extra_messages), - "integrity_ok": len(missing_messages) == 0 and len(extra_messages) == 0, - } diff --git a/api/tests/integration_tests/workflow/nodes/code_executor/test_code_javascript.py b/api/tests/integration_tests/workflow/nodes/code_executor/test_code_javascript.py deleted file mode 100644 index 09fcb68cf03..00000000000 --- a/api/tests/integration_tests/workflow/nodes/code_executor/test_code_javascript.py +++ /dev/null @@ -1,38 +0,0 @@ -from textwrap import dedent - -from core.helper.code_executor.code_executor import CodeExecutor, CodeLanguage -from core.helper.code_executor.javascript.javascript_code_provider import JavascriptCodeProvider -from core.helper.code_executor.javascript.javascript_transformer import NodeJsTemplateTransformer - -CODE_LANGUAGE = CodeLanguage.JAVASCRIPT - - -def test_javascript_plain(): - code = 'console.log("Hello World")' - result_message = CodeExecutor.execute_code(language=CODE_LANGUAGE, preload="", code=code) - assert result_message == "Hello World\n" - - -def test_javascript_json(): - code = dedent(""" - obj = {'Hello': 'World'} - console.log(JSON.stringify(obj)) - """) - result = CodeExecutor.execute_code(language=CODE_LANGUAGE, preload="", code=code) - assert result == '{"Hello":"World"}\n' - - -def test_javascript_with_code_template(): - result = CodeExecutor.execute_workflow_code_template( - language=CODE_LANGUAGE, - code=JavascriptCodeProvider.get_default_code(), - inputs={"arg1": "Hello", "arg2": "World"}, - ) - assert result == {"result": "HelloWorld"} - - -def test_javascript_get_runner_script(): - runner_script = NodeJsTemplateTransformer.get_runner_script() - assert runner_script.count(NodeJsTemplateTransformer._code_placeholder) == 1 - assert runner_script.count(NodeJsTemplateTransformer._inputs_placeholder) == 1 - assert runner_script.count(NodeJsTemplateTransformer._result_tag) == 2 diff --git a/api/tests/integration_tests/workflow/nodes/knowledge_index/test_knowledge_index_node_integration.py b/api/tests/integration_tests/workflow/nodes/knowledge_index/test_knowledge_index_node_integration.py deleted file mode 100644 index 4edbf2b1e94..00000000000 --- a/api/tests/integration_tests/workflow/nodes/knowledge_index/test_knowledge_index_node_integration.py +++ /dev/null @@ -1,69 +0,0 @@ -""" -Integration tests for KnowledgeIndexNode. - -This module provides integration tests for KnowledgeIndexNode with real database interactions. - -Note: These tests require database setup and are more complex than unit tests. -For now, we focus on unit tests which provide better coverage for the node logic. -""" - -import pytest - - -class TestKnowledgeIndexNodeIntegration: - """ - Integration test suite for KnowledgeIndexNode. - - Note: Full integration tests require: - - Database setup with datasets and documents - - Vector store for embeddings - - Model providers for indexing and summarization - - IndexProcessor and SummaryIndexService implementations - - For now, unit tests provide comprehensive coverage of the node logic. - """ - - @pytest.mark.skip(reason="Integration tests require full database and vector store setup") - def test_end_to_end_knowledge_index_preview(self): - """Test end-to-end knowledge index workflow in preview mode.""" - # TODO: Implement with real database - # 1. Create a dataset - # 2. Create a document - # 3. Prepare chunks - # 4. Run KnowledgeIndexNode in preview mode - # 5. Verify preview output - pass - - @pytest.mark.skip(reason="Integration tests require full database and vector store setup") - def test_end_to_end_knowledge_index_production(self): - """Test end-to-end knowledge index workflow in production mode.""" - # TODO: Implement with real database - # 1. Create a dataset - # 2. Create a document - # 3. Prepare chunks - # 4. Run KnowledgeIndexNode in production mode - # 5. Verify indexing and summary generation - pass - - @pytest.mark.skip(reason="Integration tests require full database and vector store setup") - def test_knowledge_index_with_summary_enabled(self): - """Test knowledge index with summary index setting enabled.""" - # TODO: Implement with real database - # 1. Create a dataset - # 2. Create a document - # 3. Prepare chunks - # 4. Configure summary index setting - # 5. Run KnowledgeIndexNode - # 6. Verify summaries are generated and indexed - pass - - @pytest.mark.skip(reason="Integration tests require full database and vector store setup") - def test_knowledge_index_parent_child_structure(self): - """Test knowledge index with parent-child chunk structure.""" - # TODO: Implement with real database - # 1. Create a dataset - # 2. Create a document - # 3. Prepare parent-child chunks - # 4. Run KnowledgeIndexNode - # 5. Verify parent-child indexing - pass diff --git a/api/tests/integration_tests/workflow/nodes/knowledge_retrieval/test_knowledge_retrieval_node_integration.py b/api/tests/integration_tests/workflow/nodes/knowledge_retrieval/test_knowledge_retrieval_node_integration.py deleted file mode 100644 index d029115df15..00000000000 --- a/api/tests/integration_tests/workflow/nodes/knowledge_retrieval/test_knowledge_retrieval_node_integration.py +++ /dev/null @@ -1,29 +0,0 @@ -""" -Integration tests for KnowledgeRetrievalNode. - -This module provides integration tests for KnowledgeRetrievalNode with real database interactions. - -Note: These tests require database setup and are more complex than unit tests. -For now, we focus on unit tests which provide better coverage for the node logic. -""" - -import pytest - - -class TestKnowledgeRetrievalNodeIntegration: - """ - Integration test suite for KnowledgeRetrievalNode. - - Note: Full integration tests require: - - Database setup with datasets and documents - - Vector store for embeddings - - Model providers for retrieval - - For now, unit tests provide comprehensive coverage of the node logic. - """ - - @pytest.mark.skip(reason="Integration tests require full database and vector store setup") - def test_end_to_end_knowledge_retrieval(self): - """Test end-to-end knowledge retrieval workflow.""" - # TODO: Implement with real database - pass diff --git a/api/tests/unit_tests/controllers/console/tag/test_tags.py b/api/tests/unit_tests/controllers/console/tag/test_tags.py index 132dd6fff0c..573698ed9e4 100644 --- a/api/tests/unit_tests/controllers/console/tag/test_tags.py +++ b/api/tests/unit_tests/controllers/console/tag/test_tags.py @@ -102,6 +102,22 @@ class TestTagListApi: assert status == 200 assert result == [{"id": "tag-1", "name": "Tag", "type": "knowledge", "binding_count": "2"}] + def test_get_skill_tags_uses_same_query_boundary( + self, app: Flask, request_context: RequestContext, tags_service: MagicMock + ) -> None: + tags_service.list_tags.return_value = (TagSummary("tag-1", "Skill", "skill", 1),) + + with app.test_request_context("/?type=skill"): + result, status = unwrap(TagListApi().get)( + TagListApi(), + TagListQueryParam(type="skill"), + request_context, + ) + + tags_service.list_tags.assert_called_once_with(request_context, "skill", None) + assert status == 200 + assert result[0]["type"] == "skill" + def test_get_snippet_tags_uses_same_query_boundary( self, app: Flask, request_context: RequestContext, tags_service: MagicMock ) -> None: @@ -378,6 +394,25 @@ class TestTagBindings: ) assert (result, status) == ({"result": "success"}, 200) + def test_create_passes_skill_binding_input( + self, app: Flask, request_context: RequestContext, tags_service: MagicMock + ) -> None: + owner = _account(TenantAccountRole.OWNER) + payload = TagBindingPayload(tag_ids=["tag-1"], target_id="skill-1", type=TagType.SKILL) + + with ( + app.test_request_context("/"), + patch.object(module.dify_config, "RBAC_ENABLED", False), + patch.object(module, "current_account_with_tenant", return_value=(owner, "tenant-1")), + ): + result, status = unwrap(TagBindingCollectionApi().post)(TagBindingCollectionApi(), payload, request_context) + + tags_service.create_bindings.assert_called_once_with( + request_context, + TagBindingInput(("tag-1",), "skill-1", "skill"), + ) + assert (result, status) == ({"result": "success"}, 200) + def test_create_maps_missing_target_to_not_found( self, app: Flask, request_context: RequestContext, tags_service: MagicMock ) -> None: diff --git a/api/tests/unit_tests/controllers/console/test_feature.py b/api/tests/unit_tests/controllers/console/test_feature.py index 0f2f9970cb7..a97f366da5b 100644 --- a/api/tests/unit_tests/controllers/console/test_feature.py +++ b/api/tests/unit_tests/controllers/console/test_feature.py @@ -107,10 +107,11 @@ class TestTrialModelsApi: api = TrialModelsApi() raw_get = unwrap(TrialModelsApi.get) - result = raw_get(api, _request_context()) + request_context = _request_context() + result = raw_get(api, request_context) assert result == {"trial_models": ["langgenius/openai/openai"]} - get_trial_models.assert_called_once_with() + get_trial_models.assert_called_once_with(request_context) class TestAppDslVersionApi: diff --git a/api/tests/unit_tests/controllers/console/test_workspace_account.py b/api/tests/unit_tests/controllers/console/test_workspace_account.py index 08799614a33..ae2002850c8 100644 --- a/api/tests/unit_tests/controllers/console/test_workspace_account.py +++ b/api/tests/unit_tests/controllers/console/test_workspace_account.py @@ -8,7 +8,7 @@ from flask import Flask from sqlalchemy.orm import Session from controllers.console.auth.error import InvalidTokenError -from controllers.console.error import EmailDomainSuspendedError +from controllers.console.error import EducationActivateLimitError, EducationVerifyLimitError, EmailDomainSuspendedError from controllers.console.workspace.account import ( AccountDeleteUpdateFeedbackApi, ChangeEmailCheckApi, @@ -16,13 +16,14 @@ from controllers.console.workspace.account import ( ChangeEmailSendEmailApi, CheckEmailUnique, EducationApi, + EducationVerifyApi, ) from machinery.context import RequestContext from models import Account, AccountStatus, Tenant, TenantAccountJoin from models.account import TenantAccountRole from services import account_errors from services.account_service import AccountService -from services.entities.account_entities import ChangeEmailVerification +from services.entities.account_entities import AccountEducationActivation, ChangeEmailVerification from services.entities.auth_entities import ( ChangeEmailNewEmailToken, ChangeEmailNewEmailVerifiedToken, @@ -105,7 +106,7 @@ def _build_change_email_token( class TestEducationApi: def test_post_activates_education_discount(self, app: Flask): education = MagicMock() - education.activate.return_value = {"message": "success"} + education.activate.return_value = AccountEducationActivation(message="success") request_context = RequestContext( request_id="request-1", trace_id=None, @@ -136,6 +137,52 @@ class TestEducationApi: role="Student", ) + def test_verify_maps_rate_limit_error(self, app: Flask): + education = MagicMock() + education.verify.side_effect = account_errors.EducationRateLimitExceededError + request_context = RequestContext( + request_id="request-1", + trace_id=None, + account_id="account-1", + active_workspace_id="workspace-1", + ) + + with ( + app.test_request_context("/account/education/verify", method="GET"), + patch( + "controllers.console.workspace.account.application_services", + return_value=SimpleNamespace(accounts=SimpleNamespace(education=education)), + ), + ): + api = EducationVerifyApi() + with pytest.raises(EducationVerifyLimitError): + inspect.unwrap(api.get)(api, request_context) + + def test_post_maps_rate_limit_error(self, app: Flask): + education = MagicMock() + education.activate.side_effect = account_errors.EducationRateLimitExceededError + request_context = RequestContext( + request_id="request-1", + trace_id=None, + account_id="account-1", + active_workspace_id="workspace-1", + ) + + with ( + app.test_request_context( + "/account/education", + method="POST", + json={"token": "education-token", "institution": "Dify University", "role": "Student"}, + ), + patch( + "controllers.console.workspace.account.application_services", + return_value=SimpleNamespace(accounts=SimpleNamespace(education=education)), + ), + ): + api = EducationApi() + with pytest.raises(EducationActivateLimitError): + inspect.unwrap(api.post)(api, request_context) + def _change_email_context(account_id: str = "acc") -> RequestContext: return RequestContext( diff --git a/api/tests/unit_tests/controllers/files/test_upload.py b/api/tests/unit_tests/controllers/files/test_upload.py index dec841e35fd..7deb85df876 100644 --- a/api/tests/unit_tests/controllers/files/test_upload.py +++ b/api/tests/unit_tests/controllers/files/test_upload.py @@ -88,10 +88,12 @@ def _tool_file(*, name: str = "test.txt", mimetype: str = "text/plain") -> ToolF class TestPluginUploadFileApi: @patch.object(module, "verify_plugin_file_signature", return_value=True) @patch.object(module, "get_user", return_value=_end_user()) + @patch.object(module, "sign_tool_file", return_value="signed-url") @patch.object(module, "ToolFileManager") def test_success_upload( self, mock_tool_file_manager, + mock_sign_tool_file, mock_get_user, mock_verify_signature, ): @@ -115,8 +117,6 @@ class TestPluginUploadFileApi: mimetype="application/octet-stream", ) - mock_tool_file_manager.sign_file.return_value = "signed-url" - api = module.PluginUploadFileApi() post_fn = unwrap(api.post) @@ -131,7 +131,11 @@ class TestPluginUploadFileApi: assert mock_verify_signature.call_args.kwargs["conversation_id"] == "conversation-1" tool_file_manager_instance.create_file_by_raw.assert_called_once() assert tool_file_manager_instance.create_file_by_raw.call_args.kwargs["conversation_id"] == "conversation-1" - mock_tool_file_manager.sign_file.assert_called_once_with(tool_file_id="file-id", extension=".docx") + mock_sign_tool_file.assert_called_once_with( + tool_file_id="file-id", + extension=".docx", + for_external=True, + ) @patch.object(module, "get_user") @patch.object(module, "ToolFileManager") diff --git a/api/tests/unit_tests/controllers/trigger/test_webhook.py b/api/tests/unit_tests/controllers/trigger/test_webhook.py index 9acf57089fc..7cfd0306ff2 100644 --- a/api/tests/unit_tests/controllers/trigger/test_webhook.py +++ b/api/tests/unit_tests/controllers/trigger/test_webhook.py @@ -5,6 +5,8 @@ import pytest from werkzeug.exceptions import NotFound, RequestEntityTooLarge import controllers.trigger.webhook as module +from models.trigger import WorkflowWebhookTrigger +from models.workflow import Workflow from services.errors.app import QuotaExceededError @@ -22,29 +24,39 @@ def mock_jsonify(): module.jsonify = lambda payload: payload -class DummyWebhookTrigger: - webhook_id = "wh-1" - webhook_url = "http://localhost:5001/triggers/webhook/wh-1" - tenant_id = "tenant-1" - app_id = "app-1" - node_id = "node-1" +def _webhook_trigger() -> WorkflowWebhookTrigger: + return WorkflowWebhookTrigger( + webhook_id="wh-1", + tenant_id="tenant-1", + app_id="app-1", + node_id="node-1", + created_by="account-1", + ) + + +def _workflow() -> Workflow: + return Workflow(id="workflow-1") class TestPrepareWebhookExecution: @patch.object(module.WebhookService, "get_webhook_trigger_and_workflow") @patch.object(module.WebhookService, "extract_and_validate_webhook_data") def test_prepare_success(self, mock_extract, mock_get): - mock_get.return_value = ("trigger", "workflow", "node_config") + webhook_trigger = _webhook_trigger() + workflow = _workflow() + mock_get.return_value = (webhook_trigger, workflow, "node_config") mock_extract.return_value = {"data": "ok"} result = module._prepare_webhook_execution("wh-1") - assert result == ("trigger", "workflow", "node_config", {"data": "ok"}, None) + assert result == (webhook_trigger, workflow, "node_config", {"data": "ok"}, None) @patch.object(module.WebhookService, "get_webhook_trigger_and_workflow") @patch.object(module.WebhookService, "extract_and_validate_webhook_data", side_effect=ValueError("bad")) def test_prepare_validation_error(self, mock_extract, mock_get): - mock_get.return_value = ("trigger", "workflow", "node_config") + webhook_trigger = _webhook_trigger() + workflow = _workflow() + mock_get.return_value = (webhook_trigger, workflow, "node_config") trigger, workflow, node_config, webhook_data, error = module._prepare_webhook_execution("wh-1") @@ -64,7 +76,7 @@ class TestHandleWebhook: mock_extract, mock_get, ): - mock_get.return_value = (DummyWebhookTrigger(), "workflow", "node_config") + mock_get.return_value = (_webhook_trigger(), _workflow(), "node_config") mock_extract.return_value = {"input": "x"} mock_generate.return_value = ({"ok": True}, 200) @@ -77,7 +89,7 @@ class TestHandleWebhook: @patch.object(module.WebhookService, "get_webhook_trigger_and_workflow") @patch.object(module.WebhookService, "extract_and_validate_webhook_data", side_effect=ValueError("bad")) def test_bad_request(self, mock_extract, mock_get): - mock_get.return_value = (DummyWebhookTrigger(), "workflow", "node_config") + mock_get.return_value = (_webhook_trigger(), _workflow(), "node_config") response, status = module.handle_webhook("wh-1") @@ -92,7 +104,7 @@ class TestHandleWebhook: side_effect=QuotaExceededError(feature="trigger", tenant_id="tenant-1", required=1), ) def test_quota_exceeded(self, mock_trigger, mock_extract, mock_get): - mock_get.return_value = (DummyWebhookTrigger(), "workflow", "node_config") + mock_get.return_value = (_webhook_trigger(), _workflow(), "node_config") mock_extract.return_value = {"input": "x"} response, status = module.handle_webhook("wh-1") @@ -111,7 +123,7 @@ class TestHandleWebhook: side_effect=QuotaExceededError(feature="workflow", tenant_id="tenant-1", required=1), ) def test_workflow_quota_exceeded(self, mock_trigger, mock_extract, mock_get): - mock_get.return_value = (DummyWebhookTrigger(), "workflow", "node_config") + mock_get.return_value = (_webhook_trigger(), _workflow(), "node_config") mock_extract.return_value = {"input": "x"} response, status = module.handle_webhook("wh-1") @@ -166,7 +178,8 @@ class TestHandleWebhookDebug: mock_extract, mock_get, ): - mock_get.return_value = (DummyWebhookTrigger(), None, "node_config") + webhook_trigger = _webhook_trigger() + mock_get.return_value = (webhook_trigger, None, "node_config") mock_extract.return_value = {"method": "POST"} response, status = module.handle_webhook_debug("wh-1") @@ -177,7 +190,7 @@ class TestHandleWebhookDebug: "The webhook debug URL only works while the Variable Inspector is listening. " "Use the published webhook URL to execute the workflow in Celery." ) - assert response["execution_url"] == DummyWebhookTrigger.webhook_url + assert response["execution_url"] == webhook_trigger.webhook_url mock_dispatch.assert_called_once() @patch.object(module.WebhookService, "get_webhook_trigger_and_workflow") @@ -193,7 +206,7 @@ class TestHandleWebhookDebug: mock_extract, mock_get, ): - mock_get.return_value = (DummyWebhookTrigger(), None, "node_config") + mock_get.return_value = (_webhook_trigger(), None, "node_config") mock_extract.return_value = {"method": "POST"} mock_generate.return_value = ({"ok": True}, 200) @@ -206,7 +219,7 @@ class TestHandleWebhookDebug: @patch.object(module.WebhookService, "get_webhook_trigger_and_workflow") @patch.object(module.WebhookService, "extract_and_validate_webhook_data", side_effect=ValueError("bad")) def test_debug_bad_request(self, mock_extract, mock_get): - mock_get.return_value = (DummyWebhookTrigger(), None, "node_config") + mock_get.return_value = (_webhook_trigger(), None, "node_config") response, status = module.handle_webhook_debug("wh-1") diff --git a/api/tests/unit_tests/core/app/apps/agent_app/test_runtime_request_builder.py b/api/tests/unit_tests/core/app/apps/agent_app/test_runtime_request_builder.py index 6ebc3bae065..cdf1749f77f 100644 --- a/api/tests/unit_tests/core/app/apps/agent_app/test_runtime_request_builder.py +++ b/api/tests/unit_tests/core/app/apps/agent_app/test_runtime_request_builder.py @@ -29,6 +29,14 @@ from core.app.entities.app_invoke_entities import InvokeFrom, UserFrom from models.agent_config_entities import AgentSoulConfig +@pytest.fixture(autouse=True) +def _no_runtime_agent_skills(monkeypatch: pytest.MonkeyPatch): + monkeypatch.setattr( + "core.app.apps.agent_app.runtime_request_builder.load_runtime_agent_skill_configs", + lambda **_kwargs: [], + ) + + @pytest.fixture(autouse=True) def model_context_window_calls(monkeypatch: pytest.MonkeyPatch) -> list[tuple[object, str, str]]: calls: list[tuple[object, str, str]] = [] diff --git a/api/tests/unit_tests/core/trigger/debug/test_debug_event_selectors.py b/api/tests/unit_tests/core/trigger/debug/test_debug_event_selectors.py index fb7dc528386..616ec72dcaa 100644 --- a/api/tests/unit_tests/core/trigger/debug/test_debug_event_selectors.py +++ b/api/tests/unit_tests/core/trigger/debug/test_debug_event_selectors.py @@ -7,6 +7,7 @@ and select_trigger_debug_events orchestrator. from __future__ import annotations +import json from datetime import datetime from typing import Any from unittest.mock import MagicMock, patch @@ -27,7 +28,9 @@ from core.trigger.debug.event_selectors import ( select_trigger_debug_events, ) from core.trigger.debug.events import PluginTriggerDebugEvent, WebhookDebugEvent -from graphon.enums import BuiltinNodeTypes, NodeType +from graphon.enums import BuiltinNodeTypes, NodeType, WorkflowType +from models.model import App, AppMode +from models.workflow import Workflow from tests.unit_tests.core.trigger.conftest import VALID_PROVIDER_ID @@ -55,6 +58,35 @@ def _plugin_node_config(provider_id: str = VALID_PROVIDER_ID) -> dict: } +def _workflow_with_node(node_type: NodeType | None) -> Workflow: + nodes = [] if node_type is None else [{"id": "n1", "data": {"type": node_type, "title": "Trigger"}}] + return Workflow.new( + tenant_id="t1", + app_id="a1", + type=WorkflowType.WORKFLOW.value, + version=Workflow.VERSION_DRAFT, + graph=json.dumps({"nodes": nodes, "edges": []}), + features="{}", + created_by="u1", + environment_variables=[], + conversation_variables=[], + rag_pipeline_variables=[], + ) + + +def _app() -> App: + return App( + id="a1", + tenant_id="t1", + name="Trigger App", + description="", + mode=AppMode.WORKFLOW, + enable_site=True, + enable_api=True, + max_active_requests=0, + ) + + class TestPluginTriggerDebugEventPoller: @patch("core.trigger.debug.event_selectors.TriggerDebugEventBus") def test_returns_workflow_args_on_success(self, mock_bus): @@ -214,51 +246,41 @@ class TestScheduleTriggerDebugEventPoller: class TestCreateEventPoller: - def _workflow_with_node(self, node_type: NodeType): - wf = MagicMock() - wf.get_node_config_by_id.return_value = {"data": {}} - wf.get_node_type_from_node_config.return_value = node_type - return wf - def test_creates_plugin_poller(self): - wf = self._workflow_with_node(TRIGGER_PLUGIN_NODE_TYPE) + wf = _workflow_with_node(TRIGGER_PLUGIN_NODE_TYPE) poller = create_event_poller(wf, "t1", "u1", "a1", "n1") assert isinstance(poller, PluginTriggerDebugEventPoller) def test_creates_webhook_poller(self): - wf = self._workflow_with_node(TRIGGER_WEBHOOK_NODE_TYPE) + wf = _workflow_with_node(TRIGGER_WEBHOOK_NODE_TYPE) poller = create_event_poller(wf, "t1", "u1", "a1", "n1") assert isinstance(poller, WebhookTriggerDebugEventPoller) def test_creates_schedule_poller(self): - wf = self._workflow_with_node(TRIGGER_SCHEDULE_NODE_TYPE) + wf = _workflow_with_node(TRIGGER_SCHEDULE_NODE_TYPE) poller = create_event_poller(wf, "t1", "u1", "a1", "n1") assert isinstance(poller, ScheduleTriggerDebugEventPoller) def test_raises_for_unknown_type(self): - wf = MagicMock() - wf.get_node_config_by_id.return_value = {"data": {}} - wf.get_node_type_from_node_config.return_value = BuiltinNodeTypes.START + wf = _workflow_with_node(BuiltinNodeTypes.START) with pytest.raises(ValueError): create_event_poller(wf, "t1", "u1", "a1", "n1") def test_raises_when_node_config_missing(self): - wf = MagicMock() - wf.get_node_config_by_id.return_value = None + wf = _workflow_with_node(None) - with pytest.raises(ValueError): + with ( + patch.object(Workflow, "get_node_config_by_id", return_value=None), + pytest.raises(ValueError), + ): create_event_poller(wf, "t1", "u1", "a1", "n1") class TestSelectTriggerDebugEvents: def test_returns_first_non_none_event(self): - wf = MagicMock() - wf.get_node_config_by_id.return_value = {"data": {}} - wf.get_node_type_from_node_config.return_value = TRIGGER_WEBHOOK_NODE_TYPE - app_model = MagicMock() - app_model.tenant_id = "t1" - app_model.id = "a1" + wf = _workflow_with_node(TRIGGER_WEBHOOK_NODE_TYPE) + app_model = _app() with patch.object(WebhookTriggerDebugEventPoller, "poll") as mock_poll: expected = MagicMock() @@ -269,12 +291,8 @@ class TestSelectTriggerDebugEvents: assert result is expected def test_returns_none_when_no_events(self): - wf = MagicMock() - wf.get_node_config_by_id.return_value = {"data": {}} - wf.get_node_type_from_node_config.return_value = TRIGGER_WEBHOOK_NODE_TYPE - app_model = MagicMock() - app_model.tenant_id = "t1" - app_model.id = "a1" + wf = _workflow_with_node(TRIGGER_WEBHOOK_NODE_TYPE) + app_model = _app() with patch.object(WebhookTriggerDebugEventPoller, "poll", return_value=None): result = select_trigger_debug_events(wf, app_model, "u1", ["n1"]) diff --git a/api/tests/unit_tests/core/workflow/nodes/agent_v2/test_runtime_request_builder.py b/api/tests/unit_tests/core/workflow/nodes/agent_v2/test_runtime_request_builder.py index 8f2e07e77a1..2a0d4b0379b 100644 --- a/api/tests/unit_tests/core/workflow/nodes/agent_v2/test_runtime_request_builder.py +++ b/api/tests/unit_tests/core/workflow/nodes/agent_v2/test_runtime_request_builder.py @@ -41,6 +41,21 @@ from models.agent_config_entities import ( ) +@pytest.fixture(autouse=True) +def _no_runtime_agent_skills(monkeypatch: pytest.MonkeyPatch): + monkeypatch.setattr( + "core.workflow.nodes.agent_v2.runtime_request_builder.load_runtime_agent_skill_configs", + lambda **_kwargs: [], + ) + + +class FakeCredentialsProvider: + def fetch(self, provider_name: str, model_name: str) -> dict[str, object]: + assert provider_name == "openai" + assert model_name == "gpt-test" + return {"api_key": "secret-key"} + + @pytest.fixture(autouse=True) def model_context_window_calls(monkeypatch: pytest.MonkeyPatch) -> list[tuple[object, str, str]]: calls: list[tuple[object, str, str]] = [] diff --git a/api/tests/unit_tests/core/workflow/nodes/agent_v2/test_validators.py b/api/tests/unit_tests/core/workflow/nodes/agent_v2/test_validators.py index c59b455c96a..7704308024c 100644 --- a/api/tests/unit_tests/core/workflow/nodes/agent_v2/test_validators.py +++ b/api/tests/unit_tests/core/workflow/nodes/agent_v2/test_validators.py @@ -248,6 +248,24 @@ def test_draft_validation_allows_non_upstream_previous_output_ref(): ) +def test_draft_validation_allows_missing_agent_soul_model(): + node_job = WorkflowNodeJobConfig.model_validate({}) + snapshot = AgentConfigSnapshot( + id="snapshot-1", + tenant_id="tenant-1", + agent_id="agent-1", + version=1, + config_snapshot=AgentSoulConfig(), + ) + session = Mock() + session.scalar.side_effect = [_binding(node_job), _agent(), snapshot] + + WorkflowAgentNodeValidator.validate_draft_workflow( + session=session, + workflow=_workflow(_graph([{"source": "start", "target": "agent-node"}])), + ) + + def test_draft_validation_rejects_incomplete_previous_output_ref(): node_job = WorkflowNodeJobConfig.model_validate({"previous_node_output_refs": [{"selector": ["previous-node"]}]}) session = Mock() diff --git a/api/tests/unit_tests/extensions/logstore/test_aliyun_logstore_pg.py b/api/tests/unit_tests/extensions/logstore/test_aliyun_logstore_pg.py new file mode 100644 index 00000000000..4902400ea91 --- /dev/null +++ b/api/tests/unit_tests/extensions/logstore/test_aliyun_logstore_pg.py @@ -0,0 +1,56 @@ +"""Test that the AliyunLogStorePG port-connectivity logger captures the traceback. + +Cycle 21 (sibling of #41066 / merged in #41068): `logger.debug("...: %s", str(e))` +sites in `extensions/logstore/aliyun_logstore_pg.py` were converted to +`logger.debug("...", exc_info=True)` so the traceback is captured at the +same log level rather than being silently dropped. This test exercises one +of the modified sites — `_check_port_connectivity` — to confirm the fix +shape is correct: the captured log record has a non-empty traceback. +""" + +from __future__ import annotations + +from unittest.mock import patch + +import pytest + +from extensions.logstore.aliyun_logstore_pg import AliyunLogStorePG + + +def test_check_port_connectivity_captures_traceback_on_exception(caplog: pytest.LogCaptureFixture) -> None: + """A socket failure during the port check must produce a log record with exc_info set. + + Before cycle 21: the record was logged as + `Port connectivity check failed for host:port: ` with no + traceback. After cycle 21: the record is logged as + `Port connectivity check failed for host:port` with `exc_info=True`, so + the traceback is part of the log record (and the host/port are still + included via the format args). + """ + store = AliyunLogStorePG( + access_key_id="ak", + access_key_secret="sk", + endpoint="https://example.com", + project_name="p", + ) + + with ( + patch("extensions.logstore.aliyun_logstore_pg.socket.socket", side_effect=OSError("boom")), + caplog.at_level("DEBUG", logger="extensions.logstore.aliyun_logstore_pg"), + ): + result = store._check_port_connectivity("example.invalid", 9999) + + assert result is False + + matching_records = [r for r in caplog.records if r.name == "extensions.logstore.aliyun_logstore_pg"] + assert len(matching_records) == 1 + record = matching_records[0] + assert record.levelname == "DEBUG" + assert record.exc_info is not None + formatted = caplog.text + assert "Port connectivity check failed for example.invalid:9999" in formatted + assert "Traceback (most recent call last)" in formatted + assert "OSError: boom" in formatted + # The exception is captured via the traceback, not interpolated into the + # format string — so the message text is the short form, not the long one. + assert "boom" not in record.getMessage() diff --git a/api/tests/unit_tests/extensions/test_ext_application_services.py b/api/tests/unit_tests/extensions/test_ext_application_services.py index 0e31b3e8ca2..8196d4fa89e 100644 --- a/api/tests/unit_tests/extensions/test_ext_application_services.py +++ b/api/tests/unit_tests/extensions/test_ext_application_services.py @@ -233,6 +233,32 @@ def test_build_application_services_wires_billing_service( sync_partner_tenants_bindings.assert_called_once_with("account-1", "partner-key", "click-1") +def test_build_application_services_wires_education_rate_limiters( + sqlite_session_factory: sessionmaker[Session], +) -> None: + redis = MagicMock(spec=RedisClientWrapper) + with patch("extensions.ext_application_services.RateLimiter") as rate_limiter_type: + ext_application_services.build_application_services( + database_client=sqlite_session_factory, + deployment_edition=DeploymentEdition.COMMUNITY, + initialization_password="", + redis=redis, + ) + + rate_limiter_type.assert_any_call( + prefix="edu_verification_rate_limit", + max_attempts=10, + time_window=60, + redis_client=redis, + ) + rate_limiter_type.assert_any_call( + prefix="edu_activation_rate_limit", + max_attempts=10, + time_window=60, + redis_client=redis, + ) + + def test_build_application_services_wires_account_profile_repository( sqlite_session_factory: sessionmaker[Session], ) -> None: diff --git a/api/tests/unit_tests/models/test_model.py b/api/tests/unit_tests/models/test_model.py index a00c2341bb9..39a84d64d7e 100644 --- a/api/tests/unit_tests/models/test_model.py +++ b/api/tests/unit_tests/models/test_model.py @@ -165,3 +165,55 @@ def test_message_inputs_resolve_file_tenant_with_caller_session(sqlite_session: inputs = message.inputs_with_session(session=sqlite_session) assert inputs["file"] == "tenant-1" + # session.scalar.assert_called_once() # removed: see #40799 conftest note + + +def test_file_url_bare_url_re_signed(): + """#40788: bare tool file URL (no markdown wrapping) must be re-signed. + + Bare URLs are produced by the agent runtime when the model returns a + non-linkified file reference. The previous regex only matched + [text](url) markdown form, so the bare URL kept INTERNAL_FILES_URL. + """ + upload_id = "bare-1" + url = f"/files/{upload_id}/file-preview?timestamp=1&nonce=2&sign=3" + msg = Message(answer=url) # bare, no markdown wrapping + + out = msg.re_sign_file_url_answer + assert f"https://signed.example/{upload_id}" in out + assert url not in out + + +def test_file_url_backticked_url_re_signed(): + """#40788: backticked tool file URL must be re-signed. + + Backticks are used by the runtime to quote file references inline. + The previous regex only matched [text](url), so backticked URLs + stayed on INTERNAL_FILES_URL. + """ + upload_id = "tick-2" + url = f"/files/{upload_id}/file-preview?timestamp=10&nonce=20&sign=30" + msg = Message(answer=f"see `{url}` for details") + + out = msg.re_sign_file_url_answer + assert f"https://signed.example/{upload_id}" in out + assert url not in out + + +def test_file_url_mixed_formats_all_re_signed(): + """#40788: all three URL shapes in the same answer are re-signed. + + Sanity check that the three patterns cooperate — bare, backticked, + and markdown — without double-signing or skipping any. + """ + upload_ids = ["mix-a", "mix-b", "mix-c"] + bare = f"/files/{upload_ids[0]}/file-preview?timestamp=1&nonce=2&sign=3" + tick = f"/files/{upload_ids[1]}/file-preview?timestamp=10&nonce=20&sign=30" + md = f"/files/{upload_ids[2]}/file-preview?timestamp=100&nonce=200&sign=300" + msg = Message(answer=f"raw {bare} ` {tick} ` and [file]({md})") + + out = msg.re_sign_file_url_answer + for uid in upload_ids: + assert f"https://signed.example/{uid}" in out + for url in (bare, tick, md): + assert url not in out diff --git a/api/tests/unit_tests/repositories/test_tag_repository.py b/api/tests/unit_tests/repositories/test_tag_repository.py index 516dc028405..684170c8b33 100644 --- a/api/tests/unit_tests/repositories/test_tag_repository.py +++ b/api/tests/unit_tests/repositories/test_tag_repository.py @@ -4,6 +4,7 @@ from sqlalchemy.orm import Session, sessionmaker from models.enums import TagType from models.model import Tag, TagBinding +from models.skill import Skill from models.snippet import CustomizedSnippet, SnippetType from repositories.tag_repository import TagRepository from services.tag_application_service import ( @@ -35,6 +36,18 @@ def _snippet(snippet_id: str, *, workspace_id: str) -> CustomizedSnippet: return snippet +def _skill(skill_id: str, *, workspace_id: str) -> Skill: + skill = Skill( + tenant_id=workspace_id, + name=f"skill-{skill_id}", + display_name="Skill", + created_by="account-1", + updated_by="account-1", + ) + skill.id = skill_id + return skill + + def test_list_tags_scopes_binding_counts_and_escapes_keyword( sqlite_session_factory: sessionmaker[Session], ) -> None: @@ -127,3 +140,38 @@ def test_binding_mutation_rejects_missing_target(sqlite_session_factory: session "account-1", TagBindingInput(("tag-1",), "missing", "snippet"), ) + + +def test_binding_mutations_validate_skill_target( + sqlite_session_factory: sessionmaker[Session], +) -> None: + with sqlite_session_factory.begin() as session: + session.add_all( + [ + _skill("skill-1", workspace_id="workspace-1"), + _tag("tag-1", workspace_id="workspace-1", tag_type=TagType.SKILL, name="Skill"), + _tag("tag-2", workspace_id="workspace-1", tag_type=TagType.APP, name="Wrong type"), + _tag("tag-3", workspace_id="workspace-2", tag_type=TagType.SKILL, name="Wrong workspace"), + ] + ) + + repository = TagRepository(sqlite_session_factory) + binding = TagBindingInput(("tag-1", "tag-2", "tag-3"), "skill-1", "skill") + repository.create_bindings("workspace-1", "account-1", binding) + + with sqlite_session_factory() as session: + bindings = session.scalars(select(TagBinding).where(TagBinding.target_id == "skill-1")).all() + assert len(bindings) == 1 + assert bindings[0].tag_id == "tag-1" + assert bindings[0].tenant_id == "workspace-1" + + repository.delete_bindings("workspace-1", binding) + with sqlite_session_factory() as session: + assert session.scalars(select(TagBinding).where(TagBinding.target_id == "skill-1")).all() == [] + + with pytest.raises(TagBindingTargetNotFoundError, match="Skill not found"): + repository.create_bindings( + "workspace-1", + "account-1", + TagBindingInput(("tag-1",), "missing", "skill"), + ) diff --git a/api/tests/unit_tests/services/agent/test_agent_dsl_service.py b/api/tests/unit_tests/services/agent/test_agent_dsl_service.py index 545db0a93b3..3cf2bcd6372 100644 --- a/api/tests/unit_tests/services/agent/test_agent_dsl_service.py +++ b/api/tests/unit_tests/services/agent/test_agent_dsl_service.py @@ -246,6 +246,7 @@ def test_export_agent_app_uses_draft_or_active_snapshot(use_draft: bool) -> None draft = SimpleNamespace(config_snapshot_dict=AgentSoulConfig(config_note="draft").model_dump(mode="json")) session = Mock() session.scalar.side_effect = [agent, draft if use_draft else None] + session.execute.return_value = [] service = AgentDslService(session) require_snapshot = Mock(return_value=_snapshot(soul=AgentSoulConfig(config_note="snapshot"))) service._require_snapshot = require_snapshot @@ -271,6 +272,7 @@ def test_export_workflow_packages_deduplicates_shared_agent() -> None: ] session = Mock() session.scalars.return_value.all.return_value = bindings + session.execute.return_value = [] service = AgentDslService(session) service._require_agent = Mock(return_value=_agent()) service._require_snapshot = Mock(return_value=_snapshot()) diff --git a/api/tests/unit_tests/services/agent/test_agent_services.py b/api/tests/unit_tests/services/agent/test_agent_services.py index 5e229d5b6d1..b622cda3203 100644 --- a/api/tests/unit_tests/services/agent/test_agent_services.py +++ b/api/tests/unit_tests/services/agent/test_agent_services.py @@ -3481,7 +3481,7 @@ def test_composer_current_version_and_error_paths(monkeypatch: pytest.MonkeyPatc monkeypatch.setattr( AgentComposerService, "_require_agent", - lambda **kwargs: SimpleNamespace(updated_by=None, active_config_is_published=False), + lambda **kwargs: SimpleNamespace(id="agent-1", updated_by=None, active_config_is_published=False), ) result = AgentComposerService._save_to_current_version( session=session, @@ -5159,7 +5159,12 @@ class TestAgentAppBackingAgent: use_icon_as_answer_icon=False, tracing=None, ) - source_agent = SimpleNamespace(id="source-agent", role="Analyst") + source_agent = SimpleNamespace( + id="source-agent", + role="Analyst", + active_config_snapshot_id="source-snapshot", + active_config_is_published=True, + ) target_app = SimpleNamespace(id="target-app") session = sqlite_session service = AgentRosterService(session) @@ -5225,7 +5230,12 @@ class TestAgentAppBackingAgent: use_icon_as_answer_icon=False, tracing=None, ) - source_agent = SimpleNamespace(id="source-agent", role="Analyst") + source_agent = SimpleNamespace( + id="source-agent", + role="Analyst", + active_config_snapshot_id="source-snapshot", + active_config_is_published=True, + ) target_app = SimpleNamespace(id="target-app") session = sqlite_session service = AgentRosterService(session) diff --git a/api/tests/unit_tests/services/test_account_billing_adapters.py b/api/tests/unit_tests/services/test_account_billing_adapters.py index 9f6e1f4bd7c..f2e76c60161 100644 --- a/api/tests/unit_tests/services/test_account_billing_adapters.py +++ b/api/tests/unit_tests/services/test_account_billing_adapters.py @@ -2,7 +2,11 @@ from datetime import UTC, datetime from unittest.mock import patch from services.account_billing_adapters import BillingAccountEducationGateway -from services.entities.account_entities import AccountEducationAutocomplete, AccountEducationStatus +from services.entities.account_entities import ( + AccountEducationActivation, + AccountEducationAutocomplete, + AccountEducationStatus, +) def test_education_gateway_normalizes_billing_status_timestamp() -> None: @@ -36,19 +40,20 @@ def test_education_gateway_activates_with_primitive_account_context() -> None: ) as activate: result = gateway.activate( account_id="account-1", - email="student@example.edu", tenant_id="workspace-1", token="education-token", institution="Dify University", role="Student", ) - assert result == {"message": "success"} - account = activate.call_args.args[0] - assert account.id == "account-1" - assert account.email == "student@example.edu" - assert account.current_tenant_id == "workspace-1" - assert activate.call_args.args[1:] == ("education-token", "Dify University", "Student") + assert result == AccountEducationActivation(message="success") + activate.assert_called_once_with( + account_id="account-1", + tenant_id="workspace-1", + token="education-token", + institution="Dify University", + role="Student", + ) def test_education_gateway_normalizes_autocomplete_defaults() -> None: diff --git a/api/tests/unit_tests/services/test_account_education_service.py b/api/tests/unit_tests/services/test_account_education_service.py index 5c77ca12864..5f413eeee62 100644 --- a/api/tests/unit_tests/services/test_account_education_service.py +++ b/api/tests/unit_tests/services/test_account_education_service.py @@ -3,10 +3,18 @@ from __future__ import annotations from datetime import UTC, datetime from unittest.mock import Mock +import pytest + from machinery.context import RequestContext -from services.account_education_service import AccountEducationGateway, AccountEducationService +from services.account_education_service import ( + AccountEducationGateway, + AccountEducationRateLimiter, + AccountEducationService, +) +from services.account_errors import EducationRateLimitExceededError from services.account_ports import AccountRepository from services.entities.account_entities import ( + AccountEducationActivation, AccountEducationAutocomplete, AccountEducationStatus, AccountEducationVerification, @@ -41,18 +49,40 @@ def _account() -> AccountSnapshot: ) +def _rate_limiter() -> Mock: + rate_limiter = Mock(spec=AccountEducationRateLimiter) + rate_limiter.is_rate_limited.return_value = False + return rate_limiter + + def test_verify_reads_account_before_billing_gateway_call() -> None: accounts = Mock(spec=AccountRepository) accounts.get.return_value = _account() education = Mock(spec=AccountEducationGateway) - education.verify.return_value = AccountEducationVerification(token="education-token") - service = AccountEducationService(accounts=accounts, education=education) + verification_rate_limiter = _rate_limiter() + activation_rate_limiter = _rate_limiter() + events: list[str] = [] + verification_rate_limiter.is_rate_limited.side_effect = lambda _key: events.append("check") or False + verification_rate_limiter.increment_rate_limit.side_effect = lambda _key: events.append("increment") + education.verify.side_effect = lambda **_kwargs: ( + events.append("verify") or AccountEducationVerification(token="education-token") + ) + service = AccountEducationService( + accounts=accounts, + education=education, + verification_rate_limiter=verification_rate_limiter, + activation_rate_limiter=activation_rate_limiter, + ) result = service.verify(_context()) assert result == AccountEducationVerification(token="education-token") + assert events == ["check", "increment", "verify"] accounts.get.assert_called_once_with("account-1") - education.verify.assert_called_once_with(account_id="account-1", email="student@example.edu") + verification_rate_limiter.is_rate_limited.assert_called_once_with("student@example.edu") + verification_rate_limiter.increment_rate_limit.assert_called_once_with("student@example.edu") + education.verify.assert_called_once_with(account_id="account-1") + activation_rate_limiter.is_rate_limited.assert_not_called() def test_status_and_autocomplete_delegate_framework_neutral_contracts() -> None: @@ -70,6 +100,8 @@ def test_status_and_autocomplete_delegate_framework_neutral_contracts() -> None: service = AccountEducationService( accounts=accounts, education=education, + verification_rate_limiter=_rate_limiter(), + activation_rate_limiter=_rate_limiter(), ) assert service.status(_context()) == status @@ -82,10 +114,18 @@ def test_activate_delegates_account_and_workspace_context() -> None: accounts = Mock(spec=AccountRepository) accounts.get.return_value = _account() education = Mock(spec=AccountEducationGateway) - education.activate.return_value = {"message": "success"} + activation = AccountEducationActivation(message="success") + verification_rate_limiter = _rate_limiter() + activation_rate_limiter = _rate_limiter() + events: list[str] = [] + activation_rate_limiter.is_rate_limited.side_effect = lambda _key: events.append("check") or False + activation_rate_limiter.increment_rate_limit.side_effect = lambda _key: events.append("increment") + education.activate.side_effect = lambda **_kwargs: events.append("activate") or activation service = AccountEducationService( accounts=accounts, education=education, + verification_rate_limiter=verification_rate_limiter, + activation_rate_limiter=activation_rate_limiter, ) result = service.activate( @@ -95,12 +135,60 @@ def test_activate_delegates_account_and_workspace_context() -> None: role="Student", ) - assert result == {"message": "success"} + assert result == activation + assert events == ["check", "increment", "activate"] + activation_rate_limiter.is_rate_limited.assert_called_once_with("student@example.edu") + activation_rate_limiter.increment_rate_limit.assert_called_once_with("student@example.edu") + verification_rate_limiter.is_rate_limited.assert_not_called() education.activate.assert_called_once_with( account_id="account-1", - email="student@example.edu", tenant_id="workspace-1", token="education-token", institution="Dify University", role="Student", ) + + +def test_verify_rejects_rate_limited_request() -> None: + accounts = Mock(spec=AccountRepository) + accounts.get.return_value = _account() + education = Mock(spec=AccountEducationGateway) + verification_rate_limiter = _rate_limiter() + verification_rate_limiter.is_rate_limited.return_value = True + service = AccountEducationService( + accounts=accounts, + education=education, + verification_rate_limiter=verification_rate_limiter, + activation_rate_limiter=_rate_limiter(), + ) + + with pytest.raises(EducationRateLimitExceededError): + service.verify(_context()) + + verification_rate_limiter.increment_rate_limit.assert_not_called() + education.verify.assert_not_called() + + +def test_activate_rejects_rate_limited_request() -> None: + accounts = Mock(spec=AccountRepository) + accounts.get.return_value = _account() + education = Mock(spec=AccountEducationGateway) + activation_rate_limiter = _rate_limiter() + activation_rate_limiter.is_rate_limited.return_value = True + service = AccountEducationService( + accounts=accounts, + education=education, + verification_rate_limiter=_rate_limiter(), + activation_rate_limiter=activation_rate_limiter, + ) + + with pytest.raises(EducationRateLimitExceededError): + service.activate( + _context(), + token="education-token", + institution="Dify University", + role="Student", + ) + + activation_rate_limiter.increment_rate_limit.assert_not_called() + education.activate.assert_not_called() diff --git a/api/tests/unit_tests/services/test_billing_service.py b/api/tests/unit_tests/services/test_billing_service.py index 7dfe54f918c..47b5c62ebcf 100644 --- a/api/tests/unit_tests/services/test_billing_service.py +++ b/api/tests/unit_tests/services/test_billing_service.py @@ -697,7 +697,7 @@ class TestBillingServiceUsageCalculation: """Unit tests for usage calculation and credit management. Tests cover: - - Feature plan usage information retrieval + - Quota information retrieval - Credit addition (positive delta) - Credit consumption (negative delta) - Usage refunds @@ -710,20 +710,6 @@ class TestBillingServiceUsageCalculation: with patch.object(BillingService, "_send_request") as mock: yield mock - def test_get_tenant_feature_plan_usage_info(self, mock_send_request): - """Test retrieval of tenant feature plan usage information (legacy endpoint).""" - # Arrange - tenant_id = "tenant-123" - expected_response = {"features": {"trigger": {"used": 50, "limit": 100}, "workflow": {"used": 20, "limit": 50}}} - mock_send_request.return_value = expected_response - - # Act - result = BillingService.get_tenant_feature_plan_usage_info(tenant_id) - - # Assert - assert result == expected_response - mock_send_request.assert_called_once_with("GET", "/tenant-feature-usage/info", params={"tenant_id": tenant_id}) - def test_get_quota_info(self): """Test retrieval of quota info from new endpoint.""" # Arrange @@ -1043,15 +1029,7 @@ class TestBillingServiceQuotaOperations: class TestBillingServiceRateLimitEnforcement: - """Unit tests for rate limit enforcement mechanisms. - - Tests cover: - - Compliance download rate limiting (4 requests per 60 seconds) - - Education verification rate limiting (10 requests per 60 seconds) - - Education activation rate limiting (10 requests per 60 seconds) - - Rate limit increment after successful operations - - Proper exception raising when limits are exceeded - """ + """Unit tests for compliance download rate-limit enforcement.""" @pytest.fixture def mock_send_request(self): @@ -1121,109 +1099,6 @@ class TestBillingServiceRateLimitEnforcement: mock_is_limited.assert_called_once_with(f"{account_id}:{tenant_id}") mock_send_request.assert_not_called() - def test_education_verify_rate_limit_not_exceeded(self, mock_send_request): - """Test education verification when rate limit is not exceeded.""" - # Arrange - account_id = "account-123" - account_email = "student@university.edu" - expected_response = {"verified": True, "institution": "University"} - - # Mock the rate limiter to return False (not limited) - with ( - patch.object( - BillingService.EducationIdentity.verification_rate_limit, "is_rate_limited", return_value=False - ) as mock_is_limited, - patch.object( - BillingService.EducationIdentity.verification_rate_limit, "increment_rate_limit" - ) as mock_increment, - ): - mock_send_request.return_value = expected_response - - # Act - result = BillingService.EducationIdentity.verify(account_id, account_email) - - # Assert - assert result == expected_response - mock_is_limited.assert_called_once_with(account_email) - mock_send_request.assert_called_once_with("GET", "/education/verify", params={"account_id": account_id}) - mock_increment.assert_called_once_with(account_email) - - def test_education_verify_rate_limit_exceeded(self, mock_send_request): - """Test education verification when rate limit is exceeded.""" - # Arrange - account_id = "account-123" - account_email = "student@university.edu" - - # Import the error class to properly catch it - from controllers.console.error import EducationVerifyLimitError - - # Mock the rate limiter to return True (rate limited) - with patch.object( - BillingService.EducationIdentity.verification_rate_limit, "is_rate_limited", return_value=True - ) as mock_is_limited: - # Act & Assert - with pytest.raises(EducationVerifyLimitError): - BillingService.EducationIdentity.verify(account_id, account_email) - - mock_is_limited.assert_called_once_with(account_email) - mock_send_request.assert_not_called() - - def test_education_activate_rate_limit_not_exceeded(self, mock_send_request): - """Test education activation when rate limit is not exceeded.""" - # Arrange - account = _account(email="student@university.edu") - token = "verification-token" - institution = "MIT" - role = "student" - expected_response = {"result": "success", "activated": True} - - # Mock the rate limiter to return False (not limited) - with ( - patch.object( - BillingService.EducationIdentity.activation_rate_limit, "is_rate_limited", return_value=False - ) as mock_is_limited, - patch.object( - BillingService.EducationIdentity.activation_rate_limit, "increment_rate_limit" - ) as mock_increment, - ): - mock_send_request.return_value = expected_response - - # Act - result = BillingService.EducationIdentity.activate(account, token, institution, role) - - # Assert - assert result == expected_response - mock_is_limited.assert_called_once_with(account.email) - mock_send_request.assert_called_once_with( - "POST", - "/education/", - json={"institution": institution, "token": token, "role": role}, - params={"account_id": account.id, "curr_tenant_id": account.current_tenant_id}, - ) - mock_increment.assert_called_once_with(account.email) - - def test_education_activate_rate_limit_exceeded(self, mock_send_request): - """Test education activation when rate limit is exceeded.""" - # Arrange - account = _account(email="student@university.edu") - token = "verification-token" - institution = "MIT" - role = "student" - - # Import the error class to properly catch it - from controllers.console.error import EducationActivateLimitError - - # Mock the rate limiter to return True (rate limited) - with patch.object( - BillingService.EducationIdentity.activation_rate_limit, "is_rate_limited", return_value=True - ) as mock_is_limited: - # Act & Assert - with pytest.raises(EducationActivateLimitError): - BillingService.EducationIdentity.activate(account, token, institution, role) - - mock_is_limited.assert_called_once_with(account.email) - mock_send_request.assert_not_called() - class TestBillingServiceEducationIdentity: """Unit tests for education identity verification and management. @@ -1240,11 +1115,46 @@ class TestBillingServiceEducationIdentity: with patch.object(BillingService, "_send_request") as mock: yield mock + def test_education_verify(self, mock_send_request): + account_id = "account-123" + expected_response = {"token": "education-token"} + mock_send_request.return_value = expected_response + + result = BillingService.EducationIdentity.verify(account_id) + + assert result == expected_response + mock_send_request.assert_called_once_with("GET", "/education/verify", params={"account_id": account_id}) + + def test_education_activate(self, mock_send_request): + expected_response = {"message": "success"} + mock_send_request.return_value = expected_response + + result = BillingService.EducationIdentity.activate( + account_id="account-123", + tenant_id="tenant-456", + token="verification-token", + institution="MIT", + role="student", + ) + + assert result == expected_response + mock_send_request.assert_called_once_with( + "POST", + "/education/", + json={"institution": "MIT", "token": "verification-token", "role": "student"}, + params={"account_id": "account-123", "curr_tenant_id": "tenant-456"}, + ) + def test_education_status(self, mock_send_request): """Test checking education verification status.""" # Arrange account_id = "account-123" - expected_response = {"verified": True, "institution": "MIT", "role": "student"} + expected_response = { + "result": True, + "is_student": True, + "expire_at": "2027-01-01T00:00:00Z", + "allow_refresh": False, + } mock_send_request.return_value = expected_response # Act @@ -1261,10 +1171,9 @@ class TestBillingServiceEducationIdentity: page = 0 limit = 20 expected_response = { - "institutions": [ - {"name": "Massachusetts Institute of Technology", "domain": "mit.edu"}, - {"name": "University of Massachusetts", "domain": "umass.edu"}, - ] + "data": ["Massachusetts Institute of Technology", "University of Massachusetts"], + "curr_page": 0, + "has_next": False, } mock_send_request.return_value = expected_response @@ -1281,7 +1190,7 @@ class TestBillingServiceEducationIdentity: """Test education institution autocomplete with default parameters.""" # Arrange keywords = "Stanford" - expected_response = {"institutions": [{"name": "Stanford University", "domain": "stanford.edu"}]} + expected_response = {"data": ["Stanford University"], "curr_page": 0, "has_next": False} mock_send_request.return_value = expected_response # Act @@ -1315,7 +1224,7 @@ class TestBillingServiceAccountManagement: """Test account deletion.""" # Arrange account_id = "account-123" - expected_response = {"result": "success", "deleted": True} + expected_response = {"message": "Account deleted successfully."} mock_send_request.return_value = expected_response # Act @@ -1377,7 +1286,7 @@ class TestBillingServiceAccountManagement: # Arrange email = "user@example.com" feedback = "Service was too expensive" - expected_response = {"result": "success"} + expected_response = {"message": "Reason added successfully."} mock_send_request.return_value = expected_response # Act @@ -1437,7 +1346,7 @@ class TestBillingServicePartnerIntegration: account_id = "account-123" partner_key = "partner-xyz" click_id = "click-789" - expected_response = {"result": "success", "synced": True} + expected_response = {"message": "Successfully synced partner tenants"} mock_send_request.return_value = expected_response # Act @@ -1933,49 +1842,6 @@ class TestBillingServiceIntegrationScenarios: assert mock_is_limited.call_count == 3 assert mock_increment.call_count == 3 - def test_education_verification_and_activation_flow(self, mock_send_request): - """Test complete education verification and activation flow.""" - # Arrange - account = _account(email="student@mit.edu") - - # Step 1: Search for institution - with ( - patch.object( - BillingService.EducationIdentity.verification_rate_limit, "is_rate_limited", return_value=False - ), - patch.object(BillingService.EducationIdentity.verification_rate_limit, "increment_rate_limit"), - ): - mock_send_request.return_value = { - "institutions": [{"name": "Massachusetts Institute of Technology", "domain": "mit.edu"}] - } - institutions = BillingService.EducationIdentity.autocomplete("MIT") - assert len(institutions["institutions"]) > 0 - - # Step 2: Verify email - with ( - patch.object( - BillingService.EducationIdentity.verification_rate_limit, "is_rate_limited", return_value=False - ), - patch.object(BillingService.EducationIdentity.verification_rate_limit, "increment_rate_limit"), - ): - mock_send_request.return_value = {"verified": True, "institution": "MIT"} - verify_result = BillingService.EducationIdentity.verify(account.id, account.email) - assert verify_result["verified"] is True - - # Step 3: Check status - mock_send_request.return_value = {"verified": True, "institution": "MIT", "role": "student"} - status = BillingService.EducationIdentity.status(account.id) - assert status["verified"] is True - - # Step 4: Activate education benefits - with ( - patch.object(BillingService.EducationIdentity.activation_rate_limit, "is_rate_limited", return_value=False), - patch.object(BillingService.EducationIdentity.activation_rate_limit, "increment_rate_limit"), - ): - mock_send_request.return_value = {"result": "success", "activated": True} - activate_result = BillingService.EducationIdentity.activate(account, "token-123", "MIT", "student") - assert activate_result["activated"] is True - class TestBillingServiceSubscriptionInfoDataType: """Unit tests for data type coercion in BillingService.get_info diff --git a/api/tests/unit_tests/services/test_feature_query_service.py b/api/tests/unit_tests/services/test_feature_query_service.py index febbfbc6af3..9e99acd1c1f 100644 --- a/api/tests/unit_tests/services/test_feature_query_service.py +++ b/api/tests/unit_tests/services/test_feature_query_service.py @@ -28,13 +28,16 @@ def test_workspace_queries_use_workspace_from_request_context() -> None: vector_space = VectorSpaceLimitationModel(size=1, limit=5) gateway.get_workspace_features.return_value = features gateway.get_vector_space.return_value = vector_space - service = FeatureQueryService(features=gateway, trial_models=(), app_dsl_version="0.7.0") + gateway.get_trial_models.return_value = ["langgenius/openai/openai"] + service = FeatureQueryService(features=gateway, app_dsl_version="0.7.0") context = _request_context() assert service.get_features(context) is features assert service.get_vector_space(context) is vector_space + assert service.get_trial_models(context) == ["langgenius/openai/openai"] gateway.get_workspace_features.assert_called_once_with("workspace_123") gateway.get_vector_space.assert_called_once_with("workspace_123") + gateway.get_trial_models.assert_called_once_with("workspace_123") def test_deployment_queries_delegate_without_request_context() -> None: @@ -45,11 +48,9 @@ def test_deployment_queries_delegate_without_request_context() -> None: gateway.get_license.return_value = license_model service = FeatureQueryService( features=gateway, - trial_models=["langgenius/openai/openai"], app_dsl_version="0.6.0", ) - assert service.get_trial_models() == ["langgenius/openai/openai"] assert service.get_app_dsl_version() == "0.6.0" assert service.get_system_features() is system_features assert service.get_license() is license_model @@ -57,7 +58,7 @@ def test_deployment_queries_delegate_without_request_context() -> None: def test_workspace_queries_require_active_workspace() -> None: gateway = create_autospec(FeatureQueryGateway, instance=True, spec_set=True) - service = FeatureQueryService(features=gateway, trial_models=(), app_dsl_version="0.7.0") + service = FeatureQueryService(features=gateway, app_dsl_version="0.7.0") with pytest.raises(RuntimeError, match="did not resolve an active workspace"): service.get_features(_request_context(active_workspace_id=None)) diff --git a/api/tests/unit_tests/services/test_feature_service_gateway.py b/api/tests/unit_tests/services/test_feature_service_gateway.py index 253df785743..8dd981e11f8 100644 --- a/api/tests/unit_tests/services/test_feature_service_gateway.py +++ b/api/tests/unit_tests/services/test_feature_service_gateway.py @@ -24,3 +24,13 @@ def test_workspace_features_exclude_independently_queried_vector_space(mocker: M assert result is features get_features.assert_called_once_with("workspace_123", exclude_vector_space=True) + + +def test_trial_models_delegate_to_workspace_aware_feature_service(mocker: MockerFixture) -> None: + trial_models = ["langgenius/openai/openai"] + get_trial_models = mocker.patch.object(FeatureService, "get_trial_models", return_value=trial_models) + + result = FeatureServiceGateway().get_trial_models("workspace_123") + + assert result == trial_models + get_trial_models.assert_called_once_with("workspace_123") diff --git a/api/tests/unit_tests/services/test_feature_service_trial_models.py b/api/tests/unit_tests/services/test_feature_service_trial_models.py index 599623aaba0..6c5c2c556da 100644 --- a/api/tests/unit_tests/services/test_feature_service_trial_models.py +++ b/api/tests/unit_tests/services/test_feature_service_trial_models.py @@ -1,6 +1,8 @@ +from unittest.mock import Mock + import pytest -from enums import HostedTrialProvider +from enums import CloudPlan, DeploymentEdition, HostedTrialProvider from services import feature_service as feature_service_module from services.feature_service import FeatureService @@ -11,7 +13,7 @@ def test_get_system_features_excludes_trial_models(): assert "trial_models" not in result -def test_get_trial_models_returns_providers_enabled_for_paid_and_trial(monkeypatch: pytest.MonkeyPatch): +def test_get_trial_models_returns_providers_with_paid_or_trial_enabled(monkeypatch: pytest.MonkeyPatch): for provider in HostedTrialProvider: monkeypatch.setattr( feature_service_module.dify_config, @@ -28,11 +30,50 @@ def test_get_trial_models_returns_providers_enabled_for_paid_and_trial(monkeypat monkeypatch.setattr(feature_service_module.dify_config, "HOSTED_OPENAI_PAID_ENABLED", True, raising=False) monkeypatch.setattr(feature_service_module.dify_config, "HOSTED_OPENAI_TRIAL_ENABLED", True, raising=False) - monkeypatch.setattr(feature_service_module.dify_config, "HOSTED_ANTHROPIC_PAID_ENABLED", True, raising=False) - monkeypatch.setattr(feature_service_module.dify_config, "HOSTED_ANTHROPIC_TRIAL_ENABLED", False, raising=False) - monkeypatch.setattr(feature_service_module.dify_config, "HOSTED_GEMINI_PAID_ENABLED", False, raising=False) - monkeypatch.setattr(feature_service_module.dify_config, "HOSTED_GEMINI_TRIAL_ENABLED", True, raising=False) + monkeypatch.setattr(feature_service_module.dify_config, "HOSTED_XAI_PAID_ENABLED", True, raising=False) + monkeypatch.setattr(feature_service_module.dify_config, "DEPLOYMENT_EDITION", DeploymentEdition.COMMUNITY) - result = FeatureService.get_trial_models() + result = FeatureService.get_trial_models("tenant_1") - assert result == [HostedTrialProvider.OPENAI.value] + assert result == [ + HostedTrialProvider.OPENAI.value, + HostedTrialProvider.X.value, + ] + + +@pytest.mark.parametrize( + ("plan", "expected"), + [ + (CloudPlan.SANDBOX, [HostedTrialProvider.OPENAI.value]), + (CloudPlan.PROFESSIONAL, [HostedTrialProvider.OPENAI.value, HostedTrialProvider.X.value]), + ], +) +def test_get_trial_models_filters_providers_by_workspace_plan( + monkeypatch: pytest.MonkeyPatch, + plan: CloudPlan, + expected: list[str], +) -> None: + for provider in HostedTrialProvider: + monkeypatch.setattr( + feature_service_module.dify_config, + f"HOSTED_{provider.config_key}_PAID_ENABLED", + False, + raising=False, + ) + monkeypatch.setattr( + feature_service_module.dify_config, + f"HOSTED_{provider.config_key}_TRIAL_ENABLED", + False, + raising=False, + ) + + monkeypatch.setattr(feature_service_module.dify_config, "DEPLOYMENT_EDITION", DeploymentEdition.CLOUD) + monkeypatch.setattr(feature_service_module.dify_config, "HOSTED_OPENAI_TRIAL_ENABLED", True, raising=False) + monkeypatch.setattr(feature_service_module.dify_config, "HOSTED_XAI_PAID_ENABLED", True, raising=False) + get_workspace_plan = Mock(return_value=plan) + monkeypatch.setattr(feature_service_module.FeatureService, "get_workspace_plan", get_workspace_plan) + + result = FeatureService.get_trial_models("tenant_1") + + assert result == expected + get_workspace_plan.assert_called_once_with("tenant_1") diff --git a/api/tests/unit_tests/services/test_tag_application_service.py b/api/tests/unit_tests/services/test_tag_application_service.py index 59921f98f4c..a97d8723f82 100644 --- a/api/tests/unit_tests/services/test_tag_application_service.py +++ b/api/tests/unit_tests/services/test_tag_application_service.py @@ -7,6 +7,7 @@ from services.tag_application_service import ( CreateTagInput, TagApplicationService, TagBindingInput, + TagBindingTargetNotFoundError, TagSummary, UpdateTagInput, ) @@ -47,3 +48,7 @@ def test_service_rejects_context_without_active_workspace() -> None: with pytest.raises(RuntimeError, match="active workspace"): service.list_tags(context, "app") + + +def test_skill_binding_target_error_message() -> None: + assert str(TagBindingTargetNotFoundError("skill")) == "Skill not found" diff --git a/api/tests/unit_tests/services/test_webhook_service.py b/api/tests/unit_tests/services/test_webhook_service.py index c4505f0b77a..f52541d3506 100644 --- a/api/tests/unit_tests/services/test_webhook_service.py +++ b/api/tests/unit_tests/services/test_webhook_service.py @@ -1,4 +1,5 @@ import logging +from datetime import UTC, datetime from io import BytesIO from types import SimpleNamespace from unittest.mock import MagicMock, patch @@ -9,11 +10,216 @@ from sqlalchemy.engine import Engine from sqlalchemy.orm import Session from werkzeug.datastructures import FileStorage +from graphon.enums import WorkflowType +from models.enums import AppTriggerStatus, AppTriggerType, EndUserType +from models.model import App, AppMode, EndUser +from models.tools import ToolFile +from models.trigger import AppTrigger, WorkflowWebhookTrigger +from models.workflow import Workflow from services.errors.app import QuotaExceededError from services.trigger import webhook_service as webhook_service_module from services.trigger.webhook_service import WebhookService +def _webhook_trigger( + *, + webhook_id: str = "webhook-123", + tenant_id: str = "tenant-123", + app_id: str = "app-123", + node_id: str = "node-123", + created_by: str = "account-123", +) -> WorkflowWebhookTrigger: + return WorkflowWebhookTrigger( + webhook_id=webhook_id, + tenant_id=tenant_id, + app_id=app_id, + node_id=node_id, + created_by=created_by, + ) + + +def _tool_file() -> ToolFile: + tool_file = ToolFile( + user_id="user-123", + tenant_id="test_tenant", + conversation_id=None, + file_key="webhook/test.txt", + mimetype="text/plain", + name="test.txt", + size=7, + ) + tool_file.id = "test_file_id" + return tool_file + + +def _workflow( + *, + workflow_id: str = "workflow-123", + tenant_id: str = "tenant-123", + app_id: str = "app-123", + version: str = Workflow.VERSION_DRAFT, +) -> Workflow: + workflow = Workflow.new( + tenant_id=tenant_id, + app_id=app_id, + type=WorkflowType.WORKFLOW.value, + version=version, + graph='{"nodes": [], "edges": []}', + features="{}", + created_by="account-123", + environment_variables=[], + conversation_variables=[], + rag_pipeline_variables=[], + ) + workflow.id = workflow_id + return workflow + + +def _app(*, tenant_id: str = "tenant-123", app_id: str = "app-123") -> App: + return App( + id=app_id, + tenant_id=tenant_id, + name="Webhook App", + description="", + mode=AppMode.WORKFLOW, + enable_site=True, + enable_api=True, + max_active_requests=0, + ) + + +def _app_trigger(*, status: AppTriggerStatus = AppTriggerStatus.ENABLED) -> AppTrigger: + return AppTrigger( + tenant_id="tenant-123", + app_id="app-123", + node_id="node-123", + trigger_type=AppTriggerType.TRIGGER_WEBHOOK, + title="Webhook", + status=status, + ) + + +def _end_user() -> EndUser: + return EndUser( + id="end-user-123", + tenant_id="tenant-123", + app_id="app-123", + type=EndUserType.TRIGGER, + session_id="webhook-session", + ) + + +class TestWebhookServiceLookup: + def test_debug_lookup_scopes_draft_workflow_to_trigger_owner( + self, + sqlite_session: Session, + sqlite_engine: Engine, + monkeypatch: pytest.MonkeyPatch, + ) -> None: + target_workflow = _workflow() + target_workflow.created_at = datetime(2025, 1, 1, tzinfo=UTC).replace(tzinfo=None) + tenant_decoy = _workflow( + workflow_id="workflow-decoy", + tenant_id="tenant-other", + app_id="app-123", + ) + tenant_decoy.created_at = datetime(2026, 1, 1, tzinfo=UTC).replace(tzinfo=None) + sqlite_session.add_all([_webhook_trigger(), target_workflow, tenant_decoy]) + sqlite_session.commit() + monkeypatch.setattr(webhook_service_module, "db", SimpleNamespace(engine=sqlite_engine)) + node_config = {"id": "node-123", "data": {}} + + with patch.object(Workflow, "get_node_config_by_id", autospec=True, return_value=node_config) as get_node: + webhook_trigger, workflow, result_node_config = WebhookService.get_webhook_trigger_and_workflow( + "webhook-123", is_debug=True + ) + + assert webhook_trigger.tenant_id == "tenant-123" + assert workflow.id == target_workflow.id + assert result_node_config is node_config + get_node.assert_called_once_with(workflow, "node-123") + + def test_published_lookup_uses_persisted_owner_chain( + self, + sqlite_session: Session, + sqlite_engine: Engine, + monkeypatch: pytest.MonkeyPatch, + ) -> None: + sqlite_session.add_all([_webhook_trigger(), _app_trigger(), _app()]) + sqlite_session.commit() + monkeypatch.setattr(webhook_service_module, "db", SimpleNamespace(engine=sqlite_engine)) + published_workflow = _workflow(version="published") + node_config = {"id": "node-123", "data": {}} + + with ( + patch.object(webhook_service_module, "WorkflowService") as workflow_service_class, + patch.object(Workflow, "get_node_config_by_id", autospec=True, return_value=node_config), + ): + get_published_workflow = workflow_service_class.return_value.get_published_workflow + get_published_workflow.return_value = published_workflow + webhook_trigger, workflow, result_node_config = WebhookService.get_webhook_trigger_and_workflow( + "webhook-123" + ) + + assert webhook_trigger.app_id == "app-123" + assert workflow is published_workflow + assert result_node_config is node_config + persisted_app = get_published_workflow.call_args.args[0] + assert isinstance(persisted_app, App) + assert persisted_app.id == "app-123" + assert persisted_app.tenant_id == "tenant-123" + + def test_published_lookup_rejects_cross_tenant_app_decoy( + self, + sqlite_session: Session, + sqlite_engine: Engine, + monkeypatch: pytest.MonkeyPatch, + ) -> None: + sqlite_session.add_all( + [ + _webhook_trigger(), + _app_trigger(), + _app(tenant_id="tenant-other"), + ] + ) + sqlite_session.commit() + monkeypatch.setattr(webhook_service_module, "db", SimpleNamespace(engine=sqlite_engine)) + + with pytest.raises(ValueError, match="App not found"): + WebhookService.get_webhook_trigger_and_workflow("webhook-123") + + @pytest.mark.parametrize( + "status", + [AppTriggerStatus.DISABLED, AppTriggerStatus.UNAUTHORIZED], + ) + def test_published_lookup_rejects_inactive_trigger( + self, + status: AppTriggerStatus, + sqlite_session: Session, + sqlite_engine: Engine, + monkeypatch: pytest.MonkeyPatch, + ) -> None: + sqlite_session.add_all([_webhook_trigger(), _app_trigger(status=status)]) + sqlite_session.commit() + monkeypatch.setattr(webhook_service_module, "db", SimpleNamespace(engine=sqlite_engine)) + + with pytest.raises(ValueError, match="disabled"): + WebhookService.get_webhook_trigger_and_workflow("webhook-123") + + def test_published_lookup_reports_rate_limited_trigger( + self, + sqlite_session: Session, + sqlite_engine: Engine, + monkeypatch: pytest.MonkeyPatch, + ) -> None: + sqlite_session.add_all([_webhook_trigger(), _app_trigger(status=AppTriggerStatus.RATE_LIMITED)]) + sqlite_session.commit() + monkeypatch.setattr(webhook_service_module, "db", SimpleNamespace(engine=sqlite_engine)) + + with pytest.raises(QuotaExceededError): + WebhookService.get_webhook_trigger_and_workflow("webhook-123") + + class TestWebhookServiceUnit: """Webhook business-logic tests with isolated sessions where the service owns their lifecycle.""" @@ -25,13 +231,8 @@ class TestWebhookServiceUnit: ) -> None: """Quota failures refund the charge and close the real service-owned session.""" monkeypatch.setattr(webhook_service_module, "db", SimpleNamespace(engine=sqlite_engine)) - webhook_trigger = MagicMock( - webhook_id="webhook-123", - tenant_id="tenant-123", - app_id="app-123", - node_id="node-123", - ) - workflow = MagicMock(id="workflow-123") + webhook_trigger = _webhook_trigger() + workflow = _workflow() quota_charge = MagicMock() quota_error = QuotaExceededError(feature="workflow", tenant_id="tenant-123", required=1) @@ -39,7 +240,7 @@ class TestWebhookServiceUnit: with ( patch( "services.trigger.webhook_service.EndUserService.get_or_create_end_user_by_type", - return_value=MagicMock(id="end-user-123"), + return_value=_end_user(), ), patch("services.trigger.webhook_service.QuotaService.reserve", return_value=quota_charge), patch( @@ -71,14 +272,9 @@ class TestWebhookServiceUnit: sqlite_engine: Engine, ) -> None: monkeypatch.setattr(webhook_service_module, "db", SimpleNamespace(engine=sqlite_engine)) - webhook_trigger = MagicMock( - webhook_id="webhook-123", - tenant_id="tenant-123", - app_id="app-123", - node_id="node-123", - ) - workflow = MagicMock(id="workflow-123") - end_user = MagicMock(id="end-user-123") + webhook_trigger = _webhook_trigger() + workflow = _workflow() + end_user = _end_user() quota_charge = MagicMock() webhook_data = { "method": "POST", @@ -108,13 +304,8 @@ class TestWebhookServiceUnit: quota_charge.refund.assert_not_called() def test_trigger_workflow_execution_end_user_service_failure(self) -> None: - webhook_trigger = MagicMock( - webhook_id="webhook-123", - tenant_id="tenant-123", - app_id="app-123", - node_id="node-123", - ) - workflow = MagicMock(id="workflow-123") + webhook_trigger = _webhook_trigger() + workflow = _workflow() webhook_data = {"method": "POST", "headers": {}, "query_params": {}, "body": {}, "files": {}} with patch.object( @@ -136,7 +327,7 @@ class TestWebhookServiceUnit: query_string="version=1&format=json", json={"message": "hello", "count": 42}, ): - webhook_trigger = MagicMock() + webhook_trigger = _webhook_trigger() webhook_data = WebhookService.extract_webhook_data(webhook_trigger) assert webhook_data["method"] == "POST" @@ -158,7 +349,7 @@ class TestWebhookServiceUnit: headers={"Content-Type": "application/json"}, query_string="count=42&threshold=3.14&enabled=true¬e=text", ): - webhook_trigger = MagicMock() + webhook_trigger = _webhook_trigger() webhook_data = WebhookService.extract_webhook_data(webhook_trigger) # After refactoring, raw extraction keeps query params as strings @@ -177,7 +368,7 @@ class TestWebhookServiceUnit: headers={"Content-Type": "application/x-www-form-urlencoded"}, data={"username": "test", "password": "secret"}, ): - webhook_trigger = MagicMock() + webhook_trigger = _webhook_trigger() webhook_data = WebhookService.extract_webhook_data(webhook_trigger) assert webhook_data["method"] == "POST" @@ -198,7 +389,7 @@ class TestWebhookServiceUnit: headers={"Content-Type": "multipart/form-data"}, data={"message": "test", "file": file_storage}, ): - webhook_trigger = MagicMock() + webhook_trigger = _webhook_trigger() webhook_trigger.tenant_id = "test_tenant" with patch.object(WebhookService, "_process_file_uploads", autospec=True) as mock_process_files: @@ -218,7 +409,7 @@ class TestWebhookServiceUnit: with app.test_request_context( "/webhook", method="POST", headers={"Content-Type": "text/plain"}, data="raw text content" ): - webhook_trigger = MagicMock() + webhook_trigger = _webhook_trigger() webhook_data = WebhookService.extract_webhook_data(webhook_trigger) assert webhook_data["method"] == "POST" @@ -232,7 +423,7 @@ class TestWebhookServiceUnit: with app.test_request_context( "/webhook", method="POST", headers={"Content-Type": "application/octet-stream"}, data=binary_content ): - webhook_trigger = MagicMock() + webhook_trigger = _webhook_trigger() mock_file = MagicMock() mock_file.to_dict.return_value = {"file": "data"} @@ -299,7 +490,7 @@ class TestWebhookServiceUnit: with app.test_request_context( "/webhook", method="POST", headers={"Content-Type": "application/json"}, data="invalid json" ): - webhook_trigger = MagicMock() + webhook_trigger = _webhook_trigger() with pytest.raises(ValueError, match="Invalid JSON body"): WebhookService.extract_webhook_data(webhook_trigger) @@ -369,9 +560,7 @@ class TestWebhookServiceUnit: """Test successful file upload processing.""" # Mock ToolFileManager mock_tool_file_instance = mock_tool_file_manager.return_value # Mock file creation - mock_tool_file = MagicMock() - mock_tool_file.id = "test_file_id" - mock_tool_file_instance.create_file_by_raw.return_value = mock_tool_file + mock_tool_file_instance.create_file_by_raw.return_value = _tool_file() # Mock file factory mock_file_obj = MagicMock() @@ -387,7 +576,7 @@ class TestWebhookServiceUnit: files["file1"].stream.read.return_value = b"content1" files["file2"].stream.read.return_value = b"content2" - webhook_trigger = MagicMock() + webhook_trigger = _webhook_trigger() webhook_trigger.tenant_id = "test_tenant" result = WebhookService._process_file_uploads(files, webhook_trigger) @@ -406,9 +595,7 @@ class TestWebhookServiceUnit: """Test file upload processing with errors.""" # Mock ToolFileManager mock_tool_file_instance = mock_tool_file_manager.return_value # Mock file creation - mock_tool_file = MagicMock() - mock_tool_file.id = "test_file_id" - mock_tool_file_instance.create_file_by_raw.return_value = mock_tool_file + mock_tool_file_instance.create_file_by_raw.return_value = _tool_file() # Mock file factory mock_file_obj = MagicMock() @@ -423,7 +610,7 @@ class TestWebhookServiceUnit: files["good_file"].stream.read.return_value = b"content" files["bad_file"].stream.read.side_effect = Exception("Read error") - webhook_trigger = MagicMock() + webhook_trigger = _webhook_trigger() webhook_trigger.tenant_id = "test_tenant" result = WebhookService._process_file_uploads(files, webhook_trigger) @@ -440,7 +627,7 @@ class TestWebhookServiceUnit: "none_filename": MagicMock(filename=None, content_type="text/plain"), } - webhook_trigger = MagicMock() + webhook_trigger = _webhook_trigger() webhook_trigger.tenant_id = "test_tenant" result = WebhookService._process_file_uploads(files, webhook_trigger) @@ -585,7 +772,7 @@ class TestWebhookServiceUnit: query_string="count=42&enabled=true", json={"message": "hello", "age": 25}, ): - webhook_trigger = MagicMock() + webhook_trigger = _webhook_trigger() node_config = { "data": { "method": "post", @@ -619,7 +806,7 @@ class TestWebhookServiceUnit: headers={"Content-Type": "application/json"}, data='{"invalid": }', ): - webhook_trigger = MagicMock() + webhook_trigger = _webhook_trigger() node_config = { "data": { "method": "post", @@ -639,7 +826,7 @@ class TestWebhookServiceUnit: method="GET", # Wrong method headers={"Content-Type": "application/json"}, ): - webhook_trigger = MagicMock() + webhook_trigger = _webhook_trigger() node_config = { "data": { "method": "post", # Expects POST @@ -666,7 +853,7 @@ class TestWebhookServiceUnit: } with pytest.raises(ValueError, match="Required header missing: Authorization"): - WebhookService.extract_and_validate_webhook_data(MagicMock(), node_config) + WebhookService.extract_and_validate_webhook_data(_webhook_trigger(), node_config) def test_extract_and_validate_webhook_request_case_insensitive_headers(self) -> None: app = Flask(__name__) @@ -685,7 +872,7 @@ class TestWebhookServiceUnit: } } - result = WebhookService.extract_and_validate_webhook_data(MagicMock(), node_config) + result = WebhookService.extract_and_validate_webhook_data(_webhook_trigger(), node_config) assert result["headers"].get("Authorization") == "Bearer token" @@ -707,7 +894,7 @@ class TestWebhookServiceUnit: } with pytest.raises(ValueError, match="Required parameter missing: version"): - WebhookService.extract_and_validate_webhook_data(MagicMock(), node_config) + WebhookService.extract_and_validate_webhook_data(_webhook_trigger(), node_config) def test_extract_and_validate_webhook_request_missing_required_body_param(self) -> None: app = Flask(__name__) @@ -726,7 +913,7 @@ class TestWebhookServiceUnit: } with pytest.raises(ValueError, match="Required body parameter missing: message"): - WebhookService.extract_and_validate_webhook_data(MagicMock(), node_config) + WebhookService.extract_and_validate_webhook_data(_webhook_trigger(), node_config) def test_extract_and_validate_webhook_request_missing_required_file(self) -> None: app = Flask(__name__) @@ -744,7 +931,7 @@ class TestWebhookServiceUnit: } } - result = WebhookService.extract_and_validate_webhook_data(MagicMock(), node_config) + result = WebhookService.extract_and_validate_webhook_data(_webhook_trigger(), node_config) assert result["files"] == {} @@ -757,19 +944,19 @@ class TestWebhookServiceUnit: patch.object(WebhookService, "get_webhook_trigger_and_workflow", autospec=True) as mock_get_trigger, patch.object(WebhookService, "extract_and_validate_webhook_data", autospec=True) as mock_extract, ): - mock_trigger = MagicMock() - mock_workflow = MagicMock() + webhook_trigger = _webhook_trigger() + workflow = _workflow() mock_config = {"data": {"test": "config"}} mock_data = {"test": "data"} - mock_get_trigger.return_value = (mock_trigger, mock_workflow, mock_config) + mock_get_trigger.return_value = (webhook_trigger, workflow, mock_config) mock_extract.return_value = mock_data result = _prepare_webhook_execution("test_webhook", is_debug=False) - assert result == (mock_trigger, mock_workflow, mock_config, mock_data, None) + assert result == (webhook_trigger, workflow, mock_config, mock_data, None) # Reset mock mock_get_trigger.reset_mock() result = _prepare_webhook_execution("test_webhook", is_debug=True) - assert result == (mock_trigger, mock_workflow, mock_config, mock_data, None) + assert result == (webhook_trigger, workflow, mock_config, mock_data, None) diff --git a/api/tests/unit_tests/services/test_webhook_service_additional.py b/api/tests/unit_tests/services/test_webhook_service_additional.py index e3a8e282e9c..44c13149088 100644 --- a/api/tests/unit_tests/services/test_webhook_service_additional.py +++ b/api/tests/unit_tests/services/test_webhook_service_additional.py @@ -14,6 +14,7 @@ from core.workflow.nodes.trigger_webhook.entities import ( WebhookParameter, ) from graphon.variables.types import SegmentType +from models.trigger import WorkflowWebhookTrigger from services.trigger import webhook_service as service_module from services.trigger.webhook_service import WebhookService @@ -23,8 +24,16 @@ def flask_app() -> Flask: return Flask(__name__) -def _workflow_trigger(**kwargs: Any) -> Any: - return SimpleNamespace(**kwargs) +def _workflow_trigger(**kwargs: Any) -> WorkflowWebhookTrigger: + values = { + "webhook_id": "webhook-123", + "tenant_id": "tenant-1", + "app_id": "app-1", + "node_id": "node-1", + "created_by": "user-1", + } + values.update(kwargs) + return WorkflowWebhookTrigger(**values) class TestWebhookServiceExtractionFallbacks: @@ -34,7 +43,7 @@ class TestWebhookServiceExtractionFallbacks: monkeypatch: pytest.MonkeyPatch, caplog: pytest.LogCaptureFixture, ) -> None: - webhook_trigger = MagicMock() + webhook_trigger = _workflow_trigger() with caplog.at_level(logging.WARNING, logger="services.trigger.webhook_service"): with flask_app.test_request_context( @@ -57,10 +66,10 @@ class TestWebhookServiceExtractionFallbacks: with flask_app.test_request_context("/webhook", method="POST", data="ab"): with pytest.raises(RequestEntityTooLarge): - WebhookService.extract_webhook_data(MagicMock()) + WebhookService.extract_webhook_data(_workflow_trigger()) def test_extract_octet_stream_body_should_return_none_when_empty_payload(self, flask_app: Flask) -> None: - webhook_trigger = MagicMock() + webhook_trigger = _workflow_trigger() with flask_app.test_request_context("/webhook", method="POST", data=b""): body, files = WebhookService._extract_octet_stream_body(webhook_trigger) @@ -73,7 +82,7 @@ class TestWebhookServiceExtractionFallbacks: flask_app: Flask, monkeypatch: pytest.MonkeyPatch, ) -> None: - webhook_trigger = MagicMock() + webhook_trigger = _workflow_trigger() monkeypatch.setattr( WebhookService, "_detect_binary_mimetype", MagicMock(return_value="application/octet-stream") ) diff --git a/api/tests/unit_tests/tasks/test_trigger_processing_tasks.py b/api/tests/unit_tests/tasks/test_trigger_processing_tasks.py index 84f95d649c4..6609633a9cb 100644 --- a/api/tests/unit_tests/tasks/test_trigger_processing_tasks.py +++ b/api/tests/unit_tests/tasks/test_trigger_processing_tasks.py @@ -1,12 +1,56 @@ +import json from unittest.mock import MagicMock, patch import pytest import tasks.trigger_processing_tasks as trigger_processing_tasks_module +from core.plugin.entities.plugin_daemon import CredentialType +from graphon.enums import WorkflowType +from models.enums import EndUserType +from models.model import EndUser +from models.trigger import TriggerSubscription, WorkflowPluginTrigger +from models.workflow import Workflow from services.errors.app import QuotaExceededError from tasks.trigger_processing_tasks import dispatch_triggered_workflow +def _workflow(*, app_id: str = "app-123") -> Workflow: + workflow = Workflow.new( + tenant_id="tenant-123", + app_id=app_id, + type=WorkflowType.WORKFLOW.value, + version="published", + graph=json.dumps( + { + "nodes": [ + { + "id": "node-123", + "data": {"type": trigger_processing_tasks_module.TRIGGER_PLUGIN_NODE_TYPE}, + } + ], + "edges": [], + } + ), + features="{}", + created_by="user-123", + environment_variables=[], + conversation_variables=[], + rag_pipeline_variables=[], + ) + workflow.id = "workflow-123" + return workflow + + +def _end_user() -> EndUser: + return EndUser( + id="end-user-123", + tenant_id="tenant-123", + app_id="app-123", + type=EndUserType.TRIGGER, + session_id="trigger-session", + ) + + class TestDispatchTriggeredWorkflow: """Unit tests covering branch behaviours of ``dispatch_triggered_workflow``. @@ -20,21 +64,31 @@ class TestDispatchTriggeredWorkflow: @pytest.fixture def subscription(self): - sub = MagicMock() - sub.id = "subscription-123" - sub.tenant_id = "tenant-123" - sub.provider_id = "langgenius/test_plugin/test_plugin" - sub.endpoint_id = "endpoint-123" - sub.credentials = {} - sub.credential_type = "api_key" - return sub + subscription = TriggerSubscription( + tenant_id="tenant-123", + user_id="user-123", + name="Test Subscription", + endpoint_id="endpoint-123", + provider_id="langgenius/test_plugin/test_plugin", + parameters={}, + properties={}, + credentials={}, + credential_type=CredentialType.API_KEY, + ) + subscription.id = "subscription-123" + return subscription @pytest.fixture def plugin_trigger(self): - trigger = MagicMock() + trigger = WorkflowPluginTrigger( + app_id="app-123", + node_id="node-123", + tenant_id="tenant-123", + provider_id="langgenius/test_plugin/test_plugin", + event_name="test_event", + subscription_id="subscription-123", + ) trigger.id = "plugin-trigger-123" - trigger.app_id = "app-123" - trigger.node_id = "node-123" return trigger @pytest.fixture @@ -144,11 +198,8 @@ class TestDispatchTriggeredWorkflow: def test_dispatch_marks_rate_limited_when_quota_exceeded(self, subscription, plugin_trigger, dispatch_mocks): """Covers QuotaExceededError → mark rate-limited + early return.""" - workflow_mock = MagicMock() - workflow_mock.walk_nodes.return_value = iter( - [(plugin_trigger.node_id, {"type": trigger_processing_tasks_module.TRIGGER_PLUGIN_NODE_TYPE})] - ) - dispatch_mocks["get_workflows"].return_value = {plugin_trigger.app_id: workflow_mock} + workflow = _workflow() + dispatch_mocks["get_workflows"].return_value = {plugin_trigger.app_id: workflow} dispatch_mocks["reserve"].side_effect = QuotaExceededError( feature="trigger", tenant_id=subscription.tenant_id, required=1 ) @@ -169,15 +220,11 @@ class TestDispatchTriggeredWorkflow: self, subscription, plugin_trigger, dispatch_mocks ): """Happy path: end user exists and async trigger succeeds.""" - workflow_mock = MagicMock() - workflow_mock.id = "workflow-123" - workflow_mock.walk_nodes.return_value = iter( - [(plugin_trigger.node_id, {"type": trigger_processing_tasks_module.TRIGGER_PLUGIN_NODE_TYPE})] - ) - dispatch_mocks["get_workflows"].return_value = {plugin_trigger.app_id: workflow_mock} + workflow = _workflow() + dispatch_mocks["get_workflows"].return_value = {plugin_trigger.app_id: workflow} - end_user_mock = MagicMock() - dispatch_mocks["create_end_user_batch"].return_value = {plugin_trigger.app_id: end_user_mock} + end_user = _end_user() + dispatch_mocks["create_end_user_batch"].return_value = {plugin_trigger.app_id: end_user} dispatched = dispatch_triggered_workflow( user_id="user-123", @@ -189,7 +236,7 @@ class TestDispatchTriggeredWorkflow: assert dispatched == 1 dispatch_mocks["trigger_workflow_async"].assert_called_once() _, kwargs = dispatch_mocks["trigger_workflow_async"].call_args - assert kwargs["user"] is end_user_mock + assert kwargs["user"] is end_user dispatch_mocks["quota_charge"].commit.assert_called_once() dispatch_mocks["quota_charge"].refund.assert_not_called() dispatch_mocks["mark_rate_limited"].assert_not_called() diff --git a/api/uv.lock b/api/uv.lock index aee9cf81039..5cf5b38c10a 100644 --- a/api/uv.lock +++ b/api/uv.lock @@ -613,16 +613,16 @@ wheels = [ [[package]] name = "boto3" -version = "1.43.71" +version = "1.43.76" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "botocore" }, { name = "jmespath" }, { name = "s3transfer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e0/ed/3220ca6396a7ce00a49aa6f43f20cae05ec6ac386e2b5d668adfad0b3eed/boto3-1.43.71.tar.gz", hash = "sha256:e3eddb6346ee23c895dd98e5c2cfc72cb5e5ed111aa6d4331f9e903a3e3bf4ee", size = 112630, upload-time = "2026-08-13T19:20:35.332Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4f/6c/0cc8c0fe7b6564a3dd3b8066a2a262ee9874272defb517f461677a8c76c8/boto3-1.43.76.tar.gz", hash = "sha256:fa4dc85f735bb67d8f82e42ac50af7e1d2c039aeacf40c878067c9046464b6ad", size = 112656, upload-time = "2026-08-20T19:25:46.007Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4f/16/7b54e7f5271756ab13beaaf6da03f62edcc3ee5ded651c2b17297e107040/boto3-1.43.71-py3-none-any.whl", hash = "sha256:3bb46661dc33121e56e3706753069d18f8dbcb644599cf098206546338602e16", size = 140024, upload-time = "2026-08-13T19:20:32.542Z" }, + { url = "https://files.pythonhosted.org/packages/db/81/5179853e14d7068e02d2f535ca620d98d1a95249ccfc2933f414ed51ded4/boto3-1.43.76-py3-none-any.whl", hash = "sha256:249f55274aef9fa3b9de6afb6f5b2effbbb15c5263d97c13e7b691f479a62c04", size = 140025, upload-time = "2026-08-20T19:25:44.427Z" }, ] [[package]] @@ -645,16 +645,16 @@ bedrock-runtime = [ [[package]] name = "botocore" -version = "1.43.72" +version = "1.43.78" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jmespath" }, { name = "python-dateutil" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/99/a8cfeaea98d5085a493af909d09d174466482235a7fda291be18c9a5a76e/botocore-1.43.72.tar.gz", hash = "sha256:1b878c69081e8e9d55aa4c0d85683e7b07f0e274a5554662f9507a46641be3d2", size = 15949280, upload-time = "2026-08-14T19:24:48.841Z" } +sdist = { url = "https://files.pythonhosted.org/packages/67/71/490aaa384855bf3b69405ded52ae77a0e5f4eeb2165044fa65466c4d3a73/botocore-1.43.78.tar.gz", hash = "sha256:e8238d22c1e1342025d75d2e33d154a375e7caad0fc67f77d77faa2d82668b94", size = 15982895, upload-time = "2026-08-21T19:37:32.402Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/27/35814fd8701a6b8be0aa47a7fcbd1ea0706189410a47d71ff29ddcc3ad4d/botocore-1.43.72-py3-none-any.whl", hash = "sha256:de5a1bcf8d7602c6cefc15016f15dad82981e339192531f31fa9483e11feea47", size = 15641880, upload-time = "2026-08-14T19:24:45.882Z" }, + { url = "https://files.pythonhosted.org/packages/c5/5b/b7c5c22767c0e8eb4bb2bd0a972d77bd0be3dd9908e15d4487094a31fa4b/botocore-1.43.78-py3-none-any.whl", hash = "sha256:ddd020493235e264b3bd12606f239a3d3b2dd7cfb1d25a0691061183c290c228", size = 15677214, upload-time = "2026-08-21T19:37:28.894Z" }, ] [[package]] @@ -1642,7 +1642,7 @@ requires-dist = [ { name = "aliyun-log-python-sdk", specifier = "==0.9.44" }, { name = "azure-identity", specifier = ">=1.25.3,<2.0.0" }, { name = "bleach", specifier = ">=6.4.0,<7.0.0" }, - { name = "boto3", specifier = ">=1.43.71,<2.0.0" }, + { name = "boto3", specifier = ">=1.43.76,<2.0.0" }, { name = "celery", specifier = ">=5.6.3,<6.0.0" }, { name = "croniter", specifier = ">=6.2.2,<7.0.0" }, { name = "dify-agent", editable = "../dify-agent" }, diff --git a/docs/ADVANCED_SETUP.md b/docs/ADVANCED_SETUP.md new file mode 100644 index 00000000000..ea20f6d4603 --- /dev/null +++ b/docs/ADVANCED_SETUP.md @@ -0,0 +1,59 @@ +# Advanced Setup + +## Custom configurations + +If you need to customize the configuration, edit `docker/.env`. The essential startup defaults live in [`docker/.env.example`](../docker/.env.example), and optional advanced variables are split under `docker/envs/` by theme. After making any changes, re-run `docker compose up -d` from the `docker` directory. You can find the full list of available environment variables [here](https://docs.dify.ai/getting-started/install-self-hosted/environments). + +## Metrics Monitoring with Grafana + +Import the dashboard to Grafana, using Dify's PostgreSQL database as data source, to monitor metrics in granularity of apps, tenants, messages, and more. + +- [Grafana Dashboard by @bowenliang123](https://github.com/bowenliang123/dify-grafana-dashboard) + +## Deployment with Kubernetes + +If you'd like to configure a highly available setup, there are community-contributed [Helm Charts](https://helm.sh/) and YAML files which allow Dify to be deployed on Kubernetes. + +- [Helm Chart by @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) +- [Helm Chart by @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) +- [Helm Chart by @magicsong](https://github.com/magicsong/ai-charts) +- [YAML file by @Winson-030](https://github.com/Winson-030/dify-kubernetes) +- [YAML file by @wyy-holding](https://github.com/wyy-holding/dify-k8s) +- [🚀 NEW! YAML files (Supports Dify v1.6.0) by @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) + +### Using Terraform for Deployment + +Deploy Dify to Cloud Platform with a single click using [terraform](https://www.terraform.io/) + +#### Azure Global + +- [Azure Terraform by @nikawang](https://github.com/nikawang/dify-azure-terraform) + +#### Google Cloud + +- [Google Cloud Terraform by @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) + +### Using AWS CDK for Deployment + +Deploy Dify to AWS with [CDK](https://aws.amazon.com/cdk/) + +#### AWS + +- [AWS CDK by @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) +- [AWS CDK by @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) + +### Using Alibaba Cloud Computing Nest + +Quickly deploy Dify to Alibaba cloud with [Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) + +### Using Alibaba Cloud Data Management + +One-Click deploy Dify to Alibaba Cloud with [Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) + +### Deploy to AKS with Azure Devops Pipeline + +One-Click deploy Dify to AKS with [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) + +### Using Sealos for Deployment + +Deploy Dify with one click using the [Sealos App Store](https://sealos.io/products/app-store/dify/) diff --git a/docs/ar-SA/ADVANCED_SETUP.md b/docs/ar-SA/ADVANCED_SETUP.md new file mode 100644 index 00000000000..578da3747ce --- /dev/null +++ b/docs/ar-SA/ADVANCED_SETUP.md @@ -0,0 +1,57 @@ +# الإعداد المتقدم + +إذا كنت بحاجة إلى تخصيص الإعدادات، فيرجى الرجوع إلى التعليقات في ملف [.env.example](../../docker/.env.example) وتحديث القيم المقابلة في ملف `.env`. بالإضافة إلى ذلك، قد تحتاج إلى إجراء تعديلات على ملف `docker-compose.yaml` نفسه، مثل تغيير إصدارات الصور أو تعيينات المنافذ أو نقاط تحميل وحدات التخزين، بناءً على بيئة النشر ومتطلباتك الخاصة. بعد إجراء أي تغييرات، يرجى إعادة تشغيل `docker-compose up -d`. يمكنك العثور على قائمة كاملة بمتغيرات البيئة المتاحة [هنا](https://docs.dify.ai/getting-started/install-self-hosted/environments). + +## مراقبة المقاييس باستخدام Grafana + +استيراد لوحة التحكم إلى Grafana، باستخدام قاعدة بيانات PostgreSQL الخاصة بـ Dify كمصدر للبيانات، لمراقبة المقاييس بدقة للتطبيقات والمستأجرين والرسائل وغير ذلك. + +- [لوحة تحكم Grafana بواسطة @bowenliang123](https://github.com/bowenliang123/dify-grafana-dashboard) + +## النشر باستخدام Kubernetes + +يوجد مجتمع خاص بـ [Helm Charts](https://helm.sh/) وملفات YAML التي تسمح بتنفيذ Dify على Kubernetes للنظام من الإيجابيات العلوية. + +- [رسم بياني Helm من قبل @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) +- [رسم بياني Helm من قبل @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) +- [رسم بياني Helm من قبل @magicsong](https://github.com/magicsong/ai-charts) +- [ملف YAML من قبل @Winson-030](https://github.com/Winson-030/dify-kubernetes) +- [ملف YAML من قبل @wyy-holding](https://github.com/wyy-holding/dify-k8s) +- [🚀 جديد! ملفات YAML (تدعم Dify v1.6.0) بواسطة @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) + +### استخدام Terraform للتوزيع + +انشر Dify إلى منصة السحابة بنقرة واحدة باستخدام [terraform](https://www.terraform.io/) + +#### Azure Global + +- [Azure Terraform بواسطة @nikawang](https://github.com/nikawang/dify-azure-terraform) + +#### Google Cloud + +- [Google Cloud Terraform بواسطة @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) + +### استخدام AWS CDK للنشر + +انشر Dify على AWS باستخدام [CDK](https://aws.amazon.com/cdk/) + +#### AWS + +- [AWS CDK بواسطة @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) +- [AWS CDK بواسطة @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) + +### استخدام Alibaba Cloud للنشر + +[بسرعة نشر Dify إلى سحابة علي بابا مع عش الحوسبة السحابية علي بابا](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) + +### استخدام Alibaba Cloud Data Management للنشر + +انشر ​​Dify على علي بابا كلاود بنقرة واحدة باستخدام [Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) + +### استخدام Azure Devops Pipeline للنشر على AKS + +انشر Dify على AKS بنقرة واحدة باستخدام [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) + +### استخدام Sealos للنشر + +انشر Dify بنقرة واحدة باستخدام [Sealos App Store](https://sealos.io/products/app-store/dify/) diff --git a/docs/ar-SA/README.md b/docs/ar-SA/README.md index 5ec744339a0..47ec128c0ac 100644 --- a/docs/ar-SA/README.md +++ b/docs/ar-SA/README.md @@ -96,7 +96,7 @@ قم بإضافة نجمة إلى Dify على GitHub وتلق تنبيهًا فوريًا بالإصدارات الجديدة. -![نجمنا](https://github.com/langgenius/dify/assets/13230914/b823edc1-6388-4e25-ad45-2f6b187adbb4) +star ## البداية السريعة @@ -121,82 +121,31 @@ docker compose up -d ## الخطوات التالية -إذا كنت بحاجة إلى تخصيص الإعدادات، فيرجى الرجوع إلى التعليقات في ملف [.env.example](../../docker/.env.example) وتحديث القيم المقابلة في ملف `.env`. بالإضافة إلى ذلك، قد تحتاج إلى إجراء تعديلات على ملف `docker-compose.yaml` نفسه، مثل تغيير إصدارات الصور أو تعيينات المنافذ أو نقاط تحميل وحدات التخزين، بناءً على بيئة النشر ومتطلباتك الخاصة. بعد إجراء أي تغييرات، يرجى إعادة تشغيل `docker-compose up -d`. يمكنك العثور على قائمة كاملة بمتغيرات البيئة المتاحة [هنا](https://docs.dify.ai/getting-started/install-self-hosted/environments). - -### مراقبة المقاييس باستخدام Grafana - -استيراد لوحة التحكم إلى Grafana، باستخدام قاعدة بيانات PostgreSQL الخاصة بـ Dify كمصدر للبيانات، لمراقبة المقاييس بدقة للتطبيقات والمستأجرين والرسائل وغير ذلك. - -- [لوحة تحكم Grafana بواسطة @bowenliang123](https://github.com/bowenliang123/dify-grafana-dashboard) - -### النشر باستخدام Kubernetes - -يوجد مجتمع خاص بـ [Helm Charts](https://helm.sh/) وملفات YAML التي تسمح بتنفيذ Dify على Kubernetes للنظام من الإيجابيات العلوية. - -- [رسم بياني Helm من قبل @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) -- [رسم بياني Helm من قبل @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) -- [رسم بياني Helm من قبل @magicsong](https://github.com/magicsong/ai-charts) -- [ملف YAML من قبل @Winson-030](https://github.com/Winson-030/dify-kubernetes) -- [ملف YAML من قبل @wyy-holding](https://github.com/wyy-holding/dify-k8s) -- [🚀 جديد! ملفات YAML (تدعم Dify v1.6.0) بواسطة @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) - -#### استخدام Terraform للتوزيع - -انشر Dify إلى منصة السحابة بنقرة واحدة باستخدام [terraform](https://www.terraform.io/) - -##### Azure Global - -- [Azure Terraform بواسطة @nikawang](https://github.com/nikawang/dify-azure-terraform) - -##### Google Cloud - -- [Google Cloud Terraform بواسطة @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) - -#### استخدام AWS CDK للنشر - -انشر Dify على AWS باستخدام [CDK](https://aws.amazon.com/cdk/) - -##### AWS - -- [AWS CDK بواسطة @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) -- [AWS CDK بواسطة @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) - -#### استخدام Alibaba Cloud للنشر - -[بسرعة نشر Dify إلى سحابة علي بابا مع عش الحوسبة السحابية علي بابا](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) - -#### استخدام Alibaba Cloud Data Management للنشر - -انشر ​​Dify على علي بابا كلاود بنقرة واحدة باستخدام [Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) - -#### استخدام Azure Devops Pipeline للنشر على AKS - -انشر Dify على AKS بنقرة واحدة باستخدام [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) - -#### استخدام Sealos للنشر - -انشر Dify بنقرة واحدة باستخدام [Sealos App Store](https://sealos.io/products/app-store/dify/) +لخيارات التكوين المخصص والمراقبة والنشر، راجع [الإعداد المتقدم](ADVANCED_SETUP.md). ## المساهمة -لأولئك الذين يرغبون في المساهمة، انظر إلى [دليل المساهمة](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) لدينا. -في الوقت نفسه، يرجى النظر في دعم Dify عن طريق مشاركته على وسائل التواصل الاجتماعي وفي الفعاليات والمؤتمرات. +يرحب Dify بالمساهمات بجميع أشكالها: -> نحن نبحث عن مساهمين لمساعدة في ترجمة Dify إلى لغات أخرى غير اللغة الصينية المندرين أو الإنجليزية. إذا كنت مهتمًا بالمساعدة، يرجى الاطلاع على [README للترجمة](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) لمزيد من المعلومات، واترك لنا تعليقًا في قناة `global-users` على [خادم المجتمع على Discord](https://discord.gg/8Tpq4AcN9c). +- **الشفرة البرمجية**: اقرأ [دليل المساهمة](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md)، ثم تصفح [المشكلات المناسبة للمساهمين الجدد](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22). +- **الأفكار والملاحظات**: ابدأ أو انضم إلى [مناقشة على GitHub](https://github.com/langgenius/dify/discussions). +- **الترجمات**: اتبع [دليل التدويل](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) لإضافة لغة أو تحديثها. +- **المجتمع**: شارك التطبيقات التي تبنيها، وساعد المستخدمين الآخرين، وساهم في نشر Dify. -**المساهمون** +### المساهمون - + Dify contributors ## المجتمع والاتصال -- [مناقشة GitHub](https://github.com/langgenius/dify/discussions). الأفضل لـ: مشاركة التعليقات وطرح الأسئلة. -- [المشكلات على GitHub](https://github.com/langgenius/dify/issues). الأفضل لـ: الأخطاء التي تواجهها في استخدام Dify.AI، واقتراحات الميزات. انظر [دليل المساهمة](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). -- [Discord](https://discord.gg/FngNHpbcY7). الأفضل لـ: مشاركة تطبيقاتك والترفيه مع المجتمع. -- [تويتر](https://twitter.com/dify_ai). الأفضل لـ: مشاركة تطبيقاتك والترفيه مع المجتمع. +اختر القناة الأنسب لسؤالك: +- [مناقشات GitHub](https://github.com/langgenius/dify/discussions): للحصول على المساعدة ومشاركة الملاحظات واقتراح الأفكار. +- [مشكلات GitHub](https://github.com/langgenius/dify/issues): للإبلاغ عن الأخطاء القابلة لإعادة الإنتاج ومتابعة العمل الهندسي. اقرأ [دليل المساهمة](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) قبل فتح مشكلة. +- [Discord](https://discord.gg/FngNHpbcY7): للدردشة الفورية ومشاركة تطبيقاتك والتواصل مع مستخدمي Dify الآخرين. +- [X](https://x.com/dify_ai): لمتابعة أخبار الإصدارات وتحديثات المشروع. ## تاريخ النجمة [![Star History Chart](https://api.star-history.com/svg?repos=langgenius/dify&type=Date)](https://star-history.com/#langgenius/dify&Date) diff --git a/docs/bn-BD/ADVANCED_SETUP.md b/docs/bn-BD/ADVANCED_SETUP.md new file mode 100644 index 00000000000..7d0d863080b --- /dev/null +++ b/docs/bn-BD/ADVANCED_SETUP.md @@ -0,0 +1,58 @@ +# উন্নত সেটআপ + +যদি আপনার কনফিগারেশনটি কাস্টমাইজ করার প্রয়োজন হয়, তাহলে অনুগ্রহ করে আমাদের [.env.example](../../docker/.env.example) ফাইল দেখুন এবং আপনার `.env` ফাইলে সংশ্লিষ্ট মানগুলি আপডেট করুন। এছাড়াও, আপনার নির্দিষ্ট এনভায়রনমেন্ট এবং প্রয়োজনীয়তার উপর ভিত্তি করে আপনাকে `docker-compose.yaml` ফাইলে সমন্বয় করতে হতে পারে, যেমন ইমেজ ভার্সন পরিবর্তন করা, পোর্ট ম্যাপিং করা, অথবা ভলিউম মাউন্ট করা। +যেকোনো পরিবর্তন করার পর, অনুগ্রহ করে `docker-compose up -d` পুনরায় চালান। ভেরিয়েবলের সম্পূর্ণ তালিকা [এখানে] (https://docs.dify.ai/getting-started/install-self-hosted/environments) খুঁজে পেতে পারেন। + +## Grafana দিয়ে মেট্রিক্স মনিটরিং + +Dify-এর PostgreSQL ডাটাবেসকে ডেটা সোর্স হিসাবে ব্যবহার করে, অ্যাপ, টেন্যান্ট, মেসেজ ইত্যাদির গ্র্যানুলারিটিতে মেট্রিক্স মনিটর করার জন্য Grafana-তে ড্যাশবোর্ড ইম্পোর্ট করুন। + +- [@bowenliang123 কর্তৃক Grafana ড্যাশবোর্ড](https://github.com/bowenliang123/dify-grafana-dashboard) + +## Kubernetes এর সাথে ডেপ্লয়মেন্ট + +যদি আপনি একটি হাইলি এভেইলেবল সেটআপ কনফিগার করতে চান, তাহলে কমিউনিটি [Helm Charts](https://helm.sh/) এবং YAML ফাইল রয়েছে যা Dify কে Kubernetes-এ ডিপ্লয় করার প্রক্রিয়া বর্ণনা করে। + +- [Helm Chart by @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) +- [Helm Chart by @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) +- [Helm Chart by @magicsong](https://github.com/magicsong/ai-charts) +- [YAML file by @Winson-030](https://github.com/Winson-030/dify-kubernetes) +- [YAML file by @wyy-holding](https://github.com/wyy-holding/dify-k8s) +- [🚀 নতুন! YAML ফাইলসমূহ (Dify v1.6.0 সমর্থিত) তৈরি করেছেন @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) + +### টেরাফর্ম ব্যবহার করে ডিপ্লয় + +[terraform](https://www.terraform.io/) ব্যবহার করে এক ক্লিকেই ক্লাউড প্ল্যাটফর্মে Dify ডিপ্লয় করুন। + +#### অ্যাজুর গ্লোবাল + +- [Azure Terraform by @nikawang](https://github.com/nikawang/dify-azure-terraform) + +#### গুগল ক্লাউড + +- [Google Cloud Terraform by @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) + +### AWS CDK ব্যবহার করে ডিপ্লয় + +[CDK](https://aws.amazon.com/cdk/) দিয়ে AWS-এ Dify ডিপ্লয় করুন + +#### AWS + +- [AWS CDK by @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) +- [AWS CDK by @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) + +### Alibaba Cloud ব্যবহার করে ডিপ্লয় + +[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) + +### Alibaba Cloud Data Management ব্যবহার করে ডিপ্লয় + +[Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) + +### AKS-এ ডিপ্লয় করার জন্য Azure Devops Pipeline ব্যবহার + +[Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) ব্যবহার করে Dify কে AKS-এ এক ক্লিকে ডিপ্লয় করুন + +### Sealos ব্যবহার করে ডিপ্লয় + +[Sealos App Store](https://sealos.io/products/app-store/dify/) ব্যবহার করে Dify-কে এক ক্লিকে ডিপ্লয় করুন diff --git a/docs/bn-BD/README.md b/docs/bn-BD/README.md index b4a160e41a0..2e30e5ee25b 100644 --- a/docs/bn-BD/README.md +++ b/docs/bn-BD/README.md @@ -133,87 +133,35 @@ LLM ফাংশন কলিং বা ReAct উপর ভিত্তি ক GitHub-এ ডিফাইকে স্টার দিয়ে রাখুন এবং নতুন রিলিজের খবর তাৎক্ষণিকভাবে পান। -![star-us](https://github.com/langgenius/dify/assets/13230914/b823edc1-6388-4e25-ad45-2f6b187adbb4) +star ## Advanced Setup -যদি আপনার কনফিগারেশনটি কাস্টমাইজ করার প্রয়োজন হয়, তাহলে অনুগ্রহ করে আমাদের [.env.example](../../docker/.env.example) ফাইল দেখুন এবং আপনার `.env` ফাইলে সংশ্লিষ্ট মানগুলি আপডেট করুন। এছাড়াও, আপনার নির্দিষ্ট এনভায়রনমেন্ট এবং প্রয়োজনীয়তার উপর ভিত্তি করে আপনাকে `docker-compose.yaml` ফাইলে সমন্বয় করতে হতে পারে, যেমন ইমেজ ভার্সন পরিবর্তন করা, পোর্ট ম্যাপিং করা, অথবা ভলিউম মাউন্ট করা। -যেকোনো পরিবর্তন করার পর, অনুগ্রহ করে `docker-compose up -d` পুনরায় চালান। ভেরিয়েবলের সম্পূর্ণ তালিকা [এখানে] (https://docs.dify.ai/getting-started/install-self-hosted/environments) খুঁজে পেতে পারেন। +কাস্টম কনফিগারেশন, পর্যবেক্ষণ এবং ডেপ্লয়মেন্ট বিকল্পের জন্য, [উন্নত সেটআপ](ADVANCED_SETUP.md) দেখুন। -### Grafana দিয়ে মেট্রিক্স মনিটরিং +## অবদান -Dify-এর PostgreSQL ডাটাবেসকে ডেটা সোর্স হিসাবে ব্যবহার করে, অ্যাপ, টেন্যান্ট, মেসেজ ইত্যাদির গ্র্যানুলারিটিতে মেট্রিক্স মনিটর করার জন্য Grafana-তে ড্যাশবোর্ড ইম্পোর্ট করুন। +Dify সব ধরনের অবদানকে স্বাগত জানায়: -- [@bowenliang123 কর্তৃক Grafana ড্যাশবোর্ড](https://github.com/bowenliang123/dify-grafana-dashboard) +- **কোড**: [অবদান নির্দেশিকা](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) পড়ুন, তারপর [নতুন অবদানকারীদের উপযোগী সমস্যাগুলো](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22) দেখুন। +- **ধারণা ও প্রতিক্রিয়া**: একটি [GitHub আলোচনা](https://github.com/langgenius/dify/discussions) শুরু করুন বা বিদ্যমান আলোচনায় যোগ দিন। +- **অনুবাদ**: কোনো লোকেল যোগ বা হালনাগাদ করতে [আন্তর্জাতিকীকরণ নির্দেশিকা](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) অনুসরণ করুন। +- **কমিউনিটি**: আপনার তৈরি অ্যাপ শেয়ার করুন, অন্য ব্যবহারকারীদের সাহায্য করুন এবং Dify সম্পর্কে সবাইকে জানান। -### Kubernetes এর সাথে ডেপ্লয়মেন্ট +### অবদানকারীরা -যদি আপনি একটি হাইলি এভেইলেবল সেটআপ কনফিগার করতে চান, তাহলে কমিউনিটি [Helm Charts](https://helm.sh/) এবং YAML ফাইল রয়েছে যা Dify কে Kubernetes-এ ডিপ্লয় করার প্রক্রিয়া বর্ণনা করে। - -- [Helm Chart by @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) -- [Helm Chart by @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) -- [Helm Chart by @magicsong](https://github.com/magicsong/ai-charts) -- [YAML file by @Winson-030](https://github.com/Winson-030/dify-kubernetes) -- [YAML file by @wyy-holding](https://github.com/wyy-holding/dify-k8s) -- [🚀 নতুন! YAML ফাইলসমূহ (Dify v1.6.0 সমর্থিত) তৈরি করেছেন @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) - -#### টেরাফর্ম ব্যবহার করে ডিপ্লয় - -[terraform](https://www.terraform.io/) ব্যবহার করে এক ক্লিকেই ক্লাউড প্ল্যাটফর্মে Dify ডিপ্লয় করুন। - -##### অ্যাজুর গ্লোবাল - -- [Azure Terraform by @nikawang](https://github.com/nikawang/dify-azure-terraform) - -##### গুগল ক্লাউড - -- [Google Cloud Terraform by @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) - -#### AWS CDK ব্যবহার করে ডিপ্লয় - -[CDK](https://aws.amazon.com/cdk/) দিয়ে AWS-এ Dify ডিপ্লয় করুন - -##### AWS - -- [AWS CDK by @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) -- [AWS CDK by @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) - -#### Alibaba Cloud ব্যবহার করে ডিপ্লয় - -[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) - -#### Alibaba Cloud Data Management ব্যবহার করে ডিপ্লয় - -[Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) - -#### AKS-এ ডিপ্লয় করার জন্য Azure Devops Pipeline ব্যবহার - -[Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) ব্যবহার করে Dify কে AKS-এ এক ক্লিকে ডিপ্লয় করুন - -#### Sealos ব্যবহার করে ডিপ্লয় - -[Sealos App Store](https://sealos.io/products/app-store/dify/) ব্যবহার করে Dify-কে এক ক্লিকে ডিপ্লয় করুন - -## Contributing - -যারা কোড অবদান রাখতে চান, তাদের জন্য আমাদের [অবদান নির্দেশিকা](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) দেখুন। -একই সাথে, সোশ্যাল মিডিয়া এবং ইভেন্ট এবং কনফারেন্সে এটি শেয়ার করে Dify কে সমর্থন করুন। - -> আমরা ম্যান্ডারিন বা ইংরেজি ছাড়া অন্য ভাষায় Dify অনুবাদ করতে সাহায্য করার জন্য অবদানকারীদের খুঁজছি। আপনি যদি সাহায্য করতে আগ্রহী হন, তাহলে আরও তথ্যের জন্য [i18n README](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) দেখুন এবং আমাদের [ডিসকর্ড কমিউনিটি সার্ভার](https://discord.gg/8Tpq4AcN9c) এর `গ্লোবাল-ইউজারস` চ্যানেলে আমাদের একটি মন্তব্য করুন। + + Dify contributors + ## কমিউনিটি এবং যোগাযোগ -- [GitHub Discussion](https://github.com/langgenius/dify/discussions) ফিডব্যাক এবং প্রতিক্রিয়া জানানোর মাধ্যম। -- [GitHub Issues](https://github.com/langgenius/dify/issues). Dify.AI ব্যবহার করে আপনি যেসব বাগের সম্মুখীন হন এবং ফিচার প্রস্তাবনা। আমাদের [অবদান নির্দেশিকা](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) দেখুন। -- [Discord](https://discord.gg/FngNHpbcY7) আপনার এপ্লিকেশন শেয়ার এবং কমিউনিটি আড্ডার মাধ্যম। -- [X(Twitter)](https://twitter.com/dify_ai) আপনার এপ্লিকেশন শেয়ার এবং কমিউনিটি আড্ডার মাধ্যম। - -**অবদানকারীদের তালিকা** - - - - +আপনার প্রশ্নের জন্য সবচেয়ে উপযুক্ত মাধ্যমটি বেছে নিন: +- [GitHub Discussions](https://github.com/langgenius/dify/discussions): সাহায্য নিন, প্রতিক্রিয়া জানান এবং ধারণা প্রস্তাব করুন। +- [GitHub Issues](https://github.com/langgenius/dify/issues): পুনরুৎপাদনযোগ্য বাগ রিপোর্ট করুন এবং ইঞ্জিনিয়ারিং কাজ অনুসরণ করুন। নতুন ইস্যু খোলার আগে [অবদান নির্দেশিকা](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) পড়ুন। +- [Discord](https://discord.gg/FngNHpbcY7): সরাসরি আলোচনা করুন, আপনার অ্যাপ শেয়ার করুন এবং অন্যান্য Dify ব্যবহারকারীর সঙ্গে যুক্ত হন। +- [X](https://x.com/dify_ai): রিলিজের খবর এবং প্রকল্পের হালনাগাদ পেতে Dify অনুসরণ করুন। ## স্টার হিস্ট্রি [![Star History Chart](https://api.star-history.com/svg?repos=langgenius/dify&type=Date)](https://star-history.com/#langgenius/dify&Date) diff --git a/docs/de-DE/ADVANCED_SETUP.md b/docs/de-DE/ADVANCED_SETUP.md new file mode 100644 index 00000000000..e5844028689 --- /dev/null +++ b/docs/de-DE/ADVANCED_SETUP.md @@ -0,0 +1,57 @@ +# Erweiterte Einstellungen + +Falls Sie die Konfiguration anpassen müssen, lesen Sie bitte die Kommentare in unserer [.env.example](../../docker/.env.example)-Datei und aktualisieren Sie die entsprechenden Werte in Ihrer `.env`-Datei. Zusätzlich müssen Sie eventuell Anpassungen an der `docker-compose.yaml`-Datei vornehmen, wie zum Beispiel das Ändern von Image-Versionen, Portzuordnungen oder Volumen-Mounts, je nach Ihrer spezifischen Einsatzumgebung und Ihren Anforderungen. Nachdem Sie Änderungen vorgenommen haben, starten Sie `docker-compose up -d` erneut. Eine vollständige Liste der verfügbaren Umgebungsvariablen finden Sie [hier](https://docs.dify.ai/getting-started/install-self-hosted/environments). + +## Metriküberwachung mit Grafana + +Importieren Sie das Dashboard in Grafana, wobei Sie die PostgreSQL-Datenbank von Dify als Datenquelle verwenden, um Metriken in der Granularität von Apps, Mandanten, Nachrichten und mehr zu überwachen. + +- [Grafana-Dashboard von @bowenliang123](https://github.com/bowenliang123/dify-grafana-dashboard) + +## Bereitstellung mit Kubernetes + +Falls Sie eine hochverfügbare Konfiguration einrichten möchten, gibt es von der Community bereitgestellte [Helm Charts](https://helm.sh/) und YAML-Dateien, die es ermöglichen, Dify auf Kubernetes bereitzustellen. + +- [Helm Chart by @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) +- [Helm Chart by @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) +- [Helm Chart by @magicsong](https://github.com/magicsong/ai-charts) +- [YAML file by @Winson-030](https://github.com/Winson-030/dify-kubernetes) +- [YAML file by @wyy-holding](https://github.com/wyy-holding/dify-k8s) +- [🚀 NEW! YAML files (Supports Dify v1.6.0) by @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) + +### Terraform für die Bereitstellung verwenden + +Stellen Sie Dify mit nur einem Klick mithilfe von [terraform](https://www.terraform.io/) auf einer Cloud-Plattform bereit. + +#### Azure Global + +- [Azure Terraform by @nikawang](https://github.com/nikawang/dify-azure-terraform) + +#### Google Cloud + +- [Google Cloud Terraform by @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) + +### Verwendung von AWS CDK für die Bereitstellung + +Bereitstellung von Dify auf AWS mit [CDK](https://aws.amazon.com/cdk/) + +#### AWS + +- [AWS CDK by @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) +- [AWS CDK by @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) + +### Alibaba Cloud + +[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) + +### Alibaba Cloud Data Management + +Ein-Klick-Bereitstellung von Dify in der Alibaba Cloud mit [Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) + +### Verwendung von Azure Devops Pipeline für AKS-Bereitstellung + +Stellen Sie Dify mit einem Klick in AKS bereit, indem Sie [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) verwenden + +### Bereitstellung mit Sealos + +Stellen Sie Dify mit einem Klick über den [Sealos App Store](https://sealos.io/products/app-store/dify/) bereit diff --git a/docs/de-DE/README.md b/docs/de-DE/README.md index 67dd58b0c9f..1608b0106e6 100644 --- a/docs/de-DE/README.md +++ b/docs/de-DE/README.md @@ -132,85 +132,35 @@ Alle Dify-Angebote kommen mit entsprechenden APIs, sodass Sie Dify mühelos in I Star Dify auf GitHub und lassen Sie sich sofort über neue Releases benachrichtigen. -![star-us](https://github.com/langgenius/dify/assets/13230914/b823edc1-6388-4e25-ad45-2f6b187adbb4) +star ## Erweiterte Einstellungen -Falls Sie die Konfiguration anpassen müssen, lesen Sie bitte die Kommentare in unserer [.env.example](../../docker/.env.example)-Datei und aktualisieren Sie die entsprechenden Werte in Ihrer `.env`-Datei. Zusätzlich müssen Sie eventuell Anpassungen an der `docker-compose.yaml`-Datei vornehmen, wie zum Beispiel das Ändern von Image-Versionen, Portzuordnungen oder Volumen-Mounts, je nach Ihrer spezifischen Einsatzumgebung und Ihren Anforderungen. Nachdem Sie Änderungen vorgenommen haben, starten Sie `docker-compose up -d` erneut. Eine vollständige Liste der verfügbaren Umgebungsvariablen finden Sie [hier](https://docs.dify.ai/getting-started/install-self-hosted/environments). +Optionen für benutzerdefinierte Konfiguration, Observability und Bereitstellung finden Sie unter [Erweiterte Einstellungen](ADVANCED_SETUP.md). -### Metriküberwachung mit Grafana +## Mitwirken -Importieren Sie das Dashboard in Grafana, wobei Sie die PostgreSQL-Datenbank von Dify als Datenquelle verwenden, um Metriken in der Granularität von Apps, Mandanten, Nachrichten und mehr zu überwachen. +Dify freut sich über Beiträge jeder Art: -- [Grafana-Dashboard von @bowenliang123](https://github.com/bowenliang123/dify-grafana-dashboard) +- **Code**: Lesen Sie den [Contribution Guide](./CONTRIBUTING.md) und stöbern Sie anschließend in den [Good First Issues](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22). +- **Ideen und Feedback**: Starten Sie eine [GitHub-Diskussion](https://github.com/langgenius/dify/discussions) oder beteiligen Sie sich an einer bestehenden. +- **Übersetzungen**: Folgen Sie dem [Internationalisierungsleitfaden](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md), um eine Sprache hinzuzufügen oder zu aktualisieren. +- **Community**: Teilen Sie Ihre Apps, helfen Sie anderen Nutzern und machen Sie Dify bekannter. -### Bereitstellung mit Kubernetes +### Mitwirkende -Falls Sie eine hochverfügbare Konfiguration einrichten möchten, gibt es von der Community bereitgestellte [Helm Charts](https://helm.sh/) und YAML-Dateien, die es ermöglichen, Dify auf Kubernetes bereitzustellen. - -- [Helm Chart by @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) -- [Helm Chart by @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) -- [Helm Chart by @magicsong](https://github.com/magicsong/ai-charts) -- [YAML file by @Winson-030](https://github.com/Winson-030/dify-kubernetes) -- [YAML file by @wyy-holding](https://github.com/wyy-holding/dify-k8s) -- [🚀 NEW! YAML files (Supports Dify v1.6.0) by @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) - -#### Terraform für die Bereitstellung verwenden - -Stellen Sie Dify mit nur einem Klick mithilfe von [terraform](https://www.terraform.io/) auf einer Cloud-Plattform bereit. - -##### Azure Global - -- [Azure Terraform by @nikawang](https://github.com/nikawang/dify-azure-terraform) - -##### Google Cloud - -- [Google Cloud Terraform by @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) - -#### Verwendung von AWS CDK für die Bereitstellung - -Bereitstellung von Dify auf AWS mit [CDK](https://aws.amazon.com/cdk/) - -##### AWS - -- [AWS CDK by @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) -- [AWS CDK by @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) - -#### Alibaba Cloud - -[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) - -#### Alibaba Cloud Data Management - -Ein-Klick-Bereitstellung von Dify in der Alibaba Cloud mit [Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) - -#### Verwendung von Azure Devops Pipeline für AKS-Bereitstellung - -Stellen Sie Dify mit einem Klick in AKS bereit, indem Sie [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) verwenden - -#### Bereitstellung mit Sealos - -Stellen Sie Dify mit einem Klick über den [Sealos App Store](https://sealos.io/products/app-store/dify/) bereit - -## Contributing - -Falls Sie Code beitragen möchten, lesen Sie bitte unseren [Contribution Guide](./CONTRIBUTING.md). Gleichzeitig bitten wir Sie, Dify zu unterstützen, indem Sie es in den sozialen Medien teilen und auf Veranstaltungen und Konferenzen präsentieren. - -> Wir suchen Mitwirkende, die dabei helfen, Dify in weitere Sprachen zu übersetzen – außer Mandarin oder Englisch. Wenn Sie Interesse an einer Mitarbeit haben, lesen Sie bitte die [i18n README](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) für weitere Informationen und hinterlassen Sie einen Kommentar im `global-users`-Kanal unseres [Discord Community Servers](https://discord.gg/8Tpq4AcN9c). + + Dify contributors + ## Gemeinschaft & Kontakt -- [GitHub Discussion](https://github.com/langgenius/dify/discussions). Am besten geeignet für: den Austausch von Feedback und das Stellen von Fragen. -- [GitHub Issues](https://github.com/langgenius/dify/issues). Am besten für: Fehler, auf die Sie bei der Verwendung von Dify.AI stoßen, und Funktionsvorschläge. Siehe unseren [Contribution Guide](./CONTRIBUTING.md). -- [Discord](https://discord.gg/FngNHpbcY7). Am besten geeignet für: den Austausch von Bewerbungen und den Austausch mit der Community. -- [X(Twitter)](https://twitter.com/dify_ai). Am besten geeignet für: den Austausch von Bewerbungen und den Austausch mit der Community. - -**Mitwirkende** - - - - +Wählen Sie den Kanal, der am besten zu Ihrem Anliegen passt: +- [GitHub Discussions](https://github.com/langgenius/dify/discussions): Hilfe erhalten, Feedback teilen und Ideen vorschlagen. +- [GitHub Issues](https://github.com/langgenius/dify/issues): Reproduzierbare Fehler melden und technische Arbeiten verfolgen. Lesen Sie vor dem Erstellen eines Issues den [Contribution Guide](./CONTRIBUTING.md). +- [Discord](https://discord.gg/FngNHpbcY7): In Echtzeit chatten, Apps teilen und sich mit anderen Dify-Nutzern austauschen. +- [X](https://x.com/dify_ai): Neuigkeiten zu Releases und Projekt-Updates verfolgen. ## Star-Geschichte [![Star History Chart](https://api.star-history.com/svg?repos=langgenius/dify&type=Date)](https://star-history.com/#langgenius/dify&Date) diff --git a/docs/es-ES/ADVANCED_SETUP.md b/docs/es-ES/ADVANCED_SETUP.md new file mode 100644 index 00000000000..664c62e8adb --- /dev/null +++ b/docs/es-ES/ADVANCED_SETUP.md @@ -0,0 +1,59 @@ +# Configuración avanzada + +Si necesita personalizar la configuración, consulte los comentarios en nuestro archivo [.env.example](../../docker/.env.example) y actualice los valores correspondientes en su archivo `.env`. Además, es posible que deba realizar ajustes en el propio archivo `docker-compose.yaml`, como cambiar las versiones de las imágenes, las asignaciones de puertos o los montajes de volúmenes, según su entorno de implementación y requisitos específicos. Después de realizar cualquier cambio, vuelva a ejecutar `docker-compose up -d`. Puede encontrar la lista completa de variables de entorno disponibles [aquí](https://docs.dify.ai/getting-started/install-self-hosted/environments). + +. Después de realizar los cambios, ejecuta `docker-compose up -d` nuevamente. Puedes ver la lista completa de variables de entorno [aquí](https://docs.dify.ai/getting-started/install-self-hosted/environments). + +## Monitorización de Métricas con Grafana + +Importe el panel a Grafana, utilizando la base de datos PostgreSQL de Dify como fuente de datos, para monitorizar métricas en granularidad de aplicaciones, inquilinos, mensajes y más. + +- [Panel de Grafana por @bowenliang123](https://github.com/bowenliang123/dify-grafana-dashboard) + +## Implementación con Kubernetes + +Si desea configurar una configuración de alta disponibilidad, la comunidad proporciona [Gráficos Helm](https://helm.sh/) y archivos YAML, a través de los cuales puede desplegar Dify en Kubernetes. + +- [Gráfico Helm por @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) +- [Gráfico Helm por @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) +- [Gráfico Helm por @magicsong](https://github.com/magicsong/ai-charts) +- [Ficheros YAML por @Winson-030](https://github.com/Winson-030/dify-kubernetes) +- [Ficheros YAML por @wyy-holding](https://github.com/wyy-holding/dify-k8s) +- [🚀 ¡NUEVO! Archivos YAML (compatible con Dify v1.6.0) por @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) + +### Uso de Terraform para el despliegue + +Despliega Dify en una plataforma en la nube con un solo clic utilizando [terraform](https://www.terraform.io/) + +#### Azure Global + +- [Azure Terraform por @nikawang](https://github.com/nikawang/dify-azure-terraform) + +#### Google Cloud + +- [Google Cloud Terraform por @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) + +### Usando AWS CDK para el Despliegue + +Despliegue Dify en AWS usando [CDK](https://aws.amazon.com/cdk/) + +#### AWS + +- [AWS CDK por @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) +- [AWS CDK por @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) + +### Alibaba Cloud + +[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) + +### Alibaba Cloud Data Management + +Despliega Dify en Alibaba Cloud con un solo clic con [Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) + +### Uso de Azure Devops Pipeline para implementar en AKS + +Implementa Dify en AKS con un clic usando [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) + +### Implementación con Sealos + +Despliega Dify con un solo clic desde [Sealos App Store](https://sealos.io/products/app-store/dify/) diff --git a/docs/es-ES/README.md b/docs/es-ES/README.md index 9462beeaffe..fb914dc1be7 100644 --- a/docs/es-ES/README.md +++ b/docs/es-ES/README.md @@ -107,7 +107,7 @@ Todas las ofertas de Dify vienen con APIs correspondientes, por lo que podrías Dale estrella a Dify en GitHub y serás notificado instantáneamente de las nuevas versiones. -![danos estrella](https://github.com/langgenius/dify/assets/13230914/b823edc1-6388-4e25-ad45-2f6b187adbb4) +star ## Inicio Rápido @@ -132,84 +132,31 @@ Después de ejecutarlo, puedes acceder al panel de control de Dify en tu navegad ## Próximos pasos -Si necesita personalizar la configuración, consulte los comentarios en nuestro archivo [.env.example](../../docker/.env.example) y actualice los valores correspondientes en su archivo `.env`. Además, es posible que deba realizar ajustes en el propio archivo `docker-compose.yaml`, como cambiar las versiones de las imágenes, las asignaciones de puertos o los montajes de volúmenes, según su entorno de implementación y requisitos específicos. Después de realizar cualquier cambio, vuelva a ejecutar `docker-compose up -d`. Puede encontrar la lista completa de variables de entorno disponibles [aquí](https://docs.dify.ai/getting-started/install-self-hosted/environments). - -. Después de realizar los cambios, ejecuta `docker-compose up -d` nuevamente. Puedes ver la lista completa de variables de entorno [aquí](https://docs.dify.ai/getting-started/install-self-hosted/environments). - -### Monitorización de Métricas con Grafana - -Importe el panel a Grafana, utilizando la base de datos PostgreSQL de Dify como fuente de datos, para monitorizar métricas en granularidad de aplicaciones, inquilinos, mensajes y más. - -- [Panel de Grafana por @bowenliang123](https://github.com/bowenliang123/dify-grafana-dashboard) - -### Implementación con Kubernetes - -Si desea configurar una configuración de alta disponibilidad, la comunidad proporciona [Gráficos Helm](https://helm.sh/) y archivos YAML, a través de los cuales puede desplegar Dify en Kubernetes. - -- [Gráfico Helm por @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) -- [Gráfico Helm por @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) -- [Gráfico Helm por @magicsong](https://github.com/magicsong/ai-charts) -- [Ficheros YAML por @Winson-030](https://github.com/Winson-030/dify-kubernetes) -- [Ficheros YAML por @wyy-holding](https://github.com/wyy-holding/dify-k8s) -- [🚀 ¡NUEVO! Archivos YAML (compatible con Dify v1.6.0) por @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) - -#### Uso de Terraform para el despliegue - -Despliega Dify en una plataforma en la nube con un solo clic utilizando [terraform](https://www.terraform.io/) - -##### Azure Global - -- [Azure Terraform por @nikawang](https://github.com/nikawang/dify-azure-terraform) - -##### Google Cloud - -- [Google Cloud Terraform por @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) - -#### Usando AWS CDK para el Despliegue - -Despliegue Dify en AWS usando [CDK](https://aws.amazon.com/cdk/) - -##### AWS - -- [AWS CDK por @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) -- [AWS CDK por @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) - -#### Alibaba Cloud - -[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) - -#### Alibaba Cloud Data Management - -Despliega Dify en Alibaba Cloud con un solo clic con [Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) - -#### Uso de Azure Devops Pipeline para implementar en AKS - -Implementa Dify en AKS con un clic usando [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) - -#### Implementación con Sealos - -Despliega Dify con un solo clic desde [Sealos App Store](https://sealos.io/products/app-store/dify/) +Para opciones de configuración personalizada, observabilidad y despliegue, consulta la [Configuración avanzada](ADVANCED_SETUP.md). ## Contribuir -Para aquellos que deseen contribuir con código, consulten nuestra [Guía de contribución](./CONTRIBUTING.md). -Al mismo tiempo, considera apoyar a Dify compartiéndolo en redes sociales y en eventos y conferencias. +Dify acepta contribuciones de todo tipo: -> Estamos buscando colaboradores para ayudar con la traducción de Dify a idiomas que no sean el mandarín o el inglés. Si estás interesado en ayudar, consulta el [README de i18n](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) para obtener más información y déjanos un comentario en el canal `global-users` de nuestro [Servidor de Comunidad en Discord](https://discord.gg/8Tpq4AcN9c). +- **Código**: Lee la [Guía de contribución](./CONTRIBUTING.md) y consulta las [incidencias para principiantes](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22). +- **Ideas y comentarios**: Inicia o únete a una [discusión en GitHub](https://github.com/langgenius/dify/discussions). +- **Traducciones**: Sigue la [guía de internacionalización](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) para añadir o actualizar un idioma. +- **Comunidad**: Comparte las aplicaciones que crees, ayuda a otros usuarios y da a conocer Dify. -**Contribuidores** +### Contribuidores - + Dify contributors -## Comunidad y Contacto +## Comunidad y contacto -- [Discusión en GitHub](https://github.com/langgenius/dify/discussions). Lo mejor para: compartir comentarios y hacer preguntas. -- [Reporte de problemas en GitHub](https://github.com/langgenius/dify/issues). Lo mejor para: errores que encuentres usando Dify.AI y propuestas de características. Consulta nuestra [Guía de contribución](./CONTRIBUTING.md). -- [Discord](https://discord.gg/FngNHpbcY7). Lo mejor para: compartir tus aplicaciones y pasar el rato con la comunidad. -- [X(Twitter)](https://twitter.com/dify_ai). Lo mejor para: compartir tus aplicaciones y pasar el rato con la comunidad. +Elige el canal que mejor se adapte a tu consulta: +- [GitHub Discussions](https://github.com/langgenius/dify/discussions): Obtén ayuda, comparte comentarios y propón ideas. +- [GitHub Issues](https://github.com/langgenius/dify/issues): Informa de errores reproducibles y sigue el trabajo de ingeniería. Lee la [Guía de contribución](./CONTRIBUTING.md) antes de abrir una incidencia. +- [Discord](https://discord.gg/FngNHpbcY7): Chatea en tiempo real, comparte tus aplicaciones y conecta con otros usuarios de Dify. +- [X](https://x.com/dify_ai): Sigue las noticias de versiones y las actualizaciones del proyecto. ## Historial de Estrellas [![Gráfico de Historial de Estrellas](https://api.star-history.com/svg?repos=langgenius/dify&type=Date)](https://star-history.com/#langgenius/dify&Date) diff --git a/docs/fr-FR/ADVANCED_SETUP.md b/docs/fr-FR/ADVANCED_SETUP.md new file mode 100644 index 00000000000..fa2d83b86fa --- /dev/null +++ b/docs/fr-FR/ADVANCED_SETUP.md @@ -0,0 +1,57 @@ +# Configuration avancée + +Si vous devez personnaliser la configuration, veuillez vous référer aux commentaires dans notre fichier [.env.example](../../docker/.env.example) et mettre à jour les valeurs correspondantes dans votre fichier `.env`. De plus, vous devrez peut-être apporter des modifications au fichier `docker-compose.yaml` lui-même, comme changer les versions d'image, les mappages de ports ou les montages de volumes, en fonction de votre environnement de déploiement et de vos exigences spécifiques. Après avoir effectué des modifications, veuillez réexécuter `docker-compose up -d`. Vous pouvez trouver la liste complète des variables d'environnement disponibles [ici](https://docs.dify.ai/getting-started/install-self-hosted/environments). + +## Surveillance des Métriques avec Grafana + +Importez le tableau de bord dans Grafana, en utilisant la base de données PostgreSQL de Dify comme source de données, pour surveiller les métriques avec une granularité d'applications, de locataires, de messages et plus. + +- [Tableau de bord Grafana par @bowenliang123](https://github.com/bowenliang123/dify-grafana-dashboard) + +## Déploiement avec Kubernetes + +Si vous souhaitez configurer une configuration haute disponibilité, la communauté fournit des [Helm Charts](https://helm.sh/) et des fichiers YAML, à travers lesquels vous pouvez déployer Dify sur Kubernetes. + +- [Helm Chart par @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) +- [Helm Chart par @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) +- [Helm Chart par @magicsong](https://github.com/magicsong/ai-charts) +- [Fichier YAML par @Winson-030](https://github.com/Winson-030/dify-kubernetes) +- [Fichier YAML par @wyy-holding](https://github.com/wyy-holding/dify-k8s) +- [🚀 NOUVEAU ! Fichiers YAML (compatible avec Dify v1.6.0) par @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) + +### Utilisation de Terraform pour le déploiement + +Déployez Dify sur une plateforme cloud en un clic en utilisant [terraform](https://www.terraform.io/) + +#### Azure Global + +- [Azure Terraform par @nikawang](https://github.com/nikawang/dify-azure-terraform) + +#### Google Cloud + +- [Google Cloud Terraform par @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) + +### Utilisation d'AWS CDK pour le déploiement + +Déployez Dify sur AWS en utilisant [CDK](https://aws.amazon.com/cdk/) + +#### AWS + +- [AWS CDK par @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) +- [AWS CDK par @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) + +### Alibaba Cloud + +[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) + +### Alibaba Cloud Data Management + +Déployez Dify en un clic sur Alibaba Cloud avec [Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) + +### Utilisation d'Azure Devops Pipeline pour déployer sur AKS + +Déployez Dify sur AKS en un clic en utilisant [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) + +### Déploiement avec Sealos + +Déployez Dify en un clic depuis le [Sealos App Store](https://sealos.io/products/app-store/dify/) diff --git a/docs/fr-FR/README.md b/docs/fr-FR/README.md index b3510ed20b2..8d9f3941f8e 100644 --- a/docs/fr-FR/README.md +++ b/docs/fr-FR/README.md @@ -107,7 +107,7 @@ Toutes les offres de Dify sont accompagnées d'API correspondantes, vous permett Mettez une étoile à Dify sur GitHub et soyez instantanément informé des nouvelles versions. -![star-us](https://github.com/langgenius/dify/assets/13230914/b823edc1-6388-4e25-ad45-2f6b187adbb4) +star ## Démarrage rapide @@ -132,82 +132,31 @@ Après l'exécution, vous pouvez accéder au tableau de bord Dify dans votre nav ## Prochaines étapes -Si vous devez personnaliser la configuration, veuillez vous référer aux commentaires dans notre fichier [.env.example](../../docker/.env.example) et mettre à jour les valeurs correspondantes dans votre fichier `.env`. De plus, vous devrez peut-être apporter des modifications au fichier `docker-compose.yaml` lui-même, comme changer les versions d'image, les mappages de ports ou les montages de volumes, en fonction de votre environnement de déploiement et de vos exigences spécifiques. Après avoir effectué des modifications, veuillez réexécuter `docker-compose up -d`. Vous pouvez trouver la liste complète des variables d'environnement disponibles [ici](https://docs.dify.ai/getting-started/install-self-hosted/environments). - -### Surveillance des Métriques avec Grafana - -Importez le tableau de bord dans Grafana, en utilisant la base de données PostgreSQL de Dify comme source de données, pour surveiller les métriques avec une granularité d'applications, de locataires, de messages et plus. - -- [Tableau de bord Grafana par @bowenliang123](https://github.com/bowenliang123/dify-grafana-dashboard) - -### Déploiement avec Kubernetes - -Si vous souhaitez configurer une configuration haute disponibilité, la communauté fournit des [Helm Charts](https://helm.sh/) et des fichiers YAML, à travers lesquels vous pouvez déployer Dify sur Kubernetes. - -- [Helm Chart par @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) -- [Helm Chart par @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) -- [Helm Chart par @magicsong](https://github.com/magicsong/ai-charts) -- [Fichier YAML par @Winson-030](https://github.com/Winson-030/dify-kubernetes) -- [Fichier YAML par @wyy-holding](https://github.com/wyy-holding/dify-k8s) -- [🚀 NOUVEAU ! Fichiers YAML (compatible avec Dify v1.6.0) par @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) - -#### Utilisation de Terraform pour le déploiement - -Déployez Dify sur une plateforme cloud en un clic en utilisant [terraform](https://www.terraform.io/) - -##### Azure Global - -- [Azure Terraform par @nikawang](https://github.com/nikawang/dify-azure-terraform) - -##### Google Cloud - -- [Google Cloud Terraform par @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) - -#### Utilisation d'AWS CDK pour le déploiement - -Déployez Dify sur AWS en utilisant [CDK](https://aws.amazon.com/cdk/) - -##### AWS - -- [AWS CDK par @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) -- [AWS CDK par @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) - -#### Alibaba Cloud - -[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) - -#### Alibaba Cloud Data Management - -Déployez Dify en un clic sur Alibaba Cloud avec [Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) - -#### Utilisation d'Azure Devops Pipeline pour déployer sur AKS - -Déployez Dify sur AKS en un clic en utilisant [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) - -#### Déploiement avec Sealos - -Déployez Dify en un clic depuis le [Sealos App Store](https://sealos.io/products/app-store/dify/) +Pour les options de configuration personnalisée, d’observabilité et de déploiement, consultez la page [Configuration avancée](ADVANCED_SETUP.md). ## Contribuer -Pour ceux qui souhaitent contribuer du code, consultez notre [Guide de contribution](./CONTRIBUTING.md). -Dans le même temps, veuillez envisager de soutenir Dify en le partageant sur les réseaux sociaux et lors d'événements et de conférences. +Dify accueille les contributions de toutes sortes : -> Nous recherchons des contributeurs pour aider à traduire Dify dans des langues autres que le mandarin ou l'anglais. Si vous êtes intéressé à aider, veuillez consulter le [README i18n](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) pour plus d'informations, et laissez-nous un commentaire dans le canal `global-users` de notre [Serveur communautaire Discord](https://discord.gg/8Tpq4AcN9c). +- **Code** : consultez le [guide de contribution](./CONTRIBUTING.md), puis parcourez les [issues accessibles aux nouveaux contributeurs](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22). +- **Idées et retours** : lancez ou rejoignez une [discussion GitHub](https://github.com/langgenius/dify/discussions). +- **Traductions** : suivez le [guide d’internationalisation](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) pour ajouter ou mettre à jour une langue. +- **Communauté** : partagez les applications que vous créez, aidez les autres utilisateurs et faites connaître Dify. -**Contributeurs** +### Contributeurs - + Dify contributors -## Communauté & Contact +## Communauté et contact -- [Discussion GitHub](https://github.com/langgenius/dify/discussions). Meilleur pour: partager des commentaires et poser des questions. -- [Problèmes GitHub](https://github.com/langgenius/dify/issues). Meilleur pour: les bogues que vous rencontrez en utilisant Dify.AI et les propositions de fonctionnalités. Consultez notre [Guide de contribution](./CONTRIBUTING.md). -- [Discord](https://discord.gg/FngNHpbcY7). Meilleur pour: partager vos applications et passer du temps avec la communauté. -- [X(Twitter)](https://twitter.com/dify_ai). Meilleur pour: partager vos applications et passer du temps avec la communauté. +Choisissez le canal le plus adapté à votre demande : +- [GitHub Discussions](https://github.com/langgenius/dify/discussions) : obtenez de l’aide, partagez vos retours et proposez des idées. +- [GitHub Issues](https://github.com/langgenius/dify/issues) : signalez des bogues reproductibles et suivez les travaux d’ingénierie. Consultez le [guide de contribution](./CONTRIBUTING.md) avant d’ouvrir une issue. +- [Discord](https://discord.gg/FngNHpbcY7) : échangez en temps réel, partagez vos applications et rencontrez d’autres utilisateurs de Dify. +- [X](https://x.com/dify_ai) : suivez les nouvelles versions et les actualités du projet. ## Historique des étoiles [![Graphique de l'historique des étoiles](https://api.star-history.com/svg?repos=langgenius/dify&type=Date)](https://star-history.com/#langgenius/dify&Date) diff --git a/docs/hi-IN/ADVANCED_SETUP.md b/docs/hi-IN/ADVANCED_SETUP.md new file mode 100644 index 00000000000..4f269270a9b --- /dev/null +++ b/docs/hi-IN/ADVANCED_SETUP.md @@ -0,0 +1,62 @@ +# उन्नत सेटअप + +## कस्टम कॉन्फ़िगरेशन + +यदि आपको कॉन्फ़िगरेशन को कस्टमाइज़ करने की आवश्यकता है, तो कृपया हमारी [.env.example](../../docker/.env.example) फ़ाइल में दिए गए टिप्पणियों (comments) को देखें और अपने `.env` फ़ाइल में संबंधित मानों को अपडेट करें।\ +इसके अतिरिक्त, आपको अपने विशेष डिप्लॉयमेंट वातावरण और आवश्यकताओं के आधार पर `docker-compose.yaml` फ़ाइल में भी बदलाव करने की आवश्यकता हो सकती है, जैसे इमेज संस्करण, पोर्ट मैपिंग या वॉल्यूम माउंट्स बदलना।\ +कोई भी बदलाव करने के बाद, कृपया `docker-compose up -d` कमांड को पुनः चलाएँ।\ +उपलब्ध सभी environment variables की पूरी सूची [here](https://docs.dify.ai/getting-started/install-self-hosted/environments) पर पाई जा सकती है। + +## Grafana के साथ मेट्रिक्स मॉनिटरिंग + +Grafana में Dify के PostgreSQL डेटाबेस को डेटा स्रोत के रूप में उपयोग करते हुए डैशबोर्ड आयात करें, ताकि आप ऐप्स, टेनेंट्स, संदेशों आदि के स्तर पर मेट्रिक्स की निगरानी कर सकें। + +- [Grafana Dashboard by @bowenliang123](https://github.com/bowenliang123/dify-grafana-dashboard) + +## Kubernetes के साथ डिप्लॉयमेंट + +यदि आप उच्च उपलब्धता (high-availability) सेटअप कॉन्फ़िगर करना चाहते हैं, तो समुदाय द्वारा योगदान किए गए [Helm Charts](https://helm.sh/) और YAML फ़ाइलें उपलब्ध हैं जो Dify को Kubernetes पर डिप्लॉय करने की अनुमति देती हैं। + +- [Helm Chart by @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) +- [Helm Chart by @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) +- [Helm Chart by @magicsong](https://github.com/magicsong/ai-charts) +- [YAML file by @Winson-030](https://github.com/Winson-030/dify-kubernetes) +- [YAML file by @wyy-holding](https://github.com/wyy-holding/dify-k8s) +- [🚀 NEW! YAML files (Supports Dify v1.6.0) by @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) + +### डिप्लॉयमेंट के लिए Terraform का उपयोग + +[terraform](https://www.terraform.io/) का उपयोग करके एक क्लिक में Dify को क्लाउड प्लेटफ़ॉर्म पर डिप्लॉय करें। + +#### Azure Global + +- [Azure Terraform by @nikawang](https://github.com/nikawang/dify-azure-terraform) + +#### Google Cloud + +- [Google Cloud Terraform by @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) + +### डिप्लॉयमेंट के लिए AWS CDK का उपयोग + +[CDK](https://aws.amazon.com/cdk/) का उपयोग करके Dify को AWS पर डिप्लॉय करें। + +#### AWS + +- [AWS CDK by @KevinZhao (EKS आधारित)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) +- [AWS CDK by @tmokmss (ECS आधारित)](https://github.com/aws-samples/dify-self-hosted-on-aws) + +### Alibaba Cloud Computing Nest का उपयोग + +[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) के साथ Dify को Alibaba Cloud पर तेज़ी से डिप्लॉय करें। + +### Alibaba Cloud Data Management का उपयोग + +[Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) के साथ एक क्लिक में Dify को Alibaba Cloud पर डिप्लॉय करें। + +### Azure Devops Pipeline के साथ AKS पर डिप्लॉय करें + +[Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) के साथ एक क्लिक में Dify को AKS पर डिप्लॉय करें। + +### Sealos के साथ डिप्लॉय करें + +[Sealos App Store](https://sealos.io/products/app-store/dify/) के साथ एक क्लिक में Dify को डिप्लॉय करें। diff --git a/docs/hi-IN/README.md b/docs/hi-IN/README.md index ab6ee18df52..747987f3a47 100644 --- a/docs/hi-IN/README.md +++ b/docs/hi-IN/README.md @@ -134,92 +134,35 @@ Dify की सभी सेवाएँ संबंधित APIs के स GitHub पर Dify को स्टार करें और नए रिलीज़ की सूचना तुरंत प्राप्त करें। -![star-us](https://github.com/langgenius/dify/assets/13230914/b823edc1-6388-4e25-ad45-2f6b187adbb4) +star ## उन्नत सेटअप -### कस्टम कॉन्फ़िगरेशन - -यदि आपको कॉन्फ़िगरेशन को कस्टमाइज़ करने की आवश्यकता है, तो कृपया हमारी [.env.example](../../docker/.env.example) फ़ाइल में दिए गए टिप्पणियों (comments) को देखें और अपने `.env` फ़ाइल में संबंधित मानों को अपडेट करें।\ -इसके अतिरिक्त, आपको अपने विशेष डिप्लॉयमेंट वातावरण और आवश्यकताओं के आधार पर `docker-compose.yaml` फ़ाइल में भी बदलाव करने की आवश्यकता हो सकती है, जैसे इमेज संस्करण, पोर्ट मैपिंग या वॉल्यूम माउंट्स बदलना।\ -कोई भी बदलाव करने के बाद, कृपया `docker-compose up -d` कमांड को पुनः चलाएँ।\ -उपलब्ध सभी environment variables की पूरी सूची [here](https://docs.dify.ai/getting-started/install-self-hosted/environments) पर पाई जा सकती है। - -### Grafana के साथ मेट्रिक्स मॉनिटरिंग - -Grafana में Dify के PostgreSQL डेटाबेस को डेटा स्रोत के रूप में उपयोग करते हुए डैशबोर्ड आयात करें, ताकि आप ऐप्स, टेनेंट्स, संदेशों आदि के स्तर पर मेट्रिक्स की निगरानी कर सकें। - -- [Grafana Dashboard by @bowenliang123](https://github.com/bowenliang123/dify-grafana-dashboard) - -### Kubernetes के साथ डिप्लॉयमेंट - -यदि आप उच्च उपलब्धता (high-availability) सेटअप कॉन्फ़िगर करना चाहते हैं, तो समुदाय द्वारा योगदान किए गए [Helm Charts](https://helm.sh/) और YAML फ़ाइलें उपलब्ध हैं जो Dify को Kubernetes पर डिप्लॉय करने की अनुमति देती हैं। - -- [Helm Chart by @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) -- [Helm Chart by @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) -- [Helm Chart by @magicsong](https://github.com/magicsong/ai-charts) -- [YAML file by @Winson-030](https://github.com/Winson-030/dify-kubernetes) -- [YAML file by @wyy-holding](https://github.com/wyy-holding/dify-k8s) -- [🚀 NEW! YAML files (Supports Dify v1.6.0) by @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) - -#### डिप्लॉयमेंट के लिए Terraform का उपयोग - -[terraform](https://www.terraform.io/) का उपयोग करके एक क्लिक में Dify को क्लाउड प्लेटफ़ॉर्म पर डिप्लॉय करें। - -##### Azure Global - -- [Azure Terraform by @nikawang](https://github.com/nikawang/dify-azure-terraform) - -##### Google Cloud - -- [Google Cloud Terraform by @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) - -#### डिप्लॉयमेंट के लिए AWS CDK का उपयोग - -[CDK](https://aws.amazon.com/cdk/) का उपयोग करके Dify को AWS पर डिप्लॉय करें। - -##### AWS - -- [AWS CDK by @KevinZhao (EKS आधारित)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) -- [AWS CDK by @tmokmss (ECS आधारित)](https://github.com/aws-samples/dify-self-hosted-on-aws) - -#### Alibaba Cloud Computing Nest का उपयोग - -[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) के साथ Dify को Alibaba Cloud पर तेज़ी से डिप्लॉय करें। - -#### Alibaba Cloud Data Management का उपयोग - -[Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) के साथ एक क्लिक में Dify को Alibaba Cloud पर डिप्लॉय करें। - -#### Azure Devops Pipeline के साथ AKS पर डिप्लॉय करें - -[Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) के साथ एक क्लिक में Dify को AKS पर डिप्लॉय करें। - -#### Sealos के साथ डिप्लॉय करें - -[Sealos App Store](https://sealos.io/products/app-store/dify/) के साथ एक क्लिक में Dify को डिप्लॉय करें। +कस्टम कॉन्फ़िगरेशन, ऑब्ज़र्वेबिलिटी और डिप्लॉयमेंट विकल्पों के लिए, [उन्नत सेटअप](ADVANCED_SETUP.md) देखें। ## योगदान (Contributing) -जो लोग कोड में योगदान देना चाहते हैं, वे हमारे [Contribution Guide](./CONTRIBUTING.md) को देखें।\ -साथ ही, कृपया Dify को सोशल मीडिया, कार्यक्रमों और सम्मेलनों में साझा करके इसका समर्थन करने पर विचार करें। +Dify सभी प्रकार के योगदानों का स्वागत करता है: -> हम ऐसे योगदानकर्ताओं की तलाश कर रहे हैं जो Dify को मंदारिन या अंग्रेज़ी के अलावा अन्य भाषाओं में अनुवाद करने में मदद कर सकें।\ -> यदि आप सहायता करने में रुचि रखते हैं, तो अधिक जानकारी के लिए [i18n README](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) देखें, और हमारे [Discord Community Server](https://discord.gg/8Tpq4AcN9c) के `global-users` चैनल में हमें संदेश दें। +- **कोड**: [Contribution Guide](./CONTRIBUTING.md) पढ़ें, फिर [नए योगदानकर्ताओं के लिए उपयुक्त issues](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22) देखें। +- **विचार और प्रतिक्रिया**: [GitHub Discussion](https://github.com/langgenius/dify/discussions) शुरू करें या किसी मौजूदा चर्चा में शामिल हों। +- **अनुवाद**: किसी locale को जोड़ने या अपडेट करने के लिए [internationalization guide](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) का पालन करें। +- **समुदाय**: अपने बनाए हुए ऐप साझा करें, अन्य उपयोगकर्ताओं की मदद करें और Dify के बारे में लोगों को बताएं। + +### योगदानकर्ता + + + Dify contributors + ## समुदाय और संपर्क (Community & contact) -- [GitHub Discussion](https://github.com/langgenius/dify/discussions) — सर्वोत्तम उपयोग के लिए: प्रतिक्रिया साझा करने और प्रश्न पूछने हेतु। -- [GitHub Issues](https://github.com/langgenius/dify/issues) — सर्वोत्तम उपयोग के लिए: Dify.AI का उपयोग करते समय आने वाली बग्स या फीचर सुझावों के लिए। देखें: [Contribution Guide](../../CONTRIBUTING.md)। -- [Discord](https://discord.gg/FngNHpbcY7) — सर्वोत्तम उपयोग के लिए: अपने एप्लिकेशन साझा करने और समुदाय के साथ जुड़ने के लिए। -- [X(Twitter)](https://twitter.com/dify_ai) — सर्वोत्तम उपयोग के लिए: अपने एप्लिकेशन साझा करने और समुदाय से जुड़े रहने के लिए। - -**योगदानकर्ता** - - - - +अपने प्रश्न के लिए सबसे उपयुक्त माध्यम चुनें: +- [GitHub Discussions](https://github.com/langgenius/dify/discussions): सहायता प्राप्त करें, प्रतिक्रिया साझा करें और विचार सुझाएँ। +- [GitHub Issues](https://github.com/langgenius/dify/issues): दोहराए जा सकने वाले bugs की रिपोर्ट करें और engineering work को ट्रैक करें। Issue खोलने से पहले [Contribution Guide](./CONTRIBUTING.md) पढ़ें। +- [Discord](https://discord.gg/FngNHpbcY7): रीयल टाइम में बातचीत करें, अपने ऐप साझा करें और अन्य Dify उपयोगकर्ताओं से जुड़ें। +- [X](https://x.com/dify_ai): रिलीज़ समाचार और प्रोजेक्ट अपडेट के लिए Dify को फ़ॉलो करें। ## स्टार इतिहास (Star history) [![Star History Chart](https://api.star-history.com/svg?repos=langgenius/dify&type=Date)](https://star-history.com/#langgenius/dify&Date) diff --git a/docs/it-IT/ADVANCED_SETUP.md b/docs/it-IT/ADVANCED_SETUP.md new file mode 100644 index 00000000000..7638985cdcd --- /dev/null +++ b/docs/it-IT/ADVANCED_SETUP.md @@ -0,0 +1,57 @@ +# Configurazioni Avanzate + +Se dovete personalizzare la configurazione, leggete i commenti nel nostro file [.env.example](../../docker/.env.example) e aggiornate i valori corrispondenti nel vostro file `.env`. Inoltre, potrebbe essere necessario apportare modifiche al file `docker-compose.yaml`, come cambiare le versioni delle immagini, le mappature delle porte o i mount dei volumi, a seconda del vostro ambiente di distribuzione specifico e dei vostri requisiti. Dopo aver apportato le modifiche, riavviate `docker-compose up -d`. L'elenco completo delle variabili d'ambiente disponibili è disponibile [qui](https://docs.dify.ai/getting-started/install-self-hosted/environments). + +## Monitoraggio delle Metriche con Grafana + +Importate la dashboard in Grafana, utilizzando il database PostgreSQL di Dify come origine dati, per monitorare le metriche a livello di app, tenant, messaggi e altro ancora. + +- [Dashboard Grafana di @bowenliang123](https://github.com/bowenliang123/dify-grafana-dashboard) + +## Distribuzione con Kubernetes + +Se desiderate configurare un'installazione ad alta disponibilità, ci sono [Helm Charts](https://helm.sh/) e file YAML forniti dalla community che consentono di distribuire Dify su Kubernetes. + +- [Helm Chart di @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) +- [Helm Chart di @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) +- [Helm Chart di @magicsong](https://github.com/magicsong/ai-charts) +- [File YAML di @Winson-030](https://github.com/Winson-030/dify-kubernetes) +- [File YAML di @wyy-holding](https://github.com/wyy-holding/dify-k8s) +- [🚀 NUOVO! File YAML (Supporta Dify v1.6.0) di @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) + +### Utilizzo di Terraform per la Distribuzione + +Distribuite Dify con un solo clic su una piattaforma cloud utilizzando [terraform](https://www.terraform.io/). + +#### Azure Global + +- [Azure Terraform di @nikawang](https://github.com/nikawang/dify-azure-terraform) + +#### Google Cloud + +- [Google Cloud Terraform di @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) + +### Utilizzo di AWS CDK per la Distribuzione + +Distribuzione di Dify su AWS con [CDK](https://aws.amazon.com/cdk/) + +#### AWS + +- [AWS CDK di @KevinZhao (basato su EKS)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) +- [AWS CDK di @tmokmss (basato su ECS)](https://github.com/aws-samples/dify-self-hosted-on-aws) + +### Alibaba Cloud + +[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) + +### Alibaba Cloud Data Management + +Distribuzione con un clic di Dify su Alibaba Cloud con [Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) + +### Utilizzo di Azure DevOps Pipeline per la Distribuzione su AKS + +Distribuite Dify con un clic in AKS utilizzando [Azure DevOps Pipeline Helm Chart di @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) + +### Distribuzione con Sealos + +Distribuite Dify con un clic tramite [Sealos App Store](https://sealos.io/products/app-store/dify/) diff --git a/docs/it-IT/README.md b/docs/it-IT/README.md index 061d3f557f0..0d258a07707 100644 --- a/docs/it-IT/README.md +++ b/docs/it-IT/README.md @@ -132,85 +132,35 @@ Tutte le offerte di Dify sono dotate di API corrispondenti, permettendovi di int Mettete una stella a Dify su GitHub e ricevete notifiche immediate sui nuovi rilasci. -![star-us](https://github.com/langgenius/dify/assets/13230914/b823edc1-6388-4e25-ad45-2f6b187adbb4) +star ## Configurazioni Avanzate -Se dovete personalizzare la configurazione, leggete i commenti nel nostro file [.env.example](../../docker/.env.example) e aggiornate i valori corrispondenti nel vostro file `.env`. Inoltre, potrebbe essere necessario apportare modifiche al file `docker-compose.yaml`, come cambiare le versioni delle immagini, le mappature delle porte o i mount dei volumi, a seconda del vostro ambiente di distribuzione specifico e dei vostri requisiti. Dopo aver apportato le modifiche, riavviate `docker-compose up -d`. L'elenco completo delle variabili d'ambiente disponibili è disponibile [qui](https://docs.dify.ai/getting-started/install-self-hosted/environments). - -### Monitoraggio delle Metriche con Grafana - -Importate la dashboard in Grafana, utilizzando il database PostgreSQL di Dify come origine dati, per monitorare le metriche a livello di app, tenant, messaggi e altro ancora. - -- [Dashboard Grafana di @bowenliang123](https://github.com/bowenliang123/dify-grafana-dashboard) - -### Distribuzione con Kubernetes - -Se desiderate configurare un'installazione ad alta disponibilità, ci sono [Helm Charts](https://helm.sh/) e file YAML forniti dalla community che consentono di distribuire Dify su Kubernetes. - -- [Helm Chart di @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) -- [Helm Chart di @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) -- [Helm Chart di @magicsong](https://github.com/magicsong/ai-charts) -- [File YAML di @Winson-030](https://github.com/Winson-030/dify-kubernetes) -- [File YAML di @wyy-holding](https://github.com/wyy-holding/dify-k8s) -- [🚀 NUOVO! File YAML (Supporta Dify v1.6.0) di @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) - -#### Utilizzo di Terraform per la Distribuzione - -Distribuite Dify con un solo clic su una piattaforma cloud utilizzando [terraform](https://www.terraform.io/). - -##### Azure Global - -- [Azure Terraform di @nikawang](https://github.com/nikawang/dify-azure-terraform) - -##### Google Cloud - -- [Google Cloud Terraform di @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) - -#### Utilizzo di AWS CDK per la Distribuzione - -Distribuzione di Dify su AWS con [CDK](https://aws.amazon.com/cdk/) - -##### AWS - -- [AWS CDK di @KevinZhao (basato su EKS)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) -- [AWS CDK di @tmokmss (basato su ECS)](https://github.com/aws-samples/dify-self-hosted-on-aws) - -#### Alibaba Cloud - -[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) - -#### Alibaba Cloud Data Management - -Distribuzione con un clic di Dify su Alibaba Cloud con [Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) - -#### Utilizzo di Azure DevOps Pipeline per la Distribuzione su AKS - -Distribuite Dify con un clic in AKS utilizzando [Azure DevOps Pipeline Helm Chart di @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) - -#### Distribuzione con Sealos - -Distribuite Dify con un clic tramite [Sealos App Store](https://sealos.io/products/app-store/dify/) +Per le opzioni di configurazione personalizzata, osservabilità e distribuzione, consulta le [Configurazioni avanzate](ADVANCED_SETUP.md). ## Contribuire -Se desiderate contribuire con codice, leggete la nostra [Guida ai Contributi](../../CONTRIBUTING.md). Allo stesso tempo, vi chiediamo di supportare Dify condividendolo sui social media e presentandolo a eventi e conferenze. +Dify accoglie contributi di ogni tipo: -> Cerchiamo collaboratori che aiutino a tradurre Dify in altre lingue oltre al mandarino o all'inglese. Se siete interessati a collaborare, leggete il [README i18n](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) per ulteriori informazioni e lasciate un commento nel canale `global-users` del nostro [server della community Discord](https://discord.gg/8Tpq4AcN9c). +- **Codice**: leggi la [Guida ai contributi](../../CONTRIBUTING.md), quindi consulta le [issue adatte ai nuovi contributori](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22). +- **Idee e feedback**: avvia o partecipa a una [discussione su GitHub](https://github.com/langgenius/dify/discussions). +- **Traduzioni**: segui la [guida all’internazionalizzazione](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) per aggiungere o aggiornare una lingua. +- **Community**: condividi le app che crei, aiuta gli altri utenti e fai conoscere Dify. -## Community & Contatti - -- [GitHub Discussion](https://github.com/langgenius/dify/discussions). Ideale per: condividere feedback e porre domande. -- [GitHub Issues](https://github.com/langgenius/dify/issues). Ideale per: bug che riscontrate durante l'utilizzo di Dify.AI e proposte di funzionalità. Consultate la nostra [Guida ai Contributi](../../CONTRIBUTING.md). -- [Discord](https://discord.gg/FngNHpbcY7). Ideale per: condividere le vostre applicazioni e interagire con la community. -- [X(Twitter)](https://twitter.com/dify_ai). Ideale per: condividere le vostre applicazioni e interagire con la community. - -**Collaboratori** +### Collaboratori - + Dify contributors +## Community e contatti + +Scegli il canale più adatto alla tua richiesta: + +- [GitHub Discussions](https://github.com/langgenius/dify/discussions): ricevi assistenza, condividi feedback e proponi idee. +- [GitHub Issues](https://github.com/langgenius/dify/issues): segnala bug riproducibili e segui il lavoro di sviluppo. Leggi la [Guida ai contributi](../../CONTRIBUTING.md) prima di aprire una issue. +- [Discord](https://discord.gg/FngNHpbcY7): chatta in tempo reale, condividi le tue app e incontra altri utenti Dify. +- [X](https://x.com/dify_ai): segui le notizie sulle release e gli aggiornamenti del progetto. ## Storia delle Stelle [![Star History Chart](https://api.star-history.com/svg?repos=langgenius/dify&type=Date)](https://star-history.com/#langgenius/dify&Date) diff --git a/docs/ja-JP/ADVANCED_SETUP.md b/docs/ja-JP/ADVANCED_SETUP.md new file mode 100644 index 00000000000..48d3fc9fc90 --- /dev/null +++ b/docs/ja-JP/ADVANCED_SETUP.md @@ -0,0 +1,57 @@ +# 高度なセットアップ + +設定をカスタマイズする必要がある場合は、[.env.example](../../docker/.env.example) ファイルのコメントを参照し、`.env` ファイルの対応する値を更新してください。さらに、デプロイ環境や要件に応じて、`docker-compose.yaml` ファイル自体を調整する必要がある場合があります。たとえば、イメージのバージョン、ポートのマッピング、ボリュームのマウントなどを変更します。変更を加えた後は、`docker-compose up -d` を再実行してください。利用可能な環境変数の全一覧は、[こちら](https://docs.dify.ai/getting-started/install-self-hosted/environments)で確認できます。 + +## Grafanaを使用したメトリクス監視 + +Grafanaにダッシュボードをインポートし、DifyのPostgreSQLデータベースをデータソースとして使用して、アプリ、テナント、メッセージなどの粒度でメトリクスを監視します。 + +- [@bowenliang123によるGrafanaダッシュボード](https://github.com/bowenliang123/dify-grafana-dashboard) + +## Kubernetesでのデプロイ + +高可用性設定を設定する必要がある場合、コミュニティは[Helm Charts](https://helm.sh/)とYAMLファイルにより、DifyをKubernetesにデプロイすることができます。 + +- [Helm Chart by @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) +- [Helm Chart by @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) +- [Helm Chart by @magicsong](https://github.com/magicsong/ai-charts) +- [YAML file by @Winson-030](https://github.com/Winson-030/dify-kubernetes) +- [YAML file by @wyy-holding](https://github.com/wyy-holding/dify-k8s) +- [🚀 新着!YAML ファイル(Dify v1.6.0 対応)by @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) + +### Terraformを使用したデプロイ + +[terraform](https://www.terraform.io/) を使用して、ワンクリックでDifyをクラウドプラットフォームにデプロイします + +#### Azure Global + +- [@nikawangによるAzure Terraform](https://github.com/nikawang/dify-azure-terraform) + +#### Google Cloud + +- [@sotazumによるGoogle Cloud Terraform](https://github.com/DeNA/dify-google-cloud-terraform) + +### AWS CDK を使用したデプロイ + +[CDK](https://aws.amazon.com/cdk/) を使用して、DifyをAWSにデプロイします + +#### AWS + +- [@KevinZhaoによるAWS CDK (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) +- [@tmokmssによるAWS CDK (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) + +### Alibaba Cloud + +[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) + +### Alibaba Cloud Data Management + +[Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) を利用して、DifyをAlibaba Cloudへワンクリックでデプロイできます + +### AKSへのデプロイにAzure Devops Pipelineを使用 + +[Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS)を使用してDifyをAKSにワンクリックでデプロイ + +### Sealosを使用したデプロイ + +[Sealos App Store](https://sealos.io/products/app-store/dify/)を使用してDifyをワンクリックでデプロイできます diff --git a/docs/ja-JP/README.md b/docs/ja-JP/README.md index 31733fea7b6..fe1ea07c551 100644 --- a/docs/ja-JP/README.md +++ b/docs/ja-JP/README.md @@ -108,7 +108,7 @@ LLM Function CallingやReActに基づくエージェントの定義が可能で GitHub上でDifyにスターを付けることで、Difyに関する新しいニュースを受け取れます。 -![star-us](https://github.com/langgenius/dify/assets/13230914/b823edc1-6388-4e25-ad45-2f6b187adbb4) +star ## クイックスタート @@ -133,82 +133,31 @@ docker compose up -d ## 次のステップ -設定をカスタマイズする必要がある場合は、[.env.example](../../docker/.env.example) ファイルのコメントを参照し、`.env` ファイルの対応する値を更新してください。さらに、デプロイ環境や要件に応じて、`docker-compose.yaml` ファイル自体を調整する必要がある場合があります。たとえば、イメージのバージョン、ポートのマッピング、ボリュームのマウントなどを変更します。変更を加えた後は、`docker-compose up -d` を再実行してください。利用可能な環境変数の全一覧は、[こちら](https://docs.dify.ai/getting-started/install-self-hosted/environments)で確認できます。 - -### Grafanaを使用したメトリクス監視 - -Grafanaにダッシュボードをインポートし、DifyのPostgreSQLデータベースをデータソースとして使用して、アプリ、テナント、メッセージなどの粒度でメトリクスを監視します。 - -- [@bowenliang123によるGrafanaダッシュボード](https://github.com/bowenliang123/dify-grafana-dashboard) - -### Kubernetesでのデプロイ - -高可用性設定を設定する必要がある場合、コミュニティは[Helm Charts](https://helm.sh/)とYAMLファイルにより、DifyをKubernetesにデプロイすることができます。 - -- [Helm Chart by @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) -- [Helm Chart by @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) -- [Helm Chart by @magicsong](https://github.com/magicsong/ai-charts) -- [YAML file by @Winson-030](https://github.com/Winson-030/dify-kubernetes) -- [YAML file by @wyy-holding](https://github.com/wyy-holding/dify-k8s) -- [🚀 新着!YAML ファイル(Dify v1.6.0 対応)by @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) - -#### Terraformを使用したデプロイ - -[terraform](https://www.terraform.io/) を使用して、ワンクリックでDifyをクラウドプラットフォームにデプロイします - -##### Azure Global - -- [@nikawangによるAzure Terraform](https://github.com/nikawang/dify-azure-terraform) - -##### Google Cloud - -- [@sotazumによるGoogle Cloud Terraform](https://github.com/DeNA/dify-google-cloud-terraform) - -#### AWS CDK を使用したデプロイ - -[CDK](https://aws.amazon.com/cdk/) を使用して、DifyをAWSにデプロイします - -##### AWS - -- [@KevinZhaoによるAWS CDK (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) -- [@tmokmssによるAWS CDK (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) - -#### Alibaba Cloud - -[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) - -#### Alibaba Cloud Data Management - -[Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) を利用して、DifyをAlibaba Cloudへワンクリックでデプロイできます - -#### AKSへのデプロイにAzure Devops Pipelineを使用 - -[Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS)を使用してDifyをAKSにワンクリックでデプロイ - -#### Sealosを使用したデプロイ - -[Sealos App Store](https://sealos.io/products/app-store/dify/)を使用してDifyをワンクリックでデプロイできます +カスタム構成、オブザーバビリティ、デプロイのオプションについては、[高度なセットアップ](ADVANCED_SETUP.md)を参照してください。 ## 貢献 -コードに貢献したい方は、[Contribution Guide](./CONTRIBUTING.md)を参照してください。 -同時に、DifyをSNSやイベント、カンファレンスで共有してサポートしていただけると幸いです。 +Difyでは、あらゆる形の貢献を歓迎しています。 -> Difyを英語または中国語以外の言語に翻訳してくれる貢献者を募集しています。興味がある場合は、詳細については[i18n README](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md)を参照してください。また、[Discordコミュニティサーバー](https://discord.gg/8Tpq4AcN9c)の`global-users`チャンネルにコメントを残してください。 +- **コード**:[コントリビューションガイド](./CONTRIBUTING.md)を読み、[good first issue](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22)を確認してください。 +- **アイデアとフィードバック**:[GitHub Discussions](https://github.com/langgenius/dify/discussions)で新しい議論を始めるか、既存の議論に参加してください。 +- **翻訳**:言語の追加や更新については、[国際化ガイド](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md)に従ってください。 +- **コミュニティ**:作成したアプリを共有し、他のユーザーを支援し、Difyを広めてください。 -**貢献者** +### 貢献者 - + Dify contributors ## コミュニティ & お問い合わせ -- [GitHub Discussion](https://github.com/langgenius/dify/discussions). 主に: フィードバックの共有や質問。 -- [GitHub Issues](https://github.com/langgenius/dify/issues). 主に: Dify.AIを使用する際に発生するエラーや問題については、[貢献ガイド](./CONTRIBUTING.md)を参照してください -- [Discord](https://discord.gg/FngNHpbcY7). 主に: アプリケーションの共有やコミュニティとの交流。 -- [X(Twitter)](https://twitter.com/dify_ai). 主に: アプリケーションの共有やコミュニティとの交流。 +目的に合った窓口を選んでください。 +- [GitHub Discussions](https://github.com/langgenius/dify/discussions):質問、フィードバックの共有、アイデアの提案にご利用ください。 +- [GitHub Issues](https://github.com/langgenius/dify/issues):再現可能なバグの報告と開発作業の追跡にご利用ください。Issueを作成する前に[コントリビューションガイド](./CONTRIBUTING.md)をお読みください。 +- [Discord](https://discord.gg/FngNHpbcY7):リアルタイムで会話し、アプリを共有し、他のDifyユーザーと交流できます。 +- [X](https://x.com/dify_ai):リリース情報やプロジェクトの最新情報を確認できます。 ## ライセンス このリポジトリは、Dify Open Source License にいくつかの追加制限を加えた[Difyオープンソースライセンス](../../LICENSE)の下で利用可能です。 diff --git a/docs/ko-KR/ADVANCED_SETUP.md b/docs/ko-KR/ADVANCED_SETUP.md new file mode 100644 index 00000000000..84aeb06ef1e --- /dev/null +++ b/docs/ko-KR/ADVANCED_SETUP.md @@ -0,0 +1,57 @@ +# 고급 설정 + +구성을 사용자 정의해야 하는 경우 [.env.example](../../docker/.env.example) 파일의 주석을 참조하고 `.env` 파일에서 해당 값을 업데이트하십시오. 또한 특정 배포 환경 및 요구 사항에 따라 `docker-compose.yaml` 파일 자체를 조정해야 할 수도 있습니다. 예를 들어 이미지 버전, 포트 매핑 또는 볼륨 마운트를 변경합니다. 변경 한 후 `docker-compose up -d`를 다시 실행하십시오. 사용 가능한 환경 변수의 전체 목록은 [여기](https://docs.dify.ai/getting-started/install-self-hosted/environments)에서 찾을 수 있습니다. + +## Grafana를 사용한 메트릭 모니터링 + +Dify의 PostgreSQL 데이터베이스를 데이터 소스로 사용하여 앱, 테넌트, 메시지 등에 대한 세분화된 메트릭을 모니터링하기 위해 대시보드를 Grafana로 가져옵니다. + +- [@bowenliang123의 Grafana 대시보드](https://github.com/bowenliang123/dify-grafana-dashboard) + +## Kubernetes를 통한 배포 + +Dify를 Kubernetes에 배포하고 프리미엄 스케일링 설정을 구성했다는 커뮤니티가 제공하는 [Helm Charts](https://helm.sh/)와 YAML 파일이 존재합니다. + +- [Helm Chart by @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) +- [Helm Chart by @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) +- [Helm Chart by @magicsong](https://github.com/magicsong/ai-charts) +- [YAML file by @Winson-030](https://github.com/Winson-030/dify-kubernetes) +- [YAML file by @wyy-holding](https://github.com/wyy-holding/dify-k8s) +- [🚀 NEW! YAML files (Supports Dify v1.6.0) by @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) + +### Terraform을 사용한 배포 + +[terraform](https://www.terraform.io/)을 사용하여 단 한 번의 클릭으로 Dify를 클라우드 플랫폼에 배포하십시오 + +#### Azure Global + +- [nikawang의 Azure Terraform](https://github.com/nikawang/dify-azure-terraform) + +#### Google Cloud + +- [sotazum의 Google Cloud Terraform](https://github.com/DeNA/dify-google-cloud-terraform) + +### AWS CDK를 사용한 배포 + +[CDK](https://aws.amazon.com/cdk/)를 사용하여 AWS에 Dify 배포 + +#### AWS + +- [KevinZhao의 AWS CDK (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) +- [tmokmss의 AWS CDK (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) + +### Alibaba Cloud + +[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) + +### Alibaba Cloud Data Management + +[Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/)를 통해 원클릭으로 Dify를 Alibaba Cloud에 배포할 수 있습니다 + +### AKS에 배포하기 위해 Azure Devops Pipeline 사용 + +[Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS)을 사용하여 Dify를 AKS에 원클릭으로 배포 + +### Sealos를 사용한 배포 + +[Sealos App Store](https://sealos.io/products/app-store/dify/)를 사용하여 Dify를 원클릭으로 배포할 수 있습니다 diff --git a/docs/ko-KR/README.md b/docs/ko-KR/README.md index bc52318d120..40638aa2449 100644 --- a/docs/ko-KR/README.md +++ b/docs/ko-KR/README.md @@ -101,7 +101,7 @@ Dify의 모든 제품에는 해당 API가 함께 제공되므로 Dify를 자신 GitHub에서 Dify에 별표를 찍어 새로운 릴리스를 즉시 알림 받으세요. -![star-us](https://github.com/langgenius/dify/assets/13230914/b823edc1-6388-4e25-ad45-2f6b187adbb4) +star ## 빠른 시작 @@ -126,82 +126,31 @@ docker compose up -d ## 다음 단계 -구성을 사용자 정의해야 하는 경우 [.env.example](../../docker/.env.example) 파일의 주석을 참조하고 `.env` 파일에서 해당 값을 업데이트하십시오. 또한 특정 배포 환경 및 요구 사항에 따라 `docker-compose.yaml` 파일 자체를 조정해야 할 수도 있습니다. 예를 들어 이미지 버전, 포트 매핑 또는 볼륨 마운트를 변경합니다. 변경 한 후 `docker-compose up -d`를 다시 실행하십시오. 사용 가능한 환경 변수의 전체 목록은 [여기](https://docs.dify.ai/getting-started/install-self-hosted/environments)에서 찾을 수 있습니다. - -### Grafana를 사용한 메트릭 모니터링 - -Dify의 PostgreSQL 데이터베이스를 데이터 소스로 사용하여 앱, 테넌트, 메시지 등에 대한 세분화된 메트릭을 모니터링하기 위해 대시보드를 Grafana로 가져옵니다. - -- [@bowenliang123의 Grafana 대시보드](https://github.com/bowenliang123/dify-grafana-dashboard) - -### Kubernetes를 통한 배포 - -Dify를 Kubernetes에 배포하고 프리미엄 스케일링 설정을 구성했다는 커뮤니티가 제공하는 [Helm Charts](https://helm.sh/)와 YAML 파일이 존재합니다. - -- [Helm Chart by @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) -- [Helm Chart by @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) -- [Helm Chart by @magicsong](https://github.com/magicsong/ai-charts) -- [YAML file by @Winson-030](https://github.com/Winson-030/dify-kubernetes) -- [YAML file by @wyy-holding](https://github.com/wyy-holding/dify-k8s) -- [🚀 NEW! YAML files (Supports Dify v1.6.0) by @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) - -#### Terraform을 사용한 배포 - -[terraform](https://www.terraform.io/)을 사용하여 단 한 번의 클릭으로 Dify를 클라우드 플랫폼에 배포하십시오 - -##### Azure Global - -- [nikawang의 Azure Terraform](https://github.com/nikawang/dify-azure-terraform) - -##### Google Cloud - -- [sotazum의 Google Cloud Terraform](https://github.com/DeNA/dify-google-cloud-terraform) - -#### AWS CDK를 사용한 배포 - -[CDK](https://aws.amazon.com/cdk/)를 사용하여 AWS에 Dify 배포 - -##### AWS - -- [KevinZhao의 AWS CDK (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) -- [tmokmss의 AWS CDK (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) - -#### Alibaba Cloud - -[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) - -#### Alibaba Cloud Data Management - -[Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/)를 통해 원클릭으로 Dify를 Alibaba Cloud에 배포할 수 있습니다 - -#### AKS에 배포하기 위해 Azure Devops Pipeline 사용 - -[Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS)을 사용하여 Dify를 AKS에 원클릭으로 배포 - -#### Sealos를 사용한 배포 - -[Sealos App Store](https://sealos.io/products/app-store/dify/)를 사용하여 Dify를 원클릭으로 배포할 수 있습니다 +사용자 지정 구성, 관측 가능성 및 배포 옵션은 [고급 설정](ADVANCED_SETUP.md)을 참조하세요. ## 기여 -코드에 기여하고 싶은 분들은 [기여 가이드](./CONTRIBUTING.md)를 참조하세요. -동시에 Dify를 소셜 미디어와 행사 및 컨퍼런스에 공유하여 지원하는 것을 고려해 주시기 바랍니다. +Dify는 모든 형태의 기여를 환영합니다. -> 우리는 Dify를 중국어나 영어 이외의 언어로 번역하는 데 도움을 줄 수 있는 기여자를 찾고 있습니다. 도움을 주고 싶으시다면 [i18n README](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md)에서 더 많은 정보를 확인하시고 [Discord 커뮤니티 서버](https://discord.gg/8Tpq4AcN9c)의 `global-users` 채널에 댓글을 남겨주세요. +- **코드**: [기여 가이드](./CONTRIBUTING.md)를 읽고 [good first issue](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22)를 살펴보세요. +- **아이디어 및 피드백**: [GitHub 토론](https://github.com/langgenius/dify/discussions)을 시작하거나 기존 토론에 참여하세요. +- **번역**: 언어를 추가하거나 업데이트하려면 [국제화 가이드](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md)를 따르세요. +- **커뮤니티**: 만든 앱을 공유하고, 다른 사용자를 돕고, Dify를 널리 알려주세요. -**기여자** +### 기여자 - + Dify contributors ## 커뮤니티 & 연락처 -- [GitHub 토론](https://github.com/langgenius/dify/discussions). 피드백 공유 및 질문하기에 적합합니다. -- [GitHub 이슈](https://github.com/langgenius/dify/issues). Dify.AI 사용 중 발견한 버그와 기능 제안에 적합합니다. [기여 가이드](./CONTRIBUTING.md)를 참조하세요. -- [디스코드](https://discord.gg/FngNHpbcY7). 애플리케이션 공유 및 커뮤니티와 소통하기에 적합합니다. -- [트위터](https://twitter.com/dify_ai). 애플리케이션 공유 및 커뮤니티와 소통하기에 적합합니다. +문의 내용에 가장 적합한 채널을 선택하세요. +- [GitHub Discussions](https://github.com/langgenius/dify/discussions): 도움을 받고, 피드백을 공유하고, 아이디어를 제안하세요. +- [GitHub Issues](https://github.com/langgenius/dify/issues): 재현 가능한 버그를 보고하고 개발 작업을 추적하세요. 이슈를 열기 전에 [기여 가이드](./CONTRIBUTING.md)를 읽어주세요. +- [Discord](https://discord.gg/FngNHpbcY7): 실시간으로 대화하고, 앱을 공유하고, 다른 Dify 사용자와 교류하세요. +- [X](https://x.com/dify_ai): 릴리스 소식과 프로젝트 업데이트를 확인하세요. ## Star 히스토리 [![Star History Chart](https://api.star-history.com/svg?repos=langgenius/dify&type=Date)](https://star-history.com/#langgenius/dify&Date) diff --git a/docs/pt-BR/ADVANCED_SETUP.md b/docs/pt-BR/ADVANCED_SETUP.md new file mode 100644 index 00000000000..9bb8a87c02a --- /dev/null +++ b/docs/pt-BR/ADVANCED_SETUP.md @@ -0,0 +1,57 @@ +# Configuração avançada + +Se precisar personalizar a configuração, consulte os comentários no nosso arquivo [.env.example](../../docker/.env.example) e atualize os valores correspondentes no seu arquivo `.env`. Além disso, talvez seja necessário fazer ajustes no próprio arquivo `docker-compose.yaml`, como alterar versões de imagem, mapeamentos de portas ou montagens de volumes, com base no seu ambiente de implantação específico e nas suas necessidades. Após fazer quaisquer alterações, execute novamente `docker-compose up -d`. Você pode encontrar a lista completa de variáveis de ambiente disponíveis [aqui](https://docs.dify.ai/getting-started/install-self-hosted/environments). + +## Monitoramento de Métricas com Grafana + +Importe o dashboard para o Grafana, usando o banco de dados PostgreSQL do Dify como fonte de dados, para monitorar métricas na granularidade de aplicativos, inquilinos, mensagens e muito mais. + +- [Dashboard do Grafana por @bowenliang123](https://github.com/bowenliang123/dify-grafana-dashboard) + +## Implantação com Kubernetes + +Se deseja configurar uma instalação de alta disponibilidade, há [Helm Charts](https://helm.sh/) e arquivos YAML contribuídos pela comunidade que permitem a implantação do Dify no Kubernetes. + +- [Helm Chart de @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) +- [Helm Chart de @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) +- [Helm Chart de @magicsong](https://github.com/magicsong/ai-charts) +- [Arquivo YAML por @Winson-030](https://github.com/Winson-030/dify-kubernetes) +- [Arquivo YAML por @wyy-holding](https://github.com/wyy-holding/dify-k8s) +- [🚀 NOVO! Arquivos YAML (Compatível com Dify v1.6.0) por @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) + +### Usando o Terraform para Implantação + +Implante o Dify na Plataforma Cloud com um único clique usando [terraform](https://www.terraform.io/) + +#### Azure Global + +- [Azure Terraform por @nikawang](https://github.com/nikawang/dify-azure-terraform) + +#### Google Cloud + +- [Google Cloud Terraform por @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) + +### Usando AWS CDK para Implantação + +Implante o Dify na AWS usando [CDK](https://aws.amazon.com/cdk/) + +#### AWS + +- [AWS CDK por @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) +- [AWS CDK por @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) + +### Alibaba Cloud + +[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) + +### Alibaba Cloud Data Management + +Implante o Dify na Alibaba Cloud com um clique usando o [Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) + +### Usando Azure Devops Pipeline para Implantar no AKS + +Implante o Dify no AKS com um clique usando [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) + +### Implantação com Sealos + +Implante o Dify com um clique usando a [Sealos App Store](https://sealos.io/products/app-store/dify/) diff --git a/docs/pt-BR/README.md b/docs/pt-BR/README.md index e1806162144..7dc7026c647 100644 --- a/docs/pt-BR/README.md +++ b/docs/pt-BR/README.md @@ -106,7 +106,7 @@ Todas os recursos do Dify vêm com APIs correspondentes, permitindo que você in Dê uma estrela no Dify no GitHub e seja notificado imediatamente sobre novos lançamentos. -![star-us](https://github.com/langgenius/dify/assets/13230914/b823edc1-6388-4e25-ad45-2f6b187adbb4) +star ## Início rápido @@ -131,82 +131,31 @@ Após a execução, você pode acessar o painel do Dify no navegador em [http:// ## Próximos passos -Se precisar personalizar a configuração, consulte os comentários no nosso arquivo [.env.example](../../docker/.env.example) e atualize os valores correspondentes no seu arquivo `.env`. Além disso, talvez seja necessário fazer ajustes no próprio arquivo `docker-compose.yaml`, como alterar versões de imagem, mapeamentos de portas ou montagens de volumes, com base no seu ambiente de implantação específico e nas suas necessidades. Após fazer quaisquer alterações, execute novamente `docker-compose up -d`. Você pode encontrar a lista completa de variáveis de ambiente disponíveis [aqui](https://docs.dify.ai/getting-started/install-self-hosted/environments). - -### Monitoramento de Métricas com Grafana - -Importe o dashboard para o Grafana, usando o banco de dados PostgreSQL do Dify como fonte de dados, para monitorar métricas na granularidade de aplicativos, inquilinos, mensagens e muito mais. - -- [Dashboard do Grafana por @bowenliang123](https://github.com/bowenliang123/dify-grafana-dashboard) - -### Implantação com Kubernetes - -Se deseja configurar uma instalação de alta disponibilidade, há [Helm Charts](https://helm.sh/) e arquivos YAML contribuídos pela comunidade que permitem a implantação do Dify no Kubernetes. - -- [Helm Chart de @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) -- [Helm Chart de @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) -- [Helm Chart de @magicsong](https://github.com/magicsong/ai-charts) -- [Arquivo YAML por @Winson-030](https://github.com/Winson-030/dify-kubernetes) -- [Arquivo YAML por @wyy-holding](https://github.com/wyy-holding/dify-k8s) -- [🚀 NOVO! Arquivos YAML (Compatível com Dify v1.6.0) por @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) - -#### Usando o Terraform para Implantação - -Implante o Dify na Plataforma Cloud com um único clique usando [terraform](https://www.terraform.io/) - -##### Azure Global - -- [Azure Terraform por @nikawang](https://github.com/nikawang/dify-azure-terraform) - -##### Google Cloud - -- [Google Cloud Terraform por @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) - -#### Usando AWS CDK para Implantação - -Implante o Dify na AWS usando [CDK](https://aws.amazon.com/cdk/) - -##### AWS - -- [AWS CDK por @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) -- [AWS CDK por @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) - -#### Alibaba Cloud - -[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) - -#### Alibaba Cloud Data Management - -Implante o Dify na Alibaba Cloud com um clique usando o [Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) - -#### Usando Azure Devops Pipeline para Implantar no AKS - -Implante o Dify no AKS com um clique usando [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) - -#### Implantação com Sealos - -Implante o Dify com um clique usando a [Sealos App Store](https://sealos.io/products/app-store/dify/) +Para opções de configuração personalizada, observabilidade e implantação, consulte a [Configuração avançada](ADVANCED_SETUP.md). ## Contribuindo -Para aqueles que desejam contribuir com código, veja nosso [Guia de Contribuição](./CONTRIBUTING.md). -Ao mesmo tempo, considere apoiar o Dify compartilhando-o nas redes sociais e em eventos e conferências. +O Dify aceita contribuições de todos os tipos: -> Estamos buscando contribuidores para ajudar na tradução do Dify para idiomas além de Mandarim e Inglês. Se você tiver interesse em ajudar, consulte o [README i18n](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) para mais informações e deixe-nos um comentário no canal `global-users` em nosso [Servidor da Comunidade no Discord](https://discord.gg/8Tpq4AcN9c). +- **Código**: leia o [Guia de Contribuição](./CONTRIBUTING.md) e consulte as [issues para iniciantes](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22). +- **Ideias e feedback**: inicie ou participe de uma [discussão no GitHub](https://github.com/langgenius/dify/discussions). +- **Traduções**: siga o [guia de internacionalização](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) para adicionar ou atualizar um idioma. +- **Comunidade**: compartilhe os aplicativos que você criar, ajude outros usuários e divulgue o Dify. -**Contribuidores** +### Contribuidores - + Dify contributors ## Comunidade e contato -- [Discussões no GitHub](https://github.com/langgenius/dify/discussions). Melhor para: compartilhar feedback e fazer perguntas. -- [Problemas no GitHub](https://github.com/langgenius/dify/issues). Melhor para: relatar bugs encontrados no Dify.AI e propor novos recursos. Veja nosso [Guia de Contribuição](./CONTRIBUTING.md). -- [Discord](https://discord.gg/FngNHpbcY7). Melhor para: compartilhar suas aplicações e interagir com a comunidade. -- [X(Twitter)](https://twitter.com/dify_ai). Melhor para: compartilhar suas aplicações e interagir com a comunidade. +Escolha o canal mais adequado para a sua dúvida: +- [GitHub Discussions](https://github.com/langgenius/dify/discussions): obtenha ajuda, compartilhe feedback e proponha ideias. +- [GitHub Issues](https://github.com/langgenius/dify/issues): relate bugs reproduzíveis e acompanhe o trabalho de engenharia. Leia o [Guia de Contribuição](./CONTRIBUTING.md) antes de abrir uma issue. +- [Discord](https://discord.gg/FngNHpbcY7): converse em tempo real, compartilhe seus aplicativos e conecte-se com outros usuários do Dify. +- [X](https://x.com/dify_ai): acompanhe notícias de versões e atualizações do projeto. ## Histórico de estrelas [![Gráfico de Histórico de Estrelas](https://api.star-history.com/svg?repos=langgenius/dify&type=Date)](https://star-history.com/#langgenius/dify&Date) diff --git a/docs/sl-SI/ADVANCED_SETUP.md b/docs/sl-SI/ADVANCED_SETUP.md new file mode 100644 index 00000000000..7892243b7cb --- /dev/null +++ b/docs/sl-SI/ADVANCED_SETUP.md @@ -0,0 +1,56 @@ +# Napredne nastavitve + +Če morate prilagoditi konfiguracijo, si oglejte komentarje v naši datoteki .env.example in posodobite ustrezne vrednosti v svoji .env datoteki. Poleg tega boste morda morali prilagoditi docker-compose.yamlsamo datoteko, na primer spremeniti različice slike, preslikave vrat ali namestitve nosilca, glede na vaše specifično okolje in zahteve za uvajanje. Po kakršnih koli spremembah ponovno zaženite docker-compose up -d. Celoten seznam razpoložljivih spremenljivk okolja najdete tukaj . + +## Spremljanje metrik z Grafana + +Uvoz nadzorne plošče v Grafana, z uporabo Difyjeve PostgreSQL baze podatkov kot vir podatkov, za spremljanje metrike glede na podrobnost aplikacij, najemnikov, sporočil in drugega. + +- [Nadzorna plošča Grafana avtorja @bowenliang123](https://github.com/bowenliang123/dify-grafana-dashboard) + +## Namestitev s Kubernetes + +Če želite konfigurirati visoko razpoložljivo nastavitev, so na voljo Helm Charts in datoteke YAML, ki jih prispeva skupnost, ki omogočajo uvedbo Difyja v Kubernetes. + +- [Helm Chart by @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) +- [Helm Chart by @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) +- [YAML file by @Winson-030](https://github.com/Winson-030/dify-kubernetes) +- [YAML file by @wyy-holding](https://github.com/wyy-holding/dify-k8s) +- [🚀 NEW! YAML files (Supports Dify v1.6.0) by @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) + +### Uporaba Terraform za uvajanje + +namestite Dify v Cloud Platform z enim klikom z uporabo [terraform](https://www.terraform.io/) + +#### Azure Global + +- [Azure Terraform by @nikawang](https://github.com/nikawang/dify-azure-terraform) + +#### Google Cloud + +- [Google Cloud Terraform by @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) + +### Uporaba AWS CDK za uvajanje + +Uvedite Dify v AWS z uporabo [CDK](https://aws.amazon.com/cdk/) + +#### AWS + +- [AWS CDK by @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) +- [AWS CDK by @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) + +### Alibaba Cloud + +[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) + +### Alibaba Cloud Data Management + +Z enim klikom namestite Dify na Alibaba Cloud z [Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) + +### Uporaba Azure Devops Pipeline za uvajanje v AKS + +Z enim klikom namestite Dify v AKS z uporabo [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) + +### Namestitev s Sealos + +Z enim klikom namestite Dify prek [Sealos App Store](https://sealos.io/products/app-store/dify/) diff --git a/docs/sl-SI/README.md b/docs/sl-SI/README.md index 63803ee7bd3..680a858634e 100644 --- a/docs/sl-SI/README.md +++ b/docs/sl-SI/README.md @@ -129,84 +129,35 @@ AVse ponudbe Difyja so opremljene z ustreznimi API-ji, tako da lahko Dify brez t Star Dify on GitHub and be instantly notified of new releases. -![star-us](https://github.com/langgenius/dify/assets/13230914/b823edc1-6388-4e25-ad45-2f6b187adbb4) +star ## Napredne nastavitve -Če morate prilagoditi konfiguracijo, si oglejte komentarje v naši datoteki .env.example in posodobite ustrezne vrednosti v svoji .env datoteki. Poleg tega boste morda morali prilagoditi docker-compose.yamlsamo datoteko, na primer spremeniti različice slike, preslikave vrat ali namestitve nosilca, glede na vaše specifično okolje in zahteve za uvajanje. Po kakršnih koli spremembah ponovno zaženite docker-compose up -d. Celoten seznam razpoložljivih spremenljivk okolja najdete tukaj . +Za možnosti konfiguracije po meri, opazovanja in namestitve glejte [Napredne nastavitve](ADVANCED_SETUP.md). -### Spremljanje metrik z Grafana +## Prispevanje -Uvoz nadzorne plošče v Grafana, z uporabo Difyjeve PostgreSQL baze podatkov kot vir podatkov, za spremljanje metrike glede na podrobnost aplikacij, najemnikov, sporočil in drugega. +Dify pozdravlja vse vrste prispevkov: -- [Nadzorna plošča Grafana avtorja @bowenliang123](https://github.com/bowenliang123/dify-grafana-dashboard) +- **Koda**: preberite [vodnik za prispevke](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md), nato pa preglejte [naloge za nove sodelavce](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22). +- **Ideje in povratne informacije**: začnite ali se pridružite [razpravi na GitHubu](https://github.com/langgenius/dify/discussions). +- **Prevodi**: sledite [vodniku za internacionalizacijo](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md), da dodate ali posodobite jezik. +- **Skupnost**: delite ustvarjene aplikacije, pomagajte drugim uporabnikom in razširite glas o Difyju. -### Namestitev s Kubernetes +### Sodelavci -Če želite konfigurirati visoko razpoložljivo nastavitev, so na voljo Helm Charts in datoteke YAML, ki jih prispeva skupnost, ki omogočajo uvedbo Difyja v Kubernetes. - -- [Helm Chart by @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) -- [Helm Chart by @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) -- [YAML file by @Winson-030](https://github.com/Winson-030/dify-kubernetes) -- [YAML file by @wyy-holding](https://github.com/wyy-holding/dify-k8s) -- [🚀 NEW! YAML files (Supports Dify v1.6.0) by @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) - -#### Uporaba Terraform za uvajanje - -namestite Dify v Cloud Platform z enim klikom z uporabo [terraform](https://www.terraform.io/) - -##### Azure Global - -- [Azure Terraform by @nikawang](https://github.com/nikawang/dify-azure-terraform) - -##### Google Cloud - -- [Google Cloud Terraform by @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) - -#### Uporaba AWS CDK za uvajanje - -Uvedite Dify v AWS z uporabo [CDK](https://aws.amazon.com/cdk/) - -##### AWS - -- [AWS CDK by @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) -- [AWS CDK by @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) - -#### Alibaba Cloud - -[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) - -#### Alibaba Cloud Data Management - -Z enim klikom namestite Dify na Alibaba Cloud z [Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) - -#### Uporaba Azure Devops Pipeline za uvajanje v AKS - -Z enim klikom namestite Dify v AKS z uporabo [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) - -#### Namestitev s Sealos - -Z enim klikom namestite Dify prek [Sealos App Store](https://sealos.io/products/app-store/dify/) - -## Prispevam - -Za tiste, ki bi radi prispevali kodo, si oglejte naš [vodnik za prispevke](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). Hkrati vas prosimo, da podprete Dify tako, da ga delite na družbenih medijih ter na dogodkih in konferencah. - -> Iščemo sodelavce za pomoč pri prevajanju Difyja v jezike, ki niso mandarinščina ali angleščina. Če želite pomagati, si oglejte i18n README za več informacij in nam pustite komentar v global-userskanalu našega strežnika skupnosti Discord . + + Dify contributors + ## Skupnost in stik -- [GitHub Discussion](https://github.com/langgenius/dify/discussions). Najboljše za: izmenjavo povratnih informacij in postavljanje vprašanj. -- [GitHub Issues](https://github.com/langgenius/dify/issues). Najboljše za: hrošče, na katere naletite pri uporabi Dify.AI, in predloge funkcij. Oglejte si naš [vodnik za prispevke](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). -- [Discord](https://discord.gg/FngNHpbcY7). Najboljše za: deljenje vaših aplikacij in druženje s skupnostjo. -- [X(Twitter)](https://twitter.com/dify_ai). Najboljše za: deljenje vaših aplikacij in druženje s skupnostjo. - -**Contributors** - - - - +Izberite kanal, ki najbolj ustreza vašemu vprašanju: +- [GitHub Discussions](https://github.com/langgenius/dify/discussions): poiščite pomoč, delite povratne informacije in predlagajte ideje. +- [GitHub Issues](https://github.com/langgenius/dify/issues): prijavite ponovljive napake in spremljajte razvojno delo. Pred odprtjem težave preberite [vodnik za prispevke](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). +- [Discord](https://discord.gg/FngNHpbcY7): klepetajte v živo, delite svoje aplikacije in se povežite z drugimi uporabniki Difyja. +- [X](https://x.com/dify_ai): spremljajte novice o izdajah in posodobitve projekta. ## Star history [![Star History Chart](https://api.star-history.com/svg?repos=langgenius/dify&type=Date)](https://star-history.com/#langgenius/dify&Date) diff --git a/docs/tlh/ADVANCED_SETUP.md b/docs/tlh/ADVANCED_SETUP.md new file mode 100644 index 00000000000..3611d6a171f --- /dev/null +++ b/docs/tlh/ADVANCED_SETUP.md @@ -0,0 +1,49 @@ +# Advanced Setup + +If you need to customize the configuration, please refer to the comments in our [.env.example](../../docker/.env.example) file and update the corresponding values in your `.env` file. Additionally, you might need to make adjustments to the `docker-compose.yaml` file itself, such as changing image versions, port mappings, or volume mounts, based on your specific deployment environment and requirements. After making any changes, please re-run `docker-compose up -d`. You can find the full list of available environment variables [here](https://docs.dify.ai/getting-started/install-self-hosted/environments). + +If you'd like to configure a highly-available setup, there are community-contributed [Helm Charts](https://helm.sh/) and YAML files which allow Dify to be deployed on Kubernetes. + +- [Helm Chart by @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) +- [Helm Chart by @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) +- [Helm Chart by @magicsong](https://github.com/magicsong/ai-charts) +- [YAML file by @Winson-030](https://github.com/Winson-030/dify-kubernetes) +- [YAML file by @wyy-holding](https://github.com/wyy-holding/dify-k8s) +- [🚀 NEW! YAML files (Supports Dify v1.6.0) by @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) + +### Terraform atorlugu pilersitsineq + +wa'logh nIqHom neH ghun deployment toy'wI' [terraform](https://www.terraform.io/) lo'laH. + +#### Azure Global + +- [Azure Terraform mung @nikawang](https://github.com/nikawang/dify-azure-terraform) + +#### Google Cloud + +- [Google Cloud Terraform qachlot @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) + +### AWS CDK atorlugh pilersitsineq + +wa'logh nIqHom neH ghun deployment toy'wI' [CDK](https://aws.amazon.com/cdk/) lo'laH. + +#### AWS + +- [AWS CDK qachlot @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) +- [AWS CDK qachlot @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) + +### Alibaba Cloud + +[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) + +### Alibaba Cloud Data Management + +[Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) + +### AKS 'e' Deploy je Azure Devops Pipeline lo'laH + +[Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) lo'laH Dify AKS 'e' wa'DIch click 'e' Deploy + +### Sealos lo'laH Deploy + +[Sealos App Store](https://sealos.io/products/app-store/dify/) lo'laH Dify wa'DIch click 'e' Deploy diff --git a/docs/tlh/README.md b/docs/tlh/README.md index 12689f485bf..df8bfd47b8d 100644 --- a/docs/tlh/README.md +++ b/docs/tlh/README.md @@ -107,7 +107,7 @@ All of Dify's offerings come with corresponding APIs, so you could effortlessly Star Dify on GitHub and be instantly notified of new releases. -![star-us](https://github.com/langgenius/dify/assets/13230914/b823edc1-6388-4e25-ad45-2f6b187adbb4) +star ## Quick Start @@ -132,74 +132,31 @@ After running, you can access the Dify dashboard in your browser at [http://loca ## Next steps -If you need to customize the configuration, please refer to the comments in our [.env.example](../../docker/.env.example) file and update the corresponding values in your `.env` file. Additionally, you might need to make adjustments to the `docker-compose.yaml` file itself, such as changing image versions, port mappings, or volume mounts, based on your specific deployment environment and requirements. After making any changes, please re-run `docker-compose up -d`. You can find the full list of available environment variables [here](https://docs.dify.ai/getting-started/install-self-hosted/environments). - -If you'd like to configure a highly-available setup, there are community-contributed [Helm Charts](https://helm.sh/) and YAML files which allow Dify to be deployed on Kubernetes. - -- [Helm Chart by @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) -- [Helm Chart by @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) -- [Helm Chart by @magicsong](https://github.com/magicsong/ai-charts) -- [YAML file by @Winson-030](https://github.com/Winson-030/dify-kubernetes) -- [YAML file by @wyy-holding](https://github.com/wyy-holding/dify-k8s) -- [🚀 NEW! YAML files (Supports Dify v1.6.0) by @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) - -#### Terraform atorlugu pilersitsineq - -wa'logh nIqHom neH ghun deployment toy'wI' [terraform](https://www.terraform.io/) lo'laH. - -##### Azure Global - -- [Azure Terraform mung @nikawang](https://github.com/nikawang/dify-azure-terraform) - -##### Google Cloud - -- [Google Cloud Terraform qachlot @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) - -#### AWS CDK atorlugh pilersitsineq - -wa'logh nIqHom neH ghun deployment toy'wI' [CDK](https://aws.amazon.com/cdk/) lo'laH. - -##### AWS - -- [AWS CDK qachlot @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) -- [AWS CDK qachlot @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) - -#### Alibaba Cloud - -[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) - -#### Alibaba Cloud Data Management - -[Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) - -#### AKS 'e' Deploy je Azure Devops Pipeline lo'laH - -[Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) lo'laH Dify AKS 'e' wa'DIch click 'e' Deploy - -#### Sealos lo'laH Deploy - -[Sealos App Store](https://sealos.io/products/app-store/dify/) lo'laH Dify wa'DIch click 'e' Deploy +For custom configuration, observability, and deployment options, see [Advanced Setup](ADVANCED_SETUP.md). ## Contributing -For those who'd like to contribute code, see our [Contribution Guide](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). -At the same time, please consider supporting Dify by sharing it on social media and at events and conferences. +Dify welcomes contributions of all kinds: -> We are looking for contributors to help with translating Dify to languages other than Mandarin or English. If you are interested in helping, please see the [i18n README](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) for more information, and leave us a comment in the `global-users` channel of our [Discord Community Server](https://discord.gg/8Tpq4AcN9c). +- **Code**: Read the [Contribution Guide](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md), then browse [good first issues](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22). +- **Ideas and feedback**: Start or join a [GitHub Discussion](https://github.com/langgenius/dify/discussions). +- **Translations**: Follow the [internationalization guide](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) to add or update a locale. +- **Community**: Share the apps you build, help other users, and spread the word about Dify. -**Contributors** +### Contributors - + Dify contributors ## Community & Contact -- [GitHub Discussion](https://github.com/langgenius/dify/discussions). Best for: sharing feedback and asking questions. -- [GitHub Issues](https://github.com/langgenius/dify/issues). Best for: bugs you encounter using Dify.AI, and feature proposals. See our [Contribution Guide](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md). -- [Discord](https://discord.gg/FngNHpbcY7). Best for: sharing your applications and hanging out with the community. -- [X(Twitter)](https://twitter.com/dify_ai). Best for: sharing your applications and hanging out with the community. +Choose the channel that best fits your question: +- [GitHub Discussions](https://github.com/langgenius/dify/discussions): Get help, share feedback, and propose ideas. +- [GitHub Issues](https://github.com/langgenius/dify/issues): Report reproducible bugs and track engineering work. Read the [Contribution Guide](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) before opening one. +- [Discord](https://discord.gg/FngNHpbcY7): Chat in real time, share your apps, and connect with other Dify users. +- [X](https://x.com/dify_ai): Follow Dify for release news and project updates. ## Star History [![Star History Chart](https://api.star-history.com/svg?repos=langgenius/dify&type=Date)](https://star-history.com/#langgenius/dify&Date) diff --git a/docs/tr-TR/ADVANCED_SETUP.md b/docs/tr-TR/ADVANCED_SETUP.md new file mode 100644 index 00000000000..872bab9b5d4 --- /dev/null +++ b/docs/tr-TR/ADVANCED_SETUP.md @@ -0,0 +1,56 @@ +# Gelişmiş Kurulum + +Yapılandırmayı özelleştirmeniz gerekiyorsa, lütfen [.env.example](../../docker/.env.example) dosyamızdaki yorumlara bakın ve `.env` dosyanızdaki ilgili değerleri güncelleyin. Ayrıca, spesifik dağıtım ortamınıza ve gereksinimlerinize bağlı olarak `docker-compose.yaml` dosyasının kendisinde de, imaj sürümlerini, port eşlemelerini veya hacim bağlantılarını değiştirmek gibi ayarlamalar yapmanız gerekebilir. Herhangi bir değişiklik yaptıktan sonra, lütfen `docker-compose up -d` komutunu tekrar çalıştırın. Kullanılabilir tüm ortam değişkenlerinin tam listesini [burada](https://docs.dify.ai/getting-started/install-self-hosted/environments) bulabilirsiniz. + +## Grafana ile Metrik İzleme + +Uygulamalar, kiracılar, mesajlar ve daha fazlasının granularitesinde metrikleri izlemek için Dify'nin PostgreSQL veritabanını veri kaynağı olarak kullanarak panoyu Grafana'ya aktarın. + +- [@bowenliang123 tarafından Grafana Panosu](https://github.com/bowenliang123/dify-grafana-dashboard) + +## Kubernetes ile Dağıtım + +Yüksek kullanılabilirliğe sahip bir kurulum yapılandırmak isterseniz, Dify'ın Kubernetes üzerine dağıtılmasına olanak tanıyan topluluk katkılı [Helm Charts](https://helm.sh/) ve YAML dosyaları mevcuttur. + +- [@LeoQuote tarafından Helm Chart](https://github.com/douban/charts/tree/master/charts/dify) +- [@BorisPolonsky tarafından Helm Chart](https://github.com/BorisPolonsky/dify-helm) +- [@Winson-030 tarafından YAML dosyası](https://github.com/Winson-030/dify-kubernetes) +- [@wyy-holding tarafından YAML dosyası](https://github.com/wyy-holding/dify-k8s) +- [🚀 YENİ! YAML dosyaları (Dify v1.6.0 destekli) @Zhoneym tarafından](https://github.com/Zhoneym/DifyAI-Kubernetes) + +### Dağıtım için Terraform Kullanımı + +Dify'ı bulut platformuna tek tıklamayla dağıtın [terraform](https://www.terraform.io/) kullanarak + +#### Azure Global + +- [Azure Terraform tarafından @nikawang](https://github.com/nikawang/dify-azure-terraform) + +#### Google Cloud + +- [Google Cloud Terraform tarafından @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) + +### AWS CDK ile Dağıtım + +[CDK](https://aws.amazon.com/cdk/) kullanarak Dify'ı AWS'ye dağıtın + +#### AWS + +- [AWS CDK tarafından @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) +- [AWS CDK tarafından @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) + +### Alibaba Cloud + +[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) + +### Alibaba Cloud Data Management + +[Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) kullanarak Dify'ı tek tıkla Alibaba Cloud'a dağıtın + +### AKS'ye Dağıtım için Azure Devops Pipeline Kullanımı + +[Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) kullanarak Dify'ı tek tıkla AKS'ye dağıtın + +### Sealos ile Dağıtım + +[Sealos App Store](https://sealos.io/products/app-store/dify/) kullanarak Dify'ı tek tıkla dağıtın diff --git a/docs/tr-TR/README.md b/docs/tr-TR/README.md index aae3b18c7ed..93ef7013235 100644 --- a/docs/tr-TR/README.md +++ b/docs/tr-TR/README.md @@ -102,7 +102,7 @@ Dify'ın tüm özellikleri ilgili API'lerle birlikte gelir, böylece Dify'ı ken GitHub'da Dify'a yıldız verin ve yeni sürümlerden anında haberdar olun. -![bizi-yıldızlayın](https://github.com/langgenius/dify/assets/13230914/b823edc1-6388-4e25-ad45-2f6b187adbb4) +star ## Hızlı başlangıç @@ -126,81 +126,31 @@ docker compose up -d ## Sonraki adımlar -Yapılandırmayı özelleştirmeniz gerekiyorsa, lütfen [.env.example](../../docker/.env.example) dosyamızdaki yorumlara bakın ve `.env` dosyanızdaki ilgili değerleri güncelleyin. Ayrıca, spesifik dağıtım ortamınıza ve gereksinimlerinize bağlı olarak `docker-compose.yaml` dosyasının kendisinde de, imaj sürümlerini, port eşlemelerini veya hacim bağlantılarını değiştirmek gibi ayarlamalar yapmanız gerekebilir. Herhangi bir değişiklik yaptıktan sonra, lütfen `docker-compose up -d` komutunu tekrar çalıştırın. Kullanılabilir tüm ortam değişkenlerinin tam listesini [burada](https://docs.dify.ai/getting-started/install-self-hosted/environments) bulabilirsiniz. - -### Grafana ile Metrik İzleme - -Uygulamalar, kiracılar, mesajlar ve daha fazlasının granularitesinde metrikleri izlemek için Dify'nin PostgreSQL veritabanını veri kaynağı olarak kullanarak panoyu Grafana'ya aktarın. - -- [@bowenliang123 tarafından Grafana Panosu](https://github.com/bowenliang123/dify-grafana-dashboard) - -### Kubernetes ile Dağıtım - -Yüksek kullanılabilirliğe sahip bir kurulum yapılandırmak isterseniz, Dify'ın Kubernetes üzerine dağıtılmasına olanak tanıyan topluluk katkılı [Helm Charts](https://helm.sh/) ve YAML dosyaları mevcuttur. - -- [@LeoQuote tarafından Helm Chart](https://github.com/douban/charts/tree/master/charts/dify) -- [@BorisPolonsky tarafından Helm Chart](https://github.com/BorisPolonsky/dify-helm) -- [@Winson-030 tarafından YAML dosyası](https://github.com/Winson-030/dify-kubernetes) -- [@wyy-holding tarafından YAML dosyası](https://github.com/wyy-holding/dify-k8s) -- [🚀 YENİ! YAML dosyaları (Dify v1.6.0 destekli) @Zhoneym tarafından](https://github.com/Zhoneym/DifyAI-Kubernetes) - -#### Dağıtım için Terraform Kullanımı - -Dify'ı bulut platformuna tek tıklamayla dağıtın [terraform](https://www.terraform.io/) kullanarak - -##### Azure Global - -- [Azure Terraform tarafından @nikawang](https://github.com/nikawang/dify-azure-terraform) - -##### Google Cloud - -- [Google Cloud Terraform tarafından @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) - -#### AWS CDK ile Dağıtım - -[CDK](https://aws.amazon.com/cdk/) kullanarak Dify'ı AWS'ye dağıtın - -##### AWS - -- [AWS CDK tarafından @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) -- [AWS CDK tarafından @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) - -#### Alibaba Cloud - -[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) - -#### Alibaba Cloud Data Management - -[Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) kullanarak Dify'ı tek tıkla Alibaba Cloud'a dağıtın - -#### AKS'ye Dağıtım için Azure Devops Pipeline Kullanımı - -[Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) kullanarak Dify'ı tek tıkla AKS'ye dağıtın - -#### Sealos ile Dağıtım - -[Sealos App Store](https://sealos.io/products/app-store/dify/) kullanarak Dify'ı tek tıkla dağıtın +Özel yapılandırma, gözlemlenebilirlik ve dağıtım seçenekleri için [Gelişmiş Kurulum](ADVANCED_SETUP.md) belgesine bakın. ## Katkıda Bulunma -Kod katkısında bulunmak isteyenler için [Katkı Kılavuzumuza](./CONTRIBUTING.md) bakabilirsiniz. -Aynı zamanda, lütfen Dify'ı sosyal medyada, etkinliklerde ve konferanslarda paylaşarak desteklemeyi düşünün. +Dify her türlü katkıyı memnuniyetle karşılar: -> Dify'ı Mandarin veya İngilizce dışındaki dillere çevirmemize yardımcı olacak katkıda bulunanlara ihtiyacımız var. Yardımcı olmakla ilgileniyorsanız, lütfen daha fazla bilgi için [i18n README](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) dosyasına bakın ve [Discord Topluluk Sunucumuzdaki](https://discord.gg/8Tpq4AcN9c) `global-users` kanalında bize bir yorum bırakın. +- **Kod**: [Katkı Kılavuzu'nu](./CONTRIBUTING.md) okuyun, ardından [yeni katkıda bulunanlara uygun sorunlara](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22) göz atın. +- **Fikirler ve geri bildirim**: Bir [GitHub tartışması](https://github.com/langgenius/dify/discussions) başlatın veya mevcut bir tartışmaya katılın. +- **Çeviriler**: Bir dil eklemek veya güncellemek için [uluslararasılaştırma kılavuzunu](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) izleyin. +- **Topluluk**: Oluşturduğunuz uygulamaları paylaşın, diğer kullanıcılara yardımcı olun ve Dify'ı duyurun. -**Katkıda Bulunanlar** +### Katkıda bulunanlar - + Dify contributors -## Topluluk & iletişim +## Topluluk ve iletişim -- [GitHub Tartışmaları](https://github.com/langgenius/dify/discussions). En uygun: geri bildirim paylaşmak ve soru sormak için. -- [GitHub Sorunları](https://github.com/langgenius/dify/issues). En uygun: Dify.AI kullanırken karşılaştığınız hatalar ve özellik önerileri için. [Katkı Kılavuzumuza](./CONTRIBUTING.md) bakın. -- [Discord](https://discord.gg/FngNHpbcY7). En uygun: uygulamalarınızı paylaşmak ve toplulukla vakit geçirmek için. -- [X(Twitter)](https://twitter.com/dify_ai). En uygun: uygulamalarınızı paylaşmak ve toplulukla vakit geçirmek için. +Sorunuza en uygun kanalı seçin: +- [GitHub Discussions](https://github.com/langgenius/dify/discussions): Yardım alın, geri bildirim paylaşın ve fikir önerin. +- [GitHub Issues](https://github.com/langgenius/dify/issues): Tekrarlanabilir hataları bildirin ve mühendislik çalışmalarını takip edin. Bir sorun açmadan önce [Katkı Kılavuzu'nu](./CONTRIBUTING.md) okuyun. +- [Discord](https://discord.gg/FngNHpbcY7): Gerçek zamanlı sohbet edin, uygulamalarınızı paylaşın ve diğer Dify kullanıcılarıyla bağlantı kurun. +- [X](https://x.com/dify_ai): Sürüm haberleri ve proje güncellemeleri için Dify'ı takip edin. ## Star history [![Star History Chart](https://api.star-history.com/svg?repos=langgenius/dify&type=Date)](https://star-history.com/#langgenius/dify&Date) diff --git a/docs/vi-VN/ADVANCED_SETUP.md b/docs/vi-VN/ADVANCED_SETUP.md new file mode 100644 index 00000000000..afc966b406b --- /dev/null +++ b/docs/vi-VN/ADVANCED_SETUP.md @@ -0,0 +1,56 @@ +# Thiết lập nâng cao + +Nếu bạn cần tùy chỉnh cấu hình, vui lòng tham khảo các nhận xét trong tệp [.env.example](../../docker/.env.example) của chúng tôi và cập nhật các giá trị tương ứng trong tệp `.env` của bạn. Ngoài ra, bạn có thể cần điều chỉnh tệp `docker-compose.yaml`, chẳng hạn như thay đổi phiên bản hình ảnh, ánh xạ cổng hoặc gắn kết khối lượng, dựa trên môi trường triển khai cụ thể và yêu cầu của bạn. Sau khi thực hiện bất kỳ thay đổi nào, vui lòng chạy lại `docker-compose up -d`. Bạn có thể tìm thấy danh sách đầy đủ các biến môi trường có sẵn [tại đây](https://docs.dify.ai/getting-started/install-self-hosted/environments). + +## Giám sát Số liệu với Grafana + +Nhập bảng điều khiển vào Grafana, sử dụng cơ sở dữ liệu PostgreSQL của Dify làm nguồn dữ liệu, để giám sát số liệu theo mức độ chi tiết của ứng dụng, người thuê, tin nhắn và hơn thế nữa. + +- [Bảng điều khiển Grafana của @bowenliang123](https://github.com/bowenliang123/dify-grafana-dashboard) + +## Triển khai với Kubernetes + +Nếu bạn muốn cấu hình một cài đặt có độ sẵn sàng cao, có các [Helm Charts](https://helm.sh/) và tệp YAML do cộng đồng đóng góp cho phép Dify được triển khai trên Kubernetes. + +- [Helm Chart bởi @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) +- [Helm Chart bởi @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) +- [Tệp YAML bởi @Winson-030](https://github.com/Winson-030/dify-kubernetes) +- [Tệp YAML bởi @wyy-holding](https://github.com/wyy-holding/dify-k8s) +- [🚀 MỚI! Tệp YAML (Hỗ trợ Dify v1.6.0) bởi @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) + +### Sử dụng Terraform để Triển khai + +Triển khai Dify lên nền tảng đám mây với một cú nhấp chuột bằng cách sử dụng [terraform](https://www.terraform.io/) + +#### Azure Global + +- [Azure Terraform bởi @nikawang](https://github.com/nikawang/dify-azure-terraform) + +#### Google Cloud + +- [Google Cloud Terraform bởi @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) + +### Sử dụng AWS CDK để Triển khai + +Triển khai Dify trên AWS bằng [CDK](https://aws.amazon.com/cdk/) + +#### AWS + +- [AWS CDK bởi @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) +- [AWS CDK bởi @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) + +### Alibaba Cloud + +[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) + +### Alibaba Cloud Data Management + +Triển khai Dify lên Alibaba Cloud chỉ với một cú nhấp chuột bằng [Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) + +### Sử dụng Azure Devops Pipeline để Triển khai lên AKS + +Triển khai Dify lên AKS chỉ với một cú nhấp chuột bằng [Azure Devops Pipeline Helm Chart bởi @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) + +### Triển khai với Sealos + +Triển khai Dify chỉ với một cú nhấp chuột từ [Sealos App Store](https://sealos.io/products/app-store/dify/) diff --git a/docs/vi-VN/README.md b/docs/vi-VN/README.md index eb71550efe4..db8d5904321 100644 --- a/docs/vi-VN/README.md +++ b/docs/vi-VN/README.md @@ -102,7 +102,7 @@ Tất cả các dịch vụ của Dify đều đi kèm với các API tương Yêu thích Dify trên GitHub và được thông báo ngay lập tức về các bản phát hành mới. -![star-us](https://github.com/langgenius/dify/assets/13230914/b823edc1-6388-4e25-ad45-2f6b187adbb4) +star ## Bắt đầu nhanh @@ -127,81 +127,31 @@ Sau khi chạy, bạn có thể truy cập bảng điều khiển Dify trong tr ## Các bước tiếp theo -Nếu bạn cần tùy chỉnh cấu hình, vui lòng tham khảo các nhận xét trong tệp [.env.example](../../docker/.env.example) của chúng tôi và cập nhật các giá trị tương ứng trong tệp `.env` của bạn. Ngoài ra, bạn có thể cần điều chỉnh tệp `docker-compose.yaml`, chẳng hạn như thay đổi phiên bản hình ảnh, ánh xạ cổng hoặc gắn kết khối lượng, dựa trên môi trường triển khai cụ thể và yêu cầu của bạn. Sau khi thực hiện bất kỳ thay đổi nào, vui lòng chạy lại `docker-compose up -d`. Bạn có thể tìm thấy danh sách đầy đủ các biến môi trường có sẵn [tại đây](https://docs.dify.ai/getting-started/install-self-hosted/environments). - -### Giám sát Số liệu với Grafana - -Nhập bảng điều khiển vào Grafana, sử dụng cơ sở dữ liệu PostgreSQL của Dify làm nguồn dữ liệu, để giám sát số liệu theo mức độ chi tiết của ứng dụng, người thuê, tin nhắn và hơn thế nữa. - -- [Bảng điều khiển Grafana của @bowenliang123](https://github.com/bowenliang123/dify-grafana-dashboard) - -### Triển khai với Kubernetes - -Nếu bạn muốn cấu hình một cài đặt có độ sẵn sàng cao, có các [Helm Charts](https://helm.sh/) và tệp YAML do cộng đồng đóng góp cho phép Dify được triển khai trên Kubernetes. - -- [Helm Chart bởi @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) -- [Helm Chart bởi @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) -- [Tệp YAML bởi @Winson-030](https://github.com/Winson-030/dify-kubernetes) -- [Tệp YAML bởi @wyy-holding](https://github.com/wyy-holding/dify-k8s) -- [🚀 MỚI! Tệp YAML (Hỗ trợ Dify v1.6.0) bởi @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) - -#### Sử dụng Terraform để Triển khai - -Triển khai Dify lên nền tảng đám mây với một cú nhấp chuột bằng cách sử dụng [terraform](https://www.terraform.io/) - -##### Azure Global - -- [Azure Terraform bởi @nikawang](https://github.com/nikawang/dify-azure-terraform) - -##### Google Cloud - -- [Google Cloud Terraform bởi @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) - -#### Sử dụng AWS CDK để Triển khai - -Triển khai Dify trên AWS bằng [CDK](https://aws.amazon.com/cdk/) - -##### AWS - -- [AWS CDK bởi @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) -- [AWS CDK bởi @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) - -#### Alibaba Cloud - -[Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) - -#### Alibaba Cloud Data Management - -Triển khai Dify lên Alibaba Cloud chỉ với một cú nhấp chuột bằng [Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/) - -#### Sử dụng Azure Devops Pipeline để Triển khai lên AKS - -Triển khai Dify lên AKS chỉ với một cú nhấp chuột bằng [Azure Devops Pipeline Helm Chart bởi @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) - -#### Triển khai với Sealos - -Triển khai Dify chỉ với một cú nhấp chuột từ [Sealos App Store](https://sealos.io/products/app-store/dify/) +Để biết các tùy chọn cấu hình tùy chỉnh, khả năng quan sát và triển khai, hãy xem [Thiết lập nâng cao](ADVANCED_SETUP.md). ## Đóng góp -Đối với những người muốn đóng góp mã, xem [Hướng dẫn Đóng góp](./CONTRIBUTING.md) của chúng tôi. -Đồng thời, vui lòng xem xét hỗ trợ Dify bằng cách chia sẻ nó trên mạng xã hội và tại các sự kiện và hội nghị. +Dify chào đón mọi hình thức đóng góp: -> Chúng tôi đang tìm kiếm người đóng góp để giúp dịch Dify sang các ngôn ngữ khác ngoài tiếng Trung hoặc tiếng Anh. Nếu bạn quan tâm đến việc giúp đỡ, vui lòng xem [README i18n](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) để biết thêm thông tin và để lại bình luận cho chúng tôi trong kênh `global-users` của [Máy chủ Cộng đồng Discord](https://discord.gg/8Tpq4AcN9c) của chúng tôi. +- **Mã nguồn**: đọc [Hướng dẫn đóng góp](./CONTRIBUTING.md), sau đó xem các [issue phù hợp cho người mới](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22). +- **Ý tưởng và phản hồi**: bắt đầu hoặc tham gia một [thảo luận trên GitHub](https://github.com/langgenius/dify/discussions). +- **Bản dịch**: làm theo [hướng dẫn quốc tế hóa](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) để thêm hoặc cập nhật một ngôn ngữ. +- **Cộng đồng**: chia sẻ ứng dụng bạn xây dựng, hỗ trợ người dùng khác và giới thiệu Dify đến nhiều người hơn. -**Người đóng góp** +### Người đóng góp - + Dify contributors -## Cộng đồng & liên hệ +## Cộng đồng và liên hệ -- [Thảo luận GitHub](https://github.com/langgenius/dify/discussions). Tốt nhất cho: chia sẻ phản hồi và đặt câu hỏi. -- [Vấn đề GitHub](https://github.com/langgenius/dify/issues). Tốt nhất cho: lỗi bạn gặp phải khi sử dụng Dify.AI và đề xuất tính năng. Xem [Hướng dẫn Đóng góp](./CONTRIBUTING.md) của chúng tôi. -- [Discord](https://discord.gg/FngNHpbcY7). Tốt nhất cho: chia sẻ ứng dụng của bạn và giao lưu với cộng đồng. -- [X(Twitter)](https://twitter.com/dify_ai). Tốt nhất cho: chia sẻ ứng dụng của bạn và giao lưu với cộng đồng. +Chọn kênh phù hợp nhất với câu hỏi của bạn: +- [GitHub Discussions](https://github.com/langgenius/dify/discussions): nhận trợ giúp, chia sẻ phản hồi và đề xuất ý tưởng. +- [GitHub Issues](https://github.com/langgenius/dify/issues): báo cáo lỗi có thể tái hiện và theo dõi công việc kỹ thuật. Đọc [Hướng dẫn đóng góp](./CONTRIBUTING.md) trước khi mở issue. +- [Discord](https://discord.gg/FngNHpbcY7): trò chuyện theo thời gian thực, chia sẻ ứng dụng và kết nối với những người dùng Dify khác. +- [X](https://x.com/dify_ai): theo dõi tin tức phát hành và cập nhật dự án. ## Lịch sử Yêu thích [![Biểu đồ Lịch sử Yêu thích](https://api.star-history.com/svg?repos=langgenius/dify&type=Date)](https://star-history.com/#langgenius/dify&Date) diff --git a/docs/zh-CN/ADVANCED_SETUP.md b/docs/zh-CN/ADVANCED_SETUP.md new file mode 100644 index 00000000000..ded07ef7c0c --- /dev/null +++ b/docs/zh-CN/ADVANCED_SETUP.md @@ -0,0 +1,64 @@ +# 高级设置 + +## 自定义配置 + +如果您需要自定义配置,请参考 [.env.example](../../docker/.env.example) 文件中的注释,并更新 `.env` 文件中对应的值。此外,您可能需要根据您的具体部署环境和需求对 `docker-compose.yaml` 文件本身进行调整,例如更改镜像版本、端口映射或卷挂载。完成任何更改后,请重新运行 `docker-compose up -d`。您可以在[此处](https://docs.dify.ai/getting-started/install-self-hosted/environments)找到可用环境变量的完整列表。 + +## 使用 Grafana 进行指标监控 + +将仪表板导入 Grafana,使用 Dify 的 PostgreSQL 数据库作为数据源,以监控应用、租户、消息等粒度的指标。 + +- [由 @bowenliang123 提供的 Grafana 仪表板](https://github.com/bowenliang123/dify-grafana-dashboard) + +## 使用 Helm Chart 或 Kubernetes 资源清单(YAML)部署 + +使用 [Helm Chart](https://helm.sh/) 版本或者 Kubernetes 资源清单(YAML),可以在 Kubernetes 上部署 Dify。 + +- [Helm Chart by @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) + +- [Helm Chart by @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) + +- [Helm Chart by @magicsong](https://github.com/magicsong/ai-charts) + +- [YAML 文件 by @Winson-030](https://github.com/Winson-030/dify-kubernetes) + +- [YAML file by @wyy-holding](https://github.com/wyy-holding/dify-k8s) + +- [🚀 NEW! YAML 文件 (支持 Dify v1.6.0) by @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) + +### 使用 Terraform 部署 + +使用 [terraform](https://www.terraform.io/) 一键将 Dify 部署到云平台 + +#### Azure Global + +- [Azure Terraform by @nikawang](https://github.com/nikawang/dify-azure-terraform) + +#### Google Cloud + +- [Google Cloud Terraform by @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) + +### 使用 AWS CDK 部署 + +使用 [CDK](https://aws.amazon.com/cdk/) 将 Dify 部署到 AWS + +#### AWS + +- [AWS CDK by @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) +- [AWS CDK by @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) + +### 使用 阿里云计算巢 部署 + +使用 [阿里云计算巢](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) 将 Dify 一键部署到 阿里云 + +### 使用 阿里云数据管理DMS 部署 + +使用 [阿里云数据管理DMS](https://help.aliyun.com/zh/dms/dify-in-invitational-preview) 将 Dify 一键部署到 阿里云 + +### 使用 Azure Devops Pipeline 部署到AKS + +使用[Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) 将 Dify 一键部署到 AKS + +### 使用 Sealos 部署 + +通过 [Sealos App Store](https://sealos.io/products/app-store/dify/) 一键部署 Dify diff --git a/docs/zh-CN/README.md b/docs/zh-CN/README.md index b1664dcbf58..72628401f96 100644 --- a/docs/zh-CN/README.md +++ b/docs/zh-CN/README.md @@ -108,7 +108,7 @@ Dify 是一个开源的 LLM 应用开发平台。其直观的界面结合了 AI 在 GitHub 上给 Dify Star,并立即收到新版本的通知。 -![star-us](https://github.com/langgenius/dify/assets/13230914/b823edc1-6388-4e25-ad45-2f6b187adbb4) +star ## 安装社区版 @@ -131,97 +131,37 @@ docker compose up -d 运行后,可以在浏览器上访问 [http://localhost/install](http://localhost/install) 进入 Dify 控制台并开始初始化安装操作。 -### 自定义配置 +### 高级设置 -如果您需要自定义配置,请参考 [.env.example](../../docker/.env.example) 文件中的注释,并更新 `.env` 文件中对应的值。此外,您可能需要根据您的具体部署环境和需求对 `docker-compose.yaml` 文件本身进行调整,例如更改镜像版本、端口映射或卷挂载。完成任何更改后,请重新运行 `docker-compose up -d`。您可以在[此处](https://docs.dify.ai/getting-started/install-self-hosted/environments)找到可用环境变量的完整列表。 +如需自定义配置、可观测性和部署选项,请参阅[高级设置](ADVANCED_SETUP.md)。 -### 使用 Grafana 进行指标监控 +## 贡献 -将仪表板导入 Grafana,使用 Dify 的 PostgreSQL 数据库作为数据源,以监控应用、租户、消息等粒度的指标。 +Dify 欢迎各种形式的贡献: -- [由 @bowenliang123 提供的 Grafana 仪表板](https://github.com/bowenliang123/dify-grafana-dashboard) +- **代码**:阅读[贡献指南](./CONTRIBUTING.md),然后浏览[适合新手的问题](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22)。 +- **想法与反馈**:发起或加入 [GitHub Discussions](https://github.com/langgenius/dify/discussions)。 +- **翻译**:按照[国际化指南](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md)添加或更新语言。 +- **社区**:分享您构建的应用、帮助其他用户,并向更多人介绍 Dify。 -#### 使用 Helm Chart 或 Kubernetes 资源清单(YAML)部署 - -使用 [Helm Chart](https://helm.sh/) 版本或者 Kubernetes 资源清单(YAML),可以在 Kubernetes 上部署 Dify。 - -- [Helm Chart by @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify) - -- [Helm Chart by @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm) - -- [Helm Chart by @magicsong](https://github.com/magicsong/ai-charts) - -- [YAML 文件 by @Winson-030](https://github.com/Winson-030/dify-kubernetes) - -- [YAML file by @wyy-holding](https://github.com/wyy-holding/dify-k8s) - -- [🚀 NEW! YAML 文件 (支持 Dify v1.6.0) by @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) - -#### 使用 Terraform 部署 - -使用 [terraform](https://www.terraform.io/) 一键将 Dify 部署到云平台 - -##### Azure Global - -- [Azure Terraform by @nikawang](https://github.com/nikawang/dify-azure-terraform) - -##### Google Cloud - -- [Google Cloud Terraform by @sotazum](https://github.com/DeNA/dify-google-cloud-terraform) - -#### 使用 AWS CDK 部署 - -使用 [CDK](https://aws.amazon.com/cdk/) 将 Dify 部署到 AWS - -##### AWS - -- [AWS CDK by @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) -- [AWS CDK by @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) - -#### 使用 阿里云计算巢 部署 - -使用 [阿里云计算巢](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) 将 Dify 一键部署到 阿里云 - -#### 使用 阿里云数据管理DMS 部署 - -使用 [阿里云数据管理DMS](https://help.aliyun.com/zh/dms/dify-in-invitational-preview) 将 Dify 一键部署到 阿里云 - -#### 使用 Azure Devops Pipeline 部署到AKS - -使用[Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) 将 Dify 一键部署到 AKS - -#### 使用 Sealos 部署 - -通过 [Sealos App Store](https://sealos.io/products/app-store/dify/) 一键部署 Dify - -## Star History - -[![Star History Chart](https://api.star-history.com/svg?repos=langgenius/dify&type=Date)](https://star-history.com/#langgenius/dify&Date) - -## Contributing - -对于那些想要贡献代码的人,请参阅我们的[贡献指南](./CONTRIBUTING.md)。 -同时,请考虑通过社交媒体、活动和会议来支持 Dify 的分享。 - -> 我们正在寻找贡献者来帮助将 Dify 翻译成除了中文和英文之外的其他语言。如果您有兴趣帮助,请参阅我们的[i18n README](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md)获取更多信息,并在我们的[Discord 社区服务器](https://discord.gg/8Tpq4AcN9c)的`global-users`频道中留言。 - -**Contributors** +### 贡献者 - + Dify contributors ## 社区与支持 -我们欢迎您为 Dify 做出贡献,以帮助改善 Dify。包括:提交代码、问题、新想法,或分享您基于 Dify 创建的有趣且有用的 AI 应用程序。同时,我们也欢迎您在不同的活动、会议和社交媒体上分享 Dify。 +请选择最适合您问题的渠道: -- [GitHub Discussion](https://github.com/langgenius/dify/discussions). 👉:分享您的应用程序并与社区交流。 -- [GitHub Issues](https://github.com/langgenius/dify/issues)。👉:使用 Dify.AI 时遇到的错误和问题,请参阅[贡献指南](./CONTRIBUTING.md)。 -- [电子邮件支持](mailto:hello@dify.ai?subject=%5BGitHub%5DQuestions%20About%20Dify)。👉:关于使用 Dify.AI 的问题。 -- [Discord](https://discord.gg/FngNHpbcY7)。👉:分享您的应用程序并与社区交流。 -- [X(Twitter)](https://twitter.com/dify_ai)。👉:分享您的应用程序并与社区交流。 -- [商业许可](mailto:business@dify.ai?subject=%5BGitHub%5DBusiness%20License%20Inquiry)。👉:有关商业用途许可 Dify.AI 的商业咨询。 +- [GitHub Discussions](https://github.com/langgenius/dify/discussions):获取帮助、分享反馈并提出想法。 +- [GitHub Issues](https://github.com/langgenius/dify/issues):报告可重现的错误并跟踪工程工作。创建问题前,请先阅读[贡献指南](./CONTRIBUTING.md)。 +- [Discord](https://discord.gg/FngNHpbcY7):实时交流、分享您的应用,并与其他 Dify 用户互动。 +- [X](https://x.com/dify_ai):关注版本新闻和项目更新。 +## Star History + +[![Star History Chart](https://api.star-history.com/svg?repos=langgenius/dify&type=Date)](https://star-history.com/#langgenius/dify&Date) ## 安全问题 为了保护您的隐私,请避免在 GitHub 上发布安全问题。发送问题至 security@dify.ai,我们将为您做更细致的解答。 diff --git a/docs/zh-TW/ADVANCED_SETUP.md b/docs/zh-TW/ADVANCED_SETUP.md new file mode 100644 index 00000000000..5299556fd7c --- /dev/null +++ b/docs/zh-TW/ADVANCED_SETUP.md @@ -0,0 +1,56 @@ +# 進階設定 + +如果您需要自定義配置,請參考我們的 [.env.example](../../docker/.env.example) 文件中的註釋,並在您的 `.env` 文件中更新相應的值。此外,根據您特定的部署環境和需求,您可能需要調整 `docker-compose.yaml` 文件本身,例如更改映像版本、端口映射或卷掛載。進行任何更改後,請重新運行 `docker-compose up -d`。您可以在[這裡](https://docs.dify.ai/getting-started/install-self-hosted/environments)找到可用環境變數的完整列表。 + +## 使用 Grafana 進行指標監控 + +將儀表板匯入 Grafana,使用 Dify 的 PostgreSQL 資料庫作為資料來源,以監控應用程式、租戶、訊息等顆粒度的指標。 + +- [由 @bowenliang123 提供的 Grafana 儀表板](https://github.com/bowenliang123/dify-grafana-dashboard) + +## 使用 Kubernetes 部署 + +如果您想配置高可用性設置,社區貢獻的 [Helm Charts](https://helm.sh/) 和 Kubernetes 資源清單(YAML)允許在 Kubernetes 上部署 Dify。 + +- [由 @LeoQuote 提供的 Helm Chart](https://github.com/douban/charts/tree/master/charts/dify) +- [由 @BorisPolonsky 提供的 Helm Chart](https://github.com/BorisPolonsky/dify-helm) +- [由 @Winson-030 提供的 YAML 文件](https://github.com/Winson-030/dify-kubernetes) +- [由 @wyy-holding 提供的 YAML 文件](https://github.com/wyy-holding/dify-k8s) +- [🚀 NEW! YAML 檔案(支援 Dify v1.6.0)by @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) + +### 使用 Terraform 進行部署 + +使用 [terraform](https://www.terraform.io/) 一鍵部署 Dify 到雲端平台 + +#### Azure 全球 + +- [由 @nikawang 提供的 Azure Terraform](https://github.com/nikawang/dify-azure-terraform) + +#### Google Cloud + +- [由 @sotazum 提供的 Google Cloud Terraform](https://github.com/DeNA/dify-google-cloud-terraform) + +### 使用 AWS CDK 進行部署 + +使用 [CDK](https://aws.amazon.com/cdk/) 部署 Dify 到 AWS + +#### AWS + +- [由 @KevinZhao 提供的 AWS CDK (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) +- [由 @tmokmss 提供的 AWS CDK (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) + +### 使用 阿里云计算巢進行部署 + +[阿里云](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) + +### 使用 阿里雲數據管理DMS 進行部署 + +透過 [阿里雲數據管理DMS](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/),一鍵將 Dify 部署至阿里雲 + +### 使用 Azure Devops Pipeline 部署到AKS + +使用[Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) 將 Dify 一鍵部署到 AKS + +### 使用 Sealos 部署 + +透過 [Sealos App Store](https://sealos.io/products/app-store/dify/) 一鍵部署 Dify diff --git a/docs/zh-TW/README.md b/docs/zh-TW/README.md index fab22e46d8c..b7682b181c6 100644 --- a/docs/zh-TW/README.md +++ b/docs/zh-TW/README.md @@ -133,85 +133,35 @@ Dify 的所有功能都提供相應的 API,因此您可以輕鬆地將 Dify 在 GitHub 上為 Dify 加星,即時獲取新版本通知。 -![star-us](https://github.com/langgenius/dify/assets/13230914/b823edc1-6388-4e25-ad45-2f6b187adbb4) +star ## 進階設定 -如果您需要自定義配置,請參考我們的 [.env.example](../../docker/.env.example) 文件中的註釋,並在您的 `.env` 文件中更新相應的值。此外,根據您特定的部署環境和需求,您可能需要調整 `docker-compose.yaml` 文件本身,例如更改映像版本、端口映射或卷掛載。進行任何更改後,請重新運行 `docker-compose up -d`。您可以在[這裡](https://docs.dify.ai/getting-started/install-self-hosted/environments)找到可用環境變數的完整列表。 - -### 使用 Grafana 進行指標監控 - -將儀表板匯入 Grafana,使用 Dify 的 PostgreSQL 資料庫作為資料來源,以監控應用程式、租戶、訊息等顆粒度的指標。 - -- [由 @bowenliang123 提供的 Grafana 儀表板](https://github.com/bowenliang123/dify-grafana-dashboard) - -### 使用 Kubernetes 部署 - -如果您想配置高可用性設置,社區貢獻的 [Helm Charts](https://helm.sh/) 和 Kubernetes 資源清單(YAML)允許在 Kubernetes 上部署 Dify。 - -- [由 @LeoQuote 提供的 Helm Chart](https://github.com/douban/charts/tree/master/charts/dify) -- [由 @BorisPolonsky 提供的 Helm Chart](https://github.com/BorisPolonsky/dify-helm) -- [由 @Winson-030 提供的 YAML 文件](https://github.com/Winson-030/dify-kubernetes) -- [由 @wyy-holding 提供的 YAML 文件](https://github.com/wyy-holding/dify-k8s) -- [🚀 NEW! YAML 檔案(支援 Dify v1.6.0)by @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes) - -### 使用 Terraform 進行部署 - -使用 [terraform](https://www.terraform.io/) 一鍵部署 Dify 到雲端平台 - -### Azure 全球 - -- [由 @nikawang 提供的 Azure Terraform](https://github.com/nikawang/dify-azure-terraform) - -### Google Cloud - -- [由 @sotazum 提供的 Google Cloud Terraform](https://github.com/DeNA/dify-google-cloud-terraform) - -### 使用 AWS CDK 進行部署 - -使用 [CDK](https://aws.amazon.com/cdk/) 部署 Dify 到 AWS - -### AWS - -- [由 @KevinZhao 提供的 AWS CDK (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws) -- [由 @tmokmss 提供的 AWS CDK (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws) - -#### 使用 阿里云计算巢進行部署 - -[阿里云](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88) - -#### 使用 阿里雲數據管理DMS 進行部署 - -透過 [阿里雲數據管理DMS](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/),一鍵將 Dify 部署至阿里雲 - -#### 使用 Azure Devops Pipeline 部署到AKS - -使用[Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS) 將 Dify 一鍵部署到 AKS - -#### 使用 Sealos 部署 - -透過 [Sealos App Store](https://sealos.io/products/app-store/dify/) 一鍵部署 Dify +如需自訂設定、可觀測性和部署選項,請參閱[進階設定](ADVANCED_SETUP.md)。 ## 貢獻 -對於想要貢獻程式碼的開發者,請參閱我們的[貢獻指南](./CONTRIBUTING.md)。 -同時,也請考慮透過在社群媒體和各種活動與會議上分享 Dify 來支持我們。 +Dify 歡迎各種形式的貢獻: -> 我們正在尋找貢獻者協助將 Dify 翻譯成中文和英文以外的語言。如果您有興趣幫忙,請查看 [i18n README](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) 獲取更多資訊,並在我們的 [Discord 社群伺服器](https://discord.gg/8Tpq4AcN9c) 的 `global-users` 頻道留言給我們。 +- **程式碼**:閱讀[貢獻指南](./CONTRIBUTING.md),再瀏覽[適合新手的議題](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22)。 +- **想法與意見**:發起或加入 [GitHub Discussions](https://github.com/langgenius/dify/discussions)。 +- **翻譯**:依照[國際化指南](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md)新增或更新語言。 +- **社群**:分享您建立的應用程式、協助其他使用者,並向更多人介紹 Dify。 + +### 貢獻者 + + + Dify contributors + ## 社群與聯絡方式 -- [GitHub Discussion](https://github.com/langgenius/dify/discussions):最適合分享反饋和提問。 -- [GitHub Issues](https://github.com/langgenius/dify/issues):最適合報告使用 Dify.AI 時遇到的問題和提出功能建議。請參閱我們的[貢獻指南](./CONTRIBUTING.md)。 -- [Discord](https://discord.gg/FngNHpbcY7):最適合分享您的應用程式並與社群互動。 -- [X(Twitter)](https://twitter.com/dify_ai):最適合分享您的應用程式並與社群互動。 - -**貢獻者** - - - - +請選擇最符合您問題的管道: +- [GitHub Discussions](https://github.com/langgenius/dify/discussions):取得協助、分享意見並提出想法。 +- [GitHub Issues](https://github.com/langgenius/dify/issues):回報可重現的錯誤並追蹤工程工作。建立議題前,請先閱讀[貢獻指南](./CONTRIBUTING.md)。 +- [Discord](https://discord.gg/FngNHpbcY7):即時交流、分享您的應用程式,並與其他 Dify 使用者互動。 +- [X](https://x.com/dify_ai):追蹤版本消息與專案更新。 ## 星星歷史 [![Star History Chart](https://api.star-history.com/svg?repos=langgenius/dify&type=Date)](https://star-history.com/#langgenius/dify&Date) diff --git a/e2e/features/step-definitions/agent-v2/build-draft.steps.ts b/e2e/features/step-definitions/agent-v2/build-draft.steps.ts index 5de92e42562..2ec1e1c45f5 100644 --- a/e2e/features/step-definitions/agent-v2/build-draft.steps.ts +++ b/e2e/features/step-definitions/agent-v2/build-draft.steps.ts @@ -280,10 +280,9 @@ Then('I should see the Agent v2 Build mode confirmation state', async function ( await expect(page.getByText('Build mode', { exact: true })).toBeVisible() await expect( - page.getByText('Configure can only be updated by the agent in this mode.'), - ).toBeVisible() - await expect( - page.getByText('Shape this setup through the chat on the right, then Apply.'), + page.getByText( + "You're in Build mode. Shape this setup by chatting with the agent, then Apply.", + ), ).toBeVisible() }) diff --git a/e2e/features/step-definitions/agent-v2/files.steps.ts b/e2e/features/step-definitions/agent-v2/files.steps.ts index e47b5a7fa65..95359439776 100644 --- a/e2e/features/step-definitions/agent-v2/files.steps.ts +++ b/e2e/features/step-definitions/agent-v2/files.steps.ts @@ -62,8 +62,9 @@ Then( async function (this: DifyWorld) { const page = this.getPage() const dialog = page.getByRole('dialog', { name: 'Upload file' }) + const notifications = page.getByRole('region', { name: 'Notifications' }) - await expect(page.getByText('Upload one file.')).toBeVisible() + await expect(notifications.getByRole('dialog')).toBeVisible() await expect(dialog.getByRole('button', { name: 'Upload' })).toBeDisabled() await expect( dialog.getByText(agentBuilderTestMaterials.smallFile, { exact: true }), diff --git a/oxlint-suppressions.json b/oxlint-suppressions.json index 3858c1300d5..cbab999ee9d 100644 --- a/oxlint-suppressions.json +++ b/oxlint-suppressions.json @@ -1,9 +1,4 @@ { - "cli/src/store/keychain-token-store.test.ts": { - "no-throw-literal": { - "count": 2 - } - }, "cli/test/e2e/suites/output/json-yaml-output.e2e.ts": { "prefer-const": { "count": 1 @@ -533,11 +528,6 @@ "count": 1 } }, - "web/app/components/app/duplicate-modal/index.tsx": { - "no-restricted-imports": { - "count": 1 - } - }, "web/app/components/app/log/filter.tsx": { "react/only-export-components": { "count": 1 @@ -1998,11 +1988,6 @@ "count": 2 } }, - "web/app/components/datasets/common/image-uploader/__tests__/store.spec.tsx": { - "eslint-react/error-boundaries": { - "count": 1 - } - }, "web/app/components/datasets/common/image-uploader/hooks/use-upload.ts": { "typescript/no-explicit-any": { "count": 3 @@ -2087,11 +2072,6 @@ "count": 1 } }, - "web/app/components/datasets/create-from-pipeline/list/template-card/edit-pipeline-info.tsx": { - "no-restricted-imports": { - "count": 1 - } - }, "web/app/components/datasets/create-from-pipeline/list/template-card/operations.tsx": { "jsx-a11y/click-events-have-key-events": { "count": 3 @@ -2669,11 +2649,6 @@ "count": 2 } }, - "web/app/components/goto-anything/actions/recent-store.ts": { - "no-restricted-globals": { - "count": 2 - } - }, "web/app/components/header/account-setting/data-source-page-new/__tests__/item.spec.tsx": { "jsx-a11y/click-events-have-key-events": { "count": 1 @@ -3036,9 +3011,6 @@ } }, "web/app/components/plugins/plugin-detail-panel/subscription-list/__tests__/index.spec.tsx": { - "no-throw-literal": { - "count": 1 - }, "typescript/no-explicit-any": { "count": 2 } @@ -3135,14 +3107,6 @@ "count": 25 } }, - "web/app/components/rag-pipeline/components/__tests__/publish-as-knowledge-pipeline-modal.spec.tsx": { - "jsx-a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx-a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/rag-pipeline/components/panel/input-field/editor/form/__tests__/hidden-fields.spec.tsx": { "eslint-react/static-components": { "count": 4 @@ -3240,11 +3204,6 @@ "count": 4 } }, - "web/app/components/rag-pipeline/components/publish-as-knowledge-pipeline-modal.tsx": { - "no-restricted-imports": { - "count": 1 - } - }, "web/app/components/rag-pipeline/components/publish-toast.tsx": { "jsx-a11y/click-events-have-key-events": { "count": 1 @@ -3657,14 +3616,6 @@ "count": 1 } }, - "web/app/components/workflow/nodes/_base/components/__tests__/node-handle.spec.tsx": { - "jsx-a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx-a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/workflow/nodes/_base/components/add-variable-popup-with-position.tsx": { "typescript/no-explicit-any": { "count": 2 @@ -3999,9 +3950,6 @@ "no-restricted-imports": { "count": 1 }, - "no-throw-literal": { - "count": 1 - }, "typescript/no-explicit-any": { "count": 22 } @@ -5540,7 +5488,7 @@ "count": 1 }, "typescript/no-explicit-any": { - "count": 7 + "count": 6 } }, "web/models/pipeline.ts": { diff --git a/package.json b/package.json index 1c1380fc3fc..88fed453dd4 100644 --- a/package.json +++ b/package.json @@ -63,5 +63,5 @@ "engines": { "node": "^22.22.1" }, - "packageManager": "pnpm@11.21.0" + "packageManager": "pnpm@11.23.0" } diff --git a/packages/contracts/account-profile-zod.test.ts b/packages/contracts/account-profile-zod.test.ts index f55eede9416..a8be14eb1e2 100644 --- a/packages/contracts/account-profile-zod.test.ts +++ b/packages/contracts/account-profile-zod.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from 'vitest' +import { describe, expect, it } from 'vite-plus/test' import { zAccountProfilePatchPayload } from './generated/api/console/account/zod.gen' describe('generated account profile schema', () => { diff --git a/packages/contracts/generated/api/console/account/types.gen.ts b/packages/contracts/generated/api/console/account/types.gen.ts index a64bd639059..3aa8f1781ee 100644 --- a/packages/contracts/generated/api/console/account/types.gen.ts +++ b/packages/contracts/generated/api/console/account/types.gen.ts @@ -87,6 +87,10 @@ export type EducationActivatePayload = { token: string } +export type EducationActivateResponse = { + message: string +} + export type EducationAutocompleteResponse = { curr_page?: number | null data?: Array @@ -305,9 +309,7 @@ export type PostAccountEducationData = { } export type PostAccountEducationResponses = { - 200: { - [key: string]: unknown - } + 200: EducationActivateResponse } export type PostAccountEducationResponse = diff --git a/packages/contracts/generated/api/console/account/zod.gen.ts b/packages/contracts/generated/api/console/account/zod.gen.ts index 41e03f24131..f4f5f429a5a 100644 --- a/packages/contracts/generated/api/console/account/zod.gen.ts +++ b/packages/contracts/generated/api/console/account/zod.gen.ts @@ -127,6 +127,13 @@ export const zEducationActivatePayload = z.object({ token: z.string(), }) +/** + * EducationActivateResponse + */ +export const zEducationActivateResponse = z.object({ + message: z.string(), +}) + /** * EducationAutocompleteResponse */ @@ -309,7 +316,7 @@ export const zPostAccountEducationBody = zEducationActivatePayload /** * Success */ -export const zPostAccountEducationResponse = z.record(z.string(), z.unknown()) +export const zPostAccountEducationResponse = zEducationActivateResponse export const zGetAccountEducationAutocompleteQuery = z.object({ keywords: z.string(), diff --git a/packages/contracts/generated/api/console/trial-models/orpc.gen.ts b/packages/contracts/generated/api/console/trial-models/orpc.gen.ts index e0aa34bf478..ce3fb8d09a4 100644 --- a/packages/contracts/generated/api/console/trial-models/orpc.gen.ts +++ b/packages/contracts/generated/api/console/trial-models/orpc.gen.ts @@ -4,18 +4,18 @@ import { oc } from '@orpc/contract' import { zGetTrialModelsResponse } from './zod.gen' /** - * Get hosted trial model provider configuration for model-provider pages + * Get hosted credit provider configuration for the current workspace * - * Get hosted trial model provider configuration + * Get hosted credit model provider configuration for the current workspace */ export const get = oc .route({ - description: 'Get hosted trial model provider configuration', + description: 'Get hosted credit model provider configuration for the current workspace', inputStructure: 'detailed', method: 'GET', operationId: 'getTrialModels', path: '/trial-models', - summary: 'Get hosted trial model provider configuration for model-provider pages', + summary: 'Get hosted credit provider configuration for the current workspace', tags: ['console'], }) .output(zGetTrialModelsResponse) diff --git a/packages/dev-proxy/tsconfig.json b/packages/dev-proxy/tsconfig.json index a082278e246..a1beb4dda23 100644 --- a/packages/dev-proxy/tsconfig.json +++ b/packages/dev-proxy/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "@dify/tsconfig/node.json", "compilerOptions": { - "types": ["node", "vitest/globals"] + "types": ["node", "vite-plus/test/globals"] }, "include": ["src/**/*.ts", "vite.config.ts"], "exclude": ["node_modules", "dist"] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fa531530b93..28bd7421cb4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -79,8 +79,8 @@ catalogs: specifier: 0.47.0 version: 0.47.0 '@mediabunny/mp3-encoder': - specifier: 1.53.1 - version: 1.53.1 + specifier: 1.55.2 + version: 1.55.2 '@monaco-editor/react': specifier: 4.7.0 version: 4.7.0 @@ -112,32 +112,32 @@ catalogs: specifier: 10.70.0 version: 10.70.0 '@storybook/addon-a11y': - specifier: 10.5.8 - version: 10.5.8 + specifier: 10.5.10 + version: 10.5.10 '@storybook/addon-docs': - specifier: 10.5.8 - version: 10.5.8 + specifier: 10.5.10 + version: 10.5.10 '@storybook/addon-links': - specifier: 10.5.8 - version: 10.5.8 + specifier: 10.5.10 + version: 10.5.10 '@storybook/addon-onboarding': - specifier: 10.5.8 - version: 10.5.8 + specifier: 10.5.10 + version: 10.5.10 '@storybook/addon-themes': - specifier: 10.5.8 - version: 10.5.8 + specifier: 10.5.10 + version: 10.5.10 '@storybook/addon-vitest': - specifier: 10.5.8 - version: 10.5.8 + specifier: 10.5.10 + version: 10.5.10 '@storybook/nextjs-vite': - specifier: 10.5.8 - version: 10.5.8 + specifier: 10.5.10 + version: 10.5.10 '@storybook/react': - specifier: 10.5.8 - version: 10.5.8 + specifier: 10.5.10 + version: 10.5.10 '@storybook/react-vite': - specifier: 10.5.8 - version: 10.5.8 + specifier: 10.5.10 + version: 10.5.10 '@streamdown/math': specifier: 1.0.2 version: 1.0.2 @@ -157,14 +157,14 @@ catalogs: specifier: 4.3.3 version: 4.3.3 '@tanstack/eslint-plugin-query': - specifier: 5.101.4 - version: 5.101.4 + specifier: 5.102.2 + version: 5.102.2 '@tanstack/form-core': specifier: 1.33.5 version: 1.33.5 '@tanstack/query-core': - specifier: 5.101.4 - version: 5.101.4 + specifier: 5.102.2 + version: 5.102.2 '@tanstack/react-form': specifier: 1.33.5 version: 1.33.5 @@ -172,11 +172,11 @@ catalogs: specifier: 0.10.0 version: 0.10.0 '@tanstack/react-query': - specifier: 5.101.4 - version: 5.101.4 + specifier: 5.102.2 + version: 5.102.2 '@tanstack/react-virtual': - specifier: 3.14.9 - version: 3.14.9 + specifier: 3.14.10 + version: 3.14.10 '@testing-library/dom': specifier: 10.4.1 version: 10.4.1 @@ -187,8 +187,8 @@ catalogs: specifier: 16.3.2 version: 16.3.2 '@testing-library/user-event': - specifier: 14.6.4 - version: 14.6.4 + specifier: 14.6.6 + version: 14.6.6 '@tsslint/cli': specifier: 3.1.4 version: 3.1.4 @@ -217,8 +217,8 @@ catalogs: specifier: 19.2.18 version: 19.2.18 '@types/react-dom': - specifier: 19.2.4 - version: 19.2.4 + specifier: 19.2.5 + version: 19.2.5 '@types/sortablejs': specifier: 1.15.9 version: 1.15.9 @@ -229,17 +229,17 @@ catalogs: specifier: npm:typescript@7.0.2 version: 7.0.2 '@vitejs/plugin-react': - specifier: 6.0.5 - version: 6.0.5 + specifier: 6.1.0 + version: 6.1.0 '@vitejs/plugin-rsc': specifier: 0.5.34 version: 0.5.34 '@vitest/browser-playwright': - specifier: 4.1.10 - version: 4.1.10 + specifier: 4.1.11 + version: 4.1.11 '@vitest/coverage-v8': - specifier: 4.1.10 - version: 4.1.10 + specifier: 4.1.11 + version: 4.1.11 abcjs: specifier: 6.7.0 version: 6.7.0 @@ -268,8 +268,8 @@ catalogs: specifier: 1.6.6 version: 1.6.6 concurrently: - specifier: 10.0.4 - version: 10.0.4 + specifier: 10.0.5 + version: 10.0.5 copy-to-clipboard: specifier: 4.0.2 version: 4.0.2 @@ -277,14 +277,14 @@ catalogs: specifier: 5.6.2 version: 5.6.2 dayjs: - specifier: 1.11.21 - version: 1.11.21 + specifier: 1.11.23 + version: 1.11.23 decimal.js: specifier: 10.6.0 version: 10.6.0 dompurify: - specifier: 3.4.13 - version: 3.4.13 + specifier: 3.4.14 + version: 3.4.14 echarts: specifier: 6.1.0 version: 6.1.0 @@ -307,11 +307,11 @@ catalogs: specifier: 5.6.0 version: 5.6.0 es-toolkit: - specifier: 1.50.0 - version: 1.50.0 + specifier: 1.51.0 + version: 1.51.0 eslint: - specifier: 10.8.1 - version: 10.8.1 + specifier: 10.9.0 + version: 10.9.0 eslint-markdown: specifier: 0.12.1 version: 0.12.1 @@ -331,8 +331,8 @@ catalogs: specifier: 63.3.3 version: 63.3.3 eslint-plugin-jsonc: - specifier: 3.4.1 - version: 3.4.1 + specifier: 3.4.2 + version: 3.4.2 eslint-plugin-markdown-preferences: specifier: 0.41.1 version: 0.41.1 @@ -352,8 +352,8 @@ catalogs: specifier: 3.1.1 version: 3.1.1 eslint-plugin-storybook: - specifier: 10.5.8 - version: 10.5.8 + specifier: 10.5.10 + version: 10.5.10 eslint-plugin-toml: specifier: 1.5.0 version: 1.5.0 @@ -370,20 +370,20 @@ catalogs: specifier: 3.1.3 version: 3.1.3 foxact: - specifier: 0.3.8 - version: 0.3.8 + specifier: 0.3.9 + version: 0.3.9 fuse.js: specifier: 7.5.0 version: 7.5.0 happy-dom: - specifier: 20.11.2 - version: 20.11.2 + specifier: 20.11.6 + version: 20.11.6 hast-util-to-jsx-runtime: specifier: 2.3.6 version: 2.3.6 hono: - specifier: 4.13.2 - version: 4.13.2 + specifier: 4.13.3 + version: 4.13.3 html-entities: specifier: 2.6.0 version: 2.6.0 @@ -391,8 +391,8 @@ catalogs: specifier: 1.11.13 version: 1.11.13 i18next: - specifier: 26.3.6 - version: 26.3.6 + specifier: 26.4.0 + version: 26.4.0 i18next-resources-to-backend: specifier: 1.2.3 version: 1.2.3 @@ -400,8 +400,8 @@ catalogs: specifier: 0.2.0 version: 0.2.0 immer: - specifier: 11.1.16 - version: 11.1.16 + specifier: 11.1.18 + version: 11.1.18 jotai: specifier: 2.20.2 version: 2.20.2 @@ -415,8 +415,8 @@ catalogs: specifier: 3.0.8 version: 3.0.8 js-yaml: - specifier: 5.2.3 - version: 5.2.3 + specifier: 5.3.0 + version: 5.3.0 jsonschema: specifier: 1.5.0 version: 1.5.0 @@ -439,11 +439,11 @@ catalogs: specifier: 1.14.1 version: 1.14.1 mediabunny: - specifier: 1.53.1 - version: 1.53.1 + specifier: 1.55.2 + version: 1.55.2 mermaid: - specifier: 11.16.1 - version: 11.16.1 + specifier: 11.17.0 + version: 11.17.0 mime: specifier: 4.1.0 version: 4.1.0 @@ -454,17 +454,17 @@ catalogs: specifier: 12.43.0 version: 12.43.0 negotiator: - specifier: 1.0.0 - version: 1.0.0 + specifier: 1.1.0 + version: 1.1.0 next: - specifier: 16.3.0 - version: 16.3.0 + specifier: 16.3.2 + version: 16.3.2 next-themes: specifier: 0.4.6 version: 0.4.6 nuqs: - specifier: 2.9.5 - version: 2.9.5 + specifier: 2.10.0 + version: 2.10.0 open: specifier: 11.0.1 version: 11.0.1 @@ -475,8 +475,8 @@ catalogs: specifier: 1.1.1 version: 1.1.1 pinyin-pro: - specifier: 3.29.1 - version: 3.29.1 + specifier: 3.29.3 + version: 3.29.3 playwright: specifier: 1.62.1 version: 1.62.1 @@ -499,8 +499,8 @@ catalogs: specifier: 6.2.3 version: 6.2.3 react-i18next: - specifier: 17.0.11 - version: 17.0.11 + specifier: 17.0.12 + version: 17.0.12 react-papaparse: specifier: 4.4.0 version: 4.4.0 @@ -544,8 +544,8 @@ catalogs: specifier: 1.0.8 version: 1.0.8 storybook: - specifier: 10.5.8 - version: 10.5.8 + specifier: 10.5.10 + version: 10.5.10 streamdown: specifier: 2.5.0 version: 2.5.0 @@ -580,17 +580,23 @@ catalogs: specifier: 2.0.0 version: 2.0.0 uuid: - specifier: 14.0.1 - version: 14.0.1 + specifier: 14.0.2 + version: 14.0.2 vinext: - specifier: 1.0.0-beta.5 - version: 1.0.0-beta.5 + specifier: 1.0.0-beta.8 + version: 1.0.0-beta.8 + vite: + specifier: npm:@voidzero-dev/vite-plus-core@0.3.0 + version: 0.3.0 vite-plugin-inspect: specifier: 12.0.2 version: 12.0.2 vite-plus: - specifier: 0.2.9 - version: 0.2.9 + specifier: 0.3.0 + version: 0.3.0 + vitest: + specifier: 4.1.11 + version: 4.1.11 vitest-browser-react: specifier: 2.2.0 version: 2.2.0 @@ -620,17 +626,17 @@ overrides: postcss-selector-parser@>=6.0.0 <6.1.3: 6.1.4 postcss-selector-parser@>=7.0.0 <7.1.3: 7.1.5 postcss@<8.5.10: ^8.5.10 - rollup@>=4.0.0 <4.59.0: 4.62.4 + rollup@>=4.0.0 <4.59.0: 4.62.5 safer-buffer: npm:@nolyfill/safer-buffer@^1.0.44 side-channel: npm:@nolyfill/side-channel@^1.0.44 - solid-js: 1.9.14 + solid-js: 1.9.15 string-width: ~8.2.2 tar@<=7.5.15: ^7.5.16 - vite: npm:@voidzero-dev/vite-plus-core@0.2.9 - vitest: 4.1.10 ws@>=8.0.0 <8.20.1: ^8.21.3 yaml@>=2.0.0 <2.8.3: 2.9.0 yauzl@<3.2.1: 3.2.1 + vite@*: npm:@voidzero-dev/vite-plus-core@0.3.0 + vitest@*: 4.1.11 importers: @@ -638,10 +644,10 @@ importers: devDependencies: '@eslint-community/eslint-plugin-eslint-comments': specifier: 'catalog:' - version: 4.7.2(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)) + version: 4.7.2(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)) '@eslint-react/eslint-plugin': specifier: 'catalog:' - version: 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + version: 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) '@eslint/markdown': specifier: 'catalog:' version: 8.0.3(supports-color@11.0.0) @@ -653,73 +659,73 @@ importers: version: 1.2.10 '@tanstack/eslint-plugin-query': specifier: 'catalog:' - version: 5.101.4(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@10.2.2) + version: 5.102.2(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) '@types/node': specifier: 'catalog:' version: 25.9.5 '@typescript-eslint/parser': specifier: 'catalog:' - version: 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + version: 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) '@typescript/native': specifier: 'catalog:' version: typescript@7.0.2 concurrently: specifier: 'catalog:' - version: 10.0.4 + version: 10.0.5 eslint: specifier: 'catalog:' - version: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + version: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) eslint-markdown: specifier: 'catalog:' - version: 0.12.1(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + version: 0.12.1(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) eslint-plugin-antfu: specifier: 'catalog:' - version: 3.2.3(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)) + version: 3.2.3(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)) eslint-plugin-better-tailwindcss: specifier: 'catalog:' - version: 4.7.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(oxlint@1.77.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(tailwindcss@4.3.3) + version: 4.7.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(oxlint@1.79.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(tailwindcss@4.3.3) eslint-plugin-command: specifier: 'catalog:' - version: 3.5.3(@typescript-eslint/typescript-estree@8.67.0(@typescript/typescript6@6.0.2)(supports-color@11.0.0))(@typescript-eslint/utils@8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0))(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)) + version: 3.5.3(@typescript-eslint/typescript-estree@8.67.0(@typescript/typescript6@6.0.2)(supports-color@11.0.0))(@typescript-eslint/utils@8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0))(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)) eslint-plugin-erasable-syntax-only: specifier: 'catalog:' - version: 0.4.2(@typescript-eslint/parser@8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0))(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@10.2.2) + version: 0.4.2(@typescript-eslint/parser@8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0))(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) eslint-plugin-jsdoc: specifier: 'catalog:' - version: 63.3.3(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + version: 63.3.3(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) eslint-plugin-jsonc: specifier: 'catalog:' - version: 3.4.1(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)) + version: 3.4.2(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)) eslint-plugin-markdown-preferences: specifier: 'catalog:' - version: 0.41.1(@eslint/markdown@8.0.3(supports-color@11.0.0))(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + version: 0.41.1(@eslint/markdown@8.0.3(supports-color@11.0.0))(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) eslint-plugin-n: specifier: 'catalog:' - version: 18.3.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)) + version: 18.3.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)) eslint-plugin-no-barrel-files: specifier: 'catalog:' - version: 1.3.1(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + version: 1.3.1(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) eslint-plugin-perfectionist: specifier: 'catalog:' - version: 5.10.1(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + version: 5.10.1(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) eslint-plugin-pnpm: specifier: 'catalog:' - version: 1.8.0(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)) + version: 1.8.0(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)) eslint-plugin-regexp: specifier: 'catalog:' - version: 3.1.1(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)) + version: 3.1.1(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)) eslint-plugin-storybook: specifier: 'catalog:' - version: 10.5.8(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(supports-color@11.0.0) + version: 10.5.10(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) eslint-plugin-toml: specifier: 'catalog:' - version: 1.5.0(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@10.2.2) + version: 1.5.0(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) eslint-plugin-unicorn: specifier: 'catalog:' - version: 71.1.0(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)) + version: 71.1.0(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)) eslint-plugin-yml: specifier: 'catalog:' - version: 3.8.1(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)) + version: 3.8.1(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)) knip: specifier: 'catalog:' version: 6.32.2 @@ -730,11 +736,11 @@ importers: specifier: 'catalog:' version: '@typescript/typescript6@6.0.2' vite: - specifier: npm:@voidzero-dev/vite-plus-core@0.2.9 - version: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' + specifier: 'catalog:' + version: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' vite-plus: specifier: 'catalog:' - version: 0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) + version: 0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) cli: dependencies: @@ -761,7 +767,7 @@ importers: version: 3.1.1 js-yaml: specifier: 'catalog:' - version: 5.2.3 + version: 5.3.0 lockfile: specifier: 'catalog:' version: 1.0.4 @@ -789,7 +795,7 @@ importers: version: link:../packages/tsconfig '@hono/node-server': specifier: 'catalog:' - version: 2.1.1(hono@4.13.2) + version: 2.1.1(hono@4.13.3) '@types/lockfile': specifier: 'catalog:' version: 1.0.4 @@ -801,22 +807,22 @@ importers: version: typescript@7.0.2 '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.10(@vitest/browser@4.1.10)(vitest@4.1.10) + version: 4.1.11(@vitest/browser@4.1.11)(vitest@4.1.11) hono: specifier: 'catalog:' - version: 4.13.2 + version: 4.13.3 typescript: specifier: 'catalog:' version: '@typescript/typescript6@6.0.2' vite: - specifier: npm:@voidzero-dev/vite-plus-core@0.2.9 - version: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' + specifier: 'catalog:' + version: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' vite-plus: specifier: 'catalog:' - version: 0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) + version: 0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) vitest: - specifier: 4.1.10 - version: 4.1.10(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/browser-preview@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.2) + specifier: 'catalog:' + version: 4.1.11(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/browser-preview@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.6) e2e: devDependencies: @@ -863,14 +869,14 @@ importers: specifier: 'catalog:' version: '@typescript/typescript6@6.0.2' vite: - specifier: npm:@voidzero-dev/vite-plus-core@0.2.9 - version: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' + specifier: 'catalog:' + version: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' vite-plus: specifier: 'catalog:' - version: 0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) + version: 0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) vitest: - specifier: 4.1.10 - version: 4.1.10(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/browser-preview@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.2) + specifier: 'catalog:' + version: 4.1.11(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/browser-preview@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.6) zod: specifier: 'catalog:' version: 4.4.3 @@ -898,25 +904,25 @@ importers: version: typescript@7.0.2 js-yaml: specifier: 'catalog:' - version: 5.2.3 + version: 5.3.0 typescript: specifier: 'catalog:' version: '@typescript/typescript6@6.0.2' vite: - specifier: npm:@voidzero-dev/vite-plus-core@0.2.9 - version: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' + specifier: 'catalog:' + version: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' vite-plus: specifier: 'catalog:' - version: 0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) + version: 0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) vitest: - specifier: 4.1.10 - version: 4.1.10(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/browser-preview@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.2) + specifier: 'catalog:' + version: 4.1.11(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/browser-preview@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.6) packages/dev-proxy: dependencies: '@hono/node-server': specifier: 'catalog:' - version: 2.1.1(hono@4.13.2) + version: 2.1.1(hono@4.13.3) c12: specifier: 'catalog:' version: 4.0.0-beta.5(chokidar@5.0.0)(dotenv@17.4.2)(giget@3.3.0)(jiti@2.7.0)(magicast@0.5.3) @@ -925,7 +931,7 @@ importers: version: 5.0.0 hono: specifier: 'catalog:' - version: 4.13.2 + version: 4.13.3 devDependencies: '@dify/tsconfig': specifier: workspace:* @@ -937,14 +943,14 @@ importers: specifier: 'catalog:' version: typescript@7.0.2 vite: - specifier: npm:@voidzero-dev/vite-plus-core@0.2.9 - version: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0)' + specifier: 'catalog:' + version: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0)' vite-plus: specifier: 'catalog:' - version: 0.2.9(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0) + version: 0.3.0(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0) vitest: - specifier: 4.1.10 - version: 4.1.10(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/browser-preview@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(happy-dom@20.11.2) + specifier: 'catalog:' + version: 4.1.11(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/browser-preview@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(happy-dom@20.11.6) packages/dify-ui: dependencies: @@ -960,7 +966,7 @@ importers: version: 1.7.0(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@chromatic-com/storybook': specifier: 'catalog:' - version: 5.3.0(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) + version: 5.3.0(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) '@dify/tsconfig': specifier: workspace:* version: link:../tsconfig @@ -972,49 +978,49 @@ importers: version: 1.2.10 '@storybook/addon-a11y': specifier: 'catalog:' - version: 10.5.8(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) + version: 10.5.10(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) '@storybook/addon-docs': specifier: 'catalog:' - version: 10.5.8(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) + version: 10.5.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) '@storybook/addon-links': specifier: 'catalog:' - version: 10.5.8(@types/react@19.2.18)(react@19.2.8)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) + version: 10.5.10(@types/react@19.2.18)(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) '@storybook/addon-themes': specifier: 'catalog:' - version: 10.5.8(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) + version: 10.5.10(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) '@storybook/addon-vitest': specifier: 'catalog:' - version: 10.5.8(@vitest/browser-playwright@4.1.10)(@vitest/browser@4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10))(@vitest/runner@4.1.10)(react@19.2.8)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(vitest@4.1.10) + version: 10.5.10(@vitest/browser-playwright@4.1.11)(@vitest/browser@4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.11))(@vitest/runner@4.1.11)(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(vitest@4.1.11) '@storybook/react-vite': specifier: 'catalog:' - version: 10.5.8(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(supports-color@11.0.0) + version: 10.5.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(supports-color@11.0.0) '@tailwindcss/vite': specifier: 'catalog:' - version: 4.3.3(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + version: 4.3.3(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) '@tanstack/react-hotkeys': specifier: 'catalog:' version: 0.10.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@tanstack/react-virtual': specifier: 'catalog:' - version: 3.14.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 3.14.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@types/react': specifier: 'catalog:' version: 19.2.18 '@types/react-dom': specifier: 'catalog:' - version: 19.2.4(@types/react@19.2.18) + version: 19.2.5(@types/react@19.2.18) '@typescript/native': specifier: 'catalog:' version: typescript@7.0.2 '@vitejs/plugin-react': specifier: 'catalog:' - version: 6.0.5(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + version: 6.1.0(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) '@vitest/browser-playwright': specifier: 'catalog:' - version: 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(playwright@1.62.1)(vitest@4.1.10) + version: 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(playwright@1.62.1)(vitest@4.1.11) '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.10(@vitest/browser@4.1.10)(vitest@4.1.10) + version: 4.1.11(@vitest/browser@4.1.11)(vitest@4.1.11) class-variance-authority: specifier: 'catalog:' version: 0.7.1 @@ -1029,7 +1035,7 @@ importers: version: 19.2.8(react@19.2.8) storybook: specifier: 'catalog:' - version: 10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + version: 10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) tailwindcss: specifier: 'catalog:' version: 4.3.3 @@ -1037,23 +1043,23 @@ importers: specifier: 'catalog:' version: '@typescript/typescript6@6.0.2' vite: - specifier: npm:@voidzero-dev/vite-plus-core@0.2.9 - version: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' + specifier: 'catalog:' + version: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' vite-plus: specifier: 'catalog:' - version: 0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) + version: 0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) vitest: - specifier: 4.1.10 - version: 4.1.10(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/browser-preview@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.2) + specifier: 'catalog:' + version: 4.1.11(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/browser-preview@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.6) vitest-browser-react: specifier: 'catalog:' - version: 2.2.0(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(vitest@4.1.10) + version: 2.2.0(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(vitest@4.1.11) packages/iconify-collections: devDependencies: iconify-import-svg: specifier: 'catalog:' - version: 0.2.0(supports-color@10.2.2) + version: 0.2.0(supports-color@11.0.0) tsx: specifier: 'catalog:' version: 4.23.12 @@ -1076,14 +1082,14 @@ importers: specifier: 'catalog:' version: '@typescript/typescript6@6.0.2' vite: - specifier: npm:@voidzero-dev/vite-plus-core@0.2.9 - version: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' + specifier: 'catalog:' + version: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' vite-plus: specifier: 'catalog:' - version: 0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) + version: 0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) vitest: - specifier: 4.1.10 - version: 4.1.10(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/browser-preview@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.2) + specifier: 'catalog:' + version: 4.1.11(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/browser-preview@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.6) packages/migrate-no-unchecked-indexed-access: dependencies: @@ -1101,11 +1107,11 @@ importers: specifier: 'catalog:' version: 25.9.5 vite: - specifier: npm:@voidzero-dev/vite-plus-core@0.2.9 - version: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' + specifier: 'catalog:' + version: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' vite-plus: specifier: 'catalog:' - version: 0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) + version: 0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) packages/tsconfig: {} @@ -1122,19 +1128,19 @@ importers: version: typescript@7.0.2 '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.10(@vitest/browser@4.1.10)(vitest@4.1.10) + version: 4.1.11(@vitest/browser@4.1.11)(vitest@4.1.11) typescript: specifier: 'catalog:' version: '@typescript/typescript6@6.0.2' vite: - specifier: npm:@voidzero-dev/vite-plus-core@0.2.9 - version: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' + specifier: 'catalog:' + version: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' vite-plus: specifier: 'catalog:' - version: 0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) + version: 0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) vitest: - specifier: 4.1.10 - version: 4.1.10(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/browser-preview@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.2) + specifier: 'catalog:' + version: 4.1.11(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/browser-preview@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.6) web: dependencies: @@ -1182,7 +1188,7 @@ importers: version: 0.47.0(@typescript/typescript6@6.0.2) '@mediabunny/mp3-encoder': specifier: 'catalog:' - version: 1.53.1(mediabunny@1.53.1) + version: 1.55.2(mediabunny@1.55.2) '@monaco-editor/react': specifier: 'catalog:' version: 4.7.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -1197,7 +1203,7 @@ importers: version: 1.15.0 '@orpc/tanstack-query': specifier: 'catalog:' - version: 1.15.0(@orpc/client@1.15.0)(@tanstack/query-core@5.101.4) + version: 1.15.0(@orpc/client@1.15.0)(@tanstack/query-core@5.102.2) '@remixicon/react': specifier: 'catalog:' version: 4.9.0(react@19.2.8) @@ -1215,7 +1221,7 @@ importers: version: 0.13.11(@typescript/typescript6@6.0.2)(valibot@1.4.2(@typescript/typescript6@6.0.2))(zod@4.4.3) '@tanstack/query-core': specifier: 'catalog:' - version: 5.101.4 + version: 5.102.2 '@tanstack/react-form': specifier: 'catalog:' version: 1.33.5(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -1224,10 +1230,10 @@ importers: version: 0.10.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@tanstack/react-query': specifier: 'catalog:' - version: 5.101.4(react@19.2.8) + version: 5.102.2(react@19.2.8) '@tanstack/react-virtual': specifier: 'catalog:' - version: 3.14.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 3.14.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8) abcjs: specifier: 'catalog:' version: 6.7.0 @@ -1245,13 +1251,13 @@ importers: version: 5.6.2 dayjs: specifier: 'catalog:' - version: 1.11.21 + version: 1.11.23 decimal.js: specifier: 'catalog:' version: 10.6.0 dompurify: specifier: 'catalog:' - version: 3.4.13 + version: 3.4.14 echarts: specifier: 'catalog:' version: 6.1.0 @@ -1275,13 +1281,13 @@ importers: version: 5.6.0 es-toolkit: specifier: 'catalog:' - version: 1.50.0 + version: 1.51.0 fast-deep-equal: specifier: 'catalog:' version: 3.1.3 foxact: specifier: 'catalog:' - version: 0.3.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 0.3.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8) fuse.js: specifier: 'catalog:' version: 7.5.0 @@ -1296,13 +1302,13 @@ importers: version: 1.11.13 i18next: specifier: 'catalog:' - version: 26.3.6(@typescript/typescript6@6.0.2) + version: 26.4.0(@typescript/typescript6@6.0.2) i18next-resources-to-backend: specifier: 'catalog:' version: 1.2.3 immer: specifier: 'catalog:' - version: 11.1.16 + version: 11.1.18 jotai: specifier: 'catalog:' version: 2.20.2(@babel/core@7.29.7(supports-color@11.0.0))(@babel/template@7.29.7)(@types/react@19.2.18)(react@19.2.8) @@ -1311,13 +1317,13 @@ importers: version: 0.11.0(jotai@2.20.2(@babel/core@7.29.7(supports-color@11.0.0))(@babel/template@7.29.7)(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) jotai-tanstack-query: specifier: 'catalog:' - version: 0.11.0(@tanstack/query-core@5.101.4)(@tanstack/react-query@5.101.4(react@19.2.8))(jotai@2.20.2(@babel/core@7.29.7(supports-color@11.0.0))(@babel/template@7.29.7)(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) + version: 0.11.0(@tanstack/query-core@5.102.2)(@tanstack/react-query@5.102.2(react@19.2.8))(jotai@2.20.2(@babel/core@7.29.7(supports-color@11.0.0))(@babel/template@7.29.7)(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) js-cookie: specifier: 'catalog:' version: 3.0.8 js-yaml: specifier: 'catalog:' - version: 5.2.3 + version: 5.3.0 jsonschema: specifier: 'catalog:' version: 1.5.0 @@ -1335,10 +1341,10 @@ importers: version: 1.14.1 mediabunny: specifier: 'catalog:' - version: 1.53.1 + version: 1.55.2 mermaid: specifier: 'catalog:' - version: 11.16.1 + version: 11.17.0 mime: specifier: 'catalog:' version: 4.1.0 @@ -1350,19 +1356,19 @@ importers: version: 12.43.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) negotiator: specifier: 'catalog:' - version: 1.0.0 + version: 1.1.0 next: specifier: 'catalog:' - version: 16.3.0(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 16.3.2(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) next-themes: specifier: 'catalog:' version: 0.4.6(react-dom@19.2.8(react@19.2.8))(react@19.2.8) nuqs: specifier: 'catalog:' - version: 2.9.5(next@16.3.0(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) + version: 2.10.0(next@16.3.2(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) pinyin-pro: specifier: 'catalog:' - version: 3.29.1 + version: 3.29.3 qrcode.react: specifier: 'catalog:' version: 4.2.0(react@19.2.8) @@ -1380,7 +1386,7 @@ importers: version: 6.2.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) react-i18next: specifier: 'catalog:' - version: 17.0.11(@typescript/typescript6@6.0.2)(i18next@26.3.6(@typescript/typescript6@6.0.2))(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 17.0.12(@typescript/typescript6@6.0.2)(i18next@26.4.0(@typescript/typescript6@6.0.2))(react-dom@19.2.8(react@19.2.8))(react@19.2.8) react-papaparse: specifier: 'catalog:' version: 4.4.0 @@ -1395,7 +1401,7 @@ importers: version: 8.5.9(@types/react@19.2.18)(react@19.2.8) reactflow: specifier: 'catalog:' - version: 11.11.4(@types/react@19.2.18)(immer@11.1.16)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 11.11.4(@types/react@19.2.18)(immer@11.1.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) remark-breaks: specifier: 'catalog:' version: 4.0.0 @@ -1413,7 +1419,7 @@ importers: version: 4.4.2 socket.io-client: specifier: 'catalog:' - version: 4.8.3(supports-color@10.2.2) + version: 4.8.3(supports-color@11.0.0) sortablejs: specifier: 'catalog:' version: 1.15.7 @@ -1437,20 +1443,20 @@ importers: version: 2.0.0(react@19.2.8)(scheduler@0.27.0) uuid: specifier: 'catalog:' - version: 14.0.1 + version: 14.0.2 zod: specifier: 'catalog:' version: 4.4.3 zundo: specifier: 'catalog:' - version: 2.3.0(zustand@5.0.15(@types/react@19.2.18)(immer@11.1.16)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8))) + version: 2.3.0(zustand@5.0.15(@types/react@19.2.18)(immer@11.1.18)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8))) zustand: specifier: 'catalog:' - version: 5.0.15(@types/react@19.2.18)(immer@11.1.16)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)) + version: 5.0.15(@types/react@19.2.18)(immer@11.1.18)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)) devDependencies: '@chromatic-com/storybook': specifier: 'catalog:' - version: 5.3.0(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) + version: 5.3.0(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) '@dify/contracts': specifier: workspace:* version: link:../packages/contracts @@ -1480,28 +1486,28 @@ importers: version: 4.2.3 '@storybook/addon-docs': specifier: 'catalog:' - version: 10.5.8(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) + version: 10.5.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) '@storybook/addon-links': specifier: 'catalog:' - version: 10.5.8(@types/react@19.2.18)(react@19.2.8)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) + version: 10.5.10(@types/react@19.2.18)(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) '@storybook/addon-onboarding': specifier: 'catalog:' - version: 10.5.8(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) + version: 10.5.10(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) '@storybook/addon-themes': specifier: 'catalog:' - version: 10.5.8(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) + version: 10.5.10(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) '@storybook/nextjs-vite': specifier: 'catalog:' - version: 10.5.8(@babel/core@7.29.7(supports-color@11.0.0))(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(next@16.3.0(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(supports-color@11.0.0) + version: 10.5.10(@babel/core@7.29.7(supports-color@11.0.0))(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(next@16.3.2(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(supports-color@11.0.0) '@storybook/react': specifier: 'catalog:' - version: 10.5.8(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(@typescript/typescript6@6.0.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(supports-color@11.0.0) + version: 10.5.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(@typescript/typescript6@6.0.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(supports-color@11.0.0) '@tailwindcss/postcss': specifier: 'catalog:' version: 4.3.3 '@tailwindcss/vite': specifier: 'catalog:' - version: 4.3.3(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + version: 4.3.3(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) '@testing-library/dom': specifier: 'catalog:' version: 10.4.1 @@ -1510,10 +1516,10 @@ importers: version: 6.9.1 '@testing-library/react': specifier: 'catalog:' - version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@testing-library/user-event': specifier: 'catalog:' - version: 14.6.4(@testing-library/dom@10.4.1) + version: 14.6.6(@testing-library/dom@10.4.1) '@tsslint/cli': specifier: 'catalog:' version: 3.1.4(@tsslint/compat-eslint@3.1.4(@typescript/typescript6@6.0.2))(@typescript/typescript6@6.0.2) @@ -1540,7 +1546,7 @@ importers: version: 19.2.18 '@types/react-dom': specifier: 'catalog:' - version: 19.2.4(@types/react@19.2.18) + version: 19.2.5(@types/react@19.2.18) '@types/sortablejs': specifier: 'catalog:' version: 1.15.9 @@ -1549,16 +1555,16 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: 'catalog:' - version: 6.0.5(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + version: 6.1.0(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) '@vitejs/plugin-rsc': specifier: 'catalog:' - version: 0.5.34(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(react-dom@19.2.8(react@19.2.8))(react-server-dom-webpack@19.2.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) + version: 0.5.34(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(react-dom@19.2.8(react@19.2.8))(react-server-dom-webpack@19.2.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) '@vitest/browser-playwright': specifier: 'catalog:' - version: 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(playwright@1.62.1)(vitest@4.1.10) + version: 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(playwright@1.62.1)(vitest@4.1.11) '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.10(@vitest/browser@4.1.10)(vitest@4.1.10) + version: 4.1.11(@vitest/browser@4.1.11)(vitest@4.1.11) agentation: specifier: 'catalog:' version: 3.0.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -1567,7 +1573,7 @@ importers: version: 1.6.6(supports-color@11.0.0) happy-dom: specifier: 'catalog:' - version: 20.11.2 + version: 20.11.6 playwright: specifier: 'catalog:' version: 1.62.1 @@ -1579,7 +1585,7 @@ importers: version: 19.2.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8) storybook: specifier: 'catalog:' - version: 10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + version: 10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) tailwindcss: specifier: 'catalog:' version: 4.3.3 @@ -1594,25 +1600,25 @@ importers: version: 3.19.3 vinext: specifier: 'catalog:' - version: 1.0.0-beta.5(@vitejs/plugin-react@6.0.5(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(@vitejs/plugin-rsc@0.5.34(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(react-dom@19.2.8(react@19.2.8))(react-server-dom-webpack@19.2.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8))(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(next@16.3.0(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react-server-dom-webpack@19.2.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) + version: 1.0.0-beta.8(@vitejs/plugin-react@6.1.0(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(@vitejs/plugin-rsc@0.5.34(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(react-dom@19.2.8(react@19.2.8))(react-server-dom-webpack@19.2.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8))(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(next@16.3.2(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react-server-dom-webpack@19.2.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) vite: - specifier: npm:@voidzero-dev/vite-plus-core@0.2.9 - version: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' + specifier: 'catalog:' + version: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' vite-plugin-inspect: specifier: 'catalog:' - version: 12.0.2(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(srvx@0.12.5) + version: 12.0.2(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(srvx@0.12.5) vite-plus: specifier: 'catalog:' - version: 0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) + version: 0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) vitest: - specifier: 4.1.10 - version: 4.1.10(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/browser-preview@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.2) + specifier: 'catalog:' + version: 4.1.11(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/browser-preview@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.6) vitest-browser-react: specifier: 'catalog:' - version: 2.2.0(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(vitest@4.1.10) + version: 2.2.0(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(vitest@4.1.11) vitest-canvas-mock: specifier: 'catalog:' - version: 1.1.5(vitest@4.1.10) + version: 1.1.5(vitest@4.1.11) packages: @@ -1764,6 +1770,7 @@ packages: '@babel/parser@7.29.7': resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} engines: {node: '>=6.0.0'} + hasBin: true '@babel/runtime@7.29.7': resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} @@ -1896,9 +1903,6 @@ packages: '@cucumber/messages@33.0.4': resolution: {integrity: sha512-i6P1a0bnmhecOHfvIW0rhMxv/gMKfBKwDMxmD9/Uo1HSqpQ17ocHms1JwWW6uTMLAopqqWlcz7l6Pax+qUOTzg==} - '@cucumber/messages@34.0.1': - resolution: {integrity: sha512-Mvh8CkZD4TGykvXqM9qpnYVGy9cqMxYkImtghl2cF1hEuBtuDGU716zQk7KviLh0ssidM/phh9kdbJL/73dHpg==} - '@cucumber/messages@34.2.0': resolution: {integrity: sha512-6X6T1TApmbQNqxC0Oh3GcnLU+gfE5fp+cEXE/ml6+Ldx76Q6BDmkgM5vagSSDXP+vetPV2Fb0kWVeP7QIR6+Aw==} @@ -1930,12 +1934,18 @@ packages: peerDependencies: tailwindcss: '*' + '@emnapi/core@1.11.0': + resolution: {integrity: sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q==} + '@emnapi/core@1.11.2': resolution: {integrity: sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==} '@emnapi/core@1.9.2': resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} + '@emnapi/runtime@1.11.0': + resolution: {integrity: sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg==} + '@emnapi/runtime@1.11.2': resolution: {integrity: sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==} @@ -2721,13 +2731,13 @@ packages: '@types/react': '>=16' react: '>=16' - '@mediabunny/mp3-encoder@1.53.1': - resolution: {integrity: sha512-a4GceG4qSMWHzW0QOSBkoCPPHrnSkoKwLmJ/2g67lBuEM9cC1R25ibe8ha14WhzswAEFtzbzwoitUOFkhahWfg==} + '@mediabunny/mp3-encoder@1.55.2': + resolution: {integrity: sha512-T/rNwW/90eF2gaHWr168Z+J030HWDk2DlKB17316v2qbBVfB/EKfD7u6NMvDTFe5TXmK4imAenLPb9S6S4Dr+w==} peerDependencies: mediabunny: ^1.0.0 - '@mermaid-js/parser@1.2.0': - resolution: {integrity: sha512-oYPyv8A4As1yH5Bx+04iQEQxXuIQDe0GKCNSRgao6z8AM9jixXIfP0vsppRLvGf+nKIOb9/LdpWA4YuJiVvESA==} + '@mermaid-js/parser@1.2.1': + resolution: {integrity: sha512-n12NohV3mrUyUL2o93IgG/ifeW9FTyeJn3zDxkhwa8MJ9Fxg3HQMlA3RiGmD/3UnJvheztkjjQAjA2T4LmUcpw==} '@monaco-editor/loader@1.7.0': resolution: {integrity: sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA==} @@ -2832,57 +2842,57 @@ packages: '@next/env@16.0.0': resolution: {integrity: sha512-s5j2iFGp38QsG1LWRQaE2iUY3h1jc014/melHFfLdrsMJPqxqDQwWNwyQTcNoUSGZlCVZuM7t7JDMmSyRilsnA==} - '@next/env@16.3.0': - resolution: {integrity: sha512-o9r1S0BNiNreHP9Vs+Qnqd9kviDkJh8xIACY7UFZSmiGbbQRzPBBosvHzAU4TULHOIuOj/18RSsyz2qrREmIFw==} + '@next/env@16.3.2': + resolution: {integrity: sha512-8k4YoG8cM7LWlkfzGNYCRBbFNlernLiMw4s0btVl+CmmWqn3VpYypA72/5Feb1UWdxe6tHqr5KHP4p4Y4m9luA==} - '@next/swc-darwin-arm64@16.3.0': - resolution: {integrity: sha512-55hpqq18bEVAlxedlTt3tFqZmKg2nUXT1kn1G/BGEy0R13h3LwtwHPVzzjG6P4LLeOHE32PFDQUVaJEWvBEZBw==} + '@next/swc-darwin-arm64@16.3.2': + resolution: {integrity: sha512-ib5Llm93YCKoKWDh6ZaHq6QWTuOZ2bRkSnUwMmX8dsRIOkBNL1vVlSiUKSfixPL9SSh9pvukzqajk/klkn5vqg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@16.3.0': - resolution: {integrity: sha512-SOi96kSaF5T+0wW4koiM1bWzSPwjzTesC1p3df+FjdOi5LIQkBK/blxh7HdoKnNuI4PURF1OO7TZqtfnbWDSgw==} + '@next/swc-darwin-x64@16.3.2': + resolution: {integrity: sha512-qd98fX2+I5nYJDioW2o7nSjoxM5KvWdeDefM80igia4+C/qSIEhH4MhTE+hO/7qKM7W37/Mq+dOWp8UePSyLHw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@16.3.0': - resolution: {integrity: sha512-P0gZAoPMF4dyTRzhmkV4PrqVzSOB6t4mC1oI3c4dqijJ+OVEVx5clIXAKR4/uQpsqw2KKM/0D5tVumcR2r5blg==} + '@next/swc-linux-arm64-gnu@16.3.2': + resolution: {integrity: sha512-vqsgb6FAOzcrCccsLXiKtAy5t8EzO+uOazuFaSkQxeY0tNONG3vpHYy8pyBafcI5SNFPTeyard6yTr6SzNGo2A==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [glibc] - '@next/swc-linux-arm64-musl@16.3.0': - resolution: {integrity: sha512-tXXGKJw0m37O0eKJARVTX/TheKPhz0QFVtVVZXmOig+9YKLQOSP6hvf2pxv5DO7CLEJyTHx3Pg043CDQkv1G4Q==} + '@next/swc-linux-arm64-musl@16.3.2': + resolution: {integrity: sha512-xIe1eujfHUB2XcxHGddxJyu6TJRPjC5NpIkQYB/32ESkt5VkQyIAjmLRS38c+s6QY+qjtY/4KarVDzXRuD7lZQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [musl] - '@next/swc-linux-x64-gnu@16.3.0': - resolution: {integrity: sha512-pjGxK5EY7yWml78ALejFkWmgHsU7wbFQrISiugpH6FbUJhgEvw3xFZ/EBAtLl7QtL0WdQKiG9eWJ3mOKGTukHw==} + '@next/swc-linux-x64-gnu@16.3.2': + resolution: {integrity: sha512-Fe0SA2j8X0kmc3aveuHD7UktO3AE2+mH3LguP60vGbz7u0z+MrDXbeb5iZFYAwR7EzzzXJ2Yk966w9mGTFMqfA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [glibc] - '@next/swc-linux-x64-musl@16.3.0': - resolution: {integrity: sha512-sjo++Xx+lomlPs3HRsHWhVDyGG6ms1kGW5EtHLERdII8AyG1i+f6aq68xHREO6AEMlhjTNEWBSmfJfqm9orf7g==} + '@next/swc-linux-x64-musl@16.3.2': + resolution: {integrity: sha512-TFBipb+gyesI/2Ve4zVu7kGltBWN/R466G5/1gtt2lECfc22G1pjkTxu68Q9aFcOaXiRGTQfvDbQQFe7mYgxiQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [musl] - '@next/swc-win32-arm64-msvc@16.3.0': - resolution: {integrity: sha512-C5JSgiO54wURdaxdEUIXqkz04uMqC9UmPX1gtDrV/5Tf1UowdWYI8uA5hfFbPolTlp0q4KZ60xlHePNibf0VIw==} + '@next/swc-win32-arm64-msvc@16.3.2': + resolution: {integrity: sha512-rVtmnNpBYIosDnKD/96dKxFsJnwnn1WRGG/HioSe8XCm2ksSHNrd2R6+hSjvTBxeMNhJ9pYeu/90cWB1nQLuNA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@16.3.0': - resolution: {integrity: sha512-fDOggsweNb5SSw0ZKVk6U+gxSyGFFlIBY/LBc1r8GUj4u/6t6oArL+Pmkg0MBnsgR+KkdsURilVH4F3GXUGepA==} + '@next/swc-win32-x64-msvc@16.3.2': + resolution: {integrity: sha512-H4Y2o2/JcHu8LtwzD5CXfHhwxwz8gfsx2HXDEw46Mtev5xHnEmB7HNtZtmriw5ReUOjRtcDqo7XSbU01FT9NlA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -3196,8 +3206,8 @@ packages: cpu: [x64] os: [win32] - '@oxc-project/runtime@0.143.0': - resolution: {integrity: sha512-zIuXUf+YGIgsPk0xlQmzTY8NCSc8jE/pSfDodlQ9H3EGZABmr+AtIjXRrnpQAXuXzhDSNqZz9cuhud8hDDLvpg==} + '@oxc-project/runtime@0.146.0': + resolution: {integrity: sha512-lbXHIpZ1MmK6zuw5txlMdIZ2waLVUIU5Gnm3sEuwJOiqDfQfbtjeHscatmeBoxbv8+If9LFM6PGh/3DcDWYIYw==} engines: {node: ^20.19.0 || >=22.12.0} '@oxc-project/types@0.127.0': @@ -3206,227 +3216,333 @@ packages: '@oxc-project/types@0.143.0': resolution: {integrity: sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==} + '@oxc-project/types@0.146.0': + resolution: {integrity: sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==} + + '@oxc-resolver/binding-android-arm-eabi@11.21.2': + resolution: {integrity: sha512-xQoCRv+gKax9KTdwdaQNnAFOai8neay7g3jExDIORzhbrejwGSJaZNTdOJHR5ziLg2joMxOCMOFMo4zuxza2uQ==} + cpu: [arm] + os: [android] + '@oxc-resolver/binding-android-arm-eabi@11.24.2': resolution: {integrity: sha512-y09e0L0SRI2OA2tUIrjBgoV3eH5hvUKXNkJqXmNo5V2WxIjyC7I7aJfRLMEVpA8yi95f90gFDvO0VMgrDw+vwA==} cpu: [arm] os: [android] + '@oxc-resolver/binding-android-arm64@11.21.2': + resolution: {integrity: sha512-HF5oiE2L05yInPYCFD/4uxSrEZW4SuIfn99Y6L1xnJnzl066JR+MJs2rIdstw8A2MPlAKH+13dpFPNycjqzvGg==} + cpu: [arm64] + os: [android] + '@oxc-resolver/binding-android-arm64@11.24.2': resolution: {integrity: sha512-cl4icWaZFnLdg8m6qtnh5rBMuGbxc/ptStFHLeCNwr+2cZjkjNwQu/jYRS0CHlnPecOJMpuS5M6/BH+0J/YkEg==} cpu: [arm64] os: [android] + '@oxc-resolver/binding-darwin-arm64@11.21.2': + resolution: {integrity: sha512-UX4u49CVCAD8QZNELaW8eMGgMAGwFWYEPbvNsh+3r/gs4NX3KfpiACMVwRQT0EuH3uat9hM5Zl+Ppm9pJD8tgg==} + cpu: [arm64] + os: [darwin] + '@oxc-resolver/binding-darwin-arm64@11.24.2': resolution: {integrity: sha512-At29QEMF6HajbQvgY8K6OXnHD1x9rad74xBEfmCB6ZqCGsdq75aK7tOYcTbOanMy8qdIBrfL3SMr3p/lfSlb9w==} cpu: [arm64] os: [darwin] + '@oxc-resolver/binding-darwin-x64@11.21.2': + resolution: {integrity: sha512-J9xPx7YBkrRmJ+xl561ztnMWEc1aOyjEIxBiGX1dVb3u7bGSnfObfcZk+Pd+uM0HZAPNsQ1xvD8j52A/uOSqNQ==} + cpu: [x64] + os: [darwin] + '@oxc-resolver/binding-darwin-x64@11.24.2': resolution: {integrity: sha512-A5Kqr1EUj4oIL5CF4WRssq/o5P0Y11cwoFouMRmQ7YnC/A8V93nv1nb7aSU8HwcgmXropjLNkVTl4MN87cu28Q==} cpu: [x64] os: [darwin] + '@oxc-resolver/binding-freebsd-x64@11.21.2': + resolution: {integrity: sha512-fRlt7OvSaQkWj6+EDTVxawVxOlqJB2QSnBfkeCyK4RTvsGctbw3BiH2Tb7DzMs7bikc4BRBpvWP5zF9K8b54Zg==} + cpu: [x64] + os: [freebsd] + '@oxc-resolver/binding-freebsd-x64@11.24.2': resolution: {integrity: sha512-R5xkRBRRz7ceH/P5Jrc6G7FmdUdgpLYyESFAUDVTNQ9K0sGPxcp4ljiwEwEqsvNcQ4sYbMRrWcHHBCu7ksAJVw==} cpu: [x64] os: [freebsd] + '@oxc-resolver/binding-linux-arm-gnueabihf@11.21.2': + resolution: {integrity: sha512-gK+vPUcPQITkGwBKpZGrcDHSlU6eDGl7AQacxS2CEKAZIBHWkOVFeJwLZ4tYnA1acJqRM5lt7yYwPCVqGHIJ7A==} + cpu: [arm] + os: [linux] + '@oxc-resolver/binding-linux-arm-gnueabihf@11.24.2': resolution: {integrity: sha512-k/RuYL4L/R58IBn3wT5ma3Wh4k62bp1eYCFRWCmMsasUOqL+H6sW0VGFadEzKWXFFlz+2uIMoeMk9ySSZJHgbg==} cpu: [arm] os: [linux] + '@oxc-resolver/binding-linux-arm-musleabihf@11.21.2': + resolution: {integrity: sha512-L/Rgas7SrOKy/z7IH+HxSFRqVO4PuLDKLEGKvnhoCBBq3UJ0YzGBou3qMzaAGgkJwsIvX2pBF+7ojzfUhLiZxQ==} + cpu: [arm] + os: [linux] + '@oxc-resolver/binding-linux-arm-musleabihf@11.24.2': resolution: {integrity: sha512-bnHAak3ujYfH5pKk4NieFNbvYvernfoQDgwLddbZ3OtMYrem87/qjlA+u+aKG0oZcqSLGCful/6/CEA+aeAgaA==} cpu: [arm] os: [linux] + '@oxc-resolver/binding-linux-arm64-gnu@11.21.2': + resolution: {integrity: sha512-CUEYvlX1Fk7E9kUMzuswru1J9HLxMwnpDeQGjQuI4ZH+iNCoa2X9T+pvyzrbsgl7WnIeTFTlNlHsRfVdf5g9/g==} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@oxc-resolver/binding-linux-arm64-gnu@11.24.2': resolution: {integrity: sha512-vDT3KHgzYp47gmtNOqL2VNhCyl5Zv643eyxm//A68J8DeUGXrvD1pZFiaT4jSfe+RInfnn1R2yVHye4enx6RnA==} cpu: [arm64] os: [linux] libc: [glibc] + '@oxc-resolver/binding-linux-arm64-musl@11.21.2': + resolution: {integrity: sha512-ViN1ZibQyxwC67GpoP33oo+S9UyUnkog13vzQb9+v9bCNvrVzJuk0MRdacjtv/9xfRMVF/eqHFyl8YOeykI10Q==} + cpu: [arm64] + os: [linux] + libc: [musl] + '@oxc-resolver/binding-linux-arm64-musl@11.24.2': resolution: {integrity: sha512-+kMlQvbzfyEYtu5FcjE4p+ttBLpKW4d/AsAsuE69BxV6V4twZJeIQZFfD8gh/wqglY0MkPSezWXQH0jBV13MUw==} cpu: [arm64] os: [linux] libc: [musl] + '@oxc-resolver/binding-linux-ppc64-gnu@11.21.2': + resolution: {integrity: sha512-CU1sCqWnhGqYD5I1HedHk5pujrn7ssDkNB/AEQd/pd3D/EojVSgJUlpbafwIbyhia3PgIfkvdFpRPWSALzVumA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + '@oxc-resolver/binding-linux-ppc64-gnu@11.24.2': resolution: {integrity: sha512-shjfMhmZ3gq9fv/w7bi3PnZlgOPG+2QAOFf0BJF0EgBSIGZ6PMLN2zbGEblTUYB/NKVDRyYhE2ff3dJ1QqNPkA==} cpu: [ppc64] os: [linux] libc: [glibc] + '@oxc-resolver/binding-linux-riscv64-gnu@11.21.2': + resolution: {integrity: sha512-jWVyZtIHca4Gb96x7dag+y69vlei7ffjrsveLkmf2ZhqEAz6ZSBnY1GWvgZUaZlwZP62A3xD092BW97Q5VGc+g==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + '@oxc-resolver/binding-linux-riscv64-gnu@11.24.2': resolution: {integrity: sha512-zGelwFR5oRo+b69k8Lrzun86DyUHzfKN6cnjbR9l7Z7NIRznOE/2ZvPa1IUKqAL2PzAXOdwkfVqNvO1H2RlpAw==} cpu: [riscv64] os: [linux] libc: [glibc] + '@oxc-resolver/binding-linux-riscv64-musl@11.21.2': + resolution: {integrity: sha512-LF29obFqNgBUgDX7rmUK7M4D0JQG5LxhYzn3xXmECcHU9aQAdWG7NiY052qybtesEdwHQXKNTWYQ7mTsybNvWg==} + cpu: [riscv64] + os: [linux] + libc: [musl] + '@oxc-resolver/binding-linux-riscv64-musl@11.24.2': resolution: {integrity: sha512-qxZ1SWCXJY0eyhAlP6Lmo9F2Nrtx7EkYj9oCgL8apDPCwXwCEDA2U697bbT81JIc2IrVjxO4KX6WU2N+oN9Z4w==} cpu: [riscv64] os: [linux] libc: [musl] + '@oxc-resolver/binding-linux-s390x-gnu@11.21.2': + resolution: {integrity: sha512-+NYcm+cCHBbtdQQ3A4phQTSuVRYnNHz7wrl9XRAPEovcdoqi0mb1K5ZOl+jN54ZD+q1zz3V0vltbFJmzecJKmw==} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@oxc-resolver/binding-linux-s390x-gnu@11.24.2': resolution: {integrity: sha512-sGCecF3cx2DFlH4t/z7ApnOnXqN48p5p5mlHDEnHTAukQa2P+qMVE4CwyWE9W+q/m3QJ7kKfGrIjax31f44oFQ==} cpu: [s390x] os: [linux] libc: [glibc] + '@oxc-resolver/binding-linux-x64-gnu@11.21.2': + resolution: {integrity: sha512-UQqZDdG2r2HhAOsZEgufkIWHPQ886IUyuJQkoZByvzhW8j51R4UNzGBJFkTiTnLhQnggwJRdJgFWK4uY6ZVIMw==} + cpu: [x64] + os: [linux] + libc: [glibc] + '@oxc-resolver/binding-linux-x64-gnu@11.24.2': resolution: {integrity: sha512-k/VlMMcSzMlahb3/fENM4rTlsJ0s3fFROA0KXPBmKggqmTSaE383sl8F3KCOXPLmVsYfW6hCitMhXCEtNeZxxg==} cpu: [x64] os: [linux] libc: [glibc] + '@oxc-resolver/binding-linux-x64-musl@11.21.2': + resolution: {integrity: sha512-3Q9PMRjalWkT6NZ4jfujuqTCFwoWErg3y3BnOgb544B8IMw4PktiwWOigMfOHNRLMghZeJ7hpfpZf4CP7rV7Og==} + cpu: [x64] + os: [linux] + libc: [musl] + '@oxc-resolver/binding-linux-x64-musl@11.24.2': resolution: {integrity: sha512-8hbnZyNi97b/8wapYaIF9+t9GmZKBW2vunaOc3h9HGJptH7b7XpvZqOTBSm/MpTjr7H497BlgOaSfLUdhmy2bw==} cpu: [x64] os: [linux] libc: [musl] + '@oxc-resolver/binding-openharmony-arm64@11.21.2': + resolution: {integrity: sha512-Eljeq3ndtyKhM+Es8LITi4Zl2htzuRZcrPMF3kMCsrILztvU6AjZ3FuEhHHKobPUB9rMpzLpJP5bDqXI7r+iog==} + cpu: [arm64] + os: [openharmony] + '@oxc-resolver/binding-openharmony-arm64@11.24.2': resolution: {integrity: sha512-MvyGik3a6pVgZ0t/kWlbmFxFLmXQJwgLsY2eYFHLpy0wGwRbfzeIGgDwQ3kXqE30z+kSXennRkCrT7TUvkptNg==} cpu: [arm64] os: [openharmony] + '@oxc-resolver/binding-wasm32-wasi@11.21.2': + resolution: {integrity: sha512-HGDbNsIywqc4LxU38+CTJNnB/6BF7rheWOJ259b4eE0aEnelYblC8x+1tEd63bp31fYne63RQz9Jb4yVnC7Yig==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + '@oxc-resolver/binding-wasm32-wasi@11.24.2': resolution: {integrity: sha512-vHcssMPwO08RTvj/c0iOBz90attxyG3wQJ0dTcyEQK43LRpcdLWZlV5feBhv6Isn6ahbQIzHbCgfa81+RiML0Q==} engines: {node: '>=14.0.0'} cpu: [wasm32] + '@oxc-resolver/binding-win32-arm64-msvc@11.21.2': + resolution: {integrity: sha512-iWx25CBEgH49iE9q5coEGI/jb1jl5kkCY9z6U5Og67xCkQ/WFMDc2J5U78+AE91SUxM2NqSLhJC8/PLfWnImww==} + cpu: [arm64] + os: [win32] + '@oxc-resolver/binding-win32-arm64-msvc@11.24.2': resolution: {integrity: sha512-uokJqro2iBqkFvJdKQLP7d8/BUmFwESQFVmIJUQKj1Xn1a/LysJoe1vmeECLF5b3jsV8CAL5sEMJXX6SdK9Nhg==} cpu: [arm64] os: [win32] + '@oxc-resolver/binding-win32-x64-msvc@11.21.2': + resolution: {integrity: sha512-VPoCAhKvCQTlG7vxqaBXcmuvbh77BfnGXj8g0pbvVXpm1F/R8rDVwqIWcEbMzrI1JvJlm8v7T9uMVQb6UctMRg==} + cpu: [x64] + os: [win32] + '@oxc-resolver/binding-win32-x64-msvc@11.24.2': resolution: {integrity: sha512-UqGPmo56KDfLlfXFAFIrNflHT8tFxWGEivWg3Zeyp4Uy2NlKN1FGPr6/BxcLGG3+kZ6Wp14g5Uj+n71boqZfiw==} cpu: [x64] os: [win32] - '@oxfmt/binding-android-arm-eabi@0.62.0': - resolution: {integrity: sha512-pdsv0C4gPjJ8H1+sd8u0BDx+yLACTL+rgeMIOL1ln4ihSnhw8CWXtYWgvcSkyTfgGBIzFKab+d8rx9Xl4en/Kw==} + '@oxfmt/binding-android-arm-eabi@0.64.0': + resolution: {integrity: sha512-o6uzh/jTOQeAY5TdkAeXdqv7MBRcPxiRA08zrcBtkKj5cSu/FMu0Hl7Q6Fi1KCKyCWZ6lJVjBzdsJvsKltUsGQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxfmt/binding-android-arm64@0.62.0': - resolution: {integrity: sha512-WC3YQ7uS/KtDrjmqwBviwFKe9qeoi+eXx8aX1z/ffG23Md75myjrJaQqTuJvdOLPoa4EYTjDWH0dHXfwulCVog==} + '@oxfmt/binding-android-arm64@0.64.0': + resolution: {integrity: sha512-jRGSUeeP7p3Gynw2YaCVtjBIA6ZxY6bEB/ES5i54OhqmRTyuVg7ZgstEtzgq6GOAJd+2QZ5pvf+bFfmW5Mp9cw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxfmt/binding-darwin-arm64@0.62.0': - resolution: {integrity: sha512-GM8Yf3LjjaR1I8PD0SfeoIlwhsh9GvSF+cQ8sf624Yxnjsyumn95aFzYfKJVefblfDIiOAnZ7QVm2sa21Er/0Q==} + '@oxfmt/binding-darwin-arm64@0.64.0': + resolution: {integrity: sha512-JINwtU2lW7nOFSqi+H2qplipNUqah9Gc1jgGmB82kTD4UnZrZIVxCJ9qEmFiKfjNq27gYLFhrUb0to86aCwMjw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxfmt/binding-darwin-x64@0.62.0': - resolution: {integrity: sha512-d5THp7F8bCxLqNogEXDORRsQD6dosf3EyFtnXfBer6v+8tGdcWIjoDX9WaXrrF/26zOmL8qHpPTKCEvpBDmZkQ==} + '@oxfmt/binding-darwin-x64@0.64.0': + resolution: {integrity: sha512-gCmuswrgrOSajV4HCRFkVCGIruPq8bjYuPYgSE2WQB3mD6XrdyZ3JMSRZCkQ8zCxOyGWriBo6QoZ5nmMHQ1BfA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxfmt/binding-freebsd-x64@0.62.0': - resolution: {integrity: sha512-1DnrtXGZooOZ0fHgAXZUaDQzBVh1CM2MNW4oBXyQ2aWKvCHjyljvT9fgBkOM0fEOb96X5eqtcfJ0YUVt9jj66g==} + '@oxfmt/binding-freebsd-x64@0.64.0': + resolution: {integrity: sha512-Ab8g7a38pT0MMImjh7anRSTve6buWBIlcXIFBYa5xl4s6UxEgKSc2xOOhbGtLwvXnEi2PsEDGoJh3oUU7xkehQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxfmt/binding-linux-arm-gnueabihf@0.62.0': - resolution: {integrity: sha512-4pQDHOYRH+Huqe0StIaWyvk2CVl/aTaqSrbZpA3/pLS2xH24ME7lBgYprhQF2fRkHBzhGGGKliwxFsDdHwx59g==} + '@oxfmt/binding-linux-arm-gnueabihf@0.64.0': + resolution: {integrity: sha512-BgvS3CoQ+Xy2deoZqEN8JVKabcCZi2RxA3yant8G9OAv9KuPJ9TCjHkqigzdHUVwErZxEP5d2bzLIEyKYyBDLg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm-musleabihf@0.62.0': - resolution: {integrity: sha512-X0jAaZJFMCVKhB6YyWVTQ/wN2DLsBcZKSMqTS76bF6riT+XZdtg2FPEdjDvdVbunO9cG+tWiVaEs4Zs38lxYog==} + '@oxfmt/binding-linux-arm-musleabihf@0.64.0': + resolution: {integrity: sha512-QXpNxwoMj0YvnceCNZadNSden3bIcnvjn/sDp/rwZhRoZoZYGpHvtPyhGsdJz9uvT9GkaMW7SsLddurU56dt8w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm64-gnu@0.62.0': - resolution: {integrity: sha512-682Z8T5s8T5ATArYtsejKvbIfd8LEAXyyDkKkoZVq8HND7Vx8TYLlrDjDSeYfodMeVwHOgkj13lJYR8cj6vUSg==} + '@oxfmt/binding-linux-arm64-gnu@0.64.0': + resolution: {integrity: sha512-BBgH3I1ppDsI5pZ4Pdhw0ceYxwVCfbU/bZEBCeZ6caRS9x0ZabErxubP7riGUn11PXZBhe8DYdjkDKP1FlVQ5w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-arm64-musl@0.62.0': - resolution: {integrity: sha512-lk25fAl7KWaLWVJcW0CHEXB7QlQZtx5eDkjpaGMK0hzXTjUe0Wmlu8IKuFHoviSOcEJedRTs4VE/506VqGxGew==} + '@oxfmt/binding-linux-arm64-musl@0.64.0': + resolution: {integrity: sha512-v19HSjC/BGXdt26qEvKZtwAHgGmQ2Agcap2kQP+KIqoRZqivVzYth3ui2dJA1i+6/fjpjga85lIOaJJjQ/bOOw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-ppc64-gnu@0.62.0': - resolution: {integrity: sha512-SFyNqHQLwySceWNLhiSldx7wPXRAzP0L0WcW9GegP3uWrpZGJiZlQO85NbHAFPEfxR9PhZ9qSnZryEh7+v+4Gw==} + '@oxfmt/binding-linux-ppc64-gnu@0.64.0': + resolution: {integrity: sha512-PElLnOo4xFTBZrxPhgTIj0eHqZXwEBQoNWtb7facUV170T0B0FRET0iNbb3LUeLWTybkUW+vsdyv4ihOdyXGyw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-gnu@0.62.0': - resolution: {integrity: sha512-KYj55C1ywJfHo6+aKDuEmUtVEdJALsC5GwayDGsI6FGz2GxFqNr/mA8nxVsNbJzm7sE5MRqTQ9ziImSzhYXysA==} + '@oxfmt/binding-linux-riscv64-gnu@0.64.0': + resolution: {integrity: sha512-Qzsg15n4F5CH+MorcRW4MkAEMiLzXmeG+DiDSbP/bBTqCmWOH3K9DHryNrve+JHlV0txS+B6Z9P5Xz+cmWeL+g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-musl@0.62.0': - resolution: {integrity: sha512-BhZDNo5GOU5nC378RhD0/XpvaEBHsH3HLgJp8YZX3A0InC7oivzA63HsRmiXFLtLSHAstEVrDf6fbC7Rs8Jh/A==} + '@oxfmt/binding-linux-riscv64-musl@0.64.0': + resolution: {integrity: sha512-/GZ358wnQ/Ez4UVnCcZIi56JkY0sOdZ+B108pqXKqZz3jLS59F4KEAB1Qv3fRlObrFEk+3L2vUQ/xoPx+3vjXw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-s390x-gnu@0.62.0': - resolution: {integrity: sha512-UyAFmyHkgSgUJ/wOM4p3U8AC2yAFvRH5PNBs7TnK0fObTT/XSWcdr/lAzPSWaekHaZFaMeFZyk9n93Joq3J93A==} + '@oxfmt/binding-linux-s390x-gnu@0.64.0': + resolution: {integrity: sha512-/C9We3DXegowfLXtVCYHeNiU9azwCDr5cQkEtCVlc74vyn+lLQSPApJ1CZmxAduqeq/Oi3gQ+IVptyhCaTMtkQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-gnu@0.62.0': - resolution: {integrity: sha512-1iYMP0leytWazFubD/WnINJuIrzRPuoL1aWEJdlGezEzDbTxcd29R4r8IUzP2oWeKst5V02uMJgR2NILlPlG6w==} + '@oxfmt/binding-linux-x64-gnu@0.64.0': + resolution: {integrity: sha512-91KM2CeRWscIEHlj1NsW2WSnzGeq1Ehq+39bfDowTdkn+fcvK/x4Y1RcyqT7glyBjZio0ldkeCG6Usj3v7ASog==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-musl@0.62.0': - resolution: {integrity: sha512-4rA/URtJSTVNVAQz6Q8wf7SaRvOXVy+TizriT9hs/Y1XhLR/R+92uWKRQG8yFWRAIEBbFHJ6WevQcl/G9SXEfw==} + '@oxfmt/binding-linux-x64-musl@0.64.0': + resolution: {integrity: sha512-gw7uEk9I+7zoT1EYLra1eWArIzNcz8e3jkv+Noo2+o2T7wPvsNSQbfoa4DSfZlvn1i6mJ05RiZ4/omaXPDNhQg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxfmt/binding-openharmony-arm64@0.62.0': - resolution: {integrity: sha512-mSZuFHU2ar1KLUjXpI2QBQcJ1VsOB3mOCgQXuXCpKs19dgh4u+OaovNfrWDfiJb+ihJ2+f7YFcaO9bS2dlTCXA==} + '@oxfmt/binding-openharmony-arm64@0.64.0': + resolution: {integrity: sha512-HYHFf616FHSPSO07c09mjmXBfQ73wIVM3m0txOiooa5XZkGoxFd6B14PVj0LB0DXIqJ6wAO/dDR/NX/5UUaqnw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxfmt/binding-win32-arm64-msvc@0.62.0': - resolution: {integrity: sha512-OfwuhkcjDlqC4EgDojtiV9mzpLqeB9KqTOWPOjLEYBVdDCVSxqW3qzp/xcIxsbtI0UgGCnKvAqYKyY25kf5JZw==} + '@oxfmt/binding-win32-arm64-msvc@0.64.0': + resolution: {integrity: sha512-uQjFp081IZSWD6VAofX2iO2z01awAdHmfC+NrieWIPKrT2hZKQDyq/U18M7ifC0sm0Wz8aHY/p6+FDYIzs/CrQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxfmt/binding-win32-ia32-msvc@0.62.0': - resolution: {integrity: sha512-P9uDDNFRzghO3X8QAzhkjKhK7JvtABsVn8UYtFX7uor12IAnwNt8nNIctvfWj1JkQU/kE+fmLRPiw7XlrIHsZw==} + '@oxfmt/binding-win32-ia32-msvc@0.64.0': + resolution: {integrity: sha512-lNM6byTAQ881jugzFu8juJTbNRgsUTlswMA6pJmwi1XDvmIqnnb49lcUAs5gz94fCJLrVN+/X3s3jOKqx23WIQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxfmt/binding-win32-x64-msvc@0.62.0': - resolution: {integrity: sha512-dlI5SY7XYQCiCBafntWagCR6HcAJB/NpsLtdlPx8x08+Osz8Ok1HHz1GZuusegCe/VoJ6pAnF5a4pd5OZAq7qQ==} + '@oxfmt/binding-win32-x64-msvc@0.64.0': + resolution: {integrity: sha512-BtmbtL/QjMtF1a6C3CqoDluH2IfB6fJt62E+B9RFfUPtFk4Iz9PFS6+y/SzzOvSxc7aUk2Kphwg7Dh8lMbwu6g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -3461,130 +3577,130 @@ packages: cpu: [x64] os: [win32] - '@oxlint/binding-android-arm-eabi@1.77.0': - resolution: {integrity: sha512-E06sKWS6PiI6HRxS1wyQg22HvApt01hI7fV+T3wUk3OSbaaP4a3hYGY/MIQDmASqCiRjBdpRQYkgMkqH82cWmQ==} + '@oxlint/binding-android-arm-eabi@1.79.0': + resolution: {integrity: sha512-TebFaaMklO/RXzTv7PucaCq9l3X6D1gA+C8H6K4njtjFOV+zWE9MKLpulcJZN9bzytbUbQIY0mZuz12nQ5Kv4Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxlint/binding-android-arm64@1.77.0': - resolution: {integrity: sha512-NvsKz0KZxTp9cYWPLf+FXaSZwB3oO3peAjtukpOMBgse2vhQSoIIVqeO1yR0lEo/UcdZIDL18uq+kL0LzQ0ytA==} + '@oxlint/binding-android-arm64@1.79.0': + resolution: {integrity: sha512-KqqnOtAVgNsPPF0YSodkFZA1O80jcKoCZCTu3bgsszxA+MrMP9TLzfXitKjEj1FmrPprKDMdRDMmY3weESO9sg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxlint/binding-darwin-arm64@1.77.0': - resolution: {integrity: sha512-bgjTn6nW4bQCFBvSvuHCpDD+sONvmpo4lGI4PxzMt1quBA+xYxhczk6RiCn3GZ9gY8uhaBbwhj9MdKGfu6T9DA==} + '@oxlint/binding-darwin-arm64@1.79.0': + resolution: {integrity: sha512-BVC2nsMzqQzRDPc5RhixkZ+m1p7iH4bxRRvqkbwDXX0PlQKm1BPy8J8cRjnAFafOq2QzI+BfO3vE8w2GZ3CBag==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxlint/binding-darwin-x64@1.77.0': - resolution: {integrity: sha512-aotaIttH1R6j1Rwhx0M0htgeZyGtVQqYNTVEYMN/UcgHPquGA6kmk9OyuDc3a2GKUQBC+3C3GVQCcrRPMYqAFA==} + '@oxlint/binding-darwin-x64@1.79.0': + resolution: {integrity: sha512-p6Lm+snmhGuLKL1+CpCV8L6ijkE/qJzK2H2jG9+eKJT0n31RbY4FLsdhexekgP3bLpw4Kgde+9DZuDZQ4yIInA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxlint/binding-freebsd-x64@1.77.0': - resolution: {integrity: sha512-nNx/wta7ksRAdYvq+l4AWjXkLxEXHALhENxjj2cYbQAIR4ybaA5L+hCbE63HOmft5czQ6ks+hb8vmEAnn7YGPg==} + '@oxlint/binding-freebsd-x64@1.79.0': + resolution: {integrity: sha512-qDMm0dXZnoHyRqSL4N4xUq82T4sqK5cbKSjvd/dF/YbMUXc2R1wEPf+vmA5S0qUmi0nwXfNbjXBtZaIqzQLIMg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxlint/binding-linux-arm-gnueabihf@1.77.0': - resolution: {integrity: sha512-tMLLjM7xXtzXisVCzkOTXNCy9bZVId2wteNwjohlFDR/jY6WagpEDA1c1wu4xRc20Hojaxj+V6DSR7gbKxijWA==} + '@oxlint/binding-linux-arm-gnueabihf@1.79.0': + resolution: {integrity: sha512-2od7s0nuKPzqyUZAWk9KkCyGg7eI9dwFPZg+20lB15fKFkVZ0c9ZFxqPfiBAyDTlTkh9stPI0t+JlPCqMbItVA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm-musleabihf@1.77.0': - resolution: {integrity: sha512-MiAFDFaqR0tmHTAyo0YDcZ5hyLREdYw/RQhc2R3cbT+8O3tB+zqPM2th9TTQ+Uo3jn/embS+DO+HyX9ztCPkOQ==} + '@oxlint/binding-linux-arm-musleabihf@1.79.0': + resolution: {integrity: sha512-ZOQUjkzDnvlhSE3+tWC3YXx94MMl+sYMlwH+u1+YGApGHOJP/YAc8ZBRFOXZ6eOBmxtXAWuS/fBcdZr8qqNO1A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm64-gnu@1.77.0': - resolution: {integrity: sha512-/xqQ3B16i1T4cyt/9Mn+4CpzhUXoBXp7kVpIwzOXNFLj5JmK1bIjsbSnX296Gg8A/o7oDtKWikFgBx0SLwztkw==} + '@oxlint/binding-linux-arm64-gnu@1.79.0': + resolution: {integrity: sha512-lu158FR4nGqGeRS3BQvtG85wRgU/Fy4MD5Cxp1hzJXizGiLo6u2742wJSCDKh8cFcZntvX7fcxlq4mMmfryH1g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-arm64-musl@1.77.0': - resolution: {integrity: sha512-LSbwuRKiNCenPDcbARqAZ5RfBy7gmj7vOvfJRLeCDU3gFtSxWbhv/+VTlaUqzUhNj1gFLHB8h7ALnxa/Az6z6g==} + '@oxlint/binding-linux-arm64-musl@1.79.0': + resolution: {integrity: sha512-mbpKQeE2aflTjddaHK7MP8KP/OFbUM++lt5M635ENM8IyIdK0jm2t9pb+2v9mVVIvhF6TqA4l7F79Pll1mi+uw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxlint/binding-linux-ppc64-gnu@1.77.0': - resolution: {integrity: sha512-QWdcH31mXEUe5Nq1s0CfCpceaKjIo9uZtwDjAuL681g1axf+5x8xrg/eXWaw//4NCxYZ4V4e5Hu5tvdR+pTBlg==} + '@oxlint/binding-linux-ppc64-gnu@1.79.0': + resolution: {integrity: sha512-WpGNua7gaxaHnpSDeog2ji8IDHn/QLPl9LPzwkR/FvVv58vT5BcXjRXnU+wbu3N75cpeha8CdC7ho/U2OIsB4g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-gnu@1.77.0': - resolution: {integrity: sha512-GnOfYgJxbcElOiPZaDFDl406ONddwvOWk2jvAAAEjwAl4GofNoHF+/HHUIBYa6bFCArlcGPi0XjC4cU1pkgF/Q==} + '@oxlint/binding-linux-riscv64-gnu@1.79.0': + resolution: {integrity: sha512-tK1E93A5LVzISg4ngpKJnfTs7EqtIUceGI7MQ4GyDjJiLi8wPCkEyKlj2xkyKWZ1yzkDJyLHTBJ5/iFWRdnJvg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-musl@1.77.0': - resolution: {integrity: sha512-AyEMTUCf0xY+hHF+IxqXFQIX0yQOIR8ykpY0lJNOw9xYqOzUX8dyZfRvlG0RfXwuQn2eonf/8NrMmDSZJjdqsA==} + '@oxlint/binding-linux-riscv64-musl@1.79.0': + resolution: {integrity: sha512-qhQvUIrngXivA2A9pQ+xPCychztn/5qUv7yS3gDwXv3w7Rag+eTeeXWmRyx+t7XsW5x6LuY/8AsTq36UgFIblg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxlint/binding-linux-s390x-gnu@1.77.0': - resolution: {integrity: sha512-sPLzEcNvxd/oyVQ5oZo92CiHkFkpBeRop13E/P3TPY+hZfXHKCOWKI70TE2RYwMKFJDc20EMjH16L7NZICtKTw==} + '@oxlint/binding-linux-s390x-gnu@1.79.0': + resolution: {integrity: sha512-sv6AaVgU/eE6u+6WFiQVDcPPwTxP6IJMSB9k701W2r/r6Tx465e8vPvVyRxquNH4Vy6KwRNu90mVbxXJN8+5gg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-gnu@1.77.0': - resolution: {integrity: sha512-1Oh2ssH2L7lwyvkdSqaMUfsGfwU2Wfvew+obBUYjRVqhpBcUpwnsPSEr1IzVi9XqkuY10geiLsNKecqaZC34Dw==} + '@oxlint/binding-linux-x64-gnu@1.79.0': + resolution: {integrity: sha512-iFZL02deziHslb3jEX9KdqlAkYoo4fGyotchKDzdfK1f5mxlIBeiQeHhvK3iFpuEJSB4ma/qeFn9oxPiwnhUPQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-musl@1.77.0': - resolution: {integrity: sha512-0j/2wRgNGO+Qj/M1uu/p57h/hFTTWWcfie0ufkbabeus2s5+/QqkCflnMOwLLN5m2GsNeWp4xdl4cPa4n7QCOQ==} + '@oxlint/binding-linux-x64-musl@1.79.0': + resolution: {integrity: sha512-3DtZR2raqObnh7wXZoFYFd0Fw7skBvcb3f7A+/lkEiDuh8hrE6vv9b/62Qxao1a9/OeHLw/FcXlXzgsW9wTRFg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxlint/binding-openharmony-arm64@1.77.0': - resolution: {integrity: sha512-BJ/j54qS0usEnyDkLYURMj2iiD9h5Cyy+ppzeMSXBGRXaGRNWnj1Mw14NqWMR5E/PzdgB30OOCCzLzbRoduafw==} + '@oxlint/binding-openharmony-arm64@1.79.0': + resolution: {integrity: sha512-Oatt4GuA1WJkqzk2ozx4HrWROOi7opV3AKDw/U8qDIqeTqzsjn5K2x3REJMNjU3/KU/Bkq96Zi3CknaiDTaC/Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxlint/binding-win32-arm64-msvc@1.77.0': - resolution: {integrity: sha512-Yh8w+g2Lpx7StrvtYkoz9JJvXjB9wxgFChFNb85nrXm/wj/XTwGWS1hve9+900HL7llrntYB3YP+y32E3tRqzA==} + '@oxlint/binding-win32-arm64-msvc@1.79.0': + resolution: {integrity: sha512-NAgZr9Qp8nIA9rpo0JEvwiabTF/2UVqBNnupBG9X4kxXcQoScJUTi+qHhvabb9s/thgj5wQ4XcIaJvb+ZMgoKw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxlint/binding-win32-ia32-msvc@1.77.0': - resolution: {integrity: sha512-zja5b7+6a7UsRFgAQSrnax5vrzliEyNPLCjfXONu/vTWswaIVZGFajJZptaeRvPE4LghtFdAzVFlexTm7MVTGA==} + '@oxlint/binding-win32-ia32-msvc@1.79.0': + resolution: {integrity: sha512-+KyXjIvcpaXmWW/j9NNY5yWjrIVxaX18VyIheQy3jwc2GSYgpCr7MGI/HxIGQ/shAL5IWEKbhsqoMpAO5Stiog==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxlint/binding-win32-x64-msvc@1.77.0': - resolution: {integrity: sha512-+teyvPDZ2RjUvo+SuCqS/UhaJl1QtdW5fWT5NJTV61V5MIuIS90Db9LixmtEGvXixyttiK62P96MSu3UlpviBw==} + '@oxlint/binding-win32-x64-msvc@1.79.0': + resolution: {integrity: sha512-mEelcCMMBS57sIXh2veGMNy+pQwuGtcMxHxGIZWQ5Ba9pJ5jCCUFOZB9E2JhBaxGsURe+WGe0zJp4RVre52gpQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxlint/plugins@1.73.0': - resolution: {integrity: sha512-OhgMQeMmZA0dcFcX4/priaJZWdFECxiClgq6mRX6aatZEcV9PbKC3P3/v8U1hVjviT1i5U+vR8lAtBV6m4FXAA==} + '@oxlint/plugins@1.79.0': + resolution: {integrity: sha512-S0uyoxakDINJ4DPgqxGlEEvrdSMeQb7Z2lKVjxoY2gwsbZbfg2Xr8Klfeo5ZeraHmmdBCELFUHkSe6KEmBpMvg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} '@pkgr/core@0.3.6': @@ -3658,7 +3774,7 @@ packages: resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: 4.62.4 + rollup: 4.62.5 peerDependenciesMeta: rollup: optional: true @@ -3743,50 +3859,50 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@storybook/addon-a11y@10.5.8': - resolution: {integrity: sha512-yunl+sKa29NaUC3I4yjESwk6ED8waEgmmvIJzNAJvdhb7thFzZYYEld68RzKmOVcGBkD3snK5eZ/Xf0l4VWliQ==} + '@storybook/addon-a11y@10.5.10': + resolution: {integrity: sha512-RpRQV5xUbrl6hCiNrd5FSMIo6pnRZ0VZxWvEW/ASLcreGkKUW5jl2AeLCe5YROE2i80s/dU+6VPzOYKrwWNFbQ==} peerDependencies: - storybook: ^10.5.8 + storybook: ^10.5.10 - '@storybook/addon-docs@10.5.8': - resolution: {integrity: sha512-NlHiMKW/UvW/uL8HXFDCEVwoH3qZeGYZ/qlWax4d7H471b/T54MBq2KcB4ZrdA785FfIH3numAJdBb5jwn00Mg==} + '@storybook/addon-docs@10.5.10': + resolution: {integrity: sha512-06JoK3/a7FWI/6GzuidJP9iHp1/Vejboe6lzS1jW+d8ItpecriBt+oXh1VNmUM7i7PjI6pZnet+j51QnLyeOoQ==} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.5.8 + storybook: ^10.5.10 peerDependenciesMeta: '@types/react': optional: true - '@storybook/addon-links@10.5.8': - resolution: {integrity: sha512-mpWw4alBJVGqgVh897LZ2keN/xnMHcH93wKJG+oGg4+cdEUA+06hCs5T4k+AS5Aa+EZ6LvdOoi2VPHssyQlCCA==} + '@storybook/addon-links@10.5.10': + resolution: {integrity: sha512-wZQX26vSKEBuQB+EKHuAoeDh0XiUDrN2GMX2lhhj2KpJ/di4OyXFaHXspXOXWkjNtyMTRd0QkCHQqKx4LY3E6w==} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.5.8 + storybook: ^10.5.10 peerDependenciesMeta: '@types/react': optional: true react: optional: true - '@storybook/addon-onboarding@10.5.8': - resolution: {integrity: sha512-q4XN4IvDds/CZ2Ng8kEG/+e8aWsngnvTQAk9bBoywV7Z+TVGOGt6QibpoSwwuVc1V0mXI4N6GJP9GSHxocnhEA==} + '@storybook/addon-onboarding@10.5.10': + resolution: {integrity: sha512-Qm1JyjM1wOabeZJykSuyT8mSyZE0/WdjT5wLjOnelE31nCWCh4DsBOgj8A1QDRt+3Hijq9/AW00olowJtf+eYA==} peerDependencies: - storybook: ^10.5.8 + storybook: ^10.5.10 - '@storybook/addon-themes@10.5.8': - resolution: {integrity: sha512-MYTLkN/5t02R0DJikVJUIRWnoyDqDwJprXnagUEFRT5aiO75glG7rY3uikB8n+7vXL/N9fTkgjIxER0SShkvYg==} + '@storybook/addon-themes@10.5.10': + resolution: {integrity: sha512-XNTjmIBwJ0TUcIV11STGY6hcynCy6imgYCDZeDaDyNEQsCoYAlY25fYvWNfrz5jOu1MGACiaA/E0ypk03whDdQ==} peerDependencies: - storybook: ^10.5.8 + storybook: ^10.5.10 - '@storybook/addon-vitest@10.5.8': - resolution: {integrity: sha512-/2K6JXncyHEM8v7UfOeR0KGd7s46Q2XlfaBJUnBoGsEG6JF46la8sh43b+kIOG7JGPUqlyfA6uOMewUmG6S17w==} + '@storybook/addon-vitest@10.5.10': + resolution: {integrity: sha512-JNQ9DSkLfxC8qqytBCej91zBExIZ7z97B410U2zgfQPki4HkI9Ffz97a15f5yhVZ79ppIrZ/ssI+WcyWn0ykXQ==} peerDependencies: '@vitest/browser': ^3.0.0 || ^4.0.0 '@vitest/browser-playwright': ^4.0.0 '@vitest/runner': ^3.0.0 || ^4.0.0 - storybook: ^10.5.8 - vitest: 4.1.10 + storybook: ^10.5.10 + vitest: 4.1.11 peerDependenciesMeta: '@vitest/browser': optional: true @@ -3797,18 +3913,18 @@ packages: vitest: optional: true - '@storybook/builder-vite@10.5.8': - resolution: {integrity: sha512-UeRnn7yT55WmBlHNOQzLrvN7vsHEvVgIukhKDO+4cMbGXN87wZkbxhx6NstpuXRH8OxGqwKS0SZNVp+SC1ftLQ==} + '@storybook/builder-vite@10.5.10': + resolution: {integrity: sha512-O4GgIP0tKLRueom3EmU3OaBUHKjNYj+jkOvmTIkn3PYTiWVkCuHqSKEs4ADvRyaQuLH+peHhFe4JtkNC9KbtrQ==} peerDependencies: - storybook: ^10.5.8 + storybook: ^10.5.10 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - '@storybook/csf-plugin@10.5.8': - resolution: {integrity: sha512-/FHiMyOWWEXfwK/lM0WxmkP9GLzbSJJuzGtfeuNWSOVDnvAMbjavitxfHb5wSbWKIQo0XYC1EJ2Y7x91XNYP4w==} + '@storybook/csf-plugin@10.5.10': + resolution: {integrity: sha512-TaCLBrqVEr767+w58QDotDUiCTuE5cyRJuRcDlsKQyUIyGBv+lYD3lu8wBiVCYxgIjB/gu9HmqiC+0yx1rHzaw==} peerDependencies: esbuild: ^0.28.2 - rollup: 4.62.4 - storybook: ^10.5.8 + rollup: 4.62.5 + storybook: ^10.5.10 vite: '*' webpack: '*' peerDependenciesMeta: @@ -3829,15 +3945,15 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@storybook/nextjs-vite@10.5.8': - resolution: {integrity: sha512-xNei/+PbNXSs5NVWy0vDzSGESeLq+BgHxLsVqEHqm52I8Up+O40wFtmpfVLVhHZvUeoq4khon8TLldC7PDAoUA==} + '@storybook/nextjs-vite@10.5.10': + resolution: {integrity: sha512-kDzhmW3pXWVI/trOcBu0XG7irieTBBdezL3gtmw6ZVyY7RJWWMlkzbVdXha76eWCM78kseLHafAxu8KgOsCI4w==} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 '@types/react-dom': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 next: ^14.1.0 || ^15.0.0 || ^16.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.5.8 + storybook: ^10.5.10 typescript: '*' vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: @@ -3848,40 +3964,40 @@ packages: typescript: optional: true - '@storybook/react-dom-shim@10.5.8': - resolution: {integrity: sha512-N8D13/Xny+V3kfe1KBgsAHS0nKWXLLdgOOXS9poKdYzVwVCN+CGEGBxWX0zMMtdCptqa6/57em9coPlZMoO+bg==} + '@storybook/react-dom-shim@10.5.10': + resolution: {integrity: sha512-rbu62ILo/VE3iXKmu+kWXFpD1H1Lwi0f19q/x7JnDsD2dxKS9w5znLEqPIq2qxpzi/wjjIb2iUP1cRG1d/9W5A==} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 '@types/react-dom': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.5.8 + storybook: ^10.5.10 peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@storybook/react-vite@10.5.8': - resolution: {integrity: sha512-ioMJGi4YzueGsJBlYio+2+UhfCFB9QV5Bs1lOilkek+a4BZgKJl0D1mVSJl6k96stQBPZmLgI9/l0hLVcUL6Kg==} + '@storybook/react-vite@10.5.10': + resolution: {integrity: sha512-xOztxefUnqKeuyvcnjspqmlDnER4cExL+liltrpdXLPJVqfFNr9lgM49FyEPajzsUVG9W/vHJWjbaQGGu1UsYQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.5.8 + storybook: ^10.5.10 typescript: '>= 4.9.x' vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - '@storybook/react@10.5.8': - resolution: {integrity: sha512-6qqkmqX6imtL+0Z9Uan2tIfYivOI0FiVmWr0zpqqQR15AkJ18JfNcNTQoyjeAlCO0Kei56SWqnu2qLq52TYplg==} + '@storybook/react@10.5.10': + resolution: {integrity: sha512-4MBV5e1SXIMfPynLHzr+Mp0dwGv/FW1bklWAsS4ynBOAbC98W9p/I9vqBnUctsvE3BJkhzHQQyPwMHL5tTcHVA==} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 '@types/react-dom': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.5.8 + storybook: ^10.5.10 typescript: '>= 4.9.x' peerDependenciesMeta: '@types/react': @@ -3899,8 +4015,8 @@ packages: '@svgdotjs/svg.js@3.2.8': resolution: {integrity: sha512-NUdbI/7FDdqGpzKmqr09IQoy9MUcrAC/3bC8gLgXi6OfJuyri450zMLvJekFUhuq3iN5gpdPjoSoStNl9Eijfg==} - '@swc/helpers@0.5.15': - resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@swc/helpers@0.5.23': + resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} '@t3-oss/env-core@0.13.11': resolution: {integrity: sha512-sM7GYY+KL7H/Hl0BE0inWfk3nRHZOLhmVn7sHGxaZt9FAR6KqREXAE+6TqKfiavfXmpRxO/OZ2QgKRd+oiBYRQ==} @@ -4038,11 +4154,11 @@ packages: engines: {node: '>=18'} hasBin: true - '@tanstack/eslint-plugin-query@5.101.4': - resolution: {integrity: sha512-jqAZJWXGd5PthJYH9wmC2O5Ry5xAN2/7zxi9qcANQ+Xix8V5JkqNRjZ8Fh+rYzqzVYGiHqbrHekt+uh38OZVpw==} + '@tanstack/eslint-plugin-query@5.102.2': + resolution: {integrity: sha512-0uRcRXvrZN3JLtGDMXU8Qp/or/fp1VhDZEVcD8WrUc7CF0uWbJbloJ88dfFDhiocYP31wXX4Buar/WC31fS5Ug==} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ^5.4.0 || ^6.0.0 + typescript: ^5.6.0 || ^6.0.0 || ^7.0.0 peerDependenciesMeta: typescript: optional: true @@ -4058,8 +4174,8 @@ packages: resolution: {integrity: sha512-y/xtNPNt/YeyoVxE/JCx+T7yjEzpezmbb+toK8DDD1P4m7Kzs5YR956+7OKexG3f8aXgC3rLZl7b1V+yNUSy5w==} engines: {node: '>=18'} - '@tanstack/query-core@5.101.4': - resolution: {integrity: sha512-gNwcvOJcRbLWPOLG/2OBm+zM+Yv+MKsXKEOWC57USuZDEsI71hEErQsiEGx5wX9rzWWkfwM0fVSPoiIFSsxfiw==} + '@tanstack/query-core@5.102.2': + resolution: {integrity: sha512-zQ5794PXBlV5Wl7N23SR1/Ss+wPE/h2Ye4XlKpm3omN8i8b/Fd4DAdqpLS2AXj5M/RMObt3k5qy3E7kzt/AvBA==} '@tanstack/react-form@1.33.5': resolution: {integrity: sha512-LlRB28qJwO/QCGaHvWnbdh4haBgTFiZVmzA2uzxSBS3YA7/IqrQ6HOBK70CkFQ+DbflZ7NawsmSln13h5iIdTA==} @@ -4077,8 +4193,8 @@ packages: react: '>=16.8' react-dom: '>=16.8' - '@tanstack/react-query@5.101.4': - resolution: {integrity: sha512-yRg2pfOCxIs4ZJW3XYYHU/WgtD04FHSnfHlpRT7h7pR77hwkdRG4wxbKe4aq6P0RvXUTBSQpQeadS1SUYUe+KA==} + '@tanstack/react-query@5.102.2': + resolution: {integrity: sha512-KxU8ZyOEuJ81eTSgXa8GQbk/jO/rz0elYtNKt3VMtM2pRjeO8ADIu7sqqmEjFKJKqco9h2N1ojIDuHs6VfDItQ==} peerDependencies: react: ^18 || ^19 @@ -4088,8 +4204,8 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/react-virtual@3.14.9': - resolution: {integrity: sha512-qZyr0FZDP8rDC4WBhsryIZmAd9bveJvFGUJJtskWaew6/0dTRS6wZxnR6VQ5bY2KwL3LjerrHqQLk3a0GKcPXQ==} + '@tanstack/react-virtual@3.14.10': + resolution: {integrity: sha512-SRyoUbdFMRHuYXMijV5H4ZarQWpXkj3iANq8OFre+pybeVap8ZJjZ3Nz9bVjx4d8PfobVUQUdKyyyHYk3E+djw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -4097,8 +4213,8 @@ packages: '@tanstack/store@0.11.0': resolution: {integrity: sha512-WlzzCt3xi0G6pCAJu1U+2jiECwabETDpQDi3hfkFZvJii9AuZqEKbOiVarX1/bWhTNjU486yQtJCCasi/0q+Cw==} - '@tanstack/virtual-core@3.17.7': - resolution: {integrity: sha512-bp+v10y65sp2H7WpWfIMyxTNfl8ZVfxFTLRjPIFRryi6FV/J33z4IS53WO4pTk36KlvJ4iLiQz+oaydDC1xbcA==} + '@tanstack/virtual-core@3.17.8': + resolution: {integrity: sha512-BfEvehNpOT75r5Ksc5xW6NZuXujTfb7nlSEyVu4XHG3gdxNg1KqXruWbDewXOUaUYIo4oRbSfkjIajz4MAT8tA==} '@teppeis/multimaps@3.0.0': resolution: {integrity: sha512-ID7fosbc50TbT0MK0EG12O+gAP3W3Aa/Pz4DaTtQtEvlc9Odaqi0de+xuZ7Li2GtK4HzEX7IuRWS/JmZLksR3Q==} @@ -4127,8 +4243,8 @@ packages: '@types/react-dom': optional: true - '@testing-library/user-event@14.6.4': - resolution: {integrity: sha512-QCGwP6QrjypBLwyj5cuyfVamkaIEy/XGY+1VDehbtbQqOggYmTFpFOdWR5mPz14vX8vXLMVjDHlRNBcClyO9ew==} + '@testing-library/user-event@14.6.6': + resolution: {integrity: sha512-Jbs9FpkkIDw8FgSc6kOVsOv8JuuqGAL7J4X1oot77JxAoDlkNn2GRkd0aYRVuQ+pVQAiHWVkE4rX/dkF5fBiCw==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' @@ -4309,9 +4425,6 @@ packages: '@types/geojson@7946.0.16': resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - '@types/hast@3.0.5': resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} @@ -4354,8 +4467,8 @@ packages: '@types/qs@6.15.1': resolution: {integrity: sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==} - '@types/react-dom@19.2.4': - resolution: {integrity: sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==} + '@types/react-dom@19.2.5': + resolution: {integrity: sha512-fMPwH9v7r/pp43yUd2/Mbiex5KouJwwR3dzHkhLREUC6764VyDsqxhAxv6OFEYR1RhjOyD1naqba8ECDBe7ZQg==} peerDependencies: '@types/react': ^19.2.0 @@ -4396,70 +4509,16 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.63.0': - resolution: {integrity: sha512-e5dh0/UI0ok53AlZ5wRkXCB32z/f2jUZqPR/ygAw5WYaSw8j9EoJWlS7wQjr/dmOaqWjnPIn2m+HhVPCMWGZVQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/project-service@8.64.0': - resolution: {integrity: sha512-tk4WpOJ6IEbGrVHaNmM0YRrwAD3exZlIK3iadQNAxh4YKk6jvUQ4ecq18n+v7+meh+cJ3j+D8nbk8sRKhlwLQg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/project-service@8.65.0': - resolution: {integrity: sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.67.0': resolution: {integrity: sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.63.0': - resolution: {integrity: sha512-uUyfMWCnDSN8bCpcrY8nGP2BLkQ9Xn0GsipcONcpIDWhwhO4ZSyHvyS14U3X75mzxWxL3I2UZIrenTzdzcJO8A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/scope-manager@8.64.0': - resolution: {integrity: sha512-CXEaFdYXjSTgKhisNkwCcJwTP8Pl+fmRrEQrri4nm3vU743bALrxzLmq7fHG/7e6a5xO0lDYeURpZmBuhHk54w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/scope-manager@8.65.0': - resolution: {integrity: sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.67.0': resolution: {integrity: sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.63.0': - resolution: {integrity: sha512-sUAbkulqBAsncKnbRP3+7CtQFRKicexnj7ZwNC6ddCR7EmrXvjvdCYMJbUIqMd6lwoEriZjwLo08aS5tSjVMHg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/tsconfig-utils@8.64.0': - resolution: {integrity: sha512-2yo8rRNKuzbVWQp5kslhANqZ2uDAeROQHBRZNPu8JDsHmeFNj/XJJhX/FhNUWmkHHvoNsKa6+tHJiig87EzsQw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/tsconfig-utils@8.65.0': - resolution: {integrity: sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/tsconfig-utils@8.66.0': - resolution: {integrity: sha512-9D5gLYZG4rOjcoag8MQ/fWI8WqA9wcPDyOGyWtWFhvM1lHRbliqUSPIY5J3zqCU1tvSwzXxnnjhQhz5Ne7mJ4g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/tsconfig-utils@8.67.0': resolution: {integrity: sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4473,71 +4532,16 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.63.0': - resolution: {integrity: sha512-xyLtl9DUBBFrcJS4x2pIqGLH68/tC2uOa4Z7pUteW09D3bXnnXUom4dyPikzWgB7llmIc1zoeI3aoUdC4rPK/Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/types@8.64.0': - resolution: {integrity: sha512-qjhfuTfLXjA4IOzXvz0rTjT01BqEiIgPoUeMwiEjnaHKJMTNo8rH5pYW1a2L/0Dnux2fPC85AeyJoWaGa8WxTA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/types@8.65.0': - resolution: {integrity: sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/types@8.66.0': - resolution: {integrity: sha512-H6gcYaSDOyvL3AD/jHUtUFo2jqGgn/F6nuyuZSu0QTesxL+cP4dQoIMrODRofuJC09g64+WgZ6tE19Y1N2YIFQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.67.0': resolution: {integrity: sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.63.0': - resolution: {integrity: sha512-ygBkU+B7ex5UI/gKhaqexWev79uISfIv7XQCRNYO/jmD8rGLPyWLAb3KMRT6nd8Gt9bmUBi9+iX6tBdYfOY81Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/typescript-estree@8.64.0': - resolution: {integrity: sha512-Pztpsn1aCE1oWDvDEfUk31nngvvF7vUB5SwHFEaZIFpvw7WJtqUHHL4plBZDA9HfWJJjL13BdG0YrJInTUvoVA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/typescript-estree@8.65.0': - resolution: {integrity: sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/typescript-estree@8.67.0': resolution: {integrity: sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.63.0': - resolution: {integrity: sha512-fUKaeAvrTuQg/Tgt3nliAUSZHJM6DlCcfyEmxCvlX8kieWSStBX+5O5Fnidtc3i2JrH+9c/GL4RY2iasd/GPTA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/utils@8.64.0': - resolution: {integrity: sha512-aJUGVB3+U0htrrCjoA8qukw8cm8fNCGAxK/tVoS70k8aeb7DETKeFozRiVFIwEeN9WJLsjaP3ph8I60tY2XZoQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/utils@8.65.0': - resolution: {integrity: sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.67.0': resolution: {integrity: sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4545,18 +4549,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.63.0': - resolution: {integrity: sha512-UexrHGnGTpbuQHct2ExOc2ZcFbGUS9FOesCxxqdBGcpI1BxYu/LZ6U8Aq6/72XtF/qRBk9nhuGHFJIXXMhPMdw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/visitor-keys@8.64.0': - resolution: {integrity: sha512-mrtuL8Nsn6gi2H4mo5KMTp823M+3Q19Ew/i+Zlikq20tIMm99C3Ez0dCmkWWnxut20esQvTg8aUSEhMcAOXhEw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/visitor-keys@8.65.0': - resolution: {integrity: sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.67.0': resolution: {integrity: sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4683,6 +4675,7 @@ packages: '@typescript/typescript6@6.0.2': resolution: {integrity: sha512-mbCddXd+jm7hfx7w2YU64/Av4/NqqeG3GoRZgxPcgoTxYjhrcfJRw9ULch71SS4G+Q3bOXFhRvPqjguN0Hyp5w==} + hasBin: true '@ungap/structured-clone@1.3.2': resolution: {integrity: sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==} @@ -4721,18 +4714,21 @@ packages: peerDependencies: vite: '*' - '@vitejs/plugin-react@6.0.5': - resolution: {integrity: sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==} + '@vitejs/plugin-react@6.1.0': + resolution: {integrity: sha512-qd2BzUBehkov86WFhg0JkEFEYyCLG9uPCe6qWTY/kRlss9OvJrOF2UbIWT7p+8IzZHkEu0DNGHc4HSv+JdDLsw==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 babel-plugin-react-compiler: ^1.0.0 + oxc-transform-react: ^0.145.0 vite: ^8.0.0 peerDependenciesMeta: '@rolldown/plugin-babel': optional: true babel-plugin-react-compiler: optional: true + oxc-transform-react: + optional: true '@vitejs/plugin-rsc@0.5.34': resolution: {integrity: sha512-95V6fyGQklQMYIWTr5qwwNmpDYxsHkTunuzq8i/keIcgdckL9zb6nyEgTnb1CEl1IPJWVxGgORMkTFHrct7XJg==} @@ -4745,27 +4741,27 @@ packages: react-server-dom-webpack: optional: true - '@vitest/browser-playwright@4.1.10': - resolution: {integrity: sha512-nMoXGEiRpT7m3W7NsbvrM2aKNwiNHZf+zEpUCvMteGjZFvfT96Q9fh7QyB98dvDWXiKvrLxA7bJ1mCOOv+JQPw==} + '@vitest/browser-playwright@4.1.11': + resolution: {integrity: sha512-riLBxPqwnJ0lWs2DN2WeUfYeKLoAjbP2Xx8cLQdSddzMi20sksIa6K2mPz79DyMZKKVKH2ksOC2yJvtNcZg8cg==} peerDependencies: playwright: '*' - vitest: 4.1.10 + vitest: 4.1.11 - '@vitest/browser-preview@4.1.10': - resolution: {integrity: sha512-14MJrL59ZFkqXLjwfSk6RzTDy5Czf9UG4+8q8L6Gxjs2aPjEce/cVNYV14bXAc2BvMjUNu904+ZEZA1Xc1wtvQ==} + '@vitest/browser-preview@4.1.11': + resolution: {integrity: sha512-iPKSE6Ibayey6HFgK1V1/aHgyhx7HSRk1YMi+lnBZGmlIiNV5Uc7xRkD9Su8RDylTxDECK23t7kTHdRKoqSYDQ==} peerDependencies: - vitest: 4.1.10 + vitest: 4.1.11 - '@vitest/browser@4.1.10': - resolution: {integrity: sha512-UDwuWGwXj646CBx/bQHOaJSX7np0I8JL/UKQYa1e4QrVHH8VdWtx8eaOuf8sy0ShwDgR6NjJAsp5eF6vjF6qng==} + '@vitest/browser@4.1.11': + resolution: {integrity: sha512-bwMovvAeuTFOK5kIFevw4VEf+1gVEICv4SYK4k3knJOxl6b1zEWud8mYKD73e1B0odAn174h1MofURy2TPWf3w==} peerDependencies: - vitest: 4.1.10 + vitest: 4.1.11 - '@vitest/coverage-v8@4.1.10': - resolution: {integrity: sha512-IM49HmthevbgAO4anp1hwtoT9wYe59w0LR00gr+eagHE+ZJ5lK4sLPeO0ubgoJcwLk6dehU3R24N+FbEEKDc8g==} + '@vitest/coverage-v8@4.1.11': + resolution: {integrity: sha512-8MVGEFnJIcdGjcbfKmeq8z0pZHH0JlVtoVZH9Q/qwUp6wyFnEJUBMrw9DCaj+ra3vShGmhavjalMIhPNxZAUcw==} peerDependencies: - '@vitest/browser': 4.1.10 - vitest: 4.1.10 + '@vitest/browser': 4.1.11 + vitest: 4.1.11 peerDependenciesMeta: '@vitest/browser': optional: true @@ -4773,11 +4769,11 @@ packages: '@vitest/expect@3.2.4': resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - '@vitest/expect@4.1.10': - resolution: {integrity: sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==} + '@vitest/expect@4.1.11': + resolution: {integrity: sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==} - '@vitest/mocker@4.1.10': - resolution: {integrity: sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==} + '@vitest/mocker@4.1.11': + resolution: {integrity: sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -4790,34 +4786,34 @@ packages: '@vitest/pretty-format@3.2.4': resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/pretty-format@4.1.10': - resolution: {integrity: sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==} + '@vitest/pretty-format@4.1.11': + resolution: {integrity: sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==} - '@vitest/runner@4.1.10': - resolution: {integrity: sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==} + '@vitest/runner@4.1.11': + resolution: {integrity: sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==} - '@vitest/snapshot@4.1.10': - resolution: {integrity: sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==} + '@vitest/snapshot@4.1.11': + resolution: {integrity: sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==} '@vitest/spy@3.2.4': resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} - '@vitest/spy@4.1.10': - resolution: {integrity: sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==} + '@vitest/spy@4.1.11': + resolution: {integrity: sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==} '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} - '@vitest/utils@4.1.10': - resolution: {integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==} + '@vitest/utils@4.1.11': + resolution: {integrity: sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==} - '@voidzero-dev/vite-plus-core@0.2.9': - resolution: {integrity: sha512-dWqScAAwa8h/i9jCiGAMs7YarzQWInHZ5gCJNbQkHXA6Zp6A2T2anN9YMFVPpb7CwVFwkI2iPF5yl/DXtq+zUA==} + '@voidzero-dev/vite-plus-core@0.3.0': + resolution: {integrity: sha512-aOqoqIWaF+Q/geDU48pC2rVFEVSvLV1GGj/NdvhUiBhCZntoFNbwI+hjUeG8BMaPG67sOV6ey+/sgkdmGmKqaw==} engines: {node: ^20.19.0 || ^22.18.0 || >=24.11.0} peerDependencies: '@arethetypeswrong/core': ^0.18.1 '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.4.0 + '@vitejs/devtools': ^0.4.0 || ^0.5.0 esbuild: ^0.28.2 jiti: '>=1.21.0' less: ^4.0.0 @@ -4868,54 +4864,54 @@ packages: yaml: optional: true - '@voidzero-dev/vite-plus-darwin-arm64@0.2.9': - resolution: {integrity: sha512-/qJHqMfyy/LiCJk4UYZfFW6Comsfm8zDuy4P8UFWnFqRjmefYvZbMK4ThYNM87tKNWYWjsnClzssjJOmDTAc8w==} + '@voidzero-dev/vite-plus-darwin-arm64@0.3.0': + resolution: {integrity: sha512-9ADr1egZ8T4tJOqrpQLhoDl95Y74R95+bsvjmin0gy1C0eQVhpmcNnBfb07KFNhJioJp9MMO7F7Dx4fQL5SKsw==} engines: {node: '>=20.0.0'} cpu: [arm64] os: [darwin] - '@voidzero-dev/vite-plus-darwin-x64@0.2.9': - resolution: {integrity: sha512-3MGnNeazgYAqQTaC7JIbZyrTHmxSXTWFr9G1yAdeItKasB1R8HKIkCS1Qnr49Ge4S/cyOODivdbcpqFkrT93ng==} + '@voidzero-dev/vite-plus-darwin-x64@0.3.0': + resolution: {integrity: sha512-GegasVCwNeDOkNyvhLOuwU1+T2JkjY/Tq+SOvwphUpVcqQ6OOAUq9LlpoXviO2QL/Kq2NbMYjiAfPKVSTLUFQw==} engines: {node: '>=20.0.0'} cpu: [x64] os: [darwin] - '@voidzero-dev/vite-plus-linux-arm64-gnu@0.2.9': - resolution: {integrity: sha512-6LmukER8qD4UBIRqMNv4Ilq7CxfRhngLUXlMv8vbTupeLRWPJSKvKEHyRxCwr6JP57Gxfr8KrX1ye42WzcZF0g==} + '@voidzero-dev/vite-plus-linux-arm64-gnu@0.3.0': + resolution: {integrity: sha512-nYI3KNYXkXjRPsSdR4Lr7J2xMxfR1+TplWlG/dV37qVXWAjbyHpoAlbULjZBAVJMyXRNlcADhBrEwXe4g6s48A==} engines: {node: '>=20.0.0'} cpu: [arm64] os: [linux] libc: [glibc] - '@voidzero-dev/vite-plus-linux-arm64-musl@0.2.9': - resolution: {integrity: sha512-cBs626GWkyJlwKP0nsdHlMWpuTl9xOWRxAUoqtxXPtw80bVy4WM5eNS4SXPC5pX10jR7DRIkRpzNAsy7fv8Faw==} + '@voidzero-dev/vite-plus-linux-arm64-musl@0.3.0': + resolution: {integrity: sha512-HRlVA3AOcuGXmOdHhQ+Zv5XAaKbYF9si5rRHoOsKl0UyBo4txA3OoJfmP0WjanfLUNmu85JyO2dO1ptL4C6wgg==} engines: {node: '>=20.0.0'} cpu: [arm64] os: [linux] libc: [musl] - '@voidzero-dev/vite-plus-linux-x64-gnu@0.2.9': - resolution: {integrity: sha512-2Iy8x4PCPMNzXeu3pREevlggoeK8PwtdUiCpoSybAZBtR/aqMxsJREyt/eKv45F8lsiNlA8PbIWEvPxLSgzFLQ==} + '@voidzero-dev/vite-plus-linux-x64-gnu@0.3.0': + resolution: {integrity: sha512-9A+dFScPfwcrzF/rRR0zH8++2hOf6xtFmN/5LyzyfUywtw9MILXcC72IMcOeL6QRJwKUMsudi1rFeDE59azNvw==} engines: {node: '>=20.0.0'} cpu: [x64] os: [linux] libc: [glibc] - '@voidzero-dev/vite-plus-linux-x64-musl@0.2.9': - resolution: {integrity: sha512-zuGx+eRotWPd9cmh1X9AfsC2tN/Ad9Hk6LAzlxoKJUjEkTsY3WjVJ6Da0z48SAUFuenI0JkdqXnMCrePtGvWHg==} + '@voidzero-dev/vite-plus-linux-x64-musl@0.3.0': + resolution: {integrity: sha512-KfIV3qaPdaOOE8JQMRHRE34FtZocl9O86XLTP6JMjDUlcx8FPgf8/fz/HFqJ8g232vM+JsgLI/YTVeXP8LkTKw==} engines: {node: '>=20.0.0'} cpu: [x64] os: [linux] libc: [musl] - '@voidzero-dev/vite-plus-win32-arm64-msvc@0.2.9': - resolution: {integrity: sha512-kaKb5Q8ReYTBfvLgUhdpLJG3aoNF8HOVJpf8qBm+THsd4WRrkRwsBHp2ITsU8oXl2gnDjFGhPDaURegd/z6Wxw==} + '@voidzero-dev/vite-plus-win32-arm64-msvc@0.3.0': + resolution: {integrity: sha512-KRhdy5K13AYx9KBfCVHRrK7zSZU+bMW9CL6gTai+UkJgAmDJi1kjdSNboZOjO8mrzUnTCrELgMI2tnstcxSTuA==} engines: {node: '>=20.0.0'} cpu: [arm64] os: [win32] - '@voidzero-dev/vite-plus-win32-x64-msvc@0.2.9': - resolution: {integrity: sha512-/fEk3gbQTJknCiYM/GTL/L++Azsav8rCAjmtKrjmCbqEif5IMzqTfvM68n+PiLB3JVoQJGF/mg2niODr0IE/2w==} + '@voidzero-dev/vite-plus-win32-x64-msvc@0.3.0': + resolution: {integrity: sha512-7+G+GxGmxdpQO0zjiGnkZFXKGqm0CrVduebRsJd6ccuOuxCQYPxLcoHq4WOaGrh56SrAGS7XjhnQCrXRkzKUVQ==} engines: {node: '>=20.0.0'} cpu: [x64] os: [win32] @@ -5092,6 +5088,7 @@ packages: acorn@8.17.0: resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} engines: {node: '>=0.4.0'} + hasBin: true agentation@3.0.2: resolution: {integrity: sha512-iGzBxFVTuZEIKzLY6AExSLAQH6i6SwxV4pAu7v7m3X6bInZ7qlZXAwrEqyc4+EfP4gM7z2RXBF6SF4DeH0f2lA==} @@ -5172,10 +5169,6 @@ packages: async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - axe-core@4.12.1: - resolution: {integrity: sha512-s7iGf5GaVMxEG0ENN9x+xTr7GFZCb1ZP/1uATUpCEK2X78nDB3RwbtFCo9pGAf9ru+VwoQ464DkaLEeRM08wJA==} - engines: {node: '>=4'} - axe-core@4.13.0: resolution: {integrity: sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A==} engines: {node: '>=4'} @@ -5226,6 +5219,7 @@ packages: browserslist@4.28.4: resolution: {integrity: sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} @@ -5418,6 +5412,7 @@ packages: color-support@1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -5441,8 +5436,8 @@ packages: compare-versions@6.1.1: resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} - concurrently@10.0.4: - resolution: {integrity: sha512-trZql+7l/0+WRAsAnEdctr4+iiOS6ZrViI6H8QWcCF9MFS/LT0dKpe8vluB1to6it+OxSI4VospFTIFMW8DJRw==} + concurrently@10.0.5: + resolution: {integrity: sha512-JaP/CoftUrCcAFW/g//RbgEGwlelnEae6cfBLgH6ZdO6s8jPkn6p9SB9u6pdVxYXoiSnFqseOlHfrEfF82TVOg==} engines: {node: '>=22'} hasBin: true @@ -5452,6 +5447,10 @@ packages: confbox@0.2.4: resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + content-type@2.1.0: + resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==} + engines: {node: '>=18'} + convert-hrtime@5.0.0: resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} engines: {node: '>=12'} @@ -5474,6 +5473,7 @@ packages: cron-parser@5.6.2: resolution: {integrity: sha512-yJ/G1LVir6CnlkLI40CsampPLKl1SprGGlUagWtGJxewytRVYezv5xVyzzbT+Pvzx+VIRvZVF7/a0eEMTxdnTA==} engines: {node: '>=18'} + deprecated: 'Published tarball was built from a stale dist/ and is missing the fixes from #414 and #415 — its contents are effectively v5.6.1. Upgrade to v5.7.0.' cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} @@ -5688,8 +5688,8 @@ packages: dagre-d3-es@7.0.14: resolution: {integrity: sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==} - dayjs@1.11.21: - resolution: {integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==} + dayjs@1.11.23: + resolution: {integrity: sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==} debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} @@ -5793,11 +5793,8 @@ packages: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} - dompurify@3.4.12: - resolution: {integrity: sha512-zQvGet8Z2sWbQhCmfFz/T5QWH2oBmjnqK3qvOjaqaNLrLEF912WamU+ohnTp0TCep/MFVHpdJuCZEdFOdTnEFg==} - - dompurify@3.4.13: - resolution: {integrity: sha512-2vmYIoqjze2d+kakP8S/nS5shfsl587kzwEjcGlTdiksUVgFHnFCsLYDVj/JNqJVOQZGSYBTmuycv0PodwmnMQ==} + dompurify@3.4.14: + resolution: {integrity: sha512-dVoH9z+MY+C9IilgGCk3YfFqjLi3fChm2OiKJMzh6axrJ5qwxqWaZamgmHrpv22CN/KdbZJuGEGgfQoL00LTdg==} domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} @@ -5912,8 +5909,8 @@ packages: es-module-lexer@2.3.1: resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} - es-toolkit@1.50.0: - resolution: {integrity: sha512-OyZKhUVvEep9ITEiwHn8GKnMRQIVqoSIX7WnRbkWgJkllCujilqP2rD0u979tkl8wqyc8ICwlc1UBVv/Sl1G6w==} + es-toolkit@1.51.0: + resolution: {integrity: sha512-zC2lQGkM7QX+Gm6iM3+WIdZJzthsEd14LvRNJneSO2hzyz/zNBENR8+YXWo1cKxgPBtV6ksPYHELbcwBRzmdCw==} esbuild@0.28.2: resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} @@ -6006,8 +6003,8 @@ packages: peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 - eslint-plugin-jsonc@3.4.1: - resolution: {integrity: sha512-HHWkjAmVJ3QAffCkfo0XKl3CstLtgbIu5EGfFfVDLQT6vqPrxl4pFbUwFwY03nOlvyuDiiBixhHFrlbzn9u09Q==} + eslint-plugin-jsonc@3.4.2: + resolution: {integrity: sha512-q5xzjCYFQuhFomTbctXzd3STfDJ8XduvaigjQmMEbP2gzSKrc58y3Fv6D775/cIK1/sRUn+4kpljiU2iW8k0zw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: eslint: '>=9.38.0' @@ -6096,11 +6093,10 @@ packages: peerDependencies: eslint: '>=9.38.0' - eslint-plugin-storybook@10.5.8: - resolution: {integrity: sha512-bf9W5nZyWdIaCUZf4aEZnEeD1mn+csNYX8dYUQjAo6L7/DkSLtr65R4zFZ1xeS4m6dOXO6UtUySesCSw4e8w1g==} + eslint-plugin-storybook@10.5.10: + resolution: {integrity: sha512-NeOu3axmhNZfRuHRciFH0a/OVgvtAJLRHAwiJjcGkPAcElNmwEPp+pqoiwxytx7kHInz7mVVoBfPwVc8kPmOLw==} peerDependencies: eslint: '>=8' - storybook: ^10.5.8 eslint-plugin-toml@1.5.0: resolution: {integrity: sha512-qBjRywEkKxO2uYOjus//6GVF1r+Hg5QDkRO8RTY6XcaXgWfBU0DhwpFmJa2Ljf0Sz49r7DdZlpKwwHmJ4nmH1Q==} @@ -6132,8 +6128,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.8.1: - resolution: {integrity: sha512-wqA7W2jbsC/BnV9Iv1UZpKVFkO1AdNoSmYW8NWG4HNOBbkAMvIqDZ27pI2f07dqn583NcIC44ckjAcOXDL1QbQ==} + eslint@10.9.0: + resolution: {integrity: sha512-5KeEOJZBfEVA47boFiBsf+6MmmJpffM7qEBg4pLla2e4nlKgdKlqCW0oSLOGsT8Wl5uCGJptLV1bkaiShj90Gw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -6176,8 +6172,8 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - event-target-bus@1.0.0: - resolution: {integrity: sha512-uPcWKbj/BJU3Tbw9XqhHqET4/LBOhvv3/SJWr7NksxA6TC5YqBpaZgawE9R+WpYFCBFSAE4Vun+xQS6w4ABdlA==} + event-target-bus@1.1.0: + resolution: {integrity: sha512-24JX34nM0qRcsj7KvtLbVpMcX8ZQYmb0+0a6viaV2GJtVFg5UGyJyDLITkBipJIG0fSscNskI2PxdhTBIMeg8g==} eventsource-parser@3.1.1: resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==} @@ -6200,6 +6196,7 @@ packages: extract-zip@2.0.1: resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} engines: {node: '>= 10.17.0'} + hasBin: true fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -6214,6 +6211,9 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fastdom@1.0.12: + resolution: {integrity: sha512-LB+xjSTEbjHE1cWsxu+tN2Xqr1kpi+V9aADI7sVM5ZMaXyYGPHULQMzpJMYqOTULK/73pUkWVzzObFRBkPr+hg==} + fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} @@ -6271,8 +6271,8 @@ packages: engines: {node: '>=18.3.0'} hasBin: true - foxact@0.3.8: - resolution: {integrity: sha512-lFakEG8xm6A6wMH4ycWhXvwUybq4ATnMxJfBD4hj6hm9CKo72q2M/YaiEemoWGh9sUjQqX+pPXfq8S/jxedWzA==} + foxact@0.3.9: + resolution: {integrity: sha512-uxOL+WzfsUAqkhBR44+om67yslYTHM9ymBsIZpr4EbPEV13oDL1XtFJQOUInci2nHmqBd3aolSC+NthQIsFbUQ==} peerDependencies: react: '*' react-dom: '*' @@ -6341,6 +6341,7 @@ packages: giget@3.3.0: resolution: {integrity: sha512-gzi2D96p+AMfDcmJHGDj3KJ9NRiwvlFAU5yfa3ROwWZmFUjX4P43x3BcyRaOMMLto1vUo7C+86+MFhYTl6Ryiw==} + hasBin: true github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} @@ -6391,8 +6392,8 @@ packages: hachure-fill@0.5.2: resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} - happy-dom@20.11.2: - resolution: {integrity: sha512-7MB+bJLkxu3SowAfBJbjW+c55kNz5tkR45gu2qzrxznezhLeN5YIlJbwUgSzlGc+qWoZ8Ykg71H5ezz69xixrw==} + happy-dom@20.11.6: + resolution: {integrity: sha512-Hldbg8AdAa5a5oDcZpjqnGitp7JB0hqWmfv/8qr+kft4vzSD8BHsbdRfzYvL/0QcbKcURC/yyoygbeDQarPvYg==} engines: {node: '>=20.0.0'} has-ansi@6.0.2: @@ -6449,8 +6450,8 @@ packages: resolution: {integrity: sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==} engines: {node: '>=6'} - hono@4.13.2: - resolution: {integrity: sha512-JydRilDRkYBQMt9qR9U92mXxmbGqsqSn/IKOrh4e7/gEbn+0zSr8igTu0obwJoNGN4sez28DIql7FBHWydoJpA==} + hono@4.13.3: + resolution: {integrity: sha512-r8AO2mYHoLxSHkgafNeC/BXyb2vWRxD3jem4Ts+ptav8oTG5FIRifAjuJEmZI4bSvvc2ns0GxmIYiZnHqN3mMw==} engines: {node: '>=16.9.0'} hosted-git-info@9.0.3: @@ -6481,8 +6482,8 @@ packages: i18next-resources-to-backend@1.2.3: resolution: {integrity: sha512-8Y/LLAm5fqZc2ckQxtTWbu75ndjNLzF7mcYl6rhc4g+WBopIsG3YhdYqF5qhJy64tlYhlU2KSSnEgW3gGHLqwg==} - i18next@26.3.6: - resolution: {integrity: sha512-Bu5Z2nAXgfVyM8xvW3jk9EKRIuX37PudsrBViThNFx7CR7aaYTpP01cxNB/E4c4UUzTDiAZRstEhsRfPOL/8xA==} + i18next@26.4.0: + resolution: {integrity: sha512-rsmK5bFqsD1AetSFSIa43wtNR4WpvvH4p0tLEsTxkC7QTrfdFm06nbQ95bh8Og4wwaCnUEcm9DVYL2cgxitiQg==} peerDependencies: typescript: ^5 || ^6 || ^7 peerDependenciesMeta: @@ -6519,8 +6520,8 @@ packages: engines: {node: '>=16.x'} hasBin: true - immer@11.1.16: - resolution: {integrity: sha512-Xs7H9rBc+kti1J6RueUvbEBkmOz7jqj11XYgf+YMXAYzu8EeE7hwZ9poLXdVfVnGmJu7QAf41T7H2KuF6QoK6Q==} + immer@11.1.18: + resolution: {integrity: sha512-EQyQtLiYW029lyoczMl/Hh4Xu7cDecSc58JRYpHyL4tIAu3eqd1yJzQX04d2BZHDkzFFvm6qJEJWOtfDSWAXbQ==} import-meta-resolve@4.2.0: resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} @@ -6715,8 +6716,8 @@ packages: resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} hasBin: true - js-yaml@5.2.3: - resolution: {integrity: sha512-n+mUVyUX5bVv7G/G2zyIHOhdxfuU1dY2NOFzTQUWiMUbFss8b57NFlgCCaggU78wSw5KVS9cllzeLyzyR+n5nw==} + js-yaml@5.3.0: + resolution: {integrity: sha512-muutsYr+e2+d3rTgUGslq5rxbBlUy3cJ61IsHag2QNDQV+7zXWjkUpmALIajhrlLlrgRUiymj6U3zUr/TMK84Q==} hasBin: true jsdoc-type-pratt-parser@7.2.0: @@ -6730,6 +6731,7 @@ packages: jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} + hasBin: true json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -6745,10 +6747,6 @@ packages: engines: {node: '>=6'} hasBin: true - jsonc-eslint-parser@3.1.0: - resolution: {integrity: sha512-75EA7EWZExL/j+MDKQrRbdzcRI2HOkRlmUw8fZJc1ioqFEOvBsq7Rt+A6yCxOt9w/TYNpkt52gC6nm/g5tFIng==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - jsonc-eslint-parser@3.3.0: resolution: {integrity: sha512-hYTGkHGNRZnXOFZ1urhINADoqDrGfpy53cjw+dxk84QE0pUDujQzeUeamNs6Mz44/TKD49z2x6/GVSu4ZrtA+Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -6764,9 +6762,11 @@ packages: katex@0.16.47: resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==} + hasBin: true katex@0.17.0: resolution: {integrity: sha512-Vdw0ATsQ9V+LuegM/BTwQqV/6cTl5lbGcIrU+BCgLxyf6bo38ybOr372tuSIxir3CN720flu1meYR6XzNMwQnw==} + hasBin: true keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -7002,6 +7002,7 @@ packages: loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true loro-crdt@1.14.1: resolution: {integrity: sha512-1BQ7neoQeJdCbD8gxlLHsy8tqCLYIJGrXSZic4s3t7toIsiFfks8Z0nGWvuEWr5miZ7giJx19x5ffkBaw+g9KQ==} @@ -7022,6 +7023,7 @@ packages: lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -7048,6 +7050,7 @@ packages: marked@17.0.6: resolution: {integrity: sha512-gB0gkNafnonOw0obSTEGZTT86IuhILt2Wfx0mWH/1Au83kybTayroZ/V6nS25mN7u8ASy+5fMhgB3XPNrOZdmA==} engines: {node: '>= 20'} + hasBin: true mdast-util-directive@3.1.0: resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==} @@ -7115,15 +7118,15 @@ packages: mdn-data@2.29.0: resolution: {integrity: sha512-pVxQFCcaYUEAH853+v7yoI/qzhxXSq1bTb9obMYGYAN1c3Hen+XDCEvr296XhstrwlSTNgOR7mCSD4JPjbJe5A==} - mediabunny@1.53.1: - resolution: {integrity: sha512-w25gA6mQuHSLzdpWswqwndbKtHFcJ0IRowJaIHgY7rlJaVTHhomfx5mLq4IHqonrsGCGDE/LIrtXz8mxiDzavA==} + mediabunny@1.55.2: + resolution: {integrity: sha512-EEx4O6qYddAdCyWPMZNDwI7uc5hewNHrPAf9jLcVhIbXoPsiqNQ+D9i1pfadmGkjN2V318jSrZljkpoziYm6Lg==} merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - mermaid@11.16.1: - resolution: {integrity: sha512-TQsq6u22fAn3rek5VOubrhKPo1g5hwC3FXUN9hiyupTckcYiGuuKGkNQrKYwGJkXUxZdojwRG46gsSCFZMDp4g==} + mermaid@11.17.0: + resolution: {integrity: sha512-Jo9N377Wb4MSnHFPTbLi2SxFpsQl4eVHoxnW5U1Md9EazvgMp3s+4ohDxr81YNTgbn5Kj7HJ3yslrSJ52kwpbA==} micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} @@ -7225,6 +7228,7 @@ packages: mime@4.1.0: resolution: {integrity: sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==} engines: {node: '>=16'} + hasBin: true mimic-function@5.0.1: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} @@ -7295,11 +7299,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.16: - resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - nanoid@3.3.18: resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -7315,9 +7314,9 @@ packages: resolution: {integrity: sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==} engines: {node: '>=18'} - negotiator@1.0.0: - resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} - engines: {node: '>= 0.6'} + negotiator@1.1.0: + resolution: {integrity: sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==} + engines: {node: '>=18'} neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -7328,8 +7327,8 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@16.3.0: - resolution: {integrity: sha512-NEdGOzH+08eTXMUp9UYkA99Nhi5N6Thrhc1jgFOQgfgnGK/dA2hRwBpXep+exdFQrnwlRf/3Wixyp8lLBUpE2A==} + next@16.3.2: + resolution: {integrity: sha512-/ZCaubUy17Lld1SiPWxuPbCk2ihqAxF2QNQaPZeEaEb7t1I58qhsJN187D7AfpapHAqUPXH0f/thtdW9dWgWFg==} engines: {node: '>=20.9.0'} hasBin: true peerDependencies: @@ -7515,8 +7514,8 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - nuqs@2.9.5: - resolution: {integrity: sha512-Ec+vVwUKKng7E6ya5zZowt3QqDRGqqB1E40Rp2QAyZXGgYekDzmVo7V7jwbLAMkdbiZTH285fOIUyZGrS5zsCg==} + nuqs@2.10.0: + resolution: {integrity: sha512-uy62jWCXiU1mcGfoClUFNTfrbaxfPQ8WuiomYlkXw5llVdN8kRZVYxOQ2LD70k3DzVQz5bZczE9ClVXwOC22Dw==} peerDependencies: '@remix-run/react': '>=2' '@tanstack/react-router': ^1 @@ -7594,11 +7593,14 @@ packages: resolution: {integrity: sha512-ov0NzaDCOInknS7mP1cwKdJERt3utPW8ldjtdUXQ8Ty0GEFD08wk422vCUN0d7pST6kqtV7dxoI9w1Zi0l/9TA==} engines: {node: ^20.19.0 || >=22.12.0} + oxc-resolver@11.21.2: + resolution: {integrity: sha512-w5tLwYN3Zo24w5EeWJjJWZOwhYqTtC8PS2B1tIt7BZUuqTIcU07sQValbDw+rq7+AuAGzOHklgK+ifsy4lpXfw==} + oxc-resolver@11.24.2: resolution: {integrity: sha512-FY91FiDBj7ls5MsFS9jN3tjz2o0/zsdSsymlakySaBwVJZorHhkWyICLZMKxlu1R9vYo+sd3z1jwb4J8x7bNDw==} - oxfmt@0.62.0: - resolution: {integrity: sha512-vxgGHTmnDU9j4CX7dDBLzxgmHxfda/yPcgJkGCMUSCwRmz+euo/V08xXLNgXTeqAB9Fhf3Pe2nO1RNKLCVgphQ==} + oxfmt@0.64.0: + resolution: {integrity: sha512-XZ4GFBN/PLbXKq+0zrgpQfPKYuJlUuj+nzZJY7UpIbFMNyefNLCdN9EwViycNqnYcv0wrn0jXcQLlqJp8RCKBg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -7614,8 +7616,8 @@ packages: resolution: {integrity: sha512-KjK/XLcXr1DSyonKhsuFqJRiuKqcyG9j3LJ8nkOsrLzGvodBPqzHOKauy10asLMDI0sUpvb+1sxlzff3udZvfg==} hasBin: true - oxlint@1.77.0: - resolution: {integrity: sha512-qnGh8XJHaQ0dprrDXNQZgS0FgjI6v+V3+X8DwmaV++5Aamy6jGKfDdQ1TUvhUxtmKFAbEf4/WeO5QZX+5WSngg==} + oxlint@1.79.0: + resolution: {integrity: sha512-hVJ9hq9m2unPS+Of4eJJgCPdIeCC+3DHEUX3tkmrPJr3OK2hz7PhXwgC+ZP71ZcYu8cCDEtQrqLxWNvxBppBVg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -7737,8 +7739,8 @@ packages: resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} - pinyin-pro@3.29.1: - resolution: {integrity: sha512-GkdTguAt9JDAO7Xw71gyx3mtzgFXpmeigesM3XkcTcQdudg2v5k1ZFzWM30Oo4UkwZ9U8pE1pcLKKu8cx8icPg==} + pinyin-pro@3.29.3: + resolution: {integrity: sha512-+UU9bx6vfDw8amOJGHm0TE0rdQl8VPylsDWviQ5OOQ3e+on1xRP4OqDbiDuMT5OISgvfl/Y6ez1BBRaIP80GLQ==} pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} @@ -7784,10 +7786,6 @@ packages: resolution: {integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.25: - resolution: {integrity: sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==} - engines: {node: ^10 || ^12 || >=14} - postcss@8.5.26: resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} engines: {node: ^10 || ^12 || >=14} @@ -7804,6 +7802,7 @@ packages: resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} engines: {node: '>=10'} deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. + hasBin: true prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -7857,6 +7856,7 @@ packages: rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true re-resizable@6.11.2: resolution: {integrity: sha512-2xI2P3OHs5qw7K0Ud1aLILK6MQxW50TcO+DetD9eIV58j84TqYeHoZcL9H4GXFXXIh7afhH8mv5iUCXII7OW7A==} @@ -7893,8 +7893,8 @@ packages: react-fast-compare@3.2.2: resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} - react-i18next@17.0.11: - resolution: {integrity: sha512-cDtkXgxjuFTWUH6V+aQn1Ve5vDiUztCNPWW5GtSHDccsgRXO1nE6QFWCEmc1KAutrb3OUv87wFShJL5RhUwPXg==} + react-i18next@17.0.12: + resolution: {integrity: sha512-lFWPEGkxQ6RhusdUkysFBD58VHfSSzvHBzqMgN0SvfVpdQGfwtNkStTqdy08/sJd7s807qqutgx93fRpD0DJ3Q==} peerDependencies: i18next: '>= 26.2.0' react: '>= 16.8.0' @@ -8013,6 +8013,7 @@ packages: regjsparser@0.13.2: resolution: {integrity: sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==} + hasBin: true rehype-harden@1.1.8: resolution: {integrity: sha512-Qn7vR1xrf6fZCrkm9TDWi/AB4ylrHy+jqsNm1EHOAmbARYA6gsnVJBq/sdBh6kmT4NEZxH5vgIjrscefJAOXcw==} @@ -8269,8 +8270,8 @@ packages: resolution: {integrity: sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==} engines: {node: '>=18'} - storybook@10.5.8: - resolution: {integrity: sha512-rR4oFMSiWBSqI0lvsJPtcQUPj8+hzj3TkLu+Mw61Wo6YxPSb5FsLSHai0jZnuaIdKIlmu25KCfwlSQl4e1uvnA==} + storybook@10.5.10: + resolution: {integrity: sha512-Rz8k9ejFHsi7lbtJTaxZlhCUz4GkbJIKEoKDjXeLfr/ZhXip73E6keKxW0KH8iGeKiCqHAbJCV4YIQrxTOLiig==} hasBin: true peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -8290,6 +8291,9 @@ packages: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 + strictdom@1.0.1: + resolution: {integrity: sha512-cEmp9QeXXRmjj/rVp9oyiqcvyocWab/HaoN4+bwFeZ7QzykJD6L3yD4v12K1x0tHpqRqVpJevN3gW7kyM39Bqg==} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -8382,6 +8386,7 @@ packages: svgo@3.3.3: resolution: {integrity: sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==} engines: {node: '>=14.0.0'} + hasBin: true synckit@0.11.13: resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} @@ -8582,6 +8587,7 @@ packages: typescript@7.0.2: resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} engines: {node: '>=16.20.0'} + hasBin: true ufo@1.6.4: resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} @@ -8589,6 +8595,7 @@ packages: uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} + hasBin: true unbash@4.0.10: resolution: {integrity: sha512-b7zoBQvpWp0vuN5q2vK2RRBR2SvuruQAs50DApdDveBSn3eSYd84IaHodFqQIMlvY9K2VnyBUEXgwOBuGU9GBg==} @@ -8600,10 +8607,6 @@ packages: undici-types@8.3.0: resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} - undici@7.28.0: - resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} - engines: {node: '>=20.18.1'} - undici@7.29.0: resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==} engines: {node: '>=20.18.1'} @@ -8707,8 +8710,9 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@14.0.1: - resolution: {integrity: sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==} + uuid@14.0.2: + resolution: {integrity: sha512-xZe/16rV4aa+HGSOCiY2YeLT1OybRLrrkL/Rqaq7p7GMVXjFh+6wN4oMYgjFmnSnhY8t6Xpdl2l9qmnHYuMHwQ==} + hasBin: true valibot@1.4.2: resolution: {integrity: sha512-gjdCvJ6d3RyHAneqxMYMW9QMCwYMb3jpOO0IyHZV1bnRHFBHrX3VkIILt5XYR0WhwHiH7Mty8ovuPZ/O3gamrg==} @@ -8734,14 +8738,14 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vinext@1.0.0-beta.5: - resolution: {integrity: sha512-c0I1UB70/pGwD9y4/iXWrGfz/LnowSbkQpUw+lK9t08tes5WHX7Vl0sZAY4MIzGaVCyvrD4/xZo7HWpMje6SwA==} + vinext@1.0.0-beta.8: + resolution: {integrity: sha512-JXiyi0V13PkcIHWUiql3wO/UyNlI1R325RBwBx4CIDa8dd4lgnI90LN5bD2V1J6T+EU8eYCYnKDmtxWjRdL0cg==} engines: {node: '>=22'} hasBin: true peerDependencies: '@mdx-js/rollup': ^3.0.0 '@vitejs/plugin-react': ^5.1.4 || ^6.0.0 - '@vitejs/plugin-rsc': ^0.5.26 + '@vitejs/plugin-rsc': ^0.5.34 react: ^19.2.6 react-dom: ^19.2.6 react-server-dom-webpack: ^19.2.6 @@ -8777,13 +8781,13 @@ packages: storybook: ^0.0.0-0 || ^9.0.0 || ^10.0.0 || ^10.0.0-0 || ^10.1.0-0 || ^10.2.0-0 || ^10.3.0-0 || ^10.4.0-0 || ^10.5.0-0 || ^10.6.0-0 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - vite-plus@0.2.9: - resolution: {integrity: sha512-8uRNqAxh9no3AU4Lep8BEYhkim07+3NO+mhuxTWiN0k30syGT/2+ue/DtWYhtzQ7yi2f2WKpjOhoI4/QkWWbUg==} + vite-plus@0.3.0: + resolution: {integrity: sha512-GNWbWuWD37frCSFrz6MLzUo62bTv5IOJozHEgZYOkxsLkuQtTwm4TowzpfoGrSsfwhAAtfPd/sK1Y0+v1SwhZA==} engines: {node: ^20.19.0 || ^22.18.0 || >=24.11.0} hasBin: true peerDependencies: - '@vitest/browser-playwright': 4.1.10 - '@vitest/browser-webdriverio': 4.1.10 + '@vitest/browser-playwright': 4.1.11 + '@vitest/browser-webdriverio': 4.1.11 peerDependenciesMeta: '@vitest/browser-playwright': optional: true @@ -8813,7 +8817,7 @@ packages: '@types/react-dom': ^18.0.0 || ^19.0.0 react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - vitest: 4.1.10 + vitest: 4.1.11 peerDependenciesMeta: '@types/react': optional: true @@ -8823,22 +8827,22 @@ packages: vitest-canvas-mock@1.1.5: resolution: {integrity: sha512-PWtzolkO/GsG9I9qsLxJ8HzdXQKNz1iRVUcCDJbNBiDuxMp50NC1MWwz2UmDYS4vJqNeKyoLWm7RgjfKWIoQOQ==} peerDependencies: - vitest: 4.1.10 + vitest: 4.1.11 - vitest@4.1.10: - resolution: {integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==} + vitest@4.1.11: + resolution: {integrity: sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.10 - '@vitest/browser-preview': 4.1.10 - '@vitest/browser-webdriverio': 4.1.10 - '@vitest/coverage-istanbul': 4.1.10 - '@vitest/coverage-v8': 4.1.10 - '@vitest/ui': 4.1.10 + '@vitest/browser-playwright': 4.1.11 + '@vitest/browser-preview': 4.1.11 + '@vitest/browser-webdriverio': 4.1.11 + '@vitest/coverage-istanbul': 4.1.11 + '@vitest/coverage-v8': 4.1.11 + '@vitest/ui': 4.1.11 happy-dom: '*' jsdom: '*' vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -8926,18 +8930,6 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.21.2: - resolution: {integrity: sha512-54dMVAo4WIe6SKy3vBgN+9bJZqqQ8IMRevAkOLQALhi49qkkQDQfWdAZ8KQlXiEabw88ARXXdUrlvtbKQX+aKw==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - ws@8.21.3: resolution: {integrity: sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==} engines: {node: '>=10.0.0'} @@ -9368,28 +9360,18 @@ snapshots: '@chevrotain/types@11.1.2': {} - '@chromatic-com/storybook@5.3.0(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))': + '@chromatic-com/storybook@5.3.0(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))': dependencies: '@neoconfetti/react': 1.0.0 chromatic: 18.2.0 jsonfile: 6.2.1 - storybook: 10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + storybook: 10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) strip-ansi: 7.2.0 transitivePeerDependencies: - '@chromatic-com/cypress' - '@chromatic-com/playwright' - '@chromatic-com/vitest' - '@code-inspector/core@1.6.6(supports-color@10.2.2)': - dependencies: - '@vue/compiler-dom': 3.5.39 - chalk: 4.1.2 - dotenv: 16.6.1 - launch-ide: 1.4.5 - portfinder: 1.0.38(supports-color@10.2.2) - transitivePeerDependencies: - - supports-color - '@code-inspector/core@1.6.6(supports-color@11.0.0)': dependencies: '@vue/compiler-dom': 3.5.39 @@ -9498,7 +9480,7 @@ snapshots: '@cucumber/gherkin@42.0.0': dependencies: - '@cucumber/messages': 34.0.1 + '@cucumber/messages': 34.2.0 '@cucumber/html-formatter@24.1.0(@cucumber/messages@34.2.0)': dependencies: @@ -9519,8 +9501,6 @@ snapshots: '@cucumber/messages@33.0.4': {} - '@cucumber/messages@34.0.1': {} - '@cucumber/messages@34.2.0': {} '@cucumber/pretty-formatter@4.0.0(@cucumber/messages@34.2.0)': @@ -9559,6 +9539,12 @@ snapshots: '@iconify/utils': 3.1.3 tailwindcss: 4.3.3 + '@emnapi/core@1.11.0': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + '@emnapi/core@1.11.2': dependencies: '@emnapi/wasi-threads': 1.2.2 @@ -9571,6 +9557,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.11.0': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.11.2': dependencies: tslib: 2.8.1 @@ -9596,7 +9587,7 @@ snapshots: '@es-joy/jsdoccomment@0.88.0': dependencies: '@types/estree': 1.0.9 - '@typescript-eslint/types': 8.66.0 + '@typescript-eslint/types': 8.67.0 comment-parser: 1.4.7 esquery: 1.7.0 jsdoc-type-pratt-parser: 7.2.0 @@ -9604,7 +9595,7 @@ snapshots: '@es-joy/jsdoccomment@0.91.0': dependencies: '@types/estree': 1.0.9 - '@typescript-eslint/types': 8.66.0 + '@typescript-eslint/types': 8.67.0 comment-parser: 1.4.7 esquery: 1.7.0 jsdoc-type-pratt-parser: 8.0.0 @@ -9689,100 +9680,100 @@ snapshots: '@esbuild/win32-x64@0.28.2': optional: true - '@eslint-community/eslint-plugin-eslint-comments@4.7.2(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))': + '@eslint-community/eslint-plugin-eslint-comments@4.7.2(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))': dependencies: escape-string-regexp: 4.0.0 - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) ignore: 7.0.5 - '@eslint-community/eslint-utils@4.9.1(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))': + '@eslint-community/eslint-utils@4.9.1(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))': dependencies: - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint-react/ast@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)': + '@eslint-react/ast@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)': dependencies: '@typescript-eslint/types': 8.67.0 '@typescript-eslint/typescript-estree': 8.67.0(@typescript/typescript6@6.0.2)(supports-color@11.0.0) - '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) string-ts: 2.3.1 typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@eslint-react/core@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)': + '@eslint-react/core@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)': dependencies: - '@eslint-react/ast': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/eslint': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/shared': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/var': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/ast': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/eslint': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/shared': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/var': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) '@typescript-eslint/scope-manager': 8.67.0 '@typescript-eslint/types': 8.67.0 - '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) ts-pattern: 5.9.0 typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@eslint-react/eslint-plugin@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)': + '@eslint-react/eslint-plugin@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)': dependencies: - '@eslint-react/shared': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) - eslint-plugin-react-dom: 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - eslint-plugin-react-jsx: 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - eslint-plugin-react-naming-convention: 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - eslint-plugin-react-rsc: 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - eslint-plugin-react-web-api: 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - eslint-plugin-react-x: 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/shared': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) + eslint-plugin-react-dom: 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + eslint-plugin-react-jsx: 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + eslint-plugin-react-naming-convention: 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + eslint-plugin-react-rsc: 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + eslint-plugin-react-web-api: 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + eslint-plugin-react-x: 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@eslint-react/eslint@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)': + '@eslint-react/eslint@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)': dependencies: - '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@eslint-react/jsx@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)': + '@eslint-react/jsx@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)': dependencies: - '@eslint-react/ast': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/eslint': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/shared': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/var': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/ast': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/eslint': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/shared': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/var': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) '@typescript-eslint/types': 8.67.0 - '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) ts-pattern: 5.9.0 typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@eslint-react/shared@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)': + '@eslint-react/shared@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)': dependencies: - '@eslint-react/eslint': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + '@eslint-react/eslint': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) ts-pattern: 5.9.0 typescript: '@typescript/typescript6@6.0.2' zod: 4.4.3 transitivePeerDependencies: - supports-color - '@eslint-react/var@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)': + '@eslint-react/var@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)': dependencies: - '@eslint-react/ast': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/eslint': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/ast': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/eslint': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) '@typescript-eslint/scope-manager': 8.67.0 '@typescript-eslint/types': 8.67.0 - '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) ts-pattern: 5.9.0 typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: @@ -9940,9 +9931,9 @@ snapshots: '@hey-api/types@0.1.4': {} - '@hono/node-server@2.1.1(hono@4.13.2)': + '@hono/node-server@2.1.1(hono@4.13.3)': dependencies: - hono: 4.13.2 + hono: 4.13.3 '@humanfs/core@0.19.2': dependencies: @@ -9968,13 +9959,13 @@ snapshots: dependencies: '@iconify/types': 2.0.0 - '@iconify/tools@4.2.0(supports-color@10.2.2)': + '@iconify/tools@4.2.0(supports-color@11.0.0)': dependencies: '@iconify/types': 2.0.0 - '@iconify/utils': 2.3.0(supports-color@10.2.2) + '@iconify/utils': 2.3.0(supports-color@11.0.0) cheerio: 1.2.0 domhandler: 5.0.3 - extract-zip: 2.0.1(supports-color@10.2.2) + extract-zip: 2.0.1(supports-color@11.0.0) local-pkg: 1.2.1 pathe: 2.0.3 svgo: 3.3.3 @@ -9984,12 +9975,12 @@ snapshots: '@iconify/types@2.0.0': {} - '@iconify/utils@2.3.0(supports-color@10.2.2)': + '@iconify/utils@2.3.0(supports-color@11.0.0)': dependencies: '@antfu/install-pkg': 1.1.0 '@antfu/utils': 8.1.1 '@iconify/types': 2.0.0 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@11.0.0) globals: 15.15.0 kolorist: 1.8.0 local-pkg: 1.2.1 @@ -10114,11 +10105,11 @@ snapshots: dependencies: minipass: 7.1.3 - '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))': dependencies: glob: 13.0.6 react-docgen-typescript: 2.4.0(@typescript/typescript6@6.0.2) - vite: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' + vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' optionalDependencies: typescript: '@typescript/typescript6@6.0.2' @@ -10379,11 +10370,11 @@ snapshots: '@types/react': 19.2.18 react: 19.2.8 - '@mediabunny/mp3-encoder@1.53.1(mediabunny@1.53.1)': + '@mediabunny/mp3-encoder@1.55.2(mediabunny@1.55.2)': dependencies: - mediabunny: 1.53.1 + mediabunny: 1.55.2 - '@mermaid-js/parser@1.2.0': + '@mermaid-js/parser@1.2.1': dependencies: '@chevrotain/types': 11.1.2 @@ -10448,6 +10439,13 @@ snapshots: '@napi-rs/keyring-win32-ia32-msvc': 1.3.0 '@napi-rs/keyring-win32-x64-msvc': 1.3.0 + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.0)(@emnapi/runtime@1.11.0)': + dependencies: + '@emnapi/core': 1.11.0 + '@emnapi/runtime': 1.11.0 + '@tybys/wasm-util': 0.10.3 + optional: true + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': dependencies: '@emnapi/core': 1.11.2 @@ -10466,30 +10464,30 @@ snapshots: '@next/env@16.0.0': {} - '@next/env@16.3.0': {} + '@next/env@16.3.2': {} - '@next/swc-darwin-arm64@16.3.0': + '@next/swc-darwin-arm64@16.3.2': optional: true - '@next/swc-darwin-x64@16.3.0': + '@next/swc-darwin-x64@16.3.2': optional: true - '@next/swc-linux-arm64-gnu@16.3.0': + '@next/swc-linux-arm64-gnu@16.3.2': optional: true - '@next/swc-linux-arm64-musl@16.3.0': + '@next/swc-linux-arm64-musl@16.3.2': optional: true - '@next/swc-linux-x64-gnu@16.3.0': + '@next/swc-linux-x64-gnu@16.3.2': optional: true - '@next/swc-linux-x64-musl@16.3.0': + '@next/swc-linux-x64-musl@16.3.2': optional: true - '@next/swc-win32-arm64-msvc@16.3.0': + '@next/swc-win32-arm64-msvc@16.3.2': optional: true - '@next/swc-win32-x64-msvc@16.3.0': + '@next/swc-win32-x64-msvc@16.3.2': optional: true '@nodelib/fs.scandir@2.1.5': @@ -10562,11 +10560,11 @@ snapshots: transitivePeerDependencies: - '@opentelemetry/api' - '@orpc/tanstack-query@1.15.0(@orpc/client@1.15.0)(@tanstack/query-core@5.101.4)': + '@orpc/tanstack-query@1.15.0(@orpc/client@1.15.0)(@tanstack/query-core@5.102.2)': dependencies: '@orpc/client': 1.15.0 '@orpc/shared': 1.15.0 - '@tanstack/query-core': 5.101.4 + '@tanstack/query-core': 5.102.2 transitivePeerDependencies: - '@opentelemetry/api' @@ -10693,60 +10691,117 @@ snapshots: '@oxc-parser/binding-win32-x64-msvc@0.143.0': optional: true - '@oxc-project/runtime@0.143.0': {} + '@oxc-project/runtime@0.146.0': {} '@oxc-project/types@0.127.0': {} '@oxc-project/types@0.143.0': {} + '@oxc-project/types@0.146.0': {} + + '@oxc-resolver/binding-android-arm-eabi@11.21.2': + optional: true + '@oxc-resolver/binding-android-arm-eabi@11.24.2': optional: true + '@oxc-resolver/binding-android-arm64@11.21.2': + optional: true + '@oxc-resolver/binding-android-arm64@11.24.2': optional: true + '@oxc-resolver/binding-darwin-arm64@11.21.2': + optional: true + '@oxc-resolver/binding-darwin-arm64@11.24.2': optional: true + '@oxc-resolver/binding-darwin-x64@11.21.2': + optional: true + '@oxc-resolver/binding-darwin-x64@11.24.2': optional: true + '@oxc-resolver/binding-freebsd-x64@11.21.2': + optional: true + '@oxc-resolver/binding-freebsd-x64@11.24.2': optional: true + '@oxc-resolver/binding-linux-arm-gnueabihf@11.21.2': + optional: true + '@oxc-resolver/binding-linux-arm-gnueabihf@11.24.2': optional: true + '@oxc-resolver/binding-linux-arm-musleabihf@11.21.2': + optional: true + '@oxc-resolver/binding-linux-arm-musleabihf@11.24.2': optional: true + '@oxc-resolver/binding-linux-arm64-gnu@11.21.2': + optional: true + '@oxc-resolver/binding-linux-arm64-gnu@11.24.2': optional: true + '@oxc-resolver/binding-linux-arm64-musl@11.21.2': + optional: true + '@oxc-resolver/binding-linux-arm64-musl@11.24.2': optional: true + '@oxc-resolver/binding-linux-ppc64-gnu@11.21.2': + optional: true + '@oxc-resolver/binding-linux-ppc64-gnu@11.24.2': optional: true + '@oxc-resolver/binding-linux-riscv64-gnu@11.21.2': + optional: true + '@oxc-resolver/binding-linux-riscv64-gnu@11.24.2': optional: true + '@oxc-resolver/binding-linux-riscv64-musl@11.21.2': + optional: true + '@oxc-resolver/binding-linux-riscv64-musl@11.24.2': optional: true + '@oxc-resolver/binding-linux-s390x-gnu@11.21.2': + optional: true + '@oxc-resolver/binding-linux-s390x-gnu@11.24.2': optional: true + '@oxc-resolver/binding-linux-x64-gnu@11.21.2': + optional: true + '@oxc-resolver/binding-linux-x64-gnu@11.24.2': optional: true + '@oxc-resolver/binding-linux-x64-musl@11.21.2': + optional: true + '@oxc-resolver/binding-linux-x64-musl@11.24.2': optional: true + '@oxc-resolver/binding-openharmony-arm64@11.21.2': + optional: true + '@oxc-resolver/binding-openharmony-arm64@11.24.2': optional: true + '@oxc-resolver/binding-wasm32-wasi@11.21.2': + dependencies: + '@emnapi/core': 1.11.0 + '@emnapi/runtime': 1.11.0 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.0)(@emnapi/runtime@1.11.0) + optional: true + '@oxc-resolver/binding-wasm32-wasi@11.24.2': dependencies: '@emnapi/core': 1.11.2 @@ -10754,67 +10809,73 @@ snapshots: '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) optional: true + '@oxc-resolver/binding-win32-arm64-msvc@11.21.2': + optional: true + '@oxc-resolver/binding-win32-arm64-msvc@11.24.2': optional: true + '@oxc-resolver/binding-win32-x64-msvc@11.21.2': + optional: true + '@oxc-resolver/binding-win32-x64-msvc@11.24.2': optional: true - '@oxfmt/binding-android-arm-eabi@0.62.0': + '@oxfmt/binding-android-arm-eabi@0.64.0': optional: true - '@oxfmt/binding-android-arm64@0.62.0': + '@oxfmt/binding-android-arm64@0.64.0': optional: true - '@oxfmt/binding-darwin-arm64@0.62.0': + '@oxfmt/binding-darwin-arm64@0.64.0': optional: true - '@oxfmt/binding-darwin-x64@0.62.0': + '@oxfmt/binding-darwin-x64@0.64.0': optional: true - '@oxfmt/binding-freebsd-x64@0.62.0': + '@oxfmt/binding-freebsd-x64@0.64.0': optional: true - '@oxfmt/binding-linux-arm-gnueabihf@0.62.0': + '@oxfmt/binding-linux-arm-gnueabihf@0.64.0': optional: true - '@oxfmt/binding-linux-arm-musleabihf@0.62.0': + '@oxfmt/binding-linux-arm-musleabihf@0.64.0': optional: true - '@oxfmt/binding-linux-arm64-gnu@0.62.0': + '@oxfmt/binding-linux-arm64-gnu@0.64.0': optional: true - '@oxfmt/binding-linux-arm64-musl@0.62.0': + '@oxfmt/binding-linux-arm64-musl@0.64.0': optional: true - '@oxfmt/binding-linux-ppc64-gnu@0.62.0': + '@oxfmt/binding-linux-ppc64-gnu@0.64.0': optional: true - '@oxfmt/binding-linux-riscv64-gnu@0.62.0': + '@oxfmt/binding-linux-riscv64-gnu@0.64.0': optional: true - '@oxfmt/binding-linux-riscv64-musl@0.62.0': + '@oxfmt/binding-linux-riscv64-musl@0.64.0': optional: true - '@oxfmt/binding-linux-s390x-gnu@0.62.0': + '@oxfmt/binding-linux-s390x-gnu@0.64.0': optional: true - '@oxfmt/binding-linux-x64-gnu@0.62.0': + '@oxfmt/binding-linux-x64-gnu@0.64.0': optional: true - '@oxfmt/binding-linux-x64-musl@0.62.0': + '@oxfmt/binding-linux-x64-musl@0.64.0': optional: true - '@oxfmt/binding-openharmony-arm64@0.62.0': + '@oxfmt/binding-openharmony-arm64@0.64.0': optional: true - '@oxfmt/binding-win32-arm64-msvc@0.62.0': + '@oxfmt/binding-win32-arm64-msvc@0.64.0': optional: true - '@oxfmt/binding-win32-ia32-msvc@0.62.0': + '@oxfmt/binding-win32-ia32-msvc@0.64.0': optional: true - '@oxfmt/binding-win32-x64-msvc@0.62.0': + '@oxfmt/binding-win32-x64-msvc@0.64.0': optional: true '@oxlint-tsgolint/darwin-arm64@7.0.2001': @@ -10835,64 +10896,64 @@ snapshots: '@oxlint-tsgolint/win32-x64@7.0.2001': optional: true - '@oxlint/binding-android-arm-eabi@1.77.0': + '@oxlint/binding-android-arm-eabi@1.79.0': optional: true - '@oxlint/binding-android-arm64@1.77.0': + '@oxlint/binding-android-arm64@1.79.0': optional: true - '@oxlint/binding-darwin-arm64@1.77.0': + '@oxlint/binding-darwin-arm64@1.79.0': optional: true - '@oxlint/binding-darwin-x64@1.77.0': + '@oxlint/binding-darwin-x64@1.79.0': optional: true - '@oxlint/binding-freebsd-x64@1.77.0': + '@oxlint/binding-freebsd-x64@1.79.0': optional: true - '@oxlint/binding-linux-arm-gnueabihf@1.77.0': + '@oxlint/binding-linux-arm-gnueabihf@1.79.0': optional: true - '@oxlint/binding-linux-arm-musleabihf@1.77.0': + '@oxlint/binding-linux-arm-musleabihf@1.79.0': optional: true - '@oxlint/binding-linux-arm64-gnu@1.77.0': + '@oxlint/binding-linux-arm64-gnu@1.79.0': optional: true - '@oxlint/binding-linux-arm64-musl@1.77.0': + '@oxlint/binding-linux-arm64-musl@1.79.0': optional: true - '@oxlint/binding-linux-ppc64-gnu@1.77.0': + '@oxlint/binding-linux-ppc64-gnu@1.79.0': optional: true - '@oxlint/binding-linux-riscv64-gnu@1.77.0': + '@oxlint/binding-linux-riscv64-gnu@1.79.0': optional: true - '@oxlint/binding-linux-riscv64-musl@1.77.0': + '@oxlint/binding-linux-riscv64-musl@1.79.0': optional: true - '@oxlint/binding-linux-s390x-gnu@1.77.0': + '@oxlint/binding-linux-s390x-gnu@1.79.0': optional: true - '@oxlint/binding-linux-x64-gnu@1.77.0': + '@oxlint/binding-linux-x64-gnu@1.79.0': optional: true - '@oxlint/binding-linux-x64-musl@1.77.0': + '@oxlint/binding-linux-x64-musl@1.79.0': optional: true - '@oxlint/binding-openharmony-arm64@1.77.0': + '@oxlint/binding-openharmony-arm64@1.79.0': optional: true - '@oxlint/binding-win32-arm64-msvc@1.77.0': + '@oxlint/binding-win32-arm64-msvc@1.79.0': optional: true - '@oxlint/binding-win32-ia32-msvc@1.77.0': + '@oxlint/binding-win32-ia32-msvc@1.79.0': optional: true - '@oxlint/binding-win32-x64-msvc@1.77.0': + '@oxlint/binding-win32-x64-msvc@1.79.0': optional: true - '@oxlint/plugins@1.73.0': {} + '@oxlint/plugins@1.79.0': {} '@pkgr/core@0.3.6': {} @@ -10904,29 +10965,29 @@ snapshots: '@preact/signals-core@1.14.3': {} - '@reactflow/background@11.3.14(@types/react@19.2.18)(immer@11.1.16)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@reactflow/background@11.3.14(@types/react@19.2.18)(immer@11.1.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@reactflow/core': 11.11.4(@types/react@19.2.18)(immer@11.1.16)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@reactflow/core': 11.11.4(@types/react@19.2.18)(immer@11.1.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) classcat: 5.0.5 react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - zustand: 4.5.7(@types/react@19.2.18)(immer@11.1.16)(react@19.2.8) + zustand: 4.5.7(@types/react@19.2.18)(immer@11.1.18)(react@19.2.8) transitivePeerDependencies: - '@types/react' - immer - '@reactflow/controls@11.2.14(@types/react@19.2.18)(immer@11.1.16)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@reactflow/controls@11.2.14(@types/react@19.2.18)(immer@11.1.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@reactflow/core': 11.11.4(@types/react@19.2.18)(immer@11.1.16)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@reactflow/core': 11.11.4(@types/react@19.2.18)(immer@11.1.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) classcat: 5.0.5 react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - zustand: 4.5.7(@types/react@19.2.18)(immer@11.1.16)(react@19.2.8) + zustand: 4.5.7(@types/react@19.2.18)(immer@11.1.18)(react@19.2.8) transitivePeerDependencies: - '@types/react' - immer - '@reactflow/core@11.11.4(@types/react@19.2.18)(immer@11.1.16)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@reactflow/core@11.11.4(@types/react@19.2.18)(immer@11.1.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@types/d3': 7.4.3 '@types/d3-drag': 3.0.7 @@ -10938,14 +10999,14 @@ snapshots: d3-zoom: 3.0.0 react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - zustand: 4.5.7(@types/react@19.2.18)(immer@11.1.16)(react@19.2.8) + zustand: 4.5.7(@types/react@19.2.18)(immer@11.1.18)(react@19.2.8) transitivePeerDependencies: - '@types/react' - immer - '@reactflow/minimap@11.7.14(@types/react@19.2.18)(immer@11.1.16)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@reactflow/minimap@11.7.14(@types/react@19.2.18)(immer@11.1.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@reactflow/core': 11.11.4(@types/react@19.2.18)(immer@11.1.16)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@reactflow/core': 11.11.4(@types/react@19.2.18)(immer@11.1.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@types/d3-selection': 3.0.11 '@types/d3-zoom': 3.0.8 classcat: 5.0.5 @@ -10953,31 +11014,31 @@ snapshots: d3-zoom: 3.0.0 react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - zustand: 4.5.7(@types/react@19.2.18)(immer@11.1.16)(react@19.2.8) + zustand: 4.5.7(@types/react@19.2.18)(immer@11.1.18)(react@19.2.8) transitivePeerDependencies: - '@types/react' - immer - '@reactflow/node-resizer@2.2.14(@types/react@19.2.18)(immer@11.1.16)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@reactflow/node-resizer@2.2.14(@types/react@19.2.18)(immer@11.1.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@reactflow/core': 11.11.4(@types/react@19.2.18)(immer@11.1.16)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@reactflow/core': 11.11.4(@types/react@19.2.18)(immer@11.1.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) classcat: 5.0.5 d3-drag: 3.0.0 d3-selection: 3.0.0 react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - zustand: 4.5.7(@types/react@19.2.18)(immer@11.1.16)(react@19.2.8) + zustand: 4.5.7(@types/react@19.2.18)(immer@11.1.18)(react@19.2.8) transitivePeerDependencies: - '@types/react' - immer - '@reactflow/node-toolbar@1.3.14(@types/react@19.2.18)(immer@11.1.16)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@reactflow/node-toolbar@1.3.14(@types/react@19.2.18)(immer@11.1.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@reactflow/core': 11.11.4(@types/react@19.2.18)(immer@11.1.16)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@reactflow/core': 11.11.4(@types/react@19.2.18)(immer@11.1.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) classcat: 5.0.5 react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - zustand: 4.5.7(@types/react@19.2.18)(immer@11.1.16)(react@19.2.8) + zustand: 4.5.7(@types/react@19.2.18)(immer@11.1.18)(react@19.2.8) transitivePeerDependencies: - '@types/react' - immer @@ -11090,21 +11151,21 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@storybook/addon-a11y@10.5.8(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))': + '@storybook/addon-a11y@10.5.10(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))': dependencies: '@storybook/global': 5.0.0 - axe-core: 4.12.1 - storybook: 10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + axe-core: 4.13.0 + storybook: 10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) - '@storybook/addon-docs@10.5.8(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))': + '@storybook/addon-docs@10.5.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))': dependencies: '@mdx-js/react': 3.1.1(@types/react@19.2.18)(react@19.2.8) - '@storybook/csf-plugin': 10.5.8(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) + '@storybook/csf-plugin': 10.5.10(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) '@storybook/icons': 2.1.0(react@19.2.8) - '@storybook/react-dom-shim': 10.5.8(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) + '@storybook/react-dom-shim': 10.5.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - storybook: 10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + storybook: 10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) ts-dedent: 2.3.0 optionalDependencies: '@types/react': 19.2.18 @@ -11115,54 +11176,54 @@ snapshots: - vite - webpack - '@storybook/addon-links@10.5.8(@types/react@19.2.18)(react@19.2.8)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))': + '@storybook/addon-links@10.5.10(@types/react@19.2.18)(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))': dependencies: '@storybook/global': 5.0.0 - storybook: 10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + storybook: 10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) optionalDependencies: '@types/react': 19.2.18 react: 19.2.8 - '@storybook/addon-onboarding@10.5.8(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))': + '@storybook/addon-onboarding@10.5.10(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))': dependencies: - storybook: 10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + storybook: 10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) - '@storybook/addon-themes@10.5.8(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))': + '@storybook/addon-themes@10.5.10(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))': dependencies: - storybook: 10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + storybook: 10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) ts-dedent: 2.3.0 - '@storybook/addon-vitest@10.5.8(@vitest/browser-playwright@4.1.10)(@vitest/browser@4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10))(@vitest/runner@4.1.10)(react@19.2.8)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(vitest@4.1.10)': + '@storybook/addon-vitest@10.5.10(@vitest/browser-playwright@4.1.11)(@vitest/browser@4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.11))(@vitest/runner@4.1.11)(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(vitest@4.1.11)': dependencies: '@storybook/global': 5.0.0 '@storybook/icons': 2.1.0(react@19.2.8) - storybook: 10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + storybook: 10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) optionalDependencies: - '@vitest/browser': 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10) - '@vitest/browser-playwright': 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(playwright@1.62.1)(vitest@4.1.10) - '@vitest/runner': 4.1.10 - vitest: 4.1.10(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/browser-preview@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.2) + '@vitest/browser': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.11) + '@vitest/browser-playwright': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(playwright@1.62.1)(vitest@4.1.11) + '@vitest/runner': 4.1.11 + vitest: 4.1.11(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/browser-preview@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.6) transitivePeerDependencies: - react - '@storybook/builder-vite@10.5.8(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))': + '@storybook/builder-vite@10.5.10(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))': dependencies: - '@storybook/csf-plugin': 10.5.8(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) - storybook: 10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + '@storybook/csf-plugin': 10.5.10(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) + storybook: 10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) ts-dedent: 2.3.0 - vite: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' + vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' transitivePeerDependencies: - esbuild - rollup - webpack - '@storybook/csf-plugin@10.5.8(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))': + '@storybook/csf-plugin@10.5.10(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))': dependencies: - storybook: 10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + storybook: 10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) unplugin: 2.3.11 optionalDependencies: esbuild: 0.28.2 - vite: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' + vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' '@storybook/global@5.0.0': {} @@ -11170,21 +11231,21 @@ snapshots: dependencies: react: 19.2.8 - '@storybook/nextjs-vite@10.5.8(@babel/core@7.29.7(supports-color@11.0.0))(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(next@16.3.0(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(supports-color@11.0.0)': + '@storybook/nextjs-vite@10.5.10(@babel/core@7.29.7(supports-color@11.0.0))(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(next@16.3.2(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(supports-color@11.0.0)': dependencies: - '@storybook/builder-vite': 10.5.8(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) - '@storybook/react': 10.5.8(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(@typescript/typescript6@6.0.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(supports-color@11.0.0) - '@storybook/react-vite': 10.5.8(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(supports-color@11.0.0) - next: 16.3.0(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@storybook/builder-vite': 10.5.10(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) + '@storybook/react': 10.5.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(@typescript/typescript6@6.0.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(supports-color@11.0.0) + '@storybook/react-vite': 10.5.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(supports-color@11.0.0) + next: 16.3.2(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - storybook: 10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + storybook: 10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) styled-jsx: 5.1.6(@babel/core@7.29.7(supports-color@11.0.0))(react@19.2.8) - vite: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' - vite-plugin-storybook-nextjs: 3.3.0(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(next@16.3.0(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(supports-color@11.0.0) + vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' + vite-plugin-storybook-nextjs: 3.3.0(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(next@16.3.2(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(supports-color@11.0.0) optionalDependencies: '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react-dom': 19.2.5(@types/react@19.2.18) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - '@babel/core' @@ -11194,30 +11255,30 @@ snapshots: - supports-color - webpack - '@storybook/react-dom-shim@10.5.8(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))': + '@storybook/react-dom-shim@10.5.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))': dependencies: react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - storybook: 10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + storybook: 10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) optionalDependencies: '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react-dom': 19.2.5(@types/react@19.2.18) - '@storybook/react-vite@10.5.8(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(supports-color@11.0.0)': + '@storybook/react-vite@10.5.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(supports-color@11.0.0)': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) '@rollup/pluginutils': 5.4.0 - '@storybook/builder-vite': 10.5.8(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) - '@storybook/react': 10.5.8(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(@typescript/typescript6@6.0.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(supports-color@11.0.0) + '@storybook/builder-vite': 10.5.10(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) + '@storybook/react': 10.5.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(@typescript/typescript6@6.0.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(supports-color@11.0.0) empathic: 2.0.1 magic-string: 0.30.21 react: 19.2.8 react-docgen: 8.0.3(supports-color@11.0.0) react-dom: 19.2.8(react@19.2.8) resolve: 1.22.12 - storybook: 10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + storybook: 10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) tsconfig-paths: 4.2.0 - vite: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' + vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' optionalDependencies: typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: @@ -11228,18 +11289,18 @@ snapshots: - supports-color - webpack - '@storybook/react@10.5.8(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(@typescript/typescript6@6.0.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(supports-color@11.0.0)': + '@storybook/react@10.5.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(@typescript/typescript6@6.0.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(supports-color@11.0.0)': dependencies: '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 10.5.8(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) + '@storybook/react-dom-shim': 10.5.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) react: 19.2.8 react-docgen: 8.0.3(supports-color@11.0.0) react-docgen-typescript: 2.4.0(@typescript/typescript6@6.0.2) react-dom: 19.2.8(react@19.2.8) - storybook: 10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + storybook: 10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) optionalDependencies: '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react-dom': 19.2.5(@types/react@19.2.18) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color @@ -11255,7 +11316,7 @@ snapshots: '@svgdotjs/svg.js@3.2.8': {} - '@swc/helpers@0.5.15': + '@swc/helpers@0.5.23': dependencies: tslib: 2.8.1 @@ -11342,19 +11403,19 @@ snapshots: postcss: 8.5.26 tailwindcss: 4.3.3 - '@tailwindcss/vite@4.3.3(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))': + '@tailwindcss/vite@4.3.3(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))': dependencies: '@tailwindcss/node': 4.3.3 '@tailwindcss/oxide': 4.3.3 tailwindcss: 4.3.3 - vite: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' + vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' '@tanstack/devtools-event-client@0.4.4': {} - '@tanstack/eslint-plugin-query@5.101.4(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@10.2.2)': + '@tanstack/eslint-plugin-query@5.102.2(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)': dependencies: - '@typescript-eslint/utils': 8.64.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@10.2.2) - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) optionalDependencies: typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: @@ -11372,7 +11433,7 @@ snapshots: '@tanstack/pacer-lite@0.1.1': {} - '@tanstack/query-core@5.101.4': {} + '@tanstack/query-core@5.102.2': {} '@tanstack/react-form@1.33.5(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: @@ -11389,9 +11450,9 @@ snapshots: react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - '@tanstack/react-query@5.101.4(react@19.2.8)': + '@tanstack/react-query@5.102.2(react@19.2.8)': dependencies: - '@tanstack/query-core': 5.101.4 + '@tanstack/query-core': 5.102.2 react: 19.2.8 '@tanstack/react-store@0.11.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': @@ -11401,15 +11462,15 @@ snapshots: react-dom: 19.2.8(react@19.2.8) use-sync-external-store: 1.6.0(react@19.2.8) - '@tanstack/react-virtual@3.14.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@tanstack/react-virtual@3.14.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@tanstack/virtual-core': 3.17.7 + '@tanstack/virtual-core': 3.17.8 react: 19.2.8 react-dom: 19.2.8(react@19.2.8) '@tanstack/store@0.11.0': {} - '@tanstack/virtual-core@3.17.7': {} + '@tanstack/virtual-core@3.17.8': {} '@teppeis/multimaps@3.0.0': {} @@ -11433,7 +11494,7 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@babel/runtime': 7.29.7 '@testing-library/dom': 10.4.1 @@ -11441,9 +11502,9 @@ snapshots: react-dom: 19.2.8(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react-dom': 19.2.5(@types/react@19.2.18) - '@testing-library/user-event@14.6.4(@testing-library/dom@10.4.1)': + '@testing-library/user-event@14.6.6(@testing-library/dom@10.4.1)': dependencies: '@testing-library/dom': 10.4.1 @@ -11657,10 +11718,6 @@ snapshots: '@types/geojson@7946.0.16': {} - '@types/hast@3.0.4': - dependencies: - '@types/unist': 3.0.3 - '@types/hast@3.0.5': dependencies: '@types/unist': 3.0.3 @@ -11699,7 +11756,7 @@ snapshots: '@types/qs@6.15.1': {} - '@types/react-dom@19.2.4(@types/react@19.2.18)': + '@types/react-dom@19.2.5(@types/react@19.2.18)': dependencies: '@types/react': 19.2.18 @@ -11730,50 +11787,14 @@ snapshots: '@types/zen-observable@0.8.3': {} - '@typescript-eslint/parser@8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)': + '@typescript-eslint/parser@8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)': dependencies: '@typescript-eslint/scope-manager': 8.67.0 '@typescript-eslint/types': 8.67.0 '@typescript-eslint/typescript-estree': 8.67.0(@typescript/typescript6@6.0.2)(supports-color@11.0.0) '@typescript-eslint/visitor-keys': 8.67.0 debug: 4.4.3(supports-color@11.0.0) - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) - typescript: '@typescript/typescript6@6.0.2' - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.63.0(@typescript/typescript6@6.0.2)(supports-color@10.2.2)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.66.0(@typescript/typescript6@6.0.2) - '@typescript-eslint/types': 8.66.0 - debug: 4.4.3(supports-color@10.2.2) - typescript: '@typescript/typescript6@6.0.2' - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.63.0(@typescript/typescript6@6.0.2)(supports-color@11.0.0)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.66.0(@typescript/typescript6@6.0.2) - '@typescript-eslint/types': 8.66.0 - debug: 4.4.3(supports-color@11.0.0) - typescript: '@typescript/typescript6@6.0.2' - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.64.0(@typescript/typescript6@6.0.2)(supports-color@10.2.2)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.66.0(@typescript/typescript6@6.0.2) - '@typescript-eslint/types': 8.66.0 - debug: 4.4.3(supports-color@10.2.2) - typescript: '@typescript/typescript6@6.0.2' - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.65.0(@typescript/typescript6@6.0.2)(supports-color@11.0.0)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.66.0(@typescript/typescript6@6.0.2) - '@typescript-eslint/types': 8.66.0 - debug: 4.4.3(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color @@ -11787,128 +11808,29 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.63.0': - dependencies: - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/visitor-keys': 8.63.0 - - '@typescript-eslint/scope-manager@8.64.0': - dependencies: - '@typescript-eslint/types': 8.64.0 - '@typescript-eslint/visitor-keys': 8.64.0 - - '@typescript-eslint/scope-manager@8.65.0': - dependencies: - '@typescript-eslint/types': 8.65.0 - '@typescript-eslint/visitor-keys': 8.65.0 - '@typescript-eslint/scope-manager@8.67.0': dependencies: '@typescript-eslint/types': 8.67.0 '@typescript-eslint/visitor-keys': 8.67.0 - '@typescript-eslint/tsconfig-utils@8.63.0(@typescript/typescript6@6.0.2)': - dependencies: - typescript: '@typescript/typescript6@6.0.2' - - '@typescript-eslint/tsconfig-utils@8.64.0(@typescript/typescript6@6.0.2)': - dependencies: - typescript: '@typescript/typescript6@6.0.2' - - '@typescript-eslint/tsconfig-utils@8.65.0(@typescript/typescript6@6.0.2)': - dependencies: - typescript: '@typescript/typescript6@6.0.2' - - '@typescript-eslint/tsconfig-utils@8.66.0(@typescript/typescript6@6.0.2)': - dependencies: - typescript: '@typescript/typescript6@6.0.2' - '@typescript-eslint/tsconfig-utils@8.67.0(@typescript/typescript6@6.0.2)': dependencies: typescript: '@typescript/typescript6@6.0.2' - '@typescript-eslint/type-utils@8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)': + '@typescript-eslint/type-utils@8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)': dependencies: '@typescript-eslint/types': 8.67.0 '@typescript-eslint/typescript-estree': 8.67.0(@typescript/typescript6@6.0.2)(supports-color@11.0.0) - '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) debug: 4.4.3(supports-color@11.0.0) - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) ts-api-utils: 2.5.0(@typescript/typescript6@6.0.2) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.63.0': {} - - '@typescript-eslint/types@8.64.0': {} - - '@typescript-eslint/types@8.65.0': {} - - '@typescript-eslint/types@8.66.0': {} - '@typescript-eslint/types@8.67.0': {} - '@typescript-eslint/typescript-estree@8.63.0(@typescript/typescript6@6.0.2)(supports-color@10.2.2)': - dependencies: - '@typescript-eslint/project-service': 8.63.0(@typescript/typescript6@6.0.2)(supports-color@10.2.2) - '@typescript-eslint/tsconfig-utils': 8.63.0(@typescript/typescript6@6.0.2) - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/visitor-keys': 8.63.0 - debug: 4.4.3(supports-color@10.2.2) - minimatch: 10.2.5 - semver: 7.8.5 - tinyglobby: 0.2.17 - ts-api-utils: 2.5.0(@typescript/typescript6@6.0.2) - typescript: '@typescript/typescript6@6.0.2' - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@8.63.0(@typescript/typescript6@6.0.2)(supports-color@11.0.0)': - dependencies: - '@typescript-eslint/project-service': 8.63.0(@typescript/typescript6@6.0.2)(supports-color@11.0.0) - '@typescript-eslint/tsconfig-utils': 8.63.0(@typescript/typescript6@6.0.2) - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/visitor-keys': 8.63.0 - debug: 4.4.3(supports-color@11.0.0) - minimatch: 10.2.5 - semver: 7.8.5 - tinyglobby: 0.2.17 - ts-api-utils: 2.5.0(@typescript/typescript6@6.0.2) - typescript: '@typescript/typescript6@6.0.2' - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@8.64.0(@typescript/typescript6@6.0.2)(supports-color@10.2.2)': - dependencies: - '@typescript-eslint/project-service': 8.64.0(@typescript/typescript6@6.0.2)(supports-color@10.2.2) - '@typescript-eslint/tsconfig-utils': 8.64.0(@typescript/typescript6@6.0.2) - '@typescript-eslint/types': 8.64.0 - '@typescript-eslint/visitor-keys': 8.64.0 - debug: 4.4.3(supports-color@10.2.2) - minimatch: 10.2.5 - semver: 7.8.5 - tinyglobby: 0.2.17 - ts-api-utils: 2.5.0(@typescript/typescript6@6.0.2) - typescript: '@typescript/typescript6@6.0.2' - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@8.65.0(@typescript/typescript6@6.0.2)(supports-color@11.0.0)': - dependencies: - '@typescript-eslint/project-service': 8.65.0(@typescript/typescript6@6.0.2)(supports-color@11.0.0) - '@typescript-eslint/tsconfig-utils': 8.65.0(@typescript/typescript6@6.0.2) - '@typescript-eslint/types': 8.65.0 - '@typescript-eslint/visitor-keys': 8.65.0 - debug: 4.4.3(supports-color@11.0.0) - minimatch: 10.2.5 - semver: 7.8.5 - tinyglobby: 0.2.17 - ts-api-utils: 2.5.0(@typescript/typescript6@6.0.2) - typescript: '@typescript/typescript6@6.0.2' - transitivePeerDependencies: - - supports-color - '@typescript-eslint/typescript-estree@8.67.0(@typescript/typescript6@6.0.2)(supports-color@11.0.0)': dependencies: '@typescript-eslint/project-service': 8.67.0(@typescript/typescript6@6.0.2)(supports-color@11.0.0) @@ -11924,76 +11846,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.63.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@10.2.2)': + '@typescript-eslint/utils@8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)) - '@typescript-eslint/scope-manager': 8.63.0 - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/typescript-estree': 8.63.0(@typescript/typescript6@6.0.2)(supports-color@10.2.2) - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) - typescript: '@typescript/typescript6@6.0.2' - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.63.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)) - '@typescript-eslint/scope-manager': 8.63.0 - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/typescript-estree': 8.63.0(@typescript/typescript6@6.0.2)(supports-color@11.0.0) - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) - typescript: '@typescript/typescript6@6.0.2' - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.64.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@10.2.2)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)) - '@typescript-eslint/scope-manager': 8.64.0 - '@typescript-eslint/types': 8.64.0 - '@typescript-eslint/typescript-estree': 8.64.0(@typescript/typescript6@6.0.2)(supports-color@10.2.2) - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) - typescript: '@typescript/typescript6@6.0.2' - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.65.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)) - '@typescript-eslint/scope-manager': 8.65.0 - '@typescript-eslint/types': 8.65.0 - '@typescript-eslint/typescript-estree': 8.65.0(@typescript/typescript6@6.0.2)(supports-color@11.0.0) - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) - typescript: '@typescript/typescript6@6.0.2' - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)) '@typescript-eslint/scope-manager': 8.67.0 '@typescript-eslint/types': 8.67.0 '@typescript-eslint/typescript-estree': 8.67.0(@typescript/typescript6@6.0.2)(supports-color@11.0.0) - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.63.0': - dependencies: - '@typescript-eslint/types': 8.63.0 - eslint-visitor-keys: 5.0.1 - - '@typescript-eslint/visitor-keys@8.64.0': - dependencies: - '@typescript-eslint/types': 8.64.0 - eslint-visitor-keys: 5.0.1 - - '@typescript-eslint/visitor-keys@8.65.0': - dependencies: - '@typescript-eslint/types': 8.65.0 - eslint-visitor-keys: 5.0.1 - '@typescript-eslint/visitor-keys@8.67.0': dependencies: '@typescript-eslint/types': 8.67.0 @@ -12069,13 +11932,13 @@ snapshots: dependencies: unpic: 4.2.2 - '@unpic/react@1.0.2(next@16.3.0(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@unpic/react@1.0.2(next@16.3.2(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@unpic/core': 1.0.3 react: 19.2.8 react-dom: 19.2.8(react@19.2.8) optionalDependencies: - next: 16.3.0(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + next: 16.3.2(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@upsetjs/venn.js@2.0.0': optionalDependencies: @@ -12093,24 +11956,24 @@ snapshots: '@vinext/types@1.0.0-beta.2': {} - '@vitejs/devtools-kit@0.4.1(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(srvx@0.12.5)': + '@vitejs/devtools-kit@0.4.1(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(srvx@0.12.5)': dependencies: '@devframes/hub': 0.6.2(devframe@0.6.2(@typescript/typescript6@6.0.2)(srvx@0.12.5)) devframe: 0.6.2(@typescript/typescript6@6.0.2)(srvx@0.12.5) mlly: 1.8.2 nostics: 1.2.0 - vite: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' + vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' transitivePeerDependencies: - '@modelcontextprotocol/sdk' - srvx - typescript - '@vitejs/plugin-react@6.0.5(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))': + '@vitejs/plugin-react@6.1.0(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' + vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' - '@vitejs/plugin-rsc@0.5.34(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(react-dom@19.2.8(react@19.2.8))(react-server-dom-webpack@19.2.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)': + '@vitejs/plugin-rsc@0.5.34(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(react-dom@19.2.8(react@19.2.8))(react-server-dom-webpack@19.2.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)': dependencies: '@rolldown/pluginutils': 1.0.1 es-module-lexer: 2.3.1 @@ -12121,31 +11984,31 @@ snapshots: srvx: 0.12.5 strip-literal: 3.1.0 turbo-stream: 3.2.0 - vite: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' - vitefu: 1.1.3(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' + vitefu: 1.1.3(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) optionalDependencies: react-server-dom-webpack: 19.2.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@vitest/browser-playwright@4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(playwright@1.62.1)(vitest@4.1.10)': + '@vitest/browser-playwright@4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(playwright@1.62.1)(vitest@4.1.11)': dependencies: - '@vitest/browser': 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10) - '@vitest/mocker': 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + '@vitest/browser': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.11) + '@vitest/mocker': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) playwright: 1.62.1 tinyrainbow: 3.1.0 - vitest: 4.1.10(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/browser-preview@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.2) + vitest: 4.1.11(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/browser-preview@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.6) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/browser-playwright@4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(playwright@1.62.1)(vitest@4.1.10)': + '@vitest/browser-playwright@4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(playwright@1.62.1)(vitest@4.1.11)': dependencies: - '@vitest/browser': 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(vitest@4.1.10) - '@vitest/mocker': 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0)) + '@vitest/browser': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(vitest@4.1.11) + '@vitest/mocker': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0)) playwright: 1.62.1 tinyrainbow: 3.1.0 - vitest: 4.1.10(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/browser-preview@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(happy-dom@20.11.2) + vitest: 4.1.11(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/browser-preview@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(happy-dom@20.11.6) transitivePeerDependencies: - bufferutil - msw @@ -12153,40 +12016,40 @@ snapshots: - vite optional: true - '@vitest/browser-preview@4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10)': + '@vitest/browser-preview@4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.11)': dependencies: '@testing-library/dom': 10.4.1 - '@testing-library/user-event': 14.6.4(@testing-library/dom@10.4.1) - '@vitest/browser': 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10) - vitest: 4.1.10(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/browser-preview@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.2) + '@testing-library/user-event': 14.6.6(@testing-library/dom@10.4.1) + '@vitest/browser': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.11) + vitest: 4.1.11(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/browser-preview@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.6) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/browser-preview@4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(vitest@4.1.10)': + '@vitest/browser-preview@4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(vitest@4.1.11)': dependencies: '@testing-library/dom': 10.4.1 - '@testing-library/user-event': 14.6.4(@testing-library/dom@10.4.1) - '@vitest/browser': 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(vitest@4.1.10) - vitest: 4.1.10(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/browser-preview@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(happy-dom@20.11.2) + '@testing-library/user-event': 14.6.6(@testing-library/dom@10.4.1) + '@vitest/browser': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(vitest@4.1.11) + vitest: 4.1.11(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/browser-preview@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(happy-dom@20.11.6) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/browser@4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10)': + '@vitest/browser@4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.11)': dependencies: '@blazediff/core': 1.9.1 - '@vitest/mocker': 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) - '@vitest/utils': 4.1.10 + '@vitest/mocker': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + '@vitest/utils': 4.1.11 magic-string: 0.30.21 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.1.0 - vitest: 4.1.10(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/browser-preview@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.2) + vitest: 4.1.11(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/browser-preview@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.6) ws: 8.21.3 transitivePeerDependencies: - bufferutil @@ -12194,16 +12057,16 @@ snapshots: - utf-8-validate - vite - '@vitest/browser@4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(vitest@4.1.10)': + '@vitest/browser@4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(vitest@4.1.11)': dependencies: '@blazediff/core': 1.9.1 - '@vitest/mocker': 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0)) - '@vitest/utils': 4.1.10 + '@vitest/mocker': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0)) + '@vitest/utils': 4.1.11 magic-string: 0.30.21 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.1.0 - vitest: 4.1.10(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/browser-preview@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(happy-dom@20.11.2) + vitest: 4.1.11(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/browser-preview@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(happy-dom@20.11.6) ws: 8.21.3 transitivePeerDependencies: - bufferutil @@ -12211,10 +12074,10 @@ snapshots: - utf-8-validate - vite - '@vitest/coverage-v8@4.1.10(@vitest/browser@4.1.10)(vitest@4.1.10)': + '@vitest/coverage-v8@4.1.11(@vitest/browser@4.1.11)(vitest@4.1.11)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.1.10 + '@vitest/utils': 4.1.11 ast-v8-to-istanbul: 1.0.4 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 @@ -12223,9 +12086,9 @@ snapshots: obug: 2.1.3 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.10(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/browser-preview@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.2) + vitest: 4.1.11(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/browser-preview@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.6) optionalDependencies: - '@vitest/browser': 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10) + '@vitest/browser': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.11) '@vitest/expect@3.2.4': dependencies: @@ -12235,48 +12098,48 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/expect@4.1.10': + '@vitest/expect@4.1.11': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.10 - '@vitest/utils': 4.1.10 + '@vitest/spy': 4.1.11 + '@vitest/utils': 4.1.11 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))': + '@vitest/mocker@4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))': dependencies: - '@vitest/spy': 4.1.10 + '@vitest/spy': 4.1.11 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' + vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' - '@vitest/mocker@4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))': + '@vitest/mocker@4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))': dependencies: - '@vitest/spy': 4.1.10 + '@vitest/spy': 4.1.11 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0)' + vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0)' '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 - '@vitest/pretty-format@4.1.10': + '@vitest/pretty-format@4.1.11': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.10': + '@vitest/runner@4.1.11': dependencies: - '@vitest/utils': 4.1.10 + '@vitest/utils': 4.1.11 pathe: 2.0.3 - '@vitest/snapshot@4.1.10': + '@vitest/snapshot@4.1.11': dependencies: - '@vitest/pretty-format': 4.1.10 - '@vitest/utils': 4.1.10 + '@vitest/pretty-format': 4.1.11 + '@vitest/utils': 4.1.11 magic-string: 0.30.21 pathe: 2.0.3 @@ -12284,7 +12147,7 @@ snapshots: dependencies: tinyspy: 4.0.4 - '@vitest/spy@4.1.10': {} + '@vitest/spy@4.1.11': {} '@vitest/utils@3.2.4': dependencies: @@ -12292,30 +12155,30 @@ snapshots: loupe: 3.2.1 tinyrainbow: 2.0.0 - '@vitest/utils@4.1.10': + '@vitest/utils@4.1.11': dependencies: - '@vitest/pretty-format': 4.1.10 + '@vitest/pretty-format': 4.1.11 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 - '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)': + '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)': dependencies: - '@oxc-project/runtime': 0.143.0 - '@oxc-project/types': 0.143.0 + '@oxc-project/runtime': 0.146.0 + '@oxc-project/types': 0.146.0 lightningcss: 1.33.0 - postcss: 8.5.25 + postcss: 8.5.26 yuku-codegen: 0.5.48 yuku-parser: 0.5.48 optionalDependencies: '@types/node': 25.9.5 - '@voidzero-dev/vite-plus-darwin-arm64': 0.2.9 - '@voidzero-dev/vite-plus-darwin-x64': 0.2.9 - '@voidzero-dev/vite-plus-linux-arm64-gnu': 0.2.9 - '@voidzero-dev/vite-plus-linux-arm64-musl': 0.2.9 - '@voidzero-dev/vite-plus-linux-x64-gnu': 0.2.9 - '@voidzero-dev/vite-plus-linux-x64-musl': 0.2.9 - '@voidzero-dev/vite-plus-win32-arm64-msvc': 0.2.9 - '@voidzero-dev/vite-plus-win32-x64-msvc': 0.2.9 + '@voidzero-dev/vite-plus-darwin-arm64': 0.3.0 + '@voidzero-dev/vite-plus-darwin-x64': 0.3.0 + '@voidzero-dev/vite-plus-linux-arm64-gnu': 0.3.0 + '@voidzero-dev/vite-plus-linux-arm64-musl': 0.3.0 + '@voidzero-dev/vite-plus-linux-x64-gnu': 0.3.0 + '@voidzero-dev/vite-plus-linux-x64-musl': 0.3.0 + '@voidzero-dev/vite-plus-win32-arm64-msvc': 0.3.0 + '@voidzero-dev/vite-plus-win32-x64-msvc': 0.3.0 esbuild: 0.28.2 fsevents: 2.3.3 jiti: 2.7.0 @@ -12323,24 +12186,24 @@ snapshots: typescript: '@typescript/typescript6@6.0.2' yaml: 2.9.0 - '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0)': + '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0)': dependencies: - '@oxc-project/runtime': 0.143.0 - '@oxc-project/types': 0.143.0 + '@oxc-project/runtime': 0.146.0 + '@oxc-project/types': 0.146.0 lightningcss: 1.33.0 - postcss: 8.5.25 + postcss: 8.5.26 yuku-codegen: 0.5.48 yuku-parser: 0.5.48 optionalDependencies: '@types/node': 25.9.5 - '@voidzero-dev/vite-plus-darwin-arm64': 0.2.9 - '@voidzero-dev/vite-plus-darwin-x64': 0.2.9 - '@voidzero-dev/vite-plus-linux-arm64-gnu': 0.2.9 - '@voidzero-dev/vite-plus-linux-arm64-musl': 0.2.9 - '@voidzero-dev/vite-plus-linux-x64-gnu': 0.2.9 - '@voidzero-dev/vite-plus-linux-x64-musl': 0.2.9 - '@voidzero-dev/vite-plus-win32-arm64-msvc': 0.2.9 - '@voidzero-dev/vite-plus-win32-x64-msvc': 0.2.9 + '@voidzero-dev/vite-plus-darwin-arm64': 0.3.0 + '@voidzero-dev/vite-plus-darwin-x64': 0.3.0 + '@voidzero-dev/vite-plus-linux-arm64-gnu': 0.3.0 + '@voidzero-dev/vite-plus-linux-arm64-musl': 0.3.0 + '@voidzero-dev/vite-plus-linux-x64-gnu': 0.3.0 + '@voidzero-dev/vite-plus-linux-x64-musl': 0.3.0 + '@voidzero-dev/vite-plus-win32-arm64-msvc': 0.3.0 + '@voidzero-dev/vite-plus-win32-x64-msvc': 0.3.0 esbuild: 0.28.2 fsevents: 2.3.3 jiti: 2.7.0 @@ -12348,28 +12211,28 @@ snapshots: typescript: 7.0.2 yaml: 2.9.0 - '@voidzero-dev/vite-plus-darwin-arm64@0.2.9': + '@voidzero-dev/vite-plus-darwin-arm64@0.3.0': optional: true - '@voidzero-dev/vite-plus-darwin-x64@0.2.9': + '@voidzero-dev/vite-plus-darwin-x64@0.3.0': optional: true - '@voidzero-dev/vite-plus-linux-arm64-gnu@0.2.9': + '@voidzero-dev/vite-plus-linux-arm64-gnu@0.3.0': optional: true - '@voidzero-dev/vite-plus-linux-arm64-musl@0.2.9': + '@voidzero-dev/vite-plus-linux-arm64-musl@0.3.0': optional: true - '@voidzero-dev/vite-plus-linux-x64-gnu@0.2.9': + '@voidzero-dev/vite-plus-linux-x64-gnu@0.3.0': optional: true - '@voidzero-dev/vite-plus-linux-x64-musl@0.2.9': + '@voidzero-dev/vite-plus-linux-x64-musl@0.3.0': optional: true - '@voidzero-dev/vite-plus-win32-arm64-msvc@0.2.9': + '@voidzero-dev/vite-plus-win32-arm64-msvc@0.3.0': optional: true - '@voidzero-dev/vite-plus-win32-x64-msvc@0.2.9': + '@voidzero-dev/vite-plus-win32-x64-msvc@0.3.0': optional: true '@volar/language-core@2.4.28': @@ -12496,7 +12359,7 @@ snapshots: dependencies: '@babel/runtime': 7.29.7 '@types/js-cookie': 3.0.6 - dayjs: 1.11.21 + dayjs: 1.11.23 intersection-observer: 0.12.2 js-cookie: 3.0.8 lodash: 4.18.1 @@ -12560,8 +12423,6 @@ snapshots: async@3.2.6: {} - axe-core@4.12.1: {} - axe-core@4.13.0: {} bail@2.0.2: {} @@ -12728,7 +12589,7 @@ snapshots: parse5: 7.3.0 parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 7.28.0 + undici: 7.29.0 whatwg-mimetype: 4.0.0 chokidar@5.0.0: @@ -12778,7 +12639,7 @@ snapshots: code-inspector-plugin@1.6.6(supports-color@11.0.0): dependencies: - '@code-inspector/core': 1.6.6(supports-color@10.2.2) + '@code-inspector/core': 1.6.6(supports-color@11.0.0) '@code-inspector/esbuild': 1.6.6(supports-color@11.0.0) '@code-inspector/mako': 1.6.6(supports-color@11.0.0) '@code-inspector/turbopack': 1.6.6(supports-color@11.0.0) @@ -12808,7 +12669,7 @@ snapshots: compare-versions@6.1.1: {} - concurrently@10.0.4: + concurrently@10.0.5: dependencies: chalk: 5.6.2 rxjs: 7.8.2 @@ -12821,6 +12682,8 @@ snapshots: confbox@0.2.4: {} + content-type@2.1.0: {} + convert-hrtime@5.0.0: {} convert-source-map@2.0.0: {} @@ -13081,13 +12944,7 @@ snapshots: d3: 7.9.0 lodash-es: 4.18.1 - dayjs@1.11.21: {} - - debug@4.4.3(supports-color@10.2.2): - dependencies: - ms: 2.1.3 - optionalDependencies: - supports-color: 10.2.2 + dayjs@1.11.23: {} debug@4.4.3(supports-color@11.0.0): dependencies: @@ -13181,11 +13038,7 @@ snapshots: dependencies: domelementtype: 2.3.0 - dompurify@3.4.12: - optionalDependencies: - '@types/trusted-types': 2.0.7 - - dompurify@3.4.13: + dompurify@3.4.14: optionalDependencies: '@types/trusted-types': 2.0.7 @@ -13250,12 +13103,12 @@ snapshots: dependencies: once: 1.4.0 - engine.io-client@6.6.6(supports-color@10.2.2): + engine.io-client@6.6.6(supports-color@11.0.0): dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@11.0.0) engine.io-parser: 5.2.3 - ws: 8.21.2 + ws: 8.21.3 xmlhttprequest-ssl: 2.1.2 transitivePeerDependencies: - bufferutil @@ -13291,7 +13144,7 @@ snapshots: es-module-lexer@2.3.1: {} - es-toolkit@1.50.0: {} + es-toolkit@1.51.0: {} esbuild@0.28.2: optionalDependencies: @@ -13330,38 +13183,32 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.5.1(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)): + eslint-compat-utils@0.5.1(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)): dependencies: - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) semver: 7.8.5 - eslint-json-compat-utils@0.2.3(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(jsonc-eslint-parser@3.1.0): + eslint-json-compat-utils@0.2.3(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(jsonc-eslint-parser@3.3.0): dependencies: - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) - esquery: 1.7.0 - jsonc-eslint-parser: 3.1.0 - - eslint-json-compat-utils@0.2.3(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(jsonc-eslint-parser@3.3.0): - dependencies: - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) esquery: 1.7.0 jsonc-eslint-parser: 3.3.0 - eslint-markdown@0.12.1(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): + eslint-markdown@0.12.1(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): dependencies: '@eslint/markdown': 7.5.1(supports-color@11.0.0) micromark-util-normalize-identifier: 2.0.1 parse5: 8.0.1 optionalDependencies: - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) transitivePeerDependencies: - supports-color - eslint-plugin-antfu@3.2.3(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)): + eslint-plugin-antfu@3.2.3(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)): dependencies: - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) - eslint-plugin-better-tailwindcss@4.7.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(oxlint@1.77.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(tailwindcss@4.3.3): + eslint-plugin-better-tailwindcss@4.7.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(oxlint@1.79.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(tailwindcss@4.3.3): dependencies: '@eslint/css-tree': 4.0.5 '@valibot/to-json-schema': 1.7.1(valibot@1.4.2(@typescript/typescript6@6.0.2)) @@ -13373,37 +13220,37 @@ snapshots: tsconfig-paths-webpack-plugin: 4.2.0 valibot: 1.4.2(@typescript/typescript6@6.0.2) optionalDependencies: - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) - oxlint: 1.77.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) + oxlint: 1.79.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) transitivePeerDependencies: - '@eslint/css' - typescript - eslint-plugin-command@3.5.3(@typescript-eslint/typescript-estree@8.67.0(@typescript/typescript6@6.0.2)(supports-color@11.0.0))(@typescript-eslint/utils@8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0))(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)): + eslint-plugin-command@3.5.3(@typescript-eslint/typescript-estree@8.67.0(@typescript/typescript6@6.0.2)(supports-color@11.0.0))(@typescript-eslint/utils@8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0))(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)): dependencies: '@es-joy/jsdoccomment': 0.88.0 '@typescript-eslint/typescript-estree': 8.67.0(@typescript/typescript6@6.0.2)(supports-color@11.0.0) - '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) - eslint-plugin-erasable-syntax-only@0.4.2(@typescript-eslint/parser@8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0))(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@10.2.2): + eslint-plugin-erasable-syntax-only@0.4.2(@typescript-eslint/parser@8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0))(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): dependencies: - '@typescript-eslint/parser': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@typescript-eslint/utils': 8.63.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@10.2.2) + '@typescript-eslint/parser': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) cached-factory: 0.3.0 - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - eslint-plugin-es-x@7.8.0(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)): + eslint-plugin-es-x@7.8.0(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)) '@eslint-community/regexpp': 4.12.2 - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) - eslint-compat-utils: 0.5.1(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) + eslint-compat-utils: 0.5.1(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)) - eslint-plugin-jsdoc@63.3.3(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): + eslint-plugin-jsdoc@63.3.3(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): dependencies: '@es-joy/jsdoccomment': 0.91.0 '@es-joy/resolve.exports': 1.2.0 @@ -13411,7 +13258,7 @@ snapshots: comment-parser: 1.4.7 debug: 4.4.3(supports-color@11.0.0) escape-string-regexp: 4.0.0 - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) espree: 11.2.0 esquery: 1.7.0 html-entities: 2.6.0 @@ -13423,27 +13270,27 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-jsonc@3.4.1(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)): + eslint-plugin-jsonc@3.4.2(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)) '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.2 '@ota-meshi/ast-token-store': 0.3.0 diff-sequences: 29.6.3 - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) - eslint-json-compat-utils: 0.2.3(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(jsonc-eslint-parser@3.1.0) - jsonc-eslint-parser: 3.1.0 + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) + eslint-json-compat-utils: 0.2.3(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(jsonc-eslint-parser@3.3.0) + jsonc-eslint-parser: 3.3.0 natural-compare: 1.4.0 synckit: 0.11.13 transitivePeerDependencies: - '@eslint/json' - eslint-plugin-markdown-preferences@0.41.1(@eslint/markdown@8.0.3(supports-color@11.0.0))(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): + eslint-plugin-markdown-preferences@0.41.1(@eslint/markdown@8.0.3(supports-color@11.0.0))(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): dependencies: '@eslint/markdown': 8.0.3(supports-color@11.0.0) diff-sequences: 29.6.3 emoji-regex-xs: 2.0.1 - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) mdast-util-from-markdown: 2.0.3(supports-color@11.0.0) mdast-util-frontmatter: 2.0.1(supports-color@11.0.0) mdast-util-gfm: 3.1.0(supports-color@11.0.0) @@ -13458,13 +13305,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-n@18.3.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)): + eslint-plugin-n@18.3.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)) enhanced-resolve: 5.24.1 - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) - eslint-plugin-es-x: 7.8.0(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)) - get-tsconfig: 4.14.0 + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) + eslint-plugin-es-x: 7.8.0(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)) + get-tsconfig: 4.14.1 globals: 15.15.0 globrex: 0.1.2 ignore: 5.3.2 @@ -13472,28 +13319,28 @@ snapshots: optionalDependencies: typescript: '@typescript/typescript6@6.0.2' - eslint-plugin-no-barrel-files@1.3.1(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): + eslint-plugin-no-barrel-files@1.3.1(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): dependencies: - '@typescript-eslint/utils': 8.63.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-perfectionist@5.10.1(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): + eslint-plugin-perfectionist@5.10.1(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): dependencies: - '@typescript-eslint/utils': 8.65.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) natural-orderby: 5.0.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-pnpm@1.8.0(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)): + eslint-plugin-pnpm@1.8.0(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)): dependencies: empathic: 2.0.1 - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) - eslint-json-compat-utils: 0.2.3(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(jsonc-eslint-parser@3.3.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) + eslint-json-compat-utils: 0.2.3(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(jsonc-eslint-parser@3.3.0) jsonc-eslint-parser: 3.3.0 pathe: 2.0.3 pnpm-workspace-yaml: 1.8.0 @@ -13503,94 +13350,94 @@ snapshots: transitivePeerDependencies: - '@eslint/json' - eslint-plugin-react-dom@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): + eslint-plugin-react-dom@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): dependencies: - '@eslint-react/ast': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/eslint': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/jsx': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/shared': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/ast': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/eslint': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/jsx': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/shared': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) '@typescript-eslint/types': 8.67.0 - '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) compare-versions: 6.1.1 - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - eslint-plugin-react-jsx@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): + eslint-plugin-react-jsx@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): dependencies: - '@eslint-react/ast': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/core': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/eslint': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/jsx': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/shared': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/ast': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/core': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/eslint': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/jsx': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/shared': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) '@typescript-eslint/types': 8.67.0 - '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - eslint-plugin-react-naming-convention@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): + eslint-plugin-react-naming-convention@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): dependencies: - '@eslint-react/ast': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/core': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/eslint': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/shared': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/var': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/ast': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/core': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/eslint': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/shared': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/var': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) '@typescript-eslint/types': 8.67.0 - '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) ts-pattern: 5.9.0 typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - eslint-plugin-react-rsc@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): + eslint-plugin-react-rsc@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): dependencies: - '@eslint-react/ast': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/core': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/eslint': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/shared': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/var': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/ast': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/core': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/eslint': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/shared': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/var': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) '@typescript-eslint/types': 8.67.0 - '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - eslint-plugin-react-web-api@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): + eslint-plugin-react-web-api@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): dependencies: - '@eslint-react/ast': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/core': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/eslint': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/shared': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/var': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/ast': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/core': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/eslint': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/shared': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/var': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) '@typescript-eslint/types': 8.67.0 - '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) birecord: 0.1.2 - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) ts-pattern: 5.9.0 typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - eslint-plugin-react-x@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): + eslint-plugin-react-x@5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): dependencies: - '@eslint-react/ast': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/core': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/eslint': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/jsx': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/shared': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - '@eslint-react/var': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/ast': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/core': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/eslint': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/jsx': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/shared': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@eslint-react/var': 5.18.6(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) '@typescript-eslint/scope-manager': 8.67.0 - '@typescript-eslint/type-utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@typescript-eslint/type-utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) '@typescript-eslint/types': 8.67.0 '@typescript-eslint/typescript-estree': 8.67.0(@typescript/typescript6@6.0.2)(supports-color@11.0.0) - '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) compare-versions: 6.1.1 - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) string-ts: 2.3.1 ts-api-utils: 2.5.0(@typescript/typescript6@6.0.2) ts-pattern: 5.9.0 @@ -13598,47 +13445,46 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-regexp@3.1.1(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)): + eslint-plugin-regexp@3.1.1(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)) '@eslint-community/regexpp': 4.12.2 comment-parser: 1.4.7 - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) jsdoc-type-pratt-parser: 7.2.0 refa: 0.12.1 regexp-ast-analysis: 0.7.1 scslre: 0.3.0 - eslint-plugin-storybook@10.5.8(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(supports-color@11.0.0): + eslint-plugin-storybook@10.5.10(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): dependencies: - '@typescript-eslint/types': 8.66.0 - '@typescript-eslint/utils': 8.65.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) - storybook: 10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-toml@1.5.0(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0))(supports-color@10.2.2): + eslint-plugin-toml@1.5.0(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0))(supports-color@11.0.0): dependencies: '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.2 '@ota-meshi/ast-token-store': 0.3.0 - debug: 4.4.3(supports-color@10.2.2) - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + debug: 4.4.3(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) toml-eslint-parser: 1.0.3 transitivePeerDependencies: - supports-color - eslint-plugin-unicorn@71.1.0(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)): + eslint-plugin-unicorn@71.1.0(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)) browserslist: 4.28.4 change-case: 5.4.4 ci-info: 4.4.0 core-js-compat: 3.49.0 detect-indent: 7.0.2 - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) find-up-simple: 1.0.1 globals: 17.7.0 indent-string: 5.0.0 @@ -13651,14 +13497,14 @@ snapshots: semver: 7.8.5 strip-indent: 4.1.1 - eslint-plugin-yml@3.8.1(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)): + eslint-plugin-yml@3.8.1(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)): dependencies: '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.2 '@ota-meshi/ast-token-store': 0.3.0 diff-sequences: 29.6.3 escape-string-regexp: 5.0.0 - eslint: 10.8.1(jiti@2.7.0)(supports-color@11.0.0) + eslint: 10.9.0(jiti@2.7.0)(supports-color@11.0.0) natural-compare: 1.4.0 yaml-eslint-parser: 2.1.0 @@ -13673,9 +13519,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0): + eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.1(jiti@2.7.0)(supports-color@11.0.0)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.9.0(jiti@2.7.0)(supports-color@11.0.0)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5(supports-color@11.0.0) '@eslint/config-helpers': 0.7.0 @@ -13738,7 +13584,7 @@ snapshots: esutils@2.0.3: {} - event-target-bus@1.0.0: {} + event-target-bus@1.1.0: {} eventsource-parser@3.1.1: {} @@ -13751,9 +13597,9 @@ snapshots: extend@3.0.2: {} - extract-zip@2.0.1(supports-color@10.2.2): + extract-zip@2.0.1(supports-color@11.0.0): dependencies: - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@11.0.0) get-stream: 5.2.0 yauzl: 3.2.1 optionalDependencies: @@ -13775,6 +13621,10 @@ snapshots: fast-levenshtein@2.0.6: {} + fastdom@1.0.12: + dependencies: + strictdom: 1.0.1 + fastq@1.20.1: dependencies: reusify: 1.1.0 @@ -13825,10 +13675,10 @@ snapshots: dependencies: fd-package-json: 2.0.0 - foxact@0.3.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + foxact@0.3.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: client-only: 0.0.1 - event-target-bus: 1.0.0 + event-target-bus: 1.1.0 server-only: 0.0.1 optionalDependencies: react: 19.2.8 @@ -13916,7 +13766,7 @@ snapshots: hachure-fill@0.5.2: {} - happy-dom@20.11.2: + happy-dom@20.11.6: dependencies: '@types/node': 26.0.1 '@types/whatwg-mimetype': 3.0.2 @@ -13937,20 +13787,20 @@ snapshots: hast-util-from-dom@5.0.1: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hastscript: 9.0.1 web-namespaces: 2.0.1 hast-util-from-html-isomorphic@2.0.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hast-util-from-dom: 5.0.1 hast-util-from-html: 2.0.3 unist-util-remove-position: 5.0.0 hast-util-from-html@2.0.3: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 devlop: 1.1.0 hast-util-from-parse5: 8.0.3 parse5: 7.3.0 @@ -13959,7 +13809,7 @@ snapshots: hast-util-from-parse5@8.0.3: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/unist': 3.0.3 devlop: 1.1.0 hastscript: 9.0.1 @@ -13970,15 +13820,15 @@ snapshots: hast-util-is-element@3.0.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hast-util-parse-selector@4.0.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hast-util-raw@9.1.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/unist': 3.0.3 '@ungap/structured-clone': 1.3.2 hast-util-from-parse5: 8.0.3 @@ -13994,13 +13844,13 @@ snapshots: hast-util-sanitize@5.0.2: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@ungap/structured-clone': 1.3.2 unist-util-position: 5.0.0 hast-util-to-html@9.0.5: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/unist': 3.0.3 ccount: 2.0.1 comma-separated-tokens: 2.0.3 @@ -14015,7 +13865,7 @@ snapshots: hast-util-to-jsx-runtime@2.3.6(supports-color@11.0.0): dependencies: '@types/estree': 1.0.9 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/unist': 3.0.3 comma-separated-tokens: 2.0.3 devlop: 1.1.0 @@ -14034,7 +13884,7 @@ snapshots: hast-util-to-parse5@8.0.1: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 comma-separated-tokens: 2.0.3 devlop: 1.1.0 property-information: 7.2.0 @@ -14044,18 +13894,18 @@ snapshots: hast-util-to-text@4.0.2: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/unist': 3.0.3 hast-util-is-element: 3.0.0 unist-util-find-after: 5.0.0 hast-util-whitespace@3.0.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hastscript@9.0.1: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 property-information: 7.2.0 @@ -14063,7 +13913,7 @@ snapshots: hex-rgb@4.3.0: {} - hono@4.13.2: {} + hono@4.13.3: {} hosted-git-info@9.0.3: dependencies: @@ -14092,13 +13942,13 @@ snapshots: dependencies: '@babel/runtime': 7.29.7 - i18next@26.3.6(@typescript/typescript6@6.0.2): + i18next@26.4.0(@typescript/typescript6@6.0.2): optionalDependencies: typescript: '@typescript/typescript6@6.0.2' - iconify-import-svg@0.2.0(supports-color@10.2.2): + iconify-import-svg@0.2.0(supports-color@11.0.0): dependencies: - '@iconify/tools': 4.2.0(supports-color@10.2.2) + '@iconify/tools': 4.2.0(supports-color@11.0.0) '@iconify/types': 2.0.0 '@iconify/utils': 3.1.3 transitivePeerDependencies: @@ -14123,7 +13973,7 @@ snapshots: image-size@2.0.2: {} - immer@11.1.16: {} + immer@11.1.18: {} import-meta-resolve@4.2.0: {} @@ -14228,12 +14078,12 @@ snapshots: jotai: 2.20.2(@babel/core@7.29.7(supports-color@11.0.0))(@babel/template@7.29.7)(@types/react@19.2.18)(react@19.2.8) react: 19.2.8 - jotai-tanstack-query@0.11.0(@tanstack/query-core@5.101.4)(@tanstack/react-query@5.101.4(react@19.2.8))(jotai@2.20.2(@babel/core@7.29.7(supports-color@11.0.0))(@babel/template@7.29.7)(@types/react@19.2.18)(react@19.2.8))(react@19.2.8): + jotai-tanstack-query@0.11.0(@tanstack/query-core@5.102.2)(@tanstack/react-query@5.102.2(react@19.2.8))(jotai@2.20.2(@babel/core@7.29.7(supports-color@11.0.0))(@babel/template@7.29.7)(@types/react@19.2.18)(react@19.2.8))(react@19.2.8): dependencies: - '@tanstack/query-core': 5.101.4 + '@tanstack/query-core': 5.102.2 jotai: 2.20.2(@babel/core@7.29.7(supports-color@11.0.0))(@babel/template@7.29.7)(@types/react@19.2.18)(react@19.2.8) optionalDependencies: - '@tanstack/react-query': 5.101.4(react@19.2.8) + '@tanstack/react-query': 5.102.2(react@19.2.8) react: 19.2.8 jotai@2.20.2(@babel/core@7.29.7(supports-color@11.0.0))(@babel/template@7.29.7)(@types/react@19.2.18)(react@19.2.8): @@ -14257,7 +14107,7 @@ snapshots: dependencies: argparse: 2.0.1 - js-yaml@5.2.3: + js-yaml@5.3.0: dependencies: argparse: 2.0.1 @@ -14275,12 +14125,6 @@ snapshots: json5@2.2.3: {} - jsonc-eslint-parser@3.1.0: - dependencies: - acorn: 8.17.0 - eslint-visitor-keys: 5.0.1 - semver: 7.8.5 - jsonc-eslint-parser@3.3.0: dependencies: acorn: 8.17.0 @@ -14646,7 +14490,7 @@ snapshots: mdast-util-math@3.0.0(supports-color@11.0.0): dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 devlop: 1.1.0 longest-streak: 3.1.0 @@ -14659,7 +14503,7 @@ snapshots: mdast-util-mdx-expression@2.0.1(supports-color@11.0.0): dependencies: '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.3(supports-color@11.0.0) @@ -14670,7 +14514,7 @@ snapshots: mdast-util-mdx-jsx@3.2.0(supports-color@11.0.0): dependencies: '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 '@types/unist': 3.0.3 ccount: 2.0.1 @@ -14687,7 +14531,7 @@ snapshots: mdast-util-mdxjs-esm@2.0.1(supports-color@11.0.0): dependencies: '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.3(supports-color@11.0.0) @@ -14707,7 +14551,7 @@ snapshots: mdast-util-to-hast@13.2.1: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 '@ungap/structured-clone': 1.3.2 devlop: 1.1.0 @@ -14739,18 +14583,18 @@ snapshots: mdn-data@2.29.0: {} - mediabunny@1.53.1: + mediabunny@1.55.2: dependencies: '@types/dom-mediacapture-transform': 0.1.11 '@types/dom-webcodecs': 0.1.13 merge2@1.4.1: {} - mermaid@11.16.1: + mermaid@11.17.0: dependencies: '@braintree/sanitize-url': 7.1.2 '@iconify/utils': 3.1.3 - '@mermaid-js/parser': 1.2.0 + '@mermaid-js/parser': 1.2.1 '@types/d3': 7.4.3 '@upsetjs/venn.js': 2.0.0 cytoscape: 3.34.0 @@ -14759,16 +14603,17 @@ snapshots: d3: 7.9.0 d3-sankey: 0.12.3 dagre-d3-es: 7.0.14 - dayjs: 1.11.21 - dompurify: 3.4.12 - es-toolkit: 1.50.0 + dayjs: 1.11.23 + dompurify: 3.4.14 + es-toolkit: 1.51.0 + fastdom: 1.0.12 katex: 0.16.47 khroma: 2.1.0 marked: 16.4.2 roughjs: 4.6.6 stylis: 4.4.0 ts-dedent: 2.3.0 - uuid: 14.0.1 + uuid: 14.0.2 micromark-core-commonmark@2.0.3: dependencies: @@ -15050,8 +14895,6 @@ snapshots: ms@2.1.3: {} - nanoid@3.3.16: {} - nanoid@3.3.18: {} napi-build-utils@2.0.0: @@ -15061,7 +14904,9 @@ snapshots: natural-orderby@5.0.0: {} - negotiator@1.0.0: {} + negotiator@1.1.0: + dependencies: + content-type: 2.1.0 neo-async@2.6.2: {} @@ -15070,10 +14915,10 @@ snapshots: react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - next@16.3.0(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + next@16.3.2(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: - '@next/env': 16.3.0 - '@swc/helpers': 0.5.15 + '@next/env': 16.3.2 + '@swc/helpers': 0.5.23 baseline-browser-mapping: 2.10.40 caniuse-lite: 1.0.30001799 postcss: 8.5.23 @@ -15081,14 +14926,14 @@ snapshots: react-dom: 19.2.8(react@19.2.8) styled-jsx: 5.1.6(@babel/core@7.29.7(supports-color@11.0.0))(react@19.2.8) optionalDependencies: - '@next/swc-darwin-arm64': 16.3.0 - '@next/swc-darwin-x64': 16.3.0 - '@next/swc-linux-arm64-gnu': 16.3.0 - '@next/swc-linux-arm64-musl': 16.3.0 - '@next/swc-linux-x64-gnu': 16.3.0 - '@next/swc-linux-x64-musl': 16.3.0 - '@next/swc-win32-arm64-msvc': 16.3.0 - '@next/swc-win32-x64-msvc': 16.3.0 + '@next/swc-darwin-arm64': 16.3.2 + '@next/swc-darwin-x64': 16.3.2 + '@next/swc-linux-arm64-gnu': 16.3.2 + '@next/swc-linux-arm64-musl': 16.3.2 + '@next/swc-linux-x64-gnu': 16.3.2 + '@next/swc-linux-x64-musl': 16.3.2 + '@next/swc-win32-arm64-msvc': 16.3.2 + '@next/swc-win32-x64-msvc': 16.3.2 '@playwright/test': 1.62.1 sharp: 0.35.3(@types/node@25.9.5) transitivePeerDependencies: @@ -15122,12 +14967,12 @@ snapshots: dependencies: boolbase: 1.0.0 - nuqs@2.9.5(next@16.3.0(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8): + nuqs@2.10.0(next@16.3.2(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8): dependencies: '@standard-schema/spec': 1.1.0 react: 19.2.8 optionalDependencies: - next: 16.3.0(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + next: 16.3.2(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) object-assign@4.1.1: {} @@ -15249,6 +15094,28 @@ snapshots: '@oxc-parser/binding-win32-ia32-msvc': 0.143.0 '@oxc-parser/binding-win32-x64-msvc': 0.143.0 + oxc-resolver@11.21.2: + optionalDependencies: + '@oxc-resolver/binding-android-arm-eabi': 11.21.2 + '@oxc-resolver/binding-android-arm64': 11.21.2 + '@oxc-resolver/binding-darwin-arm64': 11.21.2 + '@oxc-resolver/binding-darwin-x64': 11.21.2 + '@oxc-resolver/binding-freebsd-x64': 11.21.2 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.21.2 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.21.2 + '@oxc-resolver/binding-linux-arm64-gnu': 11.21.2 + '@oxc-resolver/binding-linux-arm64-musl': 11.21.2 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.21.2 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.21.2 + '@oxc-resolver/binding-linux-riscv64-musl': 11.21.2 + '@oxc-resolver/binding-linux-s390x-gnu': 11.21.2 + '@oxc-resolver/binding-linux-x64-gnu': 11.21.2 + '@oxc-resolver/binding-linux-x64-musl': 11.21.2 + '@oxc-resolver/binding-openharmony-arm64': 11.21.2 + '@oxc-resolver/binding-wasm32-wasi': 11.21.2 + '@oxc-resolver/binding-win32-arm64-msvc': 11.21.2 + '@oxc-resolver/binding-win32-x64-msvc': 11.21.2 + oxc-resolver@11.24.2: optionalDependencies: '@oxc-resolver/binding-android-arm-eabi': 11.24.2 @@ -15271,55 +15138,55 @@ snapshots: '@oxc-resolver/binding-win32-arm64-msvc': 11.24.2 '@oxc-resolver/binding-win32-x64-msvc': 11.24.2 - oxfmt@0.62.0(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)): + oxfmt@0.64.0(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)): dependencies: tinypool: 2.1.0 optionalDependencies: - '@oxfmt/binding-android-arm-eabi': 0.62.0 - '@oxfmt/binding-android-arm64': 0.62.0 - '@oxfmt/binding-darwin-arm64': 0.62.0 - '@oxfmt/binding-darwin-x64': 0.62.0 - '@oxfmt/binding-freebsd-x64': 0.62.0 - '@oxfmt/binding-linux-arm-gnueabihf': 0.62.0 - '@oxfmt/binding-linux-arm-musleabihf': 0.62.0 - '@oxfmt/binding-linux-arm64-gnu': 0.62.0 - '@oxfmt/binding-linux-arm64-musl': 0.62.0 - '@oxfmt/binding-linux-ppc64-gnu': 0.62.0 - '@oxfmt/binding-linux-riscv64-gnu': 0.62.0 - '@oxfmt/binding-linux-riscv64-musl': 0.62.0 - '@oxfmt/binding-linux-s390x-gnu': 0.62.0 - '@oxfmt/binding-linux-x64-gnu': 0.62.0 - '@oxfmt/binding-linux-x64-musl': 0.62.0 - '@oxfmt/binding-openharmony-arm64': 0.62.0 - '@oxfmt/binding-win32-arm64-msvc': 0.62.0 - '@oxfmt/binding-win32-ia32-msvc': 0.62.0 - '@oxfmt/binding-win32-x64-msvc': 0.62.0 - vite-plus: 0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) + '@oxfmt/binding-android-arm-eabi': 0.64.0 + '@oxfmt/binding-android-arm64': 0.64.0 + '@oxfmt/binding-darwin-arm64': 0.64.0 + '@oxfmt/binding-darwin-x64': 0.64.0 + '@oxfmt/binding-freebsd-x64': 0.64.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.64.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.64.0 + '@oxfmt/binding-linux-arm64-gnu': 0.64.0 + '@oxfmt/binding-linux-arm64-musl': 0.64.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.64.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.64.0 + '@oxfmt/binding-linux-riscv64-musl': 0.64.0 + '@oxfmt/binding-linux-s390x-gnu': 0.64.0 + '@oxfmt/binding-linux-x64-gnu': 0.64.0 + '@oxfmt/binding-linux-x64-musl': 0.64.0 + '@oxfmt/binding-openharmony-arm64': 0.64.0 + '@oxfmt/binding-win32-arm64-msvc': 0.64.0 + '@oxfmt/binding-win32-ia32-msvc': 0.64.0 + '@oxfmt/binding-win32-x64-msvc': 0.64.0 + vite-plus: 0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) - oxfmt@0.62.0(vite-plus@0.2.9(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0)): + oxfmt@0.64.0(vite-plus@0.3.0(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0)): dependencies: tinypool: 2.1.0 optionalDependencies: - '@oxfmt/binding-android-arm-eabi': 0.62.0 - '@oxfmt/binding-android-arm64': 0.62.0 - '@oxfmt/binding-darwin-arm64': 0.62.0 - '@oxfmt/binding-darwin-x64': 0.62.0 - '@oxfmt/binding-freebsd-x64': 0.62.0 - '@oxfmt/binding-linux-arm-gnueabihf': 0.62.0 - '@oxfmt/binding-linux-arm-musleabihf': 0.62.0 - '@oxfmt/binding-linux-arm64-gnu': 0.62.0 - '@oxfmt/binding-linux-arm64-musl': 0.62.0 - '@oxfmt/binding-linux-ppc64-gnu': 0.62.0 - '@oxfmt/binding-linux-riscv64-gnu': 0.62.0 - '@oxfmt/binding-linux-riscv64-musl': 0.62.0 - '@oxfmt/binding-linux-s390x-gnu': 0.62.0 - '@oxfmt/binding-linux-x64-gnu': 0.62.0 - '@oxfmt/binding-linux-x64-musl': 0.62.0 - '@oxfmt/binding-openharmony-arm64': 0.62.0 - '@oxfmt/binding-win32-arm64-msvc': 0.62.0 - '@oxfmt/binding-win32-ia32-msvc': 0.62.0 - '@oxfmt/binding-win32-x64-msvc': 0.62.0 - vite-plus: 0.2.9(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0) + '@oxfmt/binding-android-arm-eabi': 0.64.0 + '@oxfmt/binding-android-arm64': 0.64.0 + '@oxfmt/binding-darwin-arm64': 0.64.0 + '@oxfmt/binding-darwin-x64': 0.64.0 + '@oxfmt/binding-freebsd-x64': 0.64.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.64.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.64.0 + '@oxfmt/binding-linux-arm64-gnu': 0.64.0 + '@oxfmt/binding-linux-arm64-musl': 0.64.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.64.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.64.0 + '@oxfmt/binding-linux-riscv64-musl': 0.64.0 + '@oxfmt/binding-linux-s390x-gnu': 0.64.0 + '@oxfmt/binding-linux-x64-gnu': 0.64.0 + '@oxfmt/binding-linux-x64-musl': 0.64.0 + '@oxfmt/binding-openharmony-arm64': 0.64.0 + '@oxfmt/binding-win32-arm64-msvc': 0.64.0 + '@oxfmt/binding-win32-ia32-msvc': 0.64.0 + '@oxfmt/binding-win32-x64-msvc': 0.64.0 + vite-plus: 0.3.0(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0) oxlint-tsgolint@7.0.2001: optionalDependencies: @@ -15330,53 +15197,53 @@ snapshots: '@oxlint-tsgolint/win32-arm64': 7.0.2001 '@oxlint-tsgolint/win32-x64': 7.0.2001 - oxlint@1.77.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)): + oxlint@1.79.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)): optionalDependencies: - '@oxlint/binding-android-arm-eabi': 1.77.0 - '@oxlint/binding-android-arm64': 1.77.0 - '@oxlint/binding-darwin-arm64': 1.77.0 - '@oxlint/binding-darwin-x64': 1.77.0 - '@oxlint/binding-freebsd-x64': 1.77.0 - '@oxlint/binding-linux-arm-gnueabihf': 1.77.0 - '@oxlint/binding-linux-arm-musleabihf': 1.77.0 - '@oxlint/binding-linux-arm64-gnu': 1.77.0 - '@oxlint/binding-linux-arm64-musl': 1.77.0 - '@oxlint/binding-linux-ppc64-gnu': 1.77.0 - '@oxlint/binding-linux-riscv64-gnu': 1.77.0 - '@oxlint/binding-linux-riscv64-musl': 1.77.0 - '@oxlint/binding-linux-s390x-gnu': 1.77.0 - '@oxlint/binding-linux-x64-gnu': 1.77.0 - '@oxlint/binding-linux-x64-musl': 1.77.0 - '@oxlint/binding-openharmony-arm64': 1.77.0 - '@oxlint/binding-win32-arm64-msvc': 1.77.0 - '@oxlint/binding-win32-ia32-msvc': 1.77.0 - '@oxlint/binding-win32-x64-msvc': 1.77.0 + '@oxlint/binding-android-arm-eabi': 1.79.0 + '@oxlint/binding-android-arm64': 1.79.0 + '@oxlint/binding-darwin-arm64': 1.79.0 + '@oxlint/binding-darwin-x64': 1.79.0 + '@oxlint/binding-freebsd-x64': 1.79.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.79.0 + '@oxlint/binding-linux-arm-musleabihf': 1.79.0 + '@oxlint/binding-linux-arm64-gnu': 1.79.0 + '@oxlint/binding-linux-arm64-musl': 1.79.0 + '@oxlint/binding-linux-ppc64-gnu': 1.79.0 + '@oxlint/binding-linux-riscv64-gnu': 1.79.0 + '@oxlint/binding-linux-riscv64-musl': 1.79.0 + '@oxlint/binding-linux-s390x-gnu': 1.79.0 + '@oxlint/binding-linux-x64-gnu': 1.79.0 + '@oxlint/binding-linux-x64-musl': 1.79.0 + '@oxlint/binding-openharmony-arm64': 1.79.0 + '@oxlint/binding-win32-arm64-msvc': 1.79.0 + '@oxlint/binding-win32-ia32-msvc': 1.79.0 + '@oxlint/binding-win32-x64-msvc': 1.79.0 oxlint-tsgolint: 7.0.2001 - vite-plus: 0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) + vite-plus: 0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) - oxlint@1.77.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.2.9(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0)): + oxlint@1.79.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.3.0(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0)): optionalDependencies: - '@oxlint/binding-android-arm-eabi': 1.77.0 - '@oxlint/binding-android-arm64': 1.77.0 - '@oxlint/binding-darwin-arm64': 1.77.0 - '@oxlint/binding-darwin-x64': 1.77.0 - '@oxlint/binding-freebsd-x64': 1.77.0 - '@oxlint/binding-linux-arm-gnueabihf': 1.77.0 - '@oxlint/binding-linux-arm-musleabihf': 1.77.0 - '@oxlint/binding-linux-arm64-gnu': 1.77.0 - '@oxlint/binding-linux-arm64-musl': 1.77.0 - '@oxlint/binding-linux-ppc64-gnu': 1.77.0 - '@oxlint/binding-linux-riscv64-gnu': 1.77.0 - '@oxlint/binding-linux-riscv64-musl': 1.77.0 - '@oxlint/binding-linux-s390x-gnu': 1.77.0 - '@oxlint/binding-linux-x64-gnu': 1.77.0 - '@oxlint/binding-linux-x64-musl': 1.77.0 - '@oxlint/binding-openharmony-arm64': 1.77.0 - '@oxlint/binding-win32-arm64-msvc': 1.77.0 - '@oxlint/binding-win32-ia32-msvc': 1.77.0 - '@oxlint/binding-win32-x64-msvc': 1.77.0 + '@oxlint/binding-android-arm-eabi': 1.79.0 + '@oxlint/binding-android-arm64': 1.79.0 + '@oxlint/binding-darwin-arm64': 1.79.0 + '@oxlint/binding-darwin-x64': 1.79.0 + '@oxlint/binding-freebsd-x64': 1.79.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.79.0 + '@oxlint/binding-linux-arm-musleabihf': 1.79.0 + '@oxlint/binding-linux-arm64-gnu': 1.79.0 + '@oxlint/binding-linux-arm64-musl': 1.79.0 + '@oxlint/binding-linux-ppc64-gnu': 1.79.0 + '@oxlint/binding-linux-riscv64-gnu': 1.79.0 + '@oxlint/binding-linux-riscv64-musl': 1.79.0 + '@oxlint/binding-linux-s390x-gnu': 1.79.0 + '@oxlint/binding-linux-x64-gnu': 1.79.0 + '@oxlint/binding-linux-x64-musl': 1.79.0 + '@oxlint/binding-openharmony-arm64': 1.79.0 + '@oxlint/binding-win32-arm64-msvc': 1.79.0 + '@oxlint/binding-win32-ia32-msvc': 1.79.0 + '@oxlint/binding-win32-x64-msvc': 1.79.0 oxlint-tsgolint: 7.0.2001 - vite-plus: 0.2.9(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0) + vite-plus: 0.3.0(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0) p-event@6.0.1: dependencies: @@ -15483,7 +15350,7 @@ snapshots: picomatch@4.0.5: {} - pinyin-pro@3.29.1: {} + pinyin-pro@3.29.3: {} pkg-types@1.3.1: dependencies: @@ -15520,13 +15387,6 @@ snapshots: path-data-parser: 0.1.0 points-on-curve: 0.2.0 - portfinder@1.0.38(supports-color@10.2.2): - dependencies: - async: 3.2.6 - debug: 4.4.3(supports-color@10.2.2) - transitivePeerDependencies: - - supports-color - portfinder@1.0.38(supports-color@11.0.0): dependencies: async: 3.2.6 @@ -15542,12 +15402,6 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.25: - dependencies: - nanoid: 3.3.16 - picocolors: 1.1.1 - source-map-js: 1.2.1 - postcss@8.5.26: dependencies: nanoid: 3.3.18 @@ -15673,11 +15527,11 @@ snapshots: react-fast-compare@3.2.2: {} - react-i18next@17.0.11(@typescript/typescript6@6.0.2)(i18next@26.3.6(@typescript/typescript6@6.0.2))(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + react-i18next@17.0.12(@typescript/typescript6@6.0.2)(i18next@26.4.0(@typescript/typescript6@6.0.2))(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: '@babel/runtime': 7.29.7 html-parse-stringify: 4.0.1 - i18next: 26.3.6(@typescript/typescript6@6.0.2) + i18next: 26.4.0(@typescript/typescript6@6.0.2) react: 19.2.8 use-sync-external-store: 1.6.0(react@19.2.8) optionalDependencies: @@ -15737,14 +15591,14 @@ snapshots: react@19.2.8: {} - reactflow@11.11.4(@types/react@19.2.18)(immer@11.1.16)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + reactflow@11.11.4(@types/react@19.2.18)(immer@11.1.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: - '@reactflow/background': 11.3.14(@types/react@19.2.18)(immer@11.1.16)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@reactflow/controls': 11.2.14(@types/react@19.2.18)(immer@11.1.16)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@reactflow/core': 11.11.4(@types/react@19.2.18)(immer@11.1.16)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@reactflow/minimap': 11.7.14(@types/react@19.2.18)(immer@11.1.16)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@reactflow/node-resizer': 2.2.14(@types/react@19.2.18)(immer@11.1.16)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@reactflow/node-toolbar': 1.3.14(@types/react@19.2.18)(immer@11.1.16)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@reactflow/background': 11.3.14(@types/react@19.2.18)(immer@11.1.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@reactflow/controls': 11.2.14(@types/react@19.2.18)(immer@11.1.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@reactflow/core': 11.11.4(@types/react@19.2.18)(immer@11.1.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@reactflow/minimap': 11.7.14(@types/react@19.2.18)(immer@11.1.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@reactflow/node-resizer': 2.2.14(@types/react@19.2.18)(immer@11.1.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@reactflow/node-toolbar': 1.3.14(@types/react@19.2.18)(immer@11.1.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) transitivePeerDependencies: @@ -15822,7 +15676,7 @@ snapshots: rehype-katex@7.0.1: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/katex': 0.16.8 hast-util-from-html-isomorphic: 2.0.0 hast-util-to-text: 4.0.2 @@ -15832,13 +15686,13 @@ snapshots: rehype-raw@7.0.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hast-util-raw: 9.1.0 vfile: 6.0.3 rehype-sanitize@6.0.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hast-util-sanitize: 5.0.2 remark-breaks@4.0.0: @@ -15887,7 +15741,7 @@ snapshots: remark-rehype@11.1.2: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 mdast-util-to-hast: 13.2.1 unified: 11.0.5 @@ -16068,21 +15922,21 @@ snapshots: smol-toml@1.7.1: {} - socket.io-client@4.8.3(supports-color@10.2.2): + socket.io-client@4.8.3(supports-color@11.0.0): dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.4.3(supports-color@10.2.2) - engine.io-client: 6.6.6(supports-color@10.2.2) - socket.io-parser: 4.2.6(supports-color@10.2.2) + debug: 4.4.3(supports-color@11.0.0) + engine.io-client: 6.6.6(supports-color@11.0.0) + socket.io-parser: 4.2.6(supports-color@11.0.0) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - socket.io-parser@4.2.6(supports-color@10.2.2): + socket.io-parser@4.2.6(supports-color@11.0.0): dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.4.3(supports-color@10.2.2) + debug: 4.4.3(supports-color@11.0.0) transitivePeerDependencies: - supports-color @@ -16134,13 +15988,13 @@ snapshots: stdin-discarder@0.3.2: {} - storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)): + storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)): dependencies: '@storybook/global': 5.0.0 '@storybook/icons': 2.1.0(react@19.2.8) '@testing-library/dom': 10.4.1 '@testing-library/jest-dom': 6.9.1 - '@testing-library/user-event': 14.6.4(@testing-library/dom@10.4.1) + '@testing-library/user-event': 14.6.6(@testing-library/dom@10.4.1) '@vitest/expect': 3.2.4 '@vitest/spy': 3.2.4 '@webcontainer/env': 1.1.1 @@ -16148,14 +16002,14 @@ snapshots: jsonc-parser: 3.3.1 open: 10.2.0 oxc-parser: 0.127.0 - oxc-resolver: 11.24.2 + oxc-resolver: 11.21.2 recast: 0.23.12 semver: 7.8.5 use-sync-external-store: 1.6.0(react@19.2.8) ws: 8.21.3 optionalDependencies: '@types/react': 19.2.18 - vite-plus: 0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) + vite-plus: 0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) transitivePeerDependencies: - bufferutil - react @@ -16167,7 +16021,7 @@ snapshots: hast-util-to-jsx-runtime: 2.3.6(supports-color@11.0.0) html-url-attributes: 3.0.1 marked: 17.0.6 - mermaid: 11.16.1 + mermaid: 11.17.0 react: 19.2.8 react-dom: 19.2.8(react@19.2.8) rehype-harden: 1.1.8 @@ -16184,6 +16038,8 @@ snapshots: transitivePeerDependencies: - supports-color + strictdom@1.0.1: {} + string-argv@0.3.2: {} string-ts@2.3.1: {} @@ -16461,8 +16317,6 @@ snapshots: undici-types@8.3.0: {} - undici@7.28.0: {} - undici@7.29.0: {} unicode-trie@2.0.0: @@ -16574,7 +16428,7 @@ snapshots: util-deprecate@1.0.2: optional: true - uuid@14.0.1: {} + uuid@14.0.2: {} valibot@1.4.2(@typescript/typescript6@6.0.2): optionalDependencies: @@ -16602,22 +16456,21 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vinext@1.0.0-beta.5(@vitejs/plugin-react@6.0.5(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(@vitejs/plugin-rsc@0.5.34(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(react-dom@19.2.8(react@19.2.8))(react-server-dom-webpack@19.2.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8))(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(next@16.3.0(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react-server-dom-webpack@19.2.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8): + vinext@1.0.0-beta.8(@vitejs/plugin-react@6.1.0(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(@vitejs/plugin-rsc@0.5.34(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(react-dom@19.2.8(react@19.2.8))(react-server-dom-webpack@19.2.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8))(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(next@16.3.2(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react-server-dom-webpack@19.2.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8): dependencies: - '@unpic/react': 1.0.2(next@16.3.0(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@unpic/react': 1.0.2(next@16.3.2(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@vercel/og': 0.8.6 '@vinext/types': 1.0.0-beta.2 - '@vitejs/plugin-react': 6.0.5(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) - image-size: 2.0.2 + '@vitejs/plugin-react': 6.1.0(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) ipaddr.js: 2.4.0 magic-string: 0.30.21 react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - vite: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' + vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' vite-plugin-commonjs: 0.10.4 web-vitals: 4.2.4 optionalDependencies: - '@vitejs/plugin-rsc': 0.5.34(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(react-dom@19.2.8(react@19.2.8))(react-server-dom-webpack@19.2.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) + '@vitejs/plugin-rsc': 0.5.34(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(react-dom@19.2.8(react@19.2.8))(react-server-dom-webpack@19.2.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) react-server-dom-webpack: 19.2.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8) transitivePeerDependencies: - next @@ -16635,66 +16488,66 @@ snapshots: fast-glob: 3.3.3 magic-string: 0.30.21 - vite-plugin-inspect@12.0.2(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(srvx@0.12.5): + vite-plugin-inspect@12.0.2(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(srvx@0.12.5): dependencies: - '@vitejs/devtools-kit': 0.4.1(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(srvx@0.12.5) + '@vitejs/devtools-kit': 0.4.1(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(srvx@0.12.5) ansis: 4.3.1 error-stack-parser-es: 2.0.1 obug: 2.1.3 ohash: 2.0.11 - open: 11.0.0 + open: 11.0.1 perfect-debounce: 2.1.0 sirv: 3.0.2 unplugin-utils: 0.3.2 - vite: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' + vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' transitivePeerDependencies: - '@modelcontextprotocol/sdk' - srvx - typescript - vite-plugin-storybook-nextjs@3.3.0(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(next@16.3.0(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(storybook@10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(supports-color@11.0.0): + vite-plugin-storybook-nextjs@3.3.0(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(next@16.3.2(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(storybook@10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))(supports-color@11.0.0): dependencies: '@next/env': 16.0.0 image-size: 2.0.2 magic-string: 0.30.21 module-alias: 2.3.4 - next: 16.3.0(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - storybook: 10.5.8(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + next: 16.3.2(@babel/core@7.29.7(supports-color@11.0.0))(@playwright/test@1.62.1)(@types/node@25.9.5)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + storybook: 10.5.10(@types/react@19.2.18)(react@19.2.8)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) ts-dedent: 2.3.0 - vite: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' - vite-tsconfig-paths: 5.1.4(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(supports-color@11.0.0) + vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' + vite-tsconfig-paths: 5.1.4(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(supports-color@11.0.0) transitivePeerDependencies: - supports-color - typescript - vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0): + vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0): dependencies: - '@oxc-project/types': 0.143.0 - '@oxlint/plugins': 1.73.0 - '@vitest/browser': 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10) - '@vitest/browser-preview': 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10) - '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) - '@vitest/pretty-format': 4.1.10 - '@vitest/runner': 4.1.10 - '@vitest/snapshot': 4.1.10 - '@vitest/spy': 4.1.10 - '@vitest/utils': 4.1.10 - '@voidzero-dev/vite-plus-core': 0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) - oxfmt: 0.62.0(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) - oxlint: 1.77.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + '@oxc-project/types': 0.146.0 + '@oxlint/plugins': 1.79.0 + '@vitest/browser': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.11) + '@vitest/browser-preview': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.11) + '@vitest/expect': 4.1.11 + '@vitest/mocker': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.11 + '@vitest/runner': 4.1.11 + '@vitest/snapshot': 4.1.11 + '@vitest/spy': 4.1.11 + '@vitest/utils': 4.1.11 + '@voidzero-dev/vite-plus-core': 0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) + oxfmt: 0.64.0(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + oxlint: 1.79.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) oxlint-tsgolint: 7.0.2001 - vitest: 4.1.10(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/browser-preview@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.2) + vitest: 4.1.11(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/browser-preview@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.6) optionalDependencies: - '@vitest/browser-playwright': 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(playwright@1.62.1)(vitest@4.1.10) - '@voidzero-dev/vite-plus-darwin-arm64': 0.2.9 - '@voidzero-dev/vite-plus-darwin-x64': 0.2.9 - '@voidzero-dev/vite-plus-linux-arm64-gnu': 0.2.9 - '@voidzero-dev/vite-plus-linux-arm64-musl': 0.2.9 - '@voidzero-dev/vite-plus-linux-x64-gnu': 0.2.9 - '@voidzero-dev/vite-plus-linux-x64-musl': 0.2.9 - '@voidzero-dev/vite-plus-win32-arm64-msvc': 0.2.9 - '@voidzero-dev/vite-plus-win32-x64-msvc': 0.2.9 + '@vitest/browser-playwright': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(playwright@1.62.1)(vitest@4.1.11) + '@voidzero-dev/vite-plus-darwin-arm64': 0.3.0 + '@voidzero-dev/vite-plus-darwin-x64': 0.3.0 + '@voidzero-dev/vite-plus-linux-arm64-gnu': 0.3.0 + '@voidzero-dev/vite-plus-linux-arm64-musl': 0.3.0 + '@voidzero-dev/vite-plus-linux-x64-gnu': 0.3.0 + '@voidzero-dev/vite-plus-linux-x64-musl': 0.3.0 + '@voidzero-dev/vite-plus-win32-arm64-msvc': 0.3.0 + '@voidzero-dev/vite-plus-win32-x64-msvc': 0.3.0 transitivePeerDependencies: - '@arethetypeswrong/core' - '@edge-runtime/vm' @@ -16726,34 +16579,34 @@ snapshots: - vite - yaml - vite-plus@0.2.9(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0): + vite-plus@0.3.0(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0): dependencies: - '@oxc-project/types': 0.143.0 - '@oxlint/plugins': 1.73.0 - '@vitest/browser': 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(vitest@4.1.10) - '@vitest/browser-preview': 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(vitest@4.1.10) - '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0)) - '@vitest/pretty-format': 4.1.10 - '@vitest/runner': 4.1.10 - '@vitest/snapshot': 4.1.10 - '@vitest/spy': 4.1.10 - '@vitest/utils': 4.1.10 - '@voidzero-dev/vite-plus-core': 0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0) - oxfmt: 0.62.0(vite-plus@0.2.9(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0)) - oxlint: 1.77.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.2.9(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0)) + '@oxc-project/types': 0.146.0 + '@oxlint/plugins': 1.79.0 + '@vitest/browser': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(vitest@4.1.11) + '@vitest/browser-preview': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(vitest@4.1.11) + '@vitest/expect': 4.1.11 + '@vitest/mocker': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.11 + '@vitest/runner': 4.1.11 + '@vitest/snapshot': 4.1.11 + '@vitest/spy': 4.1.11 + '@vitest/utils': 4.1.11 + '@voidzero-dev/vite-plus-core': 0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0) + oxfmt: 0.64.0(vite-plus@0.3.0(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0)) + oxlint: 1.79.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.3.0(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(esbuild@0.28.2)(happy-dom@20.11.6)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0)) oxlint-tsgolint: 7.0.2001 - vitest: 4.1.10(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/browser-preview@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(happy-dom@20.11.2) + vitest: 4.1.11(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/browser-preview@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(happy-dom@20.11.6) optionalDependencies: - '@vitest/browser-playwright': 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(playwright@1.62.1)(vitest@4.1.10) - '@voidzero-dev/vite-plus-darwin-arm64': 0.2.9 - '@voidzero-dev/vite-plus-darwin-x64': 0.2.9 - '@voidzero-dev/vite-plus-linux-arm64-gnu': 0.2.9 - '@voidzero-dev/vite-plus-linux-arm64-musl': 0.2.9 - '@voidzero-dev/vite-plus-linux-x64-gnu': 0.2.9 - '@voidzero-dev/vite-plus-linux-x64-musl': 0.2.9 - '@voidzero-dev/vite-plus-win32-arm64-msvc': 0.2.9 - '@voidzero-dev/vite-plus-win32-x64-msvc': 0.2.9 + '@vitest/browser-playwright': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(playwright@1.62.1)(vitest@4.1.11) + '@voidzero-dev/vite-plus-darwin-arm64': 0.3.0 + '@voidzero-dev/vite-plus-darwin-x64': 0.3.0 + '@voidzero-dev/vite-plus-linux-arm64-gnu': 0.3.0 + '@voidzero-dev/vite-plus-linux-arm64-musl': 0.3.0 + '@voidzero-dev/vite-plus-linux-x64-gnu': 0.3.0 + '@voidzero-dev/vite-plus-linux-x64-musl': 0.3.0 + '@voidzero-dev/vite-plus-win32-arm64-msvc': 0.3.0 + '@voidzero-dev/vite-plus-win32-x64-msvc': 0.3.0 transitivePeerDependencies: - '@arethetypeswrong/core' - '@edge-runtime/vm' @@ -16785,45 +16638,45 @@ snapshots: - vite - yaml - vite-tsconfig-paths@5.1.4(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(supports-color@11.0.0): + vite-tsconfig-paths@5.1.4(@typescript/typescript6@6.0.2)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(supports-color@11.0.0): dependencies: debug: 4.4.3(supports-color@11.0.0) globrex: 0.1.2 tsconfck: 3.1.6(@typescript/typescript6@6.0.2) optionalDependencies: - vite: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' + vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' transitivePeerDependencies: - supports-color - typescript - vitefu@1.1.3(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)): + vitefu@1.1.3(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)): optionalDependencies: - vite: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' + vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' - vitest-browser-react@2.2.0(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(vitest@4.1.10): + vitest-browser-react@2.2.0(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(vitest@4.1.11): dependencies: react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - vitest: 4.1.10(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/browser-preview@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.2) + vitest: 4.1.11(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/browser-preview@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.6) optionalDependencies: '@types/react': 19.2.18 - '@types/react-dom': 19.2.4(@types/react@19.2.18) + '@types/react-dom': 19.2.5(@types/react@19.2.18) - vitest-canvas-mock@1.1.5(vitest@4.1.10): + vitest-canvas-mock@1.1.5(vitest@4.1.11): dependencies: cssfontparser: 1.2.1 moo-color: 1.0.3 - vitest: 4.1.10(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/browser-preview@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.2) + vitest: 4.1.11(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/browser-preview@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.6) - vitest@4.1.10(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/browser-preview@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.2): + vitest@4.1.11(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/browser-preview@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(happy-dom@20.11.6): dependencies: - '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) - '@vitest/pretty-format': 4.1.10 - '@vitest/runner': 4.1.10 - '@vitest/snapshot': 4.1.10 - '@vitest/spy': 4.1.10 - '@vitest/utils': 4.1.10 + '@vitest/expect': 4.1.11 + '@vitest/mocker': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.11 + '@vitest/runner': 4.1.11 + '@vitest/snapshot': 4.1.11 + '@vitest/spy': 4.1.11 + '@vitest/utils': 4.1.11 es-module-lexer: 2.3.1 expect-type: 1.4.0 magic-string: 0.30.21 @@ -16835,26 +16688,26 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' + vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)' why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.9.5 - '@vitest/browser-playwright': 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(playwright@1.62.1)(vitest@4.1.10) - '@vitest/browser-preview': 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.10) - '@vitest/coverage-v8': 4.1.10(@vitest/browser@4.1.10)(vitest@4.1.10) - happy-dom: 20.11.2 + '@vitest/browser-playwright': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(playwright@1.62.1)(vitest@4.1.11) + '@vitest/browser-preview': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(@typescript/typescript6@6.0.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(vitest@4.1.11) + '@vitest/coverage-v8': 4.1.11(@vitest/browser@4.1.11)(vitest@4.1.11) + happy-dom: 20.11.6 transitivePeerDependencies: - msw - vitest@4.1.10(@types/node@25.9.5)(@vitest/browser-playwright@4.1.10)(@vitest/browser-preview@4.1.10)(@vitest/coverage-v8@4.1.10)(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(happy-dom@20.11.2): + vitest@4.1.11(@types/node@25.9.5)(@vitest/browser-playwright@4.1.11)(@vitest/browser-preview@4.1.11)(@vitest/coverage-v8@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(happy-dom@20.11.6): dependencies: - '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0)) - '@vitest/pretty-format': 4.1.10 - '@vitest/runner': 4.1.10 - '@vitest/snapshot': 4.1.10 - '@vitest/spy': 4.1.10 - '@vitest/utils': 4.1.10 + '@vitest/expect': 4.1.11 + '@vitest/mocker': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.11 + '@vitest/runner': 4.1.11 + '@vitest/snapshot': 4.1.11 + '@vitest/spy': 4.1.11 + '@vitest/utils': 4.1.11 es-module-lexer: 2.3.1 expect-type: 1.4.0 magic-string: 0.30.21 @@ -16866,14 +16719,14 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: '@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0)' + vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0)' why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.9.5 - '@vitest/browser-playwright': 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(playwright@1.62.1)(vitest@4.1.10) - '@vitest/browser-preview': 4.1.10(@voidzero-dev/vite-plus-core@0.2.9(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(vitest@4.1.10) - '@vitest/coverage-v8': 4.1.10(@vitest/browser@4.1.10)(vitest@4.1.10) - happy-dom: 20.11.2 + '@vitest/browser-playwright': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(playwright@1.62.1)(vitest@4.1.11) + '@vitest/browser-preview': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@25.9.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(typescript@7.0.2)(yaml@2.9.0))(vitest@4.1.11) + '@vitest/coverage-v8': 4.1.11(@vitest/browser@4.1.11)(vitest@4.1.11) + happy-dom: 20.11.6 transitivePeerDependencies: - msw @@ -16920,8 +16773,6 @@ snapshots: wrappy@1.0.2: {} - ws@8.21.2: {} - ws@8.21.3: {} wsl-utils@0.1.0: @@ -17026,22 +16877,22 @@ snapshots: dependencies: tslib: 2.3.0 - zundo@2.3.0(zustand@5.0.15(@types/react@19.2.18)(immer@11.1.16)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8))): + zundo@2.3.0(zustand@5.0.15(@types/react@19.2.18)(immer@11.1.18)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8))): dependencies: - zustand: 5.0.15(@types/react@19.2.18)(immer@11.1.16)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)) + zustand: 5.0.15(@types/react@19.2.18)(immer@11.1.18)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)) - zustand@4.5.7(@types/react@19.2.18)(immer@11.1.16)(react@19.2.8): + zustand@4.5.7(@types/react@19.2.18)(immer@11.1.18)(react@19.2.8): dependencies: use-sync-external-store: 1.6.0(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 - immer: 11.1.16 + immer: 11.1.18 react: 19.2.8 - zustand@5.0.15(@types/react@19.2.18)(immer@11.1.16)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)): + zustand@5.0.15(@types/react@19.2.18)(immer@11.1.18)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)): optionalDependencies: '@types/react': 19.2.18 - immer: 11.1.16 + immer: 11.1.18 react: 19.2.8 use-sync-external-store: 1.6.0(react@19.2.8) @@ -17072,7 +16923,7 @@ time: '@lexical/selection@0.47.0': '2026-07-09T21:14:16.798Z' '@lexical/text@0.47.0': '2026-07-09T21:14:30.676Z' '@lexical/utils@0.47.0': '2026-07-09T21:14:36.426Z' - '@mediabunny/mp3-encoder@1.53.1': '2026-08-12T14:19:33.332Z' + '@mediabunny/mp3-encoder@1.55.2': '2026-08-21T18:21:45.711Z' '@monaco-editor/react@4.7.0': '2025-02-13T16:13:41.390Z' '@napi-rs/keyring@1.3.0': '2026-04-30T09:56:44.246Z' '@orpc/client@1.15.0': '2026-08-08T13:52:09.241Z' @@ -17083,32 +16934,32 @@ time: '@remixicon/react@4.9.0': '2026-01-29T10:53:18.993Z' '@rgrove/parse-xml@4.2.3': '2026-07-26T23:12:17.833Z' '@sentry/react@10.70.0': '2026-08-10T11:05:59.874Z' - '@storybook/addon-a11y@10.5.8': '2026-08-13T13:50:59.483Z' - '@storybook/addon-docs@10.5.8': '2026-08-13T13:54:59.817Z' - '@storybook/addon-links@10.5.8': '2026-08-13T13:51:02.146Z' - '@storybook/addon-onboarding@10.5.8': '2026-08-13T13:51:07.132Z' - '@storybook/addon-themes@10.5.8': '2026-08-13T13:52:06.073Z' - '@storybook/addon-vitest@10.5.8': '2026-08-13T13:55:16.977Z' - '@storybook/nextjs-vite@10.5.8': '2026-08-13T13:55:54.535Z' - '@storybook/react-vite@10.5.8': '2026-08-13T13:53:14.031Z' - '@storybook/react@10.5.8': '2026-08-13T13:56:08.009Z' + '@storybook/addon-a11y@10.5.10': '2026-08-20T10:45:18.990Z' + '@storybook/addon-docs@10.5.10': '2026-08-20T10:48:20.529Z' + '@storybook/addon-links@10.5.10': '2026-08-20T10:44:25.582Z' + '@storybook/addon-onboarding@10.5.10': '2026-08-20T10:44:24.763Z' + '@storybook/addon-themes@10.5.10': '2026-08-20T10:44:31.959Z' + '@storybook/addon-vitest@10.5.10': '2026-08-20T10:45:32.511Z' + '@storybook/nextjs-vite@10.5.10': '2026-08-20T10:47:22.567Z' + '@storybook/react-vite@10.5.10': '2026-08-20T10:49:55.559Z' + '@storybook/react@10.5.10': '2026-08-20T10:46:47.796Z' '@streamdown/math@1.0.2': '2026-02-09T17:31:31.085Z' '@svgdotjs/svg.js@3.2.8': '2026-08-04T08:03:16.420Z' '@t3-oss/env-core@0.13.11': '2026-03-22T19:16:09.121Z' '@t3-oss/env-nextjs@0.13.11': '2026-03-22T19:16:09.026Z' '@tailwindcss/postcss@4.3.3': '2026-07-16T12:03:56.054Z' '@tailwindcss/vite@4.3.3': '2026-07-16T12:04:06.316Z' - '@tanstack/eslint-plugin-query@5.101.4': '2026-07-21T13:03:59.996Z' + '@tanstack/eslint-plugin-query@5.102.2': '2026-08-23T18:00:24.776Z' '@tanstack/form-core@1.33.5': '2026-08-11T12:45:38.255Z' - '@tanstack/query-core@5.101.4': '2026-07-21T13:04:00.391Z' + '@tanstack/query-core@5.102.2': '2026-08-23T18:00:26.529Z' '@tanstack/react-form@1.33.5': '2026-08-11T12:45:38.642Z' '@tanstack/react-hotkeys@0.10.0': '2026-04-25T12:28:06.989Z' - '@tanstack/react-query@5.101.4': '2026-07-21T13:04:07.544Z' - '@tanstack/react-virtual@3.14.9': '2026-07-28T20:28:52.770Z' + '@tanstack/react-query@5.102.2': '2026-08-23T18:00:30.589Z' + '@tanstack/react-virtual@3.14.10': '2026-08-18T15:06:28.045Z' '@testing-library/dom@10.4.1': '2025-07-27T13:23:37.151Z' '@testing-library/jest-dom@6.9.1': '2025-10-01T20:04:22.720Z' '@testing-library/react@16.3.2': '2026-01-19T10:59:08.185Z' - '@testing-library/user-event@14.6.4': '2026-08-11T23:24:11.884Z' + '@testing-library/user-event@14.6.6': '2026-08-22T02:06:46.844Z' '@tsslint/cli@3.1.4': '2026-06-16T18:21:29.075Z' '@tsslint/compat-eslint@3.1.4': '2026-06-16T18:21:23.786Z' '@tsslint/config@3.1.4': '2026-06-16T18:21:26.545Z' @@ -17117,16 +16968,16 @@ time: '@types/negotiator@0.6.5': '2026-08-11T07:26:20.690Z' '@types/node@25.9.5': '2026-07-08T06:47:58.834Z' '@types/qs@6.15.1': '2026-05-06T23:46:01.024Z' - '@types/react-dom@19.2.4': '2026-07-30T21:53:05.684Z' + '@types/react-dom@19.2.5': '2026-08-23T21:05:23.671Z' '@types/react@19.2.18': '2026-07-30T21:54:03.456Z' '@types/sortablejs@1.15.9': '2025-10-24T04:31:45.132Z' '@typescript-eslint/parser@8.67.0': '2026-08-10T17:22:16.082Z' '@typescript/typescript6@6.0.2': '2026-07-06T18:06:47.459Z' - '@vitejs/plugin-react@6.0.5': '2026-07-30T10:12:02.149Z' + '@vitejs/plugin-react@6.1.0': '2026-08-20T02:49:46.306Z' '@vitejs/plugin-rsc@0.5.34': '2026-08-07T07:38:06.175Z' - '@vitest/browser-playwright@4.1.10': '2026-07-06T06:44:37.071Z' - '@vitest/coverage-v8@4.1.10': '2026-07-06T06:44:13.365Z' - '@voidzero-dev/vite-plus-core@0.2.9': '2026-08-12T03:03:49.378Z' + '@vitest/browser-playwright@4.1.11': '2026-08-18T14:22:33.004Z' + '@vitest/coverage-v8@4.1.11': '2026-08-18T14:22:18.896Z' + '@voidzero-dev/vite-plus-core@0.3.0': '2026-08-24T04:06:39.867Z' abcjs@6.7.0: '2026-08-07T18:50:14.156Z' agentation@3.0.2: '2026-03-25T16:24:19.682Z' ahooks@3.9.7: '2026-03-23T15:49:13.605Z' @@ -17136,12 +16987,12 @@ time: cli-table3@0.6.5: '2024-05-12T16:36:50.079Z' clsx@2.1.1: '2024-04-23T05:26:04.645Z' code-inspector-plugin@1.6.6: '2026-07-07T04:00:26.523Z' - concurrently@10.0.4: '2026-07-24T21:03:29.848Z' + concurrently@10.0.5: '2026-08-15T03:33:20.323Z' copy-to-clipboard@4.0.2: '2026-04-24T22:15:18.933Z' cron-parser@5.6.2: '2026-07-13T10:55:48.380Z' - dayjs@1.11.21: '2026-05-26T05:46:12.427Z' + dayjs@1.11.23: '2026-08-17T11:52:35.217Z' decimal.js@10.6.0: '2025-07-06T22:50:38.844Z' - dompurify@3.4.13: '2026-08-03T14:16:00.210Z' + dompurify@3.4.14: '2026-08-19T10:25:15.825Z' echarts-for-react@3.0.6: '2026-01-21T04:38:21.243Z' echarts@6.1.0: '2026-05-19T17:52:11.076Z' elkjs@0.11.1: '2026-03-03T12:21:48.463Z' @@ -17149,43 +17000,43 @@ time: embla-carousel-fade@8.6.0: '2025-04-04T17:37:50.278Z' embla-carousel-react@8.6.0: '2025-04-04T17:37:53.976Z' emoji-mart@5.6.0: '2024-04-25T14:22:21.440Z' - es-toolkit@1.50.0: '2026-07-24T08:24:09.928Z' + es-toolkit@1.51.0: '2026-08-17T02:49:29.399Z' eslint-markdown@0.12.1: '2026-07-10T23:35:26.055Z' eslint-plugin-antfu@3.2.3: '2026-05-11T02:24:38.348Z' eslint-plugin-better-tailwindcss@4.7.0: '2026-07-19T13:26:01.366Z' eslint-plugin-command@3.5.3: '2026-07-14T04:59:31.991Z' eslint-plugin-erasable-syntax-only@0.4.2: '2026-06-18T00:56:01.038Z' eslint-plugin-jsdoc@63.3.3: '2026-08-02T18:02:10.488Z' - eslint-plugin-jsonc@3.4.1: '2026-08-04T07:21:02.632Z' + eslint-plugin-jsonc@3.4.2: '2026-08-22T12:13:35.450Z' eslint-plugin-markdown-preferences@0.41.1: '2026-04-09T23:28:41.552Z' eslint-plugin-n@18.3.0: '2026-08-08T14:03:55.663Z' eslint-plugin-no-barrel-files@1.3.1: '2026-04-12T18:28:18.653Z' eslint-plugin-perfectionist@5.10.1: '2026-08-04T05:40:14.988Z' eslint-plugin-pnpm@1.8.0: '2026-08-13T06:26:51.536Z' eslint-plugin-regexp@3.1.1: '2026-06-25T23:07:43.989Z' - eslint-plugin-storybook@10.5.8: '2026-08-13T13:53:51.991Z' + eslint-plugin-storybook@10.5.10: '2026-08-20T10:46:43.128Z' eslint-plugin-toml@1.5.0: '2026-07-25T01:46:13.957Z' eslint-plugin-unicorn@71.1.0: '2026-07-06T22:07:48.695Z' eslint-plugin-yml@3.8.1: '2026-08-05T03:50:22.441Z' - eslint@10.8.1: '2026-08-07T20:21:24.770Z' + eslint@10.9.0: '2026-08-21T13:07:47.620Z' eventsource-parser@3.1.1: '2026-08-10T15:55:29.938Z' fast-deep-equal@3.1.3: '2020-06-08T07:27:28.474Z' - foxact@0.3.8: '2026-06-22T17:25:42.615Z' + foxact@0.3.9: '2026-08-22T13:25:04.932Z' fuse.js@7.5.0: '2026-07-13T17:23:36.705Z' - happy-dom@20.11.2: '2026-08-07T16:13:43.834Z' + happy-dom@20.11.6: '2026-08-19T23:45:39.849Z' hast-util-to-jsx-runtime@2.3.6: '2025-03-05T11:30:29.166Z' - hono@4.13.2: '2026-08-13T11:55:37.169Z' + hono@4.13.3: '2026-08-18T10:56:09.752Z' html-entities@2.6.0: '2025-03-30T15:40:10.885Z' html-to-image@1.11.13: '2025-02-14T01:43:48.709Z' i18next-resources-to-backend@1.2.3: '2026-07-31T15:07:13.021Z' - i18next@26.3.6: '2026-07-09T13:42:14.596Z' + i18next@26.4.0: '2026-08-20T09:25:14.621Z' iconify-import-svg@0.2.0: '2026-04-20T06:18:25.132Z' - immer@11.1.16: '2026-08-05T19:25:04.961Z' + immer@11.1.18: '2026-08-19T07:25:22.934Z' jotai-scope@0.11.0: '2026-05-13T18:43:15.331Z' jotai-tanstack-query@0.11.0: '2025-08-01T02:55:49.826Z' jotai@2.20.2: '2026-07-14T13:52:11.083Z' js-cookie@3.0.8: '2026-05-29T10:51:39.065Z' - js-yaml@5.2.3: '2026-08-01T06:25:05.164Z' + js-yaml@5.3.0: '2026-08-14T09:31:39.879Z' jsonschema@1.5.0: '2025-01-07T15:09:11.287Z' katex@0.17.0: '2026-05-22T08:06:26.967Z' knip@6.32.2: '2026-08-11T20:34:19.949Z' @@ -17194,26 +17045,26 @@ time: lexical@0.47.0: '2026-07-09T21:11:46.237Z' lockfile@1.0.4: '2018-04-17T00:36:12.565Z' loro-crdt@1.14.1: '2026-08-10T11:39:06.910Z' - mediabunny@1.53.1: '2026-08-12T14:24:26.663Z' - mermaid@11.16.1: '2026-08-04T15:09:06.734Z' + mediabunny@1.55.2: '2026-08-21T18:24:30.681Z' + mermaid@11.17.0: '2026-08-19T09:20:08.814Z' mime@4.1.0: '2025-09-12T17:53:01.376Z' mitt@3.0.1: '2023-07-04T17:31:47.638Z' motion@12.43.0: '2026-07-28T14:29:31.291Z' - negotiator@1.0.0: '2024-08-31T15:42:18.280Z' + negotiator@1.1.0: '2026-08-20T16:45:05.235Z' next-themes@0.4.6: '2025-03-11T21:02:05.882Z' - next@16.3.0: '2026-08-03T20:34:17.082Z' - nuqs@2.9.5: '2026-08-05T11:10:29.888Z' + next@16.3.2: '2026-08-21T09:54:02.099Z' + nuqs@2.10.0: '2026-08-20T08:10:12.660Z' open@11.0.1: '2026-08-13T23:39:43.829Z' ora@9.4.1: '2026-06-22T12:24:49.225Z' picocolors@1.1.1: '2024-10-16T18:20:03.921Z' - pinyin-pro@3.29.1: '2026-08-13T12:40:20.761Z' + pinyin-pro@3.29.3: '2026-08-19T01:06:36.944Z' playwright@1.62.1: '2026-07-30T16:38:49.134Z' postcss@8.5.26: '2026-08-06T08:33:00.043Z' qrcode.react@4.2.0: '2024-12-11T17:22:40.569Z' qs@6.15.3: '2026-06-24T20:03:49.752Z' react-dom@19.2.8: '2026-07-21T15:41:41.267Z' react-easy-crop@6.2.3: '2026-07-24T14:14:31.126Z' - react-i18next@17.0.11: '2026-07-22T21:24:55.425Z' + react-i18next@17.0.12: '2026-08-20T10:15:43.090Z' react-papaparse@4.4.0: '2023-10-13T10:27:07.978Z' react-pdf-highlighter@8.0.0-rc.0: '2024-09-14T16:57:58.673Z' react-server-dom-webpack@19.2.8: '2026-07-21T15:41:46.975Z' @@ -17229,7 +17080,7 @@ time: socket.io-client@4.8.3: '2025-12-23T16:39:16.428Z' sortablejs@1.15.7: '2026-02-11T22:42:31.720Z' std-semver@1.0.8: '2026-03-09T17:23:55.795Z' - storybook@10.5.8: '2026-08-13T13:59:06.123Z' + storybook@10.5.10: '2026-08-20T10:52:53.637Z' streamdown@2.5.0: '2026-03-17T17:35:05.216Z' string-ts@2.3.1: '2025-11-28T17:33:10.099Z' tailwind-merge@3.6.0: '2026-05-10T12:56:43.142Z' @@ -17241,13 +17092,13 @@ time: undici@7.29.0: '2026-07-24T12:52:58.701Z' unist-util-visit@5.1.0: '2026-01-22T19:02:58.977Z' use-context-selector@2.0.0: '2024-05-06T11:23:59.259Z' - uuid@14.0.1: '2026-06-20T11:56:02.499Z' - vinext@1.0.0-beta.5: '2026-08-07T22:21:07.884Z' + uuid@14.0.2: '2026-08-18T18:21:56.060Z' + vinext@1.0.0-beta.8: '2026-08-20T13:19:33.311Z' vite-plugin-inspect@12.0.2: '2026-07-13T05:34:12.173Z' - vite-plus@0.2.9: '2026-08-12T03:03:54.271Z' + vite-plus@0.3.0: '2026-08-24T04:01:38.288Z' vitest-browser-react@2.2.0: '2026-04-05T06:56:34.635Z' vitest-canvas-mock@1.1.5: '2026-08-13T07:03:06.784Z' - vitest@4.1.10: '2026-07-06T06:44:42.684Z' + vitest@4.1.11: '2026-08-18T14:27:07.240Z' zod@4.4.3: '2026-05-04T07:06:40.819Z' zundo@2.3.0: '2024-11-17T16:35:11.372Z' zustand@5.0.15: '2026-08-13T00:39:55.466Z' diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index a2b7ff4685c..150f6fd3734 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -50,14 +50,14 @@ overrides: postcss-selector-parser@>=6.0.0 <6.1.3: 6.1.4 postcss-selector-parser@>=7.0.0 <7.1.3: 7.1.5 postcss@<8.5.10: ^8.5.10 - rollup@>=4.0.0 <4.59.0: 4.62.4 + rollup@>=4.0.0 <4.59.0: 4.62.5 safer-buffer: npm:@nolyfill/safer-buffer@^1.0.44 side-channel: npm:@nolyfill/side-channel@^1.0.44 - solid-js: 1.9.14 + solid-js: 1.9.15 string-width: ~8.2.2 tar@<=7.5.15: ^7.5.16 - vite: 'catalog:' - vitest: 'catalog:' + vite@*: 'catalog:' + vitest@*: 'catalog:' ws@>=8.0.0 <8.20.1: ^8.21.3 yaml@>=2.0.0 <2.8.3: 2.9.0 yauzl@<3.2.1: 3.2.1 @@ -87,7 +87,7 @@ catalog: '@lexical/selection': 0.47.0 '@lexical/text': 0.47.0 '@lexical/utils': 0.47.0 - '@mediabunny/mp3-encoder': 1.53.1 + '@mediabunny/mp3-encoder': 1.55.2 '@monaco-editor/react': 4.7.0 '@napi-rs/keyring': 1.3.0 '@orpc/client': 1.15.0 @@ -98,32 +98,32 @@ catalog: '@remixicon/react': 4.9.0 '@rgrove/parse-xml': 4.2.3 '@sentry/react': 10.70.0 - '@storybook/addon-a11y': 10.5.8 - '@storybook/addon-docs': 10.5.8 - '@storybook/addon-links': 10.5.8 - '@storybook/addon-onboarding': 10.5.8 - '@storybook/addon-themes': 10.5.8 - '@storybook/addon-vitest': 10.5.8 - '@storybook/nextjs-vite': 10.5.8 - '@storybook/react': 10.5.8 - '@storybook/react-vite': 10.5.8 + '@storybook/addon-a11y': 10.5.10 + '@storybook/addon-docs': 10.5.10 + '@storybook/addon-links': 10.5.10 + '@storybook/addon-onboarding': 10.5.10 + '@storybook/addon-themes': 10.5.10 + '@storybook/addon-vitest': 10.5.10 + '@storybook/nextjs-vite': 10.5.10 + '@storybook/react': 10.5.10 + '@storybook/react-vite': 10.5.10 '@streamdown/math': 1.0.2 '@svgdotjs/svg.js': 3.2.8 '@t3-oss/env-core': 0.13.11 '@t3-oss/env-nextjs': 0.13.11 '@tailwindcss/postcss': 4.3.3 '@tailwindcss/vite': 4.3.3 - '@tanstack/eslint-plugin-query': 5.101.4 + '@tanstack/eslint-plugin-query': 5.102.2 '@tanstack/form-core': 1.33.5 - '@tanstack/query-core': 5.101.4 + '@tanstack/query-core': 5.102.2 '@tanstack/react-form': 1.33.5 '@tanstack/react-hotkeys': 0.10.0 - '@tanstack/react-query': 5.101.4 - '@tanstack/react-virtual': 3.14.9 + '@tanstack/react-query': 5.102.2 + '@tanstack/react-virtual': 3.14.10 '@testing-library/dom': 10.4.1 '@testing-library/jest-dom': 6.9.1 '@testing-library/react': 16.3.2 - '@testing-library/user-event': 14.6.4 + '@testing-library/user-event': 14.6.6 '@tsslint/cli': 3.1.4 '@tsslint/compat-eslint': 3.1.4 '@tsslint/config': 3.1.4 @@ -133,14 +133,14 @@ catalog: '@types/node': 25.9.5 '@types/qs': 6.15.1 '@types/react': 19.2.18 - '@types/react-dom': 19.2.4 + '@types/react-dom': 19.2.5 '@types/sortablejs': 1.15.9 '@typescript-eslint/parser': 8.67.0 '@typescript/native': npm:typescript@7.0.2 - '@vitejs/plugin-react': 6.0.5 + '@vitejs/plugin-react': 6.1.0 '@vitejs/plugin-rsc': 0.5.34 - '@vitest/browser-playwright': 4.1.10 - '@vitest/coverage-v8': 4.1.10 + '@vitest/browser-playwright': 4.1.11 + '@vitest/coverage-v8': 4.1.11 abcjs: 6.7.0 agentation: 3.0.2 ahooks: 3.9.7 @@ -150,12 +150,12 @@ catalog: cli-table3: 0.6.5 clsx: 2.1.1 code-inspector-plugin: 1.6.6 - concurrently: 10.0.4 + concurrently: 10.0.5 copy-to-clipboard: 4.0.2 cron-parser: 5.6.2 - dayjs: 1.11.21 + dayjs: 1.11.23 decimal.js: 10.6.0 - dompurify: 3.4.13 + dompurify: 3.4.14 echarts: 6.1.0 echarts-for-react: 3.0.6 elkjs: 0.11.1 @@ -163,43 +163,43 @@ catalog: embla-carousel-fade: 8.6.0 embla-carousel-react: 8.6.0 emoji-mart: 5.6.0 - es-toolkit: 1.50.0 - eslint: 10.8.1 + es-toolkit: 1.51.0 + eslint: 10.9.0 eslint-markdown: 0.12.1 eslint-plugin-antfu: 3.2.3 eslint-plugin-better-tailwindcss: 4.7.0 eslint-plugin-command: 3.5.3 eslint-plugin-erasable-syntax-only: 0.4.2 eslint-plugin-jsdoc: 63.3.3 - eslint-plugin-jsonc: 3.4.1 + eslint-plugin-jsonc: 3.4.2 eslint-plugin-markdown-preferences: 0.41.1 eslint-plugin-n: 18.3.0 eslint-plugin-no-barrel-files: 1.3.1 eslint-plugin-perfectionist: 5.10.1 eslint-plugin-pnpm: 1.8.0 eslint-plugin-regexp: 3.1.1 - eslint-plugin-storybook: 10.5.8 + eslint-plugin-storybook: 10.5.10 eslint-plugin-toml: 1.5.0 eslint-plugin-unicorn: 71.1.0 eslint-plugin-yml: 3.8.1 eventsource-parser: 3.1.1 fast-deep-equal: 3.1.3 - foxact: 0.3.8 + foxact: 0.3.9 fuse.js: 7.5.0 - happy-dom: 20.11.2 + happy-dom: 20.11.6 hast-util-to-jsx-runtime: 2.3.6 - hono: 4.13.2 + hono: 4.13.3 html-entities: 2.6.0 html-to-image: 1.11.13 - i18next: 26.3.6 + i18next: 26.4.0 i18next-resources-to-backend: 1.2.3 iconify-import-svg: 0.2.0 - immer: 11.1.16 + immer: 11.1.18 jotai: 2.20.2 jotai-scope: 0.11.0 jotai-tanstack-query: 0.11.0 js-cookie: 3.0.8 - js-yaml: 5.2.3 + js-yaml: 5.3.0 jsonschema: 1.5.0 katex: 0.17.0 knip: 6.32.2 @@ -207,19 +207,19 @@ catalog: lexical: 0.47.0 lockfile: 1.0.4 loro-crdt: 1.14.1 - mediabunny: 1.53.1 - mermaid: 11.16.1 + mediabunny: 1.55.2 + mermaid: 11.17.0 mime: 4.1.0 mitt: 3.0.1 motion: 12.43.0 - negotiator: 1.0.0 - next: 16.3.0 + negotiator: 1.1.0 + next: 16.3.2 next-themes: 0.4.6 - nuqs: 2.9.5 + nuqs: 2.10.0 open: 11.0.1 ora: 9.4.1 picocolors: 1.1.1 - pinyin-pro: 3.29.1 + pinyin-pro: 3.29.3 playwright: 1.62.1 postcss: 8.5.26 qrcode.react: 4.2.0 @@ -227,7 +227,7 @@ catalog: react: 19.2.8 react-dom: 19.2.8 react-easy-crop: 6.2.3 - react-i18next: 17.0.11 + react-i18next: 17.0.12 react-papaparse: 4.4.0 react-pdf-highlighter: 8.0.0-rc.0 react-server-dom-webpack: 19.2.8 @@ -242,7 +242,7 @@ catalog: socket.io-client: 4.8.3 sortablejs: 1.15.7 std-semver: 1.0.8 - storybook: 10.5.8 + storybook: 10.5.10 streamdown: 2.5.0 string-ts: 2.3.1 tailwind-merge: 3.6.0 @@ -254,12 +254,12 @@ catalog: undici: 7.29.0 unist-util-visit: 5.1.0 use-context-selector: 2.0.0 - uuid: 14.0.1 - vinext: 1.0.0-beta.5 - vite: npm:@voidzero-dev/vite-plus-core@0.2.9 + uuid: 14.0.2 + vinext: 1.0.0-beta.8 + vite: npm:@voidzero-dev/vite-plus-core@0.3.0 vite-plugin-inspect: 12.0.2 - vite-plus: 0.2.9 - vitest: 4.1.10 + vite-plus: 0.3.0 + vitest: 4.1.11 vitest-browser-react: 2.2.0 vitest-canvas-mock: 1.1.5 zod: 4.4.3 diff --git a/web/app/(commonLayout)/skills/__tests__/metadata.spec.ts b/web/app/(commonLayout)/skills/__tests__/metadata.spec.ts new file mode 100644 index 00000000000..92e3975587c --- /dev/null +++ b/web/app/(commonLayout)/skills/__tests__/metadata.spec.ts @@ -0,0 +1,15 @@ +import { describe, expect, it, vi } from 'vite-plus/test' +import { generateMetadata } from '../page' + +vi.mock('server-only', () => ({})) + +vi.mock('@/i18n-config/server', async (importOriginal) => ({ + ...(await importOriginal()), + getLocaleOnServer: async () => 'en-US', +})) + +describe('Skills route metadata', () => { + it('provides the localized document title for the Skills route', async () => { + await expect(generateMetadata()).resolves.toMatchObject({ title: 'Skills' }) + }) +}) diff --git a/web/app/components/app/app-publisher/environment-tabs/__tests__/layout.spec.ts b/web/app/components/app/app-publisher/environment-tabs/__tests__/layout.spec.ts index 73d800650f9..253b8ab98a5 100644 --- a/web/app/components/app/app-publisher/environment-tabs/__tests__/layout.spec.ts +++ b/web/app/components/app/app-publisher/environment-tabs/__tests__/layout.spec.ts @@ -1,4 +1,4 @@ -import { getEnvironmentTabLayout } from '../layout' +import { getEnvironmentTabLayout } from '../layout-calculations' const environmentTabWidths = { canary: 72, diff --git a/web/app/components/app/app-publisher/environment-tabs/environment-button.tsx b/web/app/components/app/app-publisher/environment-tabs/environment-button.tsx index 9aa7370fc5f..6d6a644c901 100644 --- a/web/app/components/app/app-publisher/environment-tabs/environment-button.tsx +++ b/web/app/components/app/app-publisher/environment-tabs/environment-button.tsx @@ -1,6 +1,6 @@ import { cn } from '@langgenius/dify-ui/cn' import { Tooltip, TooltipContent, TooltipTrigger } from '@langgenius/dify-ui/tooltip' -import { ENVIRONMENT_TAB_LABEL_MAX_WIDTH } from './layout' +import { ENVIRONMENT_TAB_LABEL_MAX_WIDTH } from './layout-calculations' export function EnvironmentButton({ active, diff --git a/web/app/components/app/app-publisher/environment-tabs/index.tsx b/web/app/components/app/app-publisher/environment-tabs/index.tsx index 69be04adb89..eef5c30e32b 100644 --- a/web/app/components/app/app-publisher/environment-tabs/index.tsx +++ b/web/app/components/app/app-publisher/environment-tabs/index.tsx @@ -21,7 +21,7 @@ import { estimateFallbackTextWidth, getEnvironmentTabLayout, SELECTED_OVERFLOW_LABEL_MAX_WIDTH, -} from './layout' +} from './layout-calculations' import { EnvironmentTabsMeasurementProbe } from './measurement-probe' import { useEnvironmentTabMeasurements } from './use-measurements' diff --git a/web/app/components/app/app-publisher/environment-tabs/layout.ts b/web/app/components/app/app-publisher/environment-tabs/layout-calculations.ts similarity index 94% rename from web/app/components/app/app-publisher/environment-tabs/layout.ts rename to web/app/components/app/app-publisher/environment-tabs/layout-calculations.ts index 05b3809297d..1e0cbac026c 100644 --- a/web/app/components/app/app-publisher/environment-tabs/layout.ts +++ b/web/app/components/app/app-publisher/environment-tabs/layout-calculations.ts @@ -4,7 +4,7 @@ export const ENVIRONMENT_TAB_HORIZONTAL_PADDING = 16 export const ENVIRONMENT_TAB_LABEL_MAX_WIDTH = ENVIRONMENT_TAB_MAX_WIDTH - ENVIRONMENT_TAB_HORIZONTAL_PADDING export const SELECTED_OVERFLOW_LABEL_MAX_WIDTH = ENVIRONMENT_TAB_LABEL_MAX_WIDTH - 16 -export const TAB_GAP = 4 +const TAB_GAP = 4 type EnvironmentTabLayout = { overflowEnvironmentIds: string[] @@ -40,7 +40,7 @@ export function estimateFallbackTabWidth(value: string) { ) } -function rowWidth(widths: readonly number[]) { +function getRowWidth(widths: readonly number[]) { if (widths.length === 0) return 0 return widths.reduce((total, width) => total + width, 0) + (widths.length - 1) * TAB_GAP } @@ -58,7 +58,7 @@ export function getEnvironmentTabLayout({ (environmentId) => environmentTabWidths[environmentId] ?? ENVIRONMENT_TAB_MAX_WIDTH, ) const allTabsFit = - !hasUndeployedEnvironments && rowWidth([builtInWidth, ...joinedWidths]) <= availableWidth + !hasUndeployedEnvironments && getRowWidth([builtInWidth, ...joinedWidths]) <= availableWidth if (allTabsFit) { return { diff --git a/web/app/components/app/app-publisher/environment-tabs/use-measurements.ts b/web/app/components/app/app-publisher/environment-tabs/use-measurements.ts index 4ae0df4385c..87dcf1fd9f6 100644 --- a/web/app/components/app/app-publisher/environment-tabs/use-measurements.ts +++ b/web/app/components/app/app-publisher/environment-tabs/use-measurements.ts @@ -8,7 +8,7 @@ import { ENVIRONMENT_TAB_MAX_WIDTH, estimateFallbackTabWidth, estimateFallbackTextWidth, -} from './layout' +} from './layout-calculations' export function useEnvironmentTabMeasurements({ builtInLabel, diff --git a/web/app/components/app/duplicate-modal/__tests__/index.spec.tsx b/web/app/components/app/duplicate-modal/__tests__/index.spec.tsx index 3c839070e6a..865ece216c3 100644 --- a/web/app/components/app/duplicate-modal/__tests__/index.spec.tsx +++ b/web/app/components/app/duplicate-modal/__tests__/index.spec.tsx @@ -2,15 +2,19 @@ import { render, screen, waitFor } from '@testing-library/react' import userEvent from '@testing-library/user-event' import DuplicateAppModal from '../index' -const toastErrorMock = vi.fn() -vi.mock('@/context/provider-context', () => ({ - useProviderContext: () => ({ +const { mockProviderContext, toastErrorMock } = vi.hoisted(() => ({ + mockProviderContext: { plan: { usage: { buildApps: 0 }, total: { buildApps: 1 }, }, enableBilling: true, - }), + }, + toastErrorMock: vi.fn(), +})) + +vi.mock('@/context/provider-context', () => ({ + useProviderContext: () => mockProviderContext, })) vi.mock('@langgenius/dify-ui/toast', () => ({ @@ -20,11 +24,11 @@ vi.mock('@langgenius/dify-ui/toast', () => ({ })) vi.mock('@/app/components/base/app-icon', () => ({ - default: ({ onClick }: { onClick: () => void }) => ( - - ), + default: () => app-icon, +})) + +vi.mock('@/app/components/billing/apps-full-in-dialog', () => ({ + default: () =>
apps-full
, })) vi.mock('@/app/components/base/app-icon-picker', () => ({ @@ -67,8 +71,30 @@ vi.mock('@/app/components/base/app-icon-picker', () => ({ })) describe('DuplicateAppModal', () => { + const getIconButton = () => + screen.getByRole('button', { + name: /operation\.edit.*appCustomize\.subTitle/, + }) + beforeEach(() => { vi.clearAllMocks() + mockProviderContext.plan.usage.buildApps = 0 + mockProviderContext.plan.total.buildApps = 1 + }) + + it('should render a named dialog', () => { + render( + , + ) + + expect(screen.getByRole('dialog', { name: /duplicateTitle/ })).toBeInTheDocument() }) it('should validate the name before duplicating and update the input value', async () => { @@ -88,13 +114,14 @@ describe('DuplicateAppModal', () => { />, ) - const input = screen.getByRole('textbox') + const input = screen.getByRole('textbox', { name: /appCustomize\.subTitle/ }) await user.clear(input) await user.type(input, 'Updated App') expect(input).toHaveValue('Updated App') await user.clear(input) - await user.click(screen.getByRole('button', { name: /(?:^|\.)duplicate(?=$|:)/ })) + await user.click(screen.getByRole('textbox', { name: /appCustomize\.subTitle/ })) + await user.keyboard('{Enter}') expect(toastErrorMock).toHaveBeenCalledWith( expect.stringMatching(/(?:^|\.)appCustomize\.nameRequired(?=$|:)/), @@ -120,7 +147,7 @@ describe('DuplicateAppModal', () => { />, ) - await user.click(screen.getByText('open-icon-picker')) + await user.click(getIconButton()) await waitFor(() => { expect(screen.getByPlaceholderText('Search emojis...')).toBeInTheDocument() }) @@ -161,6 +188,50 @@ describe('DuplicateAppModal', () => { expect(onHide).toHaveBeenCalledTimes(1) }) + it('should call onHide when Escape is pressed', async () => { + const onHide = vi.fn() + const user = userEvent.setup() + + render( + , + ) + + await user.keyboard('{Escape}') + + expect(onHide).toHaveBeenCalledTimes(1) + }) + + it('should not submit with Enter when the app limit is reached', async () => { + const onConfirm = vi.fn() + const onHide = vi.fn() + const user = userEvent.setup() + mockProviderContext.plan.usage.buildApps = 1 + + render( + , + ) + + await user.click(screen.getByRole('textbox', { name: /appCustomize\.subTitle/ })) + await user.keyboard('{Enter}') + + expect(onConfirm).not.toHaveBeenCalled() + expect(onHide).not.toHaveBeenCalled() + }) + it('should preserve the current image icon when the picker closes without selecting', async () => { const onConfirm = vi.fn() const user = userEvent.setup() @@ -177,7 +248,7 @@ describe('DuplicateAppModal', () => { />, ) - await user.click(screen.getByText('open-icon-picker')) + await user.click(getIconButton()) await waitFor(() => { expect(screen.getByPlaceholderText('Search emojis...')).toBeInTheDocument() }) @@ -189,7 +260,7 @@ describe('DuplicateAppModal', () => { await waitFor(() => { expect(screen.queryByPlaceholderText('Search emojis...')).not.toBeInTheDocument() }) - await user.click(screen.getByText('open-icon-picker')) + await user.click(getIconButton()) await waitFor(() => { expect(screen.getByPlaceholderText('Search emojis...')).toBeInTheDocument() }) diff --git a/web/app/components/app/duplicate-modal/index.tsx b/web/app/components/app/duplicate-modal/index.tsx index 0fa4671a8cd..86458018dda 100644 --- a/web/app/components/app/duplicate-modal/index.tsx +++ b/web/app/components/app/duplicate-modal/index.tsx @@ -1,14 +1,15 @@ 'use client' import type { AppIconType } from '@/types/app' import { Button } from '@langgenius/dify-ui/button' -import { Dialog, DialogContent } from '@langgenius/dify-ui/dialog' +import { Dialog, DialogContent, DialogTitle } from '@langgenius/dify-ui/dialog' +import { Field, FieldLabel } from '@langgenius/dify-ui/field' +import { IconButton } from '@langgenius/dify-ui/icon-button' +import { Input } from '@langgenius/dify-ui/input' import { toast } from '@langgenius/dify-ui/toast' -import { RiCloseLine } from '@remixicon/react' import * as React from 'react' import { useState } from 'react' import { useTranslation } from 'react-i18next' import AppIcon from '@/app/components/base/app-icon' -import Input from '@/app/components/base/input' import AppsFull from '@/app/components/billing/apps-full-in-dialog' import { useProviderContext } from '@/context/provider-context' import AppIconPicker from '../../base/app-icon-picker' @@ -54,6 +55,8 @@ const DuplicateAppModal = ({ const isAppsFull = enableBilling && plan.usage.buildApps >= plan.total.buildApps const submit = () => { + if (isAppsFull) return + if (!name.trim()) { toast.error(t(($) => $['appCustomize.nameRequired'], { ns: 'explore' })) return @@ -69,47 +72,72 @@ const DuplicateAppModal = ({ return ( <> - + { + if (!open) onHide() + }} + > - -
+
-
-
- {t(($) => $['appCustomize.subTitle'], { ns: 'explore' })} + +
{ + event.preventDefault() + submit() + }} + > +
+ + + {t(($) => $['appCustomize.subTitle'], { ns: 'explore' })} + +
+ + setName(e.target.value)} + className="h-10" + placeholder={t(($) => $['placeholder.input'], { ns: 'common' }) || ''} + /> +
+
+ {isAppsFull && }
-
- { - setShowAppIconPicker(true) - }} - className="cursor-pointer" - iconType={appIcon.type} - icon={appIcon.type === 'image' ? appIcon.fileId : appIcon.icon} - background={appIcon.type === 'image' ? undefined : appIcon.background} - imageUrl={appIcon.type === 'image' ? appIcon.url : undefined} - /> - setName(e.target.value)} className="h-10" /> +
+ +
- {isAppsFull && } -
-
- - -
+
{showAppIconPicker && ( diff --git a/web/app/components/apps/__tests__/list.spec.tsx b/web/app/components/apps/__tests__/list.spec.tsx index 8ade51a73a3..79816ab08a8 100644 --- a/web/app/components/apps/__tests__/list.spec.tsx +++ b/web/app/components/apps/__tests__/list.spec.tsx @@ -899,29 +899,6 @@ describe('List', () => { ) }) - it('should lay out first empty state placeholder cards with auto-fill grid columns', () => { - mockAppData = { pages: [{ data: [], total: 0 }] } - - const { container } = renderList() - const placeholderGrid = Array.from(container.querySelectorAll('.pointer-events-none')).find( - (element) => element.className.includes('grid-rows-4'), - ) - - if (!placeholderGrid) throw new Error('Expected first empty state placeholder grid to render') - - expect(placeholderGrid).toHaveClass( - 'grid', - 'grid-cols-[repeat(auto-fill,minmax(296px,1fr))]', - 'grid-rows-4', - ) - expect(placeholderGrid).not.toHaveClass( - 'grid-cols-1', - 'sm:grid-cols-2', - 'lg:grid-cols-3', - 'xl:grid-cols-4', - ) - }) - it('should hide learn dify in first empty state when learn app is disabled', () => { mockAppData = { pages: [{ data: [], total: 0 }] } diff --git a/web/app/components/apps/app-list-catalog.tsx b/web/app/components/apps/app-list-catalog.tsx index 1b7dc2df745..97d7fa36fbc 100644 --- a/web/app/components/apps/app-list-catalog.tsx +++ b/web/app/components/apps/app-list-catalog.tsx @@ -208,35 +208,34 @@ function AppListCatalogContent({ /> )} {hasNextPage && ( -
+ <> + + {isFetchNextPageError && ( +
+ {t(($) => $['errorBoundary.title'], { ns: 'common' })} + +
+ )} { void onFetchNextPage() }} preloadDistance={getPreloadDistance} scrollContainerRef={scrollViewportRef} /> -
- - {isFetchNextPageError && ( -
- {t(($) => $['errorBoundary.title'], { ns: 'common' })} - -
- )} -
-
+ )} diff --git a/web/app/components/apps/constants.ts b/web/app/components/apps/constants.ts index 578a2c24605..0307c3c5907 100644 --- a/web/app/components/apps/constants.ts +++ b/web/app/components/apps/constants.ts @@ -1,3 +1,5 @@ +import { cn } from '@langgenius/dify-ui/cn' +import { MAIN_NAV_APP_CARD_GRID_CLASS_NAME } from '@/app/components/main-nav/app-card-grid' + export const APP_LIST_SEARCH_DEBOUNCE_MS = 500 -export const APP_LIST_GRID_CLASS_NAME = - 'grid grid-cols-[repeat(auto-fill,minmax(296px,1fr))] gap-2.5 px-8 pt-2' +export const APP_LIST_GRID_CLASS_NAME = cn('gap-2.5 px-8 pt-2', MAIN_NAV_APP_CARD_GRID_CLASS_NAME) diff --git a/web/app/components/apps/first-empty-state/index.tsx b/web/app/components/apps/first-empty-state/index.tsx index 09ea83b7104..fe91e64a7f4 100644 --- a/web/app/components/apps/first-empty-state/index.tsx +++ b/web/app/components/apps/first-empty-state/index.tsx @@ -3,8 +3,10 @@ import type { ReactNode } from 'react' import type { App } from '@/models/explore' import type { TryAppSelection } from '@/types/try-app' +import { cn } from '@langgenius/dify-ui/cn' import { useTranslation } from 'react-i18next' import LearnDify from '@/app/components/explore/learn-dify' +import { MAIN_NAV_APP_CARD_GRID_CLASS_NAME } from '@/app/components/main-nav/app-card-grid' import { STEP_BY_STEP_TOUR_TARGETS } from '@/app/components/step-by-step-tour/target-registry' import FirstEmptyActionCard from './action-card' @@ -71,7 +73,12 @@ function FirstEmptyState({ return (
-
+
{EMPTY_PLACEHOLDER_CARD_IDS.map((id) => (
))} diff --git a/web/app/components/datasets/common/image-uploader/__tests__/store.spec.tsx b/web/app/components/datasets/common/image-uploader/__tests__/store.spec.tsx index 59616fb2d61..0604fef507e 100644 --- a/web/app/components/datasets/common/image-uploader/__tests__/store.spec.tsx +++ b/web/app/components/datasets/common/image-uploader/__tests__/store.spec.tsx @@ -210,16 +210,11 @@ describe('image-uploader store', () => { describe('useFileStoreWithSelector', () => { it('should throw error when used outside provider', () => { const TestComponent = () => { - try { - useFileStoreWithSelector((state) => state.files) - return
No Error
- } catch { - return
Error
- } + useFileStoreWithSelector((state) => state.files) + return null } - render() - expect(screen.getByText('Error')).toBeInTheDocument() + expect(() => render()).toThrow('Missing FileContext.Provider in the tree') }) it('should select files from store', () => { diff --git a/web/app/components/datasets/create-from-pipeline/list/template-card/__tests__/edit-pipeline-info.spec.tsx b/web/app/components/datasets/create-from-pipeline/list/template-card/__tests__/edit-pipeline-info.spec.tsx index 4d5a0a563e5..de26e64e577 100644 --- a/web/app/components/datasets/create-from-pipeline/list/template-card/__tests__/edit-pipeline-info.spec.tsx +++ b/web/app/components/datasets/create-from-pipeline/list/template-card/__tests__/edit-pipeline-info.spec.tsx @@ -1,9 +1,19 @@ +import type { ReactElement } from 'react' import type { PipelineTemplate } from '@/models/pipeline' -import { fireEvent, render, screen, waitFor } from '@testing-library/react' +import { Dialog, DialogContent } from '@langgenius/dify-ui/dialog' +import { fireEvent, screen, render as testingLibraryRender, waitFor } from '@testing-library/react' +import userEvent from '@testing-library/user-event' import { beforeEach, describe, expect, it, vi } from 'vite-plus/test' import { ChunkingMode } from '@/models/datasets' import EditPipelineInfo from '../edit-pipeline-info' +const render = (ui: ReactElement) => + testingLibraryRender( + + {ui} + , + ) + const mockUpdatePipeline = vi.fn() const mockInvalidCustomizedTemplateList = vi.fn() @@ -65,6 +75,10 @@ describe('EditPipelineInfo', () => { onClose: vi.fn(), pipeline: createPipelineTemplate(), } + const getIconButton = () => + screen.getByRole('button', { + name: 'common.operation.edit datasetPipeline.pipelineNameAndIcon', + }) beforeEach(() => { vi.clearAllMocks() @@ -74,13 +88,12 @@ describe('EditPipelineInfo', () => { describe('Rendering', () => { it('should render title', () => { render() - expect(screen.getByText(/editPipelineInfo/i)).toBeInTheDocument() + expect(screen.getByRole('dialog', { name: /editPipelineInfo/i })).toBeInTheDocument() }) it('should render close button', () => { - const { container } = render() - const closeButton = container.querySelector('button[type="button"]') - expect(closeButton).toBeInTheDocument() + render() + expect(screen.getByRole('button', { name: 'common.operation.close' })).toBeInTheDocument() }) it('should render name input with initial value', () => { @@ -113,11 +126,11 @@ describe('EditPipelineInfo', () => { }) describe('User Interactions', () => { - it('should call onClose when close button is clicked', () => { - const { container } = render() + it('should call onClose when close button is clicked', async () => { + const user = userEvent.setup() + render() - const closeButton = container.querySelector('button[type="button"]') - fireEvent.click(closeButton!) + await user.click(screen.getByRole('button', { name: 'common.operation.close' })) expect(defaultProps.onClose).toHaveBeenCalledTimes(1) }) @@ -149,7 +162,8 @@ describe('EditPipelineInfo', () => { expect(screen.getByDisplayValue('New description')).toBeInTheDocument() }) - it('should call updatePipeline when save is clicked with valid name', async () => { + it('should submit with Enter from the name input', async () => { + const user = userEvent.setup() mockUpdatePipeline.mockImplementation((_data, callbacks) => { callbacks.onSuccess() return Promise.resolve() @@ -157,8 +171,8 @@ describe('EditPipelineInfo', () => { render() - const saveButton = screen.getByText(/operation\.save/i) - fireEvent.click(saveButton) + await user.click(screen.getByRole('textbox', { name: 'datasetPipeline.pipelineNameAndIcon' })) + await user.keyboard('{Enter}') await waitFor(() => { expect(mockUpdatePipeline).toHaveBeenCalled() @@ -231,9 +245,9 @@ describe('EditPipelineInfo', () => { // Icon Types Tests (Branch Coverage for lines 29-30, 36-37) describe('Icon Types', () => { it('should initialize with emoji icon type when pipeline has emoji icon', () => { - const { container } = render() + render() // Should render component with emoji icon - expect(container.querySelector('[class*="cursor-pointer"]')).toBeInTheDocument() + expect(getIconButton()).toBeInTheDocument() expect(screen.getByDisplayValue('Test Pipeline')).toBeInTheDocument() }) @@ -248,10 +262,10 @@ describe('EditPipelineInfo', () => { onClose: vi.fn(), pipeline: imagePipeline, } - const { container } = render() + render() // Component should initialize with image icon state expect(screen.getByDisplayValue('Image Pipeline')).toBeInTheDocument() - expect(container.querySelector('[class*="cursor-pointer"]')).toBeInTheDocument() + expect(getIconButton()).toBeInTheDocument() }) it('should render correctly with image icon and then update', () => { @@ -261,14 +275,13 @@ describe('EditPipelineInfo', () => { ...defaultProps, pipeline: imagePipeline, } - const { container } = render() + render() // Verify component rendered with image pipeline expect(screen.getByDisplayValue('Image Pipeline')).toBeInTheDocument() // Open icon picker - const appIcon = container.querySelector('[class*="cursor-pointer"]') - fireEvent.click(appIcon!) + fireEvent.click(getIconButton()) expect(screen.getByPlaceholderText('Search emojis...')).toBeInTheDocument() }) @@ -329,11 +342,10 @@ describe('EditPipelineInfo', () => { ...defaultProps, pipeline: createImagePipelineTemplate(), } - const { container } = render() + render() // Open picker - const appIcon = container.querySelector('[class*="cursor-pointer"]') - fireEvent.click(appIcon!) + fireEvent.click(getIconButton()) expect(screen.getByPlaceholderText('Search emojis...')).toBeInTheDocument() // Close without selection - should revert to original image icon @@ -354,11 +366,10 @@ describe('EditPipelineInfo', () => { ...defaultProps, pipeline: createImagePipelineTemplate(), } - const { container } = render() + render() // Open picker and select emoji - const appIcon = container.querySelector('[class*="cursor-pointer"]') - fireEvent.click(appIcon!) + fireEvent.click(getIconButton()) const emojiButton = document.querySelector('em-emoji')?.closest('button') expect(emojiButton).toBeTruthy() fireEvent.click(emojiButton!) @@ -383,10 +394,9 @@ describe('EditPipelineInfo', () => { }) it('should switch to the image tab in the real picker', () => { - const { container } = render() + render() - const appIcon = container.querySelector('[class*="cursor-pointer"]') - fireEvent.click(appIcon!) + fireEvent.click(getIconButton()) fireEvent.click(screen.getByRole('button', { name: /iconPicker\.image/ })) expect(screen.getByRole('button', { name: /iconPicker\.ok/ })).toBeInTheDocument() @@ -401,17 +411,15 @@ describe('EditPipelineInfo', () => { }) it('should open picker when icon is clicked', () => { - const { container } = render() - const appIcon = container.querySelector('[class*="cursor-pointer"]') - fireEvent.click(appIcon!) + render() + fireEvent.click(getIconButton()) expect(screen.getByPlaceholderText('Search emojis...')).toBeInTheDocument() }) it('should close picker and update icon when emoji style is selected', async () => { - const { container } = render() - const appIcon = container.querySelector('[class*="cursor-pointer"]') - fireEvent.click(appIcon!) + render() + fireEvent.click(getIconButton()) fireEvent.click(screen.getByRole('button', { name: '#E4FBCC' })) fireEvent.click(screen.getByRole('button', { name: /iconPicker\.ok/ })) @@ -422,9 +430,8 @@ describe('EditPipelineInfo', () => { }) it('should keep picker open when only switching to image tab', () => { - const { container } = render() - const appIcon = container.querySelector('[class*="cursor-pointer"]') - fireEvent.click(appIcon!) + render() + fireEvent.click(getIconButton()) fireEvent.click(screen.getByRole('button', { name: /iconPicker\.image/ })) @@ -432,9 +439,8 @@ describe('EditPipelineInfo', () => { }) it('should revert icon when picker is closed without selection', async () => { - const { container } = render() - const appIcon = container.querySelector('[class*="cursor-pointer"]') - fireEvent.click(appIcon!) + render() + fireEvent.click(getIconButton()) fireEvent.click(screen.getByRole('button', { name: /iconPicker\.cancel/ })) @@ -449,11 +455,10 @@ describe('EditPipelineInfo', () => { return Promise.resolve() }) - const { container } = render() + render() // Open picker and select new emoji - const appIcon = container.querySelector('[class*="cursor-pointer"]') - fireEvent.click(appIcon!) + fireEvent.click(getIconButton()) fireEvent.click(screen.getByRole('button', { name: '#E4FBCC' })) fireEvent.click(screen.getByRole('button', { name: /iconPicker\.ok/ })) @@ -480,12 +485,9 @@ describe('EditPipelineInfo', () => { return Promise.resolve() }) - const { container } = render( - , - ) + render() - const appIcon = container.querySelector('[class*="cursor-pointer"]') - fireEvent.click(appIcon!) + fireEvent.click(getIconButton()) const emojiButton = document.querySelector('em-emoji')?.closest('button') expect(emojiButton).toBeTruthy() fireEvent.click(emojiButton!) @@ -569,8 +571,8 @@ describe('EditPipelineInfo', () => { describe('Layout', () => { it('should have close button in header', () => { - const { container } = render() - const closeButton = container.querySelector('button.absolute') + render() + const closeButton = screen.getByRole('button', { name: 'common.operation.close' }) expect(closeButton).toHaveClass('right-5', 'top-5') }) }) diff --git a/web/app/components/datasets/create-from-pipeline/list/template-card/edit-pipeline-info.tsx b/web/app/components/datasets/create-from-pipeline/list/template-card/edit-pipeline-info.tsx index 0aa17c18f42..9515d4ea854 100644 --- a/web/app/components/datasets/create-from-pipeline/list/template-card/edit-pipeline-info.tsx +++ b/web/app/components/datasets/create-from-pipeline/list/template-card/edit-pipeline-info.tsx @@ -1,15 +1,17 @@ import type { AppIconSelection } from '@/app/components/base/app-icon-picker' import type { PipelineTemplate } from '@/models/pipeline' import { Button } from '@langgenius/dify-ui/button' +import { DialogTitle } from '@langgenius/dify-ui/dialog' +import { Field, FieldLabel } from '@langgenius/dify-ui/field' +import { IconButton } from '@langgenius/dify-ui/icon-button' +import { Input } from '@langgenius/dify-ui/input' import { Textarea } from '@langgenius/dify-ui/textarea' import { toast } from '@langgenius/dify-ui/toast' -import { RiCloseLine } from '@remixicon/react' import * as React from 'react' import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' import AppIcon from '@/app/components/base/app-icon' import AppIconPicker from '@/app/components/base/app-icon-picker' -import Input from '@/app/components/base/input' import { useInvalidCustomizedTemplateList, useUpdateTemplateInfo } from '@/service/use-pipeline' type EditPipelineInfoProps = { @@ -83,65 +85,79 @@ const EditPipelineInfo = ({ onClose, pipeline }: EditPipelineInfoProps) => { updatePipeline, invalidCustomizedTemplateList, onClose, + t, ]) return ( -
+
{ + event.preventDefault() + void handleSave() + }} + > {/* Header */}
- + {t(($) => $.editPipelineInfo, { ns: 'datasetPipeline' })} - +
- +